2010-04-08 62 views
3

我想重写生成的代理(ClientBase)的Dispose方法,因为处置代理时会调用Close并在通道出现故障时抛出异常。WCF:使用分部类覆盖客户端的Dispose方法是否安全?

我想出的唯一方法是创建一个部分类对我生成的代理,使之从IDisposable继承:

public partial class MyServiceProxy : IDisposable 
    { 
     #region IDisposable Members 

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

     #endregion 
    } 

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

您是否看到此策略的任何问题?

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

是很好,如果我能够让我的代理继承一个基类...

回答

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代理价格昂贵创造,所以你通常想尽量让他们活着,而不是创造和处置他们每一个几秒钟(或更多)。这适用于不经常使用的客户端。

+0

我喜欢你的版本,这样我就不需要创建一个类为每个代理。谢谢! – pdiddy 2010-04-09 01:57:45