我有一个 WCF 服务,它记录所有异常,然后将它们作为错误异常抛出。
我做了很多重复,例如在每个服务方法中。
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 http://en.wikipedia.org/wiki/Aspect-oriented_programming
以下是我通过将“work”作为 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 );
}
}
}
and so:
return Aspect.CallClient( client =>
{
return client.Method( ... );
}
);
然后,您可以包装您通常想要应用的所有方面并创建一个主方面。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)