2010-07-12 5 views
1

Au travail, j'ai trouvé une classe d'aide pour gérer les services WCF qui implémente IDisposable et a un ServiceAgent qui dérive de System.ServiceModel.ClientBase. La méthode Dispose() ferme tous les services WCF ouverts. L'assistant expose les méthodes qui enveloppent les appels aux méthodes du ServiceAgent. Chaque méthode est construite sur ce modèle:IDisposable et WCF

public void WCFMethod1() 
{ 
    using(this) 
    { 
     this.ServiceAgent.WCFMethod1(); 
    } 
} 

public override void Dispose() 
{ 
    try 
    { 
     this.ServiceAgent.Close(); 
    } 
    catch 
    { 
     this.ServiceAgent.Abort(); 
    } 
    finally 
    { 
     this.ServiceAgent = null; 
    } 
} 

Voici la question: est-ce que l'utilisation de (ce) est une bonne pratique?

+0

il est une solution de contournement pour bug/mauvais code de WCF. Lire la suite sur http://geekswithblogs.net/bcaraway/archive/2008/07/06/123622.aspx – Rohit

+0

Non ce n'est pas une implémentation du travail. Le * Dispose() * est censé nettoyer la classe "* WCFMethod *" et ne pas fermer les services. Comme Andrey et Pavel disent que cette façon de faire est confuse. Lorsque « * Dispose() * » est appelé, je ne suis pas attendre en utilisant cet objet plus parce qu'il est censé être disposé (et par définition, il peut être nettoyé à tout moment par le GC) –

Répondre

1

Je ne l'aime pas. Je pense que cette classe devrait être a) disposée une fois b) par le code qui l'instancie. IDisposable habituellement compris comme moyen d'implémenter le modèle RAII. MSDN déclare explicitement:

Si la méthode Dispose d'un objet est appelé plus d'une fois, l'objet doit ignorer tous les appels après la première. L'objet ne doit pas déclencher une exception si sa méthode Dispose est appelée plusieurs fois. Les méthodes d'instance autres que que Dispose peuvent lancer une exception ObjectDisposedException lorsque les ressources sont déjà éliminées.

Ainsi, les utilisateurs trouveront ce comportement déroutant, donc je vous recommande de concevoir la classe afin qu'il soit instancié par appel:

using (var clientFactory = new ClientFactory()) 
    clientFactory.Client.WCFMethod1(); 
1

Pour que ce code est une mauvaise pratique. C'est l'appelant qui décide si l'instance est nécessaire ou non. Il est supposé qu'après la méthode Dispose, aucun autre appel de méthode n'est autorisé (conformément aux directives, l'instance passe à l'état éliminé). Imaginez que vous appeliez une méthode, puis une autre et obteniez l'exception ObjectDisposed. Un peu bizarre, n'est-ce pas?