2010-09-08 5 views
0

En général, j'ai le code client similaire à quelque chose comme ceci:Test IDisposable et WCF client

// SomeOtherServiceClient would be injected in actual code. 
ISomeOtherService client = new SomeOtherServiceClient(); 

... pour que je puisse se moquer de service pour les tests. Mais maintenant j'ai un service WCF qui a le mode de contexte mis à PerSession et implémente IDisposable.

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] 
public class SampleService : ISampleService, IDisposable 
{ 
    public void SampleMethod() { ... } 
    public void Dispose() { ... } 
} 

Si je veux mettre le client dans une instruction using, est-il encore un moyen pour moi de se moquer du client pour les tests?

// SampleServiceClient would be injected in actual code. 
using (var client = new SampleServiceClient()) 
{ 
    ... 
} 
+0

Juval Lowy recommande explicitement contre l'instruction using sur proxys. En présence d'une session de transport, toute attente côté service risque d'endommager le canal. Essayer de distribuer le proxy lorsque le canal est en défaut renvoie une exception CommunicationObjectFaultedException. –

Répondre

1

Si je comprends le problème, il est que ISomeOtherService est un contrat de service WCF, et ne met pas IDisposable même si tous les clients d'exécution seront. Vous pouvez contourner cela en changeant l'instruction using à quelque chose comme ceci:

public void SampleMethod() 
{ 
    //client was injected somehow 
    using(this.client as IDisposable) 
    { 
     ... 
    } 
} 
+0

Cela ne résout pas le problème mentionné par Andrew ci-dessus, la méthode disposer va lancer une exception sur un canal défaillant. Utilisez la méthode de Juval pour fermer les proxies en toute sécurité. – MetalLemon