2010-12-22 9 views
0

Warum implementiert die konkrete WCF-Clientimplementierung IDisposable, aber nicht die standardmäßige Standardschnittstelle, die für jeden WCF-Client als Teil von .net bereitgestellt wird?WCF IDisposable Design Diskrepanz

using(WcfClient client = new WcfClient) 
    { 
     client.WebMethod(); 
    } 


    using(IWcfClient client = new WcfClient) 
    { 
     client.WebMethod(); 
    } //throws bc it's not part of the Interfact but is the part of the base class every wcf client implements along the interface? 

Warum es ein Teil der Schnittstelle nicht zu machen, wie man wählen kann, wie die wcf in einer benutzerdefinierten Art und Weise der Reinigung bis zu handhaben?

+0

Auf einer tangentialen beachten Sie bitte, dass das Mischen WCF-Clients mit 'using'-Blöcken können Ausnahmen maskieren. http://stackoverflow.com/questions/573872/what-is-the-best-workaround-for-the-wcf-client-using-block-issue –

Antwort

1

Es ist, weil die Schnittstelle ist der Datenvertrag des Web-Service und es macht keinen Sinn für einen Datenvertrag zu implementieren IDisposable. Ein Datenvertrag enthält Betriebsverträge, es gibt nichts zu veräußern. Es ist der Kanal, der entsorgt werden muss, und deshalb implementiert die automatisch generierte Proxy-Klasse (WcfClient) IDisposable.

Man könnte dies versuchen, wenn Sie darauf bestehen, auf dem Datenvertrag mit:

IWcfClient client = new WcfClient(); 
using((IDisposable)client) 
{ 
    client.WebMethod(); 
} 

aber ich sehe nicht wirklich was mit falsch:

using(var client = new WcfClient()) 
{ 
    client.WebMethod(); 
} 
+0

Ja und wie ist die konkrete Instanz des Clients keine Kapselung des 2 Endpunkt-Kanals. Wie unterscheidet es sich dann von der Schnittstelle in diesem Sinne? – dexter

+0

@Max, die WcfClient-Klasse leitet sich von 'ClientBase ' ab und implementiert den Datenvertrag. Es ist diese "ClientBase ", die den Kanal einkapselt und notwendig ist, IDisposable, nicht den Datenvertrag zu implementieren. –