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

ecl*_*eel 81 .net aop

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

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

Rom*_*ier 45

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

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

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

  • 如果你想做运行时AOP,那就+1.如果您想要编译后时间AOP,请在PostSharp上+1 (3认同)
  • 不幸的是,PostSharp 是一个商业产品 (2认同)

Mar*_*ell 13

"最好"是主观的.

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


Ste*_*ven 11

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

以下是一些指示:

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

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

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

  • AOP 是下一个抽象级别。事实上,正是继承和组合的限制导致了AOP。你见过Entlib异常块吗?Aspect 比每次调用数据库时都调用那个该死的块(只是为了尝试捕获日志抛出)要干净得多。 (2认同)
  • 如果使用异常块将每次调用都包装到数据库中,那么无论如何都是错误的.它回归到了良好的设计.总是. (2认同)
  • @OutOFTouch:看一下[这个SO问题]的答案(http://stackoverflow.com/questions/9892137). (2认同)
  • @SleeperSmith:虽然我不确定"AOP是下一级抽象"意味着什么,但我认为你不能在不使用AOP的情况下保持大型系统的可维护性.我相信应用AOP.然而,AOP是一种范式; 不是工具.我同意继承的限制,但它不是导致AOP的组成限制.缺乏适当的设计导致使用代码编织和动态代理工具.我使用装饰器应用横切关注点.这是我应用AOP的首选方式. (2认同)

Men*_*elt 5

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

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

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

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