.Net中AOP的最佳实现是什么?[关闭]


83

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

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


4
如果您提供了指向所有AOP的链接,这将对您有所帮助,以节省读者与Google的时间。我希望这个问题/答案将成为.NET中不同AOP选项的精彩摘要
Ian Ringrose,2009年

10
52个人投票说这是一个建设性的问题。5票表示没有建设性。谁决定的?至少主持人应该更改或重新提出问题,但他们最好考虑大多数人的意见。
回顾

2
@Revious完全同意!
传说

1
SO和人们反对像OT这样的问题真是令人惊讶。讨论和帮助社区的如此有用的问题和技术只是被否决并关闭,但一堆老式的,八十年代风格的人被困在过去。因此,世界已经改变。完全可以理解的是,您希望帮助解决特定的问题,但至少要在“封闭”标签中提供一个链接,以在其中张贴此类问题。这将大有帮助,避免出现这种愚蠢现象。
像素

Answers:


45

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

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

请注意,它还存在Linfu,可用于利用两种AOP方式。


3
如果您想执行运行时AOP,则为此+1。如果您想在编译后进行AOP,则在PostSharp上+1
Krzysztof Kozmic 2009年

这个答案有更新吗?还是仍然有效?我特别想知道Spring.Aop与Castle和PostSharp相比如何
Evren Kuzucuoglu 2011年

1
不幸的是,PostSharp是一种商业产品
像素像素,它在2008年

Postsharp是商业产品,不是免费的。请建议其他有关静态编织的内容。
Shivam Sachan

@ShivamSachan只因为免费是一件不好的事。.net中大多数免费的AOP都在2-5年前删除,最后一次更新,PostSharp仍然是同类中最好的。
Offler

15

“最佳”是主观的。

首先,列出所需功能,体系结构等的列表。然后寻找可以满足所需功能的选项,而又不引入不必要的复杂性。例如,有几种是面向接口的:您的代码当前是否面向接口?如果不是这样,则PostSharp可能是一个更好的选择(被编织到原始类中)。但是当然,不能在运行时配置PostSharp。


您可以重新定义您的内容,如下所示:“最好是主观的,我将为此框架草拟一份赞成和反对的清单”。
回顾

11

在.NET中进行面向方面的编程的最佳方法是使用众所周知的设计技术。例如,通过应用SOLID原理,您可以实现允许添加跨领域关注点所需的灵活性和模块化。如果您拥有设计权,那么您甚至可以在没有任何框架的情况下应用大多数跨领域关注点。认为OOP不适合执行AOP是一个谬论。

这里有一些指针:

  • 不要依赖具体实例,而要依赖抽象。
  • 不要将跨领域的关注点和业务逻辑混在一起。
  • 通过将带有业务逻辑的类包装在实现这些关注点的类(装饰器)中来添加横切关注点。
  • 在设计中找到常见的工件,并对其进行平均建模,最好使用相同类型的抽象。看一下这个这个

当您有了正确的抽象之后,向系统添加新的横切关注点只是编写一个新的装饰器类并将其包装在正确的实现上。如果抽象是通用的,则可以将单个装饰器包装在一大类类中(这正是AOP的目的)。

尽管诸如动态代理和代码编织之类的技术可以使设计较差的应用程序更容易工作,但是对于好的设计,确实没有其他选择。迟早您会被烫伤的。这并不意味着不应使用动态代理生成和代码编织。但是,如果没有适当的应用程序设计,那么即使是那些技术也只能提供很少的帮助。


AOP是下一个抽象级别。实际上,导致AOP的是继承和组合的限制。您看过Entlib异常块吗?Aspect比每次尝试调用数据库都要调用该死的块要干净得多,只是尝试try-catch-log-throw。
睡眠史密斯,

2
如果用异常块包装对数据库的每次调用,那么无论如何都会做错。回到良好的设计。总是。
Steven

因此,除了捕获数据库异常之外,正确的方法是什么?
OutOFTouch

2
@OutOFTouch:看看这个SO问题的答案。
史蒂文

2
@SleeperSmith:尽管我不确定“ AOP是下一个抽象级别”的含义,但我确实认为,如果不使用AOP,就无法保持大型系统的可维护性。我相信申请AOP。但是,AOP是一个范例。不是工具。我同意继承的限制,但是导致AOP的不是构成上的限制。缺乏适当的设计导致使用代码编织和动态代理工具。我使用装饰器应用横切关注点。这是我应用AOP的首选方式。
史蒂文

5

我最不了解,有很多框架,一天中没有足够的时间尝试所有框架。

我确实使用过PostSharp,并且感到惊讶的是,开始使用它是如此容易。

我还使用Castle Windsor和Spring.Net研究了AOP,这种方法是不同的(运行时vs编译时)。混合AOP和IoC似乎很有意义。当您不使用这些框架之一时,要开始进行大量的工作,但不要因此而停下来。

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.