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

标签 c# asp.net .net wcf logging

我有一个 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( ... );
  }
);

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

关于c# - 重复代码位的设计模式/C#技巧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15203331/

相关文章:

c# - 矩形重载方法问题

c# - 返回比接口(interface)指定更多的派生类

c# - 我可以将 HTML 代码放在标签中以显示在我的页面中吗?

c# - 无法从单例 'MyDbContext' 使用范围服务 'Microsoft.AspNetCore.Hosting.Internal.HostedServiceExecutor'

c# - 如何在 c# 中动态创建 JSON 对象(从 ASP.NET 资源文件)?

c# - 带有 while (true) 的特殊重载决议

c# - 线程可以作为另一个用户执行吗? (.NET 2.0/3.5)

c# - 创建具有一长串参数的方法还是将参数包装到一个对象中更好?

c# - 用于后续加载的 Javascript 事件,例如 window.onload

java - 在.NET 到 Java/Spring 中实现 RSA 公钥/私钥解密