C# · 12月 30, 2021

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

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

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