2010-07-12 59 views
1

在工作中,我找到了一个帮助程序类来管理WCF服务,该服务实现了IDisposable并具有一个派生自System.ServiceModel.ClientBase的ServiceAgent。 Dispose()方法关闭所有打开的WCF服务。该帮助器公开了将调用包装到ServiceAgent的方法中的方法。每种方法都建立在该模式上:IDisposable和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; 
    } 
} 

下面是问题:使用(这)一个良好的做法?

+0

它是解决WCF错误/错误代码的解决方法。阅读更多在http://geekswithblogs.net/bcaraway/archive/2008/07/06/123622.aspx – Rohit 2011-03-21 09:06:49

+0

不,它不是一个工作的实施。 * Dispose()*应该清理“* WCFMethod *”类并且不关闭服务。正如安德烈和帕维尔所说,这种做法令人困惑。当“* Dispose()*”被调用时,我不希望再使用这个对象,因为它应该被丢弃(根据定义,它可以随时由GC清理) – 2011-07-12 08:27:07

回答

1

我不喜欢它。我认为这个类应该是a)一次b)用实例化它的代码来处理。 IDisposable通常理解为实现RAII模式的方式。 MSDN明确规定:

如果对象的Dispose方法是 称为不止一次,对象必须 忽略第一个之后的所有呼叫。 如果其Dispose方法多次调用 ,则该对象不得抛出异常 。其他 实例方法比Dispose可以抛出 ObjectDisposedException当资源 已被处置。

所以用户会发现这种行为令人费解,所以我建议,使其每次呼叫实例化设计类:

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

可以肯定这个代码是一个不好的做法。决定实例是否需要的是调用者。据推测,在调用Dispose方法后,不允许再有方法调用(根据指导方针,实例会切换到处置状态)。想象一下你调用一些方法,然后调用另一个方法并获得ObjectDisposed异常。有点奇怪,不是吗?