WCF:使用部分类覆盖客户端的Dispose方法是否安全?

3

我希望重写生成的代理(ClientBase)的Dispose方法,因为释放代理会调用Close并且当通道出现故障时可能会抛出异常。

我想到的唯一方法是创建一个部分类来继承IDisposable

 public partial class MyServiceProxy : IDisposable
    {
        #region IDisposable Members

        public void Dispose()
        {
            if (State != System.ServiceModel.CommunicationState.Faulted)
                Close();
            else
                Abort();
        }

        #endregion
    }

我进行了一些测试,我的Dispose方法确实被调用了。

您认为这种策略有什么问题吗?

此外,我不喜欢我必须为每个生成的代理创建这个局部类。

如果能够让我的代理继承自一个基类就好了...

2个回答

2

没有问题。以这种方式自定义设计师生成的代码,正是部分类旨在提供的功能之一,并且这也是处理ClientBase上损坏的IDisposable实现的推荐方法之一。

至于为每个WCF客户端重新实现此代码 - 不幸的是,如果您想要使用这些内容中的IDisposable模式,则必须这样做。您可以将if/else块提取到实用程序方法中,但仍需要为每个客户端创建一个部分类并覆盖Dispose方法。

鉴于以上做法非常繁琐,许多人选择使用Service Proxy Helper(服务代理助手),因为它不需要编写任何新代码。

我自己使用稍微修改过的版本:

public static class Service<TProxy>
    where TProxy : ICommunicationObject, IDisposable, new()
{
    public static void Using(Action<TProxy> action)
    {
        TProxy proxy = new TProxy();
        bool success = false;
        try
        {
            action(proxy);
            proxy.Close();
            success = true;
        }
        finally
        {
            if (!success)
            {
                proxy.Abort();
            }
        }
    }
}

这使得编写此类代码成为可能:

Service<MyServiceClient>.Using(svc => svc.PerformOperation());

或者:

Service<MyServiceClient>.Using(svc =>
{
    var result = svc.PerformOperation();
    ProcessResult(result);
});

注意:WCF代理的创建成本很高,因此通常希望尽可能长时间地保持它们的活性,而不是每隔几秒钟(或更长时间)创建和处理它们。这适用于不经常使用的客户端。


我喜欢你的版本,这样我就不需要为每个代理创建一个类。谢谢! - pdiddy

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接