2010-10-06 131 views
0

我有一个类来处理我的应用程序中与我的WCF服务的所有交互,并且似乎MSDN认为使用using)_语句与WCF很差 - 我可以看到为什么会这样是不好的,并同意它(http://msdn.microsoft.com/en-us/library/aa355056.aspx)调用WCF服务的多种方法

我的问题是,他们建议的实现方法将意味着我有10个方法[10在我服务的公共方法]将具有相同的结构代码,这当然不符合DRY委托 - 代码看起来类似于以下内容:

try 
{ 
    results = _client.MethodCall(input parameteres); 
    _client.Close(); 
} 
catch (CommunicationException) 
{ 
    if (_client != null && _client.State != CommunicationState.Closed) 
    { 
     _client.Abort(); 
    } 
} 
catch (TimeoutException) 
{ 
    if (_client != null && _client.State != CommunicationState.Closed) 
    { 
     _client.Abort(); 
    } 
} 
catch (Exception ex) 
{ 
    if (_client != null && _client.State != CommunicationState.Closed) 
    { 
     _client.Abort(); 
    } 
    throw; 
} 

这还没有任何日志记录,但当然,当我来开始记录它,然后我将不得不在几乎10个不同的地方添加日志记录工作

没有任何人有任何提示我如何可以更有机会在这里重用代码

感谢

保罗

回答

5

我会使用一些通用的,可配置的异常处理组件,可以让喜欢记录基本的异常处理加工,再投掷等从实际脱钩处理地点。这种组件的一个例子是微软的Exception Handling Application Block

然后,你可以结束了这样的代码:

try 
{ 
    results = _client.MethodCall(input parameteres); 
    _client.Close(); 
} 
catch (Exception ex) 
{ 
    _client.CloseIfNeeded(); 
    if (!ex.Handle("Wcf.Policy")) throw; 
} 

其中CloseIfNeeded表示自定义扩展方法封装WCF通道关闭逻辑和Handle异常方法调用的异常处理机构,传递一个应在此处应用的例外策略的名称。

在大多数情况下,可以减少异常处理逻辑的代码,一个体面的一两行,给你几个好处:

  • 的异常处理行为,即时的可配置性(政策)
  • 扩展与自定义绑定到特定类型的异常和异常的政策
  • 更好的可管理性和代码的可读性的异常处理程序
+0

我认为你有S中的解决方案uggested非常好。扩展方法的使用将使这非常有用 - 如果我扩展System.ServiceModel.ClientBase与CloseIfNeeded()你认为这将是一个好的或坏的举动? – stack72 2010-10-06 13:30:28

+1

如何为'System.ServiceModel.ICommunicationObject'实现它?这将更符合该接口的架构意图,该接口为通信状态管理提供原语。 – 2010-10-06 13:46:12

+0

虐待给了一个去 - 谢谢:) – stack72 2010-10-06 15:06:12