我构建了一个 c# .net 4.0 库。
所有方法都是公共且静态的。
我想使用方面编程库添加一个方面,它可以执行以下操作:
try block
1. call method (if method throws exception)
catch block
2. log the exception and massage the exception
it is a dll (class library project)
请您建议是否有一种方法可以在一个类中添加 try/catch 例程,而不是一个一个地包装所有方法?
因为您提到了单词
static
,ninject或castle-windsor或其他任何基于castle-dynamicproxy的内容都不会帮助您,因为它们能够围绕常规方法添加方面。所以你有两个选择:
添加单独的手写跟踪装饰器,该装饰器将添加所需的功能,而无需更改现有代码
// Decorated calls
TraceDecorator.Aspect(() => StaticLogic.SuccessfulCall());
TraceDecorator.Aspect(() => StaticLogic.ExceptionCall());
TraceDecorator.Aspect(() => StaticLogic.SuccessfulCallWithReturn(42));
TraceDecorator.Aspect(() => StaticLogic.ExceptionCallWithReturn(42));
// Decorator itself
public static class TraceDecorator
{
public static T Aspect<T>(Func<T> func)
{
try
{
return func();
}
catch(Exception ex)
{
LogException(ex);
return default(T);
}
}
public static void Aspect(Action func)
{
try
{
func();
}
catch(Exception ex)
{
LogException(ex);
}
}
private static void LogException(Exception ex)
{
Console.WriteLine("Traced by TraceDecorator: {0}", ex);
}
}
完整样本可在此处
请参阅 NConsern .NET AOP Framework,一个开源项目。
示例
你的静态类
static public class Calculator
{
static public int Add(int a, int b)
{
return a + b;
}
}
记录器
static public class Logger
{
static public void Log(MethodInfo method, object[] arguments, Exception exception)
{
Console.WriteLine("{0}({1}) exception = {2}", method.Name, string.Join(", ", arguments), exception.Message);
}
}
方面:登录异常
public class Logging : IAspect
{
public IEnumerable<IAdvice> Advise(MethodInfo method)
{
yield return Advice.Basic.After.Throwing((instance, arguments, exception) =>
{
Logger.Log(method, arguments, exception);
});
}
}
Joinpoint:计算器的方法
var calculatorMethods = new Func<MethodInfo, bool>(method => method.ReflectedType == typeof(Calculator));
激活连接点的日志记录
Aspect.Weave<Logging>(calculatorMethods);