首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IDisposable和WCF

IDisposable和WCF
EN

Stack Overflow用户
提问于 2010-07-12 22:16:43
回答 2查看 931关注 0票数 2

在工作中,我发现了一个帮助类来管理WCF Services,它实现了IDisposable,并且有一个从System.ServiceModel.ClientBase派生的ServiceAgent。Dispose()方法关闭所有打开的WCF服务。帮助器公开包装对ServiceAgent方法的调用的方法。每个方法都是基于该模式构建的:

代码语言:javascript
复制
public void WCFMethod1()
{
    using(this)
    {
        this.ServiceAgent.WCFMethod1();
    }
}

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

这里有一个问题:使用(这个)是一个好的实践吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-12 22:27:53

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

如果对象的Dispose方法被多次调用,则该对象必须忽略第一次之后的所有调用。如果对象的Dispose方法被多次调用,则不能引发异常。Dispose以外的实例方法可以在资源已释放时引发ObjectDisposedException。

所以用户会觉得这个行为很混乱,所以我建议设计这个类,让它在每次调用时都被实例化:

代码语言:javascript
复制
using (var clientFactory = new ClientFactory())
   clientFactory.Client.WCFMethod1();
票数 1
EN

Stack Overflow用户

发布于 2010-07-12 22:57:21

可以肯定的是,这段代码是一个糟糕的实践。调用者决定是否需要该实例。假设在调用Dispose方法之后,不再允许方法调用(根据指导原则,实例将切换到disposed状态)。想象一下,您先调用某个方法,然后再调用另一个方法,然后得到ObjectDisposed异常。有点奇怪,不是吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3229358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档