使用C#建议AOP

时间:2010-02-10 03:53:45

标签: c# asp.net domain-driven-design aop

我有一个ASP.NET 3.5 SP1 Webforms应用程序。我使用带有DI(autofac)的MVP模式(监督控制器)。我的演示者调用我的域(DDD)中定义的存储库合同,这些合同在基础结构项目中实现。

演示者调用的存储库方法可能会出现问题,因此我需要记录异常,然后在视图上设置错误消息。

过去我会将另一个参数添加到Presenter构造函数中,将引用存储在Base Presenter中,并在我的Catch块中调用Log方法。我不是很喜欢这个,但它完成了工作。

我可以使用工厂来获取日志记录类as described here,但我想首先探索AOP,因为它看起来非常有趣。

我已经完成了关于编译时与运行时AOP的阅读,并且我想知道人们对不同解决方案,优缺点,建议词等的经验是什么。

从挖掘开始,我认为在.NET中有4个主要的AOP框架

  • 温莎城堡 - 我一般都远离这个,因为它做了很多我真的不需要的东西
  • Spring.net - 听起来它有良好的记录,但通过其xml配置激发了恐惧(我不喜欢非流畅的配置)
  • PostSharp - 属性驱动(我喜欢这个),但有一点some line number issues,不确定它们是否仍然存在
  • Unity - 很多我不需要的东西

我看到another question有一些好的答案,但是从一年半前开始。是否有更新的“更好”的框架在此期间开发,或者对现有解决方案进行了哪些改进应该加以考虑?

作为参考,我选择了Autofac for DI,因为它流利,易于使用,找不到任何关于它的负面评论,它只是有效。

我是否应该尝试使用哪种AOP框架?感谢阅读所有这些并添加任何想法。

3 个答案:

答案 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很长一段时间,我必须说我很享受易用性和实现的简单性。

我必须个人补充一点,当我使用框架时,我总是试图坚持使用单一的责任框架,除非框架包含我需要的许多组件或称赞核心。