在工作中,我发现了一个帮助类来管理WCF Services,它实现了IDisposable,并且有一个从System.ServiceModel.ClientBase派生的ServiceAgent。Dispose()方法关闭所有打开的WCF服务。帮助器公开包装对ServiceAgent方法的调用的方法。每个方法都是基于该模式构建的:
public void WCFMethod1()
{
using(this)
{
this.ServiceAgent.WCFMethod1();
}
}
public override void Dispose()
{
try
{
this.ServiceAgent.Close();
}
catch
{
this.ServiceAgent.Abort();
}
finally
{
this.ServiceAgent = null;
}
}这里有一个问题:使用(这个)是一个好的实践吗?
发布于 2010-07-12 22:27:53
我不喜欢这个。我认为这个类应该a)被实例化它的代码处理一次b)。IDisposable通常被理解为实现RAII模式的方式。MSDN明确声明:
如果对象的Dispose方法被多次调用,则该对象必须忽略第一次之后的所有调用。如果对象的Dispose方法被多次调用,则不能引发异常。Dispose以外的实例方法可以在资源已释放时引发ObjectDisposedException。
所以用户会觉得这个行为很混乱,所以我建议设计这个类,让它在每次调用时都被实例化:
using (var clientFactory = new ClientFactory())
clientFactory.Client.WCFMethod1();发布于 2010-07-12 22:57:21
可以肯定的是,这段代码是一个糟糕的实践。调用者决定是否需要该实例。假设在调用Dispose方法之后,不再允许方法调用(根据指导原则,实例将切换到disposed状态)。想象一下,您先调用某个方法,然后再调用另一个方法,然后得到ObjectDisposed异常。有点奇怪,不是吗?
https://stackoverflow.com/questions/3229358
复制相似问题