2013-05-08 11 views
6

Mam klasy z tej dziedziny:Dlaczego metoda Dispose() nie jest dostępna w moim obiekcie IDisposable?

private WcfChannelFactory<IPrestoService> _channelFactory; 

w metodzie Dispose(), robię to:

if (_channelFactory != null) { _channelFactory.Dispose(); } 

Ale to powoduje błąd:

Cannot access explicit implementation of IDisposable.Dispose

Po wykonaniu niektóre research, wydaje się, że mogę zbywać w ten sposób:

if (_channelFactory != null) { (_channelFactory as IDisposable).Dispose(); } 

Nie rozumiem dwóch rzeczy:

  1. Dlaczego nie Dispose() jest niedostępny? WcfChannelFactory<T> wywodzi się z ChannelFactory<T>, który pochodzi od ChannelFactory, który implementuje IDisposable. Jednak ChannelFactory nie ma metody Dispose(). Jak to jest możliwe?

  2. Gdybym mógł (powinien?) Po prostu zadzwonić Close() na _channelFactory, dlaczego państwo nie dokumentacja XML Close() będzie również zadzwonić Dispose()? Może to nie będzie? To jest mylące.

Odpowiedz

7
  1. Jako metoda Dispose jest realizowany osobiĹ dla interfejsu IDisposable można zobaczyć tylko metodę, gdy masz odniesienia typu IDisposable. Ta metoda istnieje, ale nie możesz jej zobaczyć, gdy masz odniesienie do innego typu. Jest podobny do tego, jak prywatna metoda jest widoczna tylko z kodu wewnątrz samej klasy, mimo że jest zawsze obecna.

  2. Metodanie wywoła dla tej klasy Dispose. Metoda nie zamyka fabryki, rozpoczyna asynchroniczny proces zamykania. Gdy metoda Close kończy się, proces zamykania nie jest zakończony, więc obiekt nie może być w tym czasie usunięty.

+0

Więc jak mam do dysponowania '_channelFactory'? Czy mam nazwać 'Close()'? Czy mam nazwać "Dispose()"? –

+0

@Bob, nevermind. Źle przeczytałem twoje oryginalne pytanie. Wygląda na to, że wdrażasz swój własny wzór jednorazowy. –

+0

@AnthonyPegram Nie mogę. Metoda zwraca '_channelFactory'. Konsument owija wywołanie w 'using', więc moja klasa musi implementować' IDiposable' i odinstaluj go. –

2

Sposób Dispose wdrożono jako wyraźny członka interfejsu IDisposable. Oznacza to, że definicja wygląda mniej więcej tak:

public class WcfChannelFactory<T> : IDisposable 
{ 
    public void IDisposable.Dispose() 
    { 
     ... 
    } 
} 

Tutorial: Explicit Interface Implementation Tutorial

+0

Wiem, jaka jest jawna implementacja interfejsu. Dzięki! –

Powiązane problemy