.Net中AOP的最佳实现是什么?

时间:2009-03-11 08:14:21

标签: .net aop

在C#,VB.net中有很多AOP实现。这是一些AOP实现:

.Net中AOP的最佳实现是什么?我应该用什么?

5 个答案:

答案 0 :(得分:45)

如果动态拦截可以满足您的需求,我认为Castle Dynamic Proxy是首选解决方案。许多其他想要提供AOP功能的框架在内部使用此框架。通常,大多数现有的IoC容器现在提供了一些动态拦截机制(Spring.NET,Castle Windsor,StructureMap等)。如果您已经使用过IoC容器,也许可以更容易地看一下它的建议。

如果动态拦截无法满足您的需求(编织密封类,拦截非虚拟调用等),那么您当然需要静态编织。 PostSharp是此域中的参考。

请注意,它也存在Linfu,可用于利用两种AOP时尚。

答案 1 :(得分:13)

“最好”是主观的。

首先,列出您需要的功能,架构等列表。然后查找满足您需求的选项,而不会引入不必要的复杂性。例如,有几个面向接口:您的代码目前面向接口吗?如果没有,PostSharp可能是更好的选择(被编织到原始类中)。但当然,PostSharp无法在运行时配置......马匹用于课程。

答案 2 :(得分:11)

在.NET中进行面向方面编程的最佳方法是使用众所周知的设计技术。例如,通过应用SOLID principles,您可以实现灵活性和模块化,从而允许添加横切关注点。如果您拥有正确的设计,您甚至可以在没有任何框架的情况下应用大多数横切关注点。认为OOP不适合做AOP是一种谬论。

以下是一些提示:

  • 不依赖具体实例,而是依赖于抽象。
  • 不要将横切关注点和业务逻辑混合在同一个类中。
  • 通过在实现这些问题的类中使用业务逻辑包装类来添加横切关注点(decorators)。
  • 在设计中查找常见工件并对其进行相同的建模,最好使用相同类型的抽象。例如,请查看thisthis

当你得到正确的抽象时,向系统添加新的横切关注点只需要编写一个新的装饰器类并将其包装在正确的实现中。如果抽象是通用的,你可以围绕一大组类包装一个装饰器(这正是AOP的意思)。

尽管动态代理和代码编织等技术可以更容易地使用设计糟糕的应用程序,但是对于良好的设计来说真的没有其他选择。迟早你会被烧伤。这并不意味着不应该使用动态代理生成和代码编织。但是如果没有适当的应用程序设计,即使这些技术也会有所帮助。

答案 3 :(得分:5)

我不知道最好的,有很多框架,并且没有足够的时间来尝试所有这些。

我确实使用了PostSharp,并且惊喜地发现它是多么容易。

我还查看了Castle Windsor和Spring.Net的AOP,方法不同(运行时与编译时)。混合AOP和IoC似乎是有道理的。如果你没有使用其中一个框架,那么开始时要做的工作要多得多,但不要让它阻止你。

对于新项目,我现在可能会使用Castle Windsor,但这主要是因为我还想使用IoC。如果我必须快速将AOP实现到现有代码库中,我将使用PostSharp。

答案 4 :(得分:4)

还有来自Microsoft的Policy Injection和Unity Interception