WCF关闭最佳实践

时间:2011-07-31 08:01:13

标签: wcf

我读到使用WCF代理的最佳做法是:

YourClientProxy clientProxy = new YourClientProxy();

try
{
   .. use your service
   clientProxy.Close();
}
catch(FaultException)
{
   clientProxy.Abort();
}
catch(CommunicationException)
{
   clientProxy.Abort();
}
catch (TimeoutException)
{ 
   clientProxy.Abort();
}

我的问题是,在我分配代理之后,我为它分配了事件处理程序,并使用代理初始化其他方法:

public void InitProxy()
{
    sdksvc = new SdkServiceClient();
    sdksvc.InitClusteringObjectCompleted += new EventHandler<InitClusteringObjectCompletedEventArgs>(sdksvc_InitClusteringObjectCompleted);
    sdksvc.InitClusteringObjectAsync(Utils.DSN, Utils.USER,Utils.PASSWORD);
    sdksvc.DoClusteringCompleted += new EventHandler<DoClusteringCompletedEventArgs>(sdksvc_DoClusteringCompleted);
    sdksvc.CreateTablesCompleted += new EventHandler<CreateTablesCompletedEventArgs>(sdksvc_CreateTablesCompleted);
}

我现在需要每次使用代理时调用InitProxy()方法,如果我想按照最佳实践建议使用它。

关于如何避免这种情况的任何想法?

2 个答案:

答案 0 :(得分:0)

我没有看到ClientProxy和InitProxy()是如何链接的,但如果它们被链接这个强大的我会将ClientProxy的初始化移动到InitProxy(或者创建一个初始化它们的方法),这样你就可以控制他们的生命都来自那里。

答案 1 :(得分:0)

有几种选择。一种选择是编写一个辅助类,如下所示:

public class SvcClient : IDisposable {
   public SvcClient(ICommunicationObject service) {
      if( service == null ) {
         throw ArgumentNullException("service");
      }
      _service = service;
      // Add your event handlers here, e.g. using your example:
      sdksvc = new SdkServiceClient();
      sdksvc.InitClusteringObjectCompleted += new EventHandler<InitClusteringObjectCompletedEventArgs>(sdksvc_InitClusteringObjectCompleted);
      sdksvc.InitClusteringObjectAsync(Utils.DSN, Utils.USER,Utils.PASSWORD);
      sdksvc.DoClusteringCompleted += new EventHandler<DoClusteringCompletedEventArgs>(sdksvc_DoClusteringCompleted);
      sdksvc.CreateTablesCompleted += new EventHandler<CreateTablesCompletedEventArgs>(sdksvc_CreateTablesCompleted);
   }
   public void Dispose() {
      try {
         if( _service.State == CommunicationState.Faulted ) {
            _service.Abort();
         }
      }
      finally {
         _service.Close();
      }
   }
   private readonly ICommunicationObject _service;
}

要使用此类,请编写以下内容:

var clientProxy = new YourClientProxy();
using(new SvcClient(clientProxy)) {
   // use clientProxy as usual. No need to call Abort() and/or Close() here.
}

当调用SvcClient的构造函数时,它会根据需要设置SdkServiceClient实例。此外,SvcClient类清理服务客户端代理以及根据需要中止和/或关闭连接,无论控制流如何离开using - 块。