面向方面编程?

时间:2009-09-01 05:35:36

标签: c# vb.net aop

如何在C#中使用AOP将属性应用于类函数?

更新:我有点不清楚在什么情况下应该使用AOP?由于我们可以使用AOP进行日志记录,安全性(身份验证),请建议我们可以利用AOP的其他方案

AOP是否可以用于在应用程序进程中的不同运行线程之间共享数据?

2 个答案:

答案 0 :(得分:5)

AOP旨在涵盖它所指的跨领域问题,即系统内许多对象所需的功能,但不是这些对象关注的核心。如果通过将交叉问题编码到整个系统的对象中来满足这些要求,我们最终会在许多对象中分离出一个混乱,难以维护的实现。

跨领域关注的典型示例是日志记录:日志记录对于真实的实时系统至关重要,需要在整个系统中实施,但实际上并不是该系统中对象的关注点: system 可能需要销售税计算对象来实现日志记录,但日志记录并不是销售税计算对象本身的关注点。 AOP允许我们将这些系统范围(交叉)要求分别指定给我们的主要业务逻辑,然后在运行时或编译时将两者编织在一起。

AOP通过拦截对象上方法的调用来工作。截取点称为切入点,截取的方法是建议的方法,在截取的方法上建议的代码被称为通知。我只是通过Spring.Net的AOP框架熟悉AOP,它允许您通过配置文件和编程方式指定和应用切入点和建议。 Spring.Net AOP有四种类型的建议:before,after,around和throws,它们是在调用建议方法之前拦截建议方法时调用的,之后是它在调用之前和之后以及分别抛出异常时调用。无论是通过配置还是以编程方式应用,建议的方法都不了解Spring.Net AOP,甚至不知道它已被建议。

AOP有用的另一个例子是交易。如果我们尝试在对象内的代码中实现它,我们最终会得到一些对象,这些对象必须知道它们在一个事务中行动,在我看来,这不是一个理想的设计特性。 AOP允许我们在参与交易的对象外部创建和协调交易,这可以提供更加稳定,维护友好的设计。

Spring.Net文档非常擅长解释AOP,特别是Spring.Net的AOP实现,并包含许多示例。即使您不考虑使用Spring.Net AOP框架,也值得一看。

答案 1 :(得分:4)

C#对AOP没有很大的支持。

您可能希望了解一个框架PostSharp。它可能会得到你想要的东西,但它永远不会像Java那样好。

- 编辑

如果您不希望使用类似PostSharp的框架,请查看ContextBoundObject类以及(IIRC)DynamicProxy。但是这两者都需要更改继承链,或者更改实例化对象的方式。