我有一个ASP.NET 3.5 SP1 Webforms应用程序。我使用带有DI(autofac)的MVP模式(监督控制器)。我的演示者调用我的域(DDD)中定义的存储库合同,这些合同在基础结构项目中实现。
演示者调用的存储库方法可能会出现问题,因此我需要记录异常,然后在视图上设置错误消息。
过去我会将另一个参数添加到Presenter构造函数中,将引用存储在Base Presenter中,并在我的Catch块中调用Log方法。我不是很喜欢这个,但它完成了工作。
我可以使用工厂来获取日志记录类as described here,但我想首先探索AOP,因为它看起来非常有趣。
我已经完成了关于编译时与运行时AOP的阅读,并且我想知道人们对不同解决方案,优缺点,建议词等的经验是什么。
从挖掘开始,我认为在.NET中有4个主要的AOP框架
我看到another question有一些好的答案,但是从一年半前开始。是否有更新的“更好”的框架在此期间开发,或者对现有解决方案进行了哪些改进应该加以考虑?
作为参考,我选择了Autofac for DI,因为它流利,易于使用,找不到任何关于它的负面评论,它只是有效。
我是否应该尝试使用哪种AOP框架?感谢阅读所有这些并添加任何想法。
答案 0 :(得分:4)
简短回答,为了简单易用,PostSharp真的不会出错。
更长的答案:在我看来,你应该根据你想要达到的目标在两个框架之间做出选择。
如果您想要根据上下文更改的方面,请考虑Spring.NET(或任何基于配置在运行时注入代码的aop框架)。这允许您根据自己的操作自定义对象的行为。例如,通过您的配置,您可以在控制台应用程序中使用一种类型的日志记录,而在Web应用程序中使用另一种日志记录。请注意,Spring也是一个DI容器(以及其他一些东西) - 它远远超出了AOP,绝对值得学习如何使用。
另一方面,如果你想要总是的行为,无论上下文如何,那么PostSharp(编译时编织)是你最好的选择。这实际上与在应用方面的每个方法中包含代码的情况相同。
对于你正在做的事情,我建议你从PostSharp开始。
答案 1 :(得分:1)
对于简单的方面场景,我将方法体作为块传递给处理方面的泛型方法,即实现the «hole in the middle» design pattern。
示例:
public class Class
{
public void MethodWithoutAspect()
{
var dummy = new string('a', 10);
Console.WriteLine(dummy);
}
public void MethodWithAspect()
{
Aspect.LogException(() =>
{
var dummy = new string('a', 10);
Console.WriteLine(dummy);
});
}
}
public static class Aspect
{
public static void LogException(Action block)
{
try
{
block();
}
catch (Exception e)
{
Log(e);
throw;
}
}
private static void Log(Exception e)
{
throw new NotImplementedException();
}
}
答案 2 :(得分:0)
我一直在使用PostSharp很长一段时间,我必须说我很享受易用性和实现的简单性。
我必须个人补充一点,当我使用框架时,我总是试图坚持使用单一的责任框架,除非框架包含我需要的许多组件或称赞核心。