85

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

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

4

5 回答 5

45

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

如果动态拦截不能满足你的需求(编织密封类、拦截非虚调用等),那你肯定要静态编织。PostSharp是这个领域的参考。

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

于 2009-03-11T09:12:30.773 回答
15

“最好”是主观的。

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

于 2009-03-11T08:20:08.497 回答
11

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

这里有一些提示:

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

当您拥有正确的抽象时,向系统添加新的横切关注点只需编写一个新的装饰器类并将其包装在正确的实现中即可。如果抽象是通用的,您可以将单个装饰器包装在一大组类中(这正是 AOP 的意义所在)。

尽管动态代理和代码编织等技术可以更轻松地处理设计不佳的应用程序,但对于好的设计确实没有其他选择。迟早你会被烧死。这并不意味着不应该使用动态代理生成和代码编织。但是,如果没有适当的应用程序设计,即使这些技术也只会有一点帮助。

于 2012-12-27T23:54:13.330 回答
5

我不知道最好,有很多框架,一天中没有足够的时间来尝试它们。

我确实使用过 PostSharp,并且对它上手的容易程度感到惊喜。

我还研究了 Castle Windsor 和 Spring.Net 的 AOP,方法不同(运行时与编译时)。混合 AOP 和 IoC 似乎很有意义。当您没有使用这些框架之一时,开始需要做更多的工作,但不要让它阻止您。

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

于 2009-03-11T08:23:33.400 回答
4

还有来自 Microsoft的 Policy Injection 和Unity Interception 。

于 2011-04-09T20:08:07.733 回答