调用WCF服务的多种方法

时间:2010-10-06 11:02:20

标签: wcf design-patterns principles

我有一个类,用我的WCF服务处理我的应用程序中的所有交互,似乎MSDN说使用With)_语句与WCF是坏的 - 我可以看到为什么这是坏的并同意它( http://msdn.microsoft.com/en-us/library/aa355056.aspx)

我的问题是他们建议的实现方法意味着我有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个不同的地方添加记录工作

有没有人知道如何在重用代码

中获得更多资源

感谢

1 个答案:

答案 0 :(得分: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异常方法调用异常处理机制,传入应在此处应用的异常策略的名称的地方。

在大多数情况下,您可以将异常处理逻辑减少到一两行代码,从而为您带来以下好处:

  • 异常处理行为(策略)的即时可配置性
  • 使用绑定到特定类型的例外和例外策略的自定义异常处理程序的可扩展性
  • 更好的可管理性和代码可读性