在C#,VB.net中有很多AOP实现.这是一些AOP实现:
PostSharp
LOOM.NET
Aspect.NET
企业库3.0策略注入应用程序块
AspectDNG
DotSpect(.SPECT)
在Spring.NET框架作为其功能的一部分
Wicca和Phx.Morph
Twente大学提供了针对.NET的AOSD解决方案的详尽分析
Seasar.NET
方面#
Puzzle.NAspect
撰写*
设定点
NConcern .NET AOP框架
...
.Net中AOP的最佳实现是什么?我应该用什么?
如果动态拦截可以满足您的需求,我认为Castle Dynamic Proxy是首选解决方案.许多其他想要提供AOP功能的框架在内部使用此框架.通常,大多数现有的IoC容器现在提供了一些动态拦截机制(Spring.NET,Castle Windsor,StructureMap等).如果您已经使用过IoC容器,也许可以更容易地查看它的建议.
如果动态拦截无法满足您的需求(编织密封类,拦截非虚拟调用等),那么您肯定需要静态编织.PostSharp是此域中的引用.
请注意,它也存在Linfu,可用于利用两种AOP时尚.
"最好"是主观的.
首先,列出您需要的功能,架构等列表.然后查找满足您需求的选项,而不会引入不必要的复杂性.例如,有几个面向接口:您的代码目前是面向接口的吗?如果没有,PostSharp可能是更好的选择(被编织到原始类中).但是当然,PostSharp无法在运行时配置......马匹用于课程.
在.NET中进行面向方面编程的最佳方法是使用众所周知的设计技术.例如,通过应用SOLID原则,您可以实现增加横切关注所需的灵活性和模块性.如果您拥有正确的设计,您甚至可以在没有任何框架的情况下应用大多数横切关注点.认为OOP不适合做AOP是一种谬论.
以下是一些指示:
不依赖于具体实例,而是依赖于抽象.
不要将横切关注点和业务逻辑混合在同一个类中.
通过在实现这些关注的类(装饰器)中使用业务逻辑包装类来添加横切关注点.
在设计中查找常见工件并对它们进行相同的建模,最好使用相同类型的抽象.例如,看看这个和这个.
当你得到正确的抽象时,向系统添加新的横切关注点只需要编写一个新的装饰器类并将其包装在正确的实现中.如果抽象是通用的,你可以围绕一大组类包装一个装饰器(这正是AOP的意思).
虽然动态代理和代码编织等技术可以更容易地使用设计糟糕的应用程序,但是对于良好的设计来说真的没有其他选择.迟早你会被烧伤.这并不意味着不应该使用动态代理生成和代码编织.但如果没有适当的应用程序设计,即使这些技术也只是略有帮助.
我不知道最好的,有很多框架,并没有足够的时间来尝试所有.
我确实使用了PostSharp,并且惊喜地发现它是多么容易.
我还查看了Castle Windsor和Spring.Net的AOP,方法不同(运行时与编译时).混合AOP和IoC似乎是有道理的.如果你没有使用其中一个框架,那么开始时要做的工作要多得多,但不要让它阻止你.
对于新项目,我现在可能会使用Castle Windsor,但这主要是因为我还想使用IoC.如果我必须快速将AOP实现到现有代码库中,我将使用PostSharp.