加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

设计模式/ C#技巧重复位的代码

发布时间:2020-12-15 06:55:14 所属栏目:百科 来源:网络整理
导读:我有一个WCF服务记录任何异常,然后将它们作为FaultExceptions抛出. 我正在做很多重复,例如在每个服务方式. try { // do some work}catch(Exception ex){ Logger.log(ex); // actually will be Fault Exception but you get the idea. throw ex;} 我正在寻找
我有一个WCF服务记录任何异常,然后将它们作为FaultExceptions抛出.

我正在做很多重复,例如在每个服务方式.

try { 
   // do some work

}
catch(Exception ex)
{
  Logger.log(ex);

  // actually will be Fault Exception but you get the idea.
  throw ex;
}

我正在寻找一种更优雅的方式来做到这一点,因为我在每个服务中剪切和粘贴try / catch.

有没有一个设计模式/ C#技巧可以用来使这更优雅?

解决方法

你在说AOP – Aspect Oriented Programming

这是我通过将“工作”作为lambda传递的方式:

public partial static class Aspect
{
  public static T HandleFaultException<T>( Func<T> fn )
  {
    try
    { 
      return fn();
    }
    catch( FaultException ex )
    {
      Logger.log(ex);
      throw;
    }
  }
}

然后用它:

return Aspect.HandleFaultException( () =>
  {
    // call WCF
  }
);

还有其他方法可以实现同样的目标,甚至是一些商业产品,但我觉得这样做是最明确和灵活的.

例如,您可以编写一个为您创建和处置客户端的方面:

public partial static class Aspect
{
  public static T CallClient<T>( Func<Client,T> fn )
  {
    using ( var client = ... create client ... )
    {
      return fn( client );
    }
  }
}

所以:

return Aspect.CallClient( client =>
  {
    return client.Method( ... );
  }
);

然后,您可以包装通常要应用的所有方面,并创建一个主要方面.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读