调用WCF服务的多个方法

调用WCF服务的多个方法,wcf,design-patterns,principles,Wcf,Design Patterns,Principles,我有一个类处理我的应用程序中与我的WCF服务的所有交互,似乎MSDN说与WCF一起使用Using)uu语句是不好的-我可以理解为什么这是不好的,并同意它(http://msdn.microsoft.com/en-us/library/aa355056.aspx) 我的问题是,他们建议的实现方法将意味着我有10个方法[作为我服务中的10个公共方法]具有相同的结构代码,这当然不符合DRY原则-代码看起来类似于以下内容: try { results = _client.MethodCall(i

我有一个类处理我的应用程序中与我的WCF服务的所有交互,似乎MSDN说与WCF一起使用Using)uu语句是不好的-我可以理解为什么这是不好的,并同意它(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个不同的地方添加日志记录工作

有没有人能告诉我如何在重用代码方面变得更加足智多谋

谢谢


paul

我将使用一些通用的、可配置的异常处理组件,允许将日志记录、重新抛出等基本异常处理与实际处理位置分离。这种组件的一个例子是微软的

然后您可能会得到如下代码:

try
{
    results = _client.MethodCall(input parameteres);
    _client.Close();
}
catch (Exception ex)
{
    _client.CloseIfNeeded();
    if (!ex.Handle("Wcf.Policy")) throw;
}
其中,
CloseIfNeeded
表示封装WCF通道关闭逻辑的自定义扩展方法,
Handle
异常方法调用异常处理机制,传入应在此位置应用的异常策略的名称

在大多数情况下,您可以将异常处理逻辑简化为一行或两行代码,从而获得以下好处:

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

我将使用一些通用的、可配置的异常处理组件,允许将日志记录、重新抛出等基本异常处理与实际处理位置分离。这种组件的一个例子是微软的

然后您可能会得到如下代码:

try
{
    results = _client.MethodCall(input parameteres);
    _client.Close();
}
catch (Exception ex)
{
    _client.CloseIfNeeded();
    if (!ex.Handle("Wcf.Policy")) throw;
}
其中,
CloseIfNeeded
表示封装WCF通道关闭逻辑的自定义扩展方法,
Handle
异常方法调用异常处理机制,传入应在此位置应用的异常策略的名称

在大多数情况下,您可以将异常处理逻辑简化为一行或两行代码,从而获得以下好处:

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

我认为您提出的解决方案非常好。使用扩展方法将使其非常有用-如果我使用closeIfRequired()扩展System.ServiceModel.ClientBase,您认为这是一个好的举措还是一个坏的举措?如何为
System.ServiceModel.ICommunicationObject
实现它?这将更符合该接口的体系结构意图,该接口为通信状态管理提供了原语。我认为您建议的解决方案非常好。使用扩展方法将使其非常有用-如果我使用closeIfRequired()扩展System.ServiceModel.ClientBase,您认为这是一个好的举措还是一个坏的举措?如何为
System.ServiceModel.ICommunicationObject
实现它?这将更符合该接口的体系结构意图,该接口为通信状态管理提供原语。