【发布时间】:2015-11-21 23:25:58
【问题描述】:
来自 Unity 文档:
Unity 拦截使您能够有效地捕获对对象的调用并向目标对象添加附加功能。当您想要修改单个对象而不是整个类的行为时,拦截很有用,就像您在使用 Decorator pattern 时所做的那样。它提供了一种在运行时向对象添加新行为的灵活方法。
因为在面向方面的编程中使用了相同的 DP(请参阅here)
...在 .NET Framework 中,这些技术中最常用的是后处理和代码拦截。前者是 PostSharp 使用的技术,后者是由依赖注入 (DI) 容器使用的,例如 Castle DynamicProxy 和 Unity。这些工具通常使用名为Decorator 或Proxy 的设计模式来执行代码拦截。
在这些引文中,Proxy 用作 Decorator 的同义词,尽管它们非常相似,但也有一些 differences。
所以,我的问题是: 什么(最重要的是为什么)AOP 必须优先于 DI 拦截?或者 DI 拦截是一种在不改变其实现的情况下增强对象功能的更好方法?一般来说,如果一个人应该比另一个人更受欢迎,那么为什么?
【问题讨论】:
-
是的,您的帖子与我的问题有关。谢谢。此外,许多新兴框架(ASP.NET 5 / MVC 6 和 AngularJS 仅举其中两个)提供开箱即用的 DI。
-
因此,决定是否使用 AOP 工具需要对以下一些方面做出明确的回答:我们得到了什么,做得更好,在我们可能拥有的某些场景中是否有额外的功能有用等. 事实上,我正在寻找一个答案,如果我们有开箱即用的 DI,为什么我们应该使用 AOP?在这方面,我的问题比您在引用的问题中回答的要广泛一些。无论如何,再次感谢!
-
我会说你应该使用 AOP,但 AOP 与代码编织不同。代码编织只是应用 AOP 的一种方式。我的答案描述的是,即使不使用任何框架(因此没有 DI 库,没有代码编织工具),好的(SOLID)应用程序设计也将有助于 AOP 的使用。应用正确的原则后,您可以考虑使用工具来帮助您。但任何工具都无法弥补糟糕的设计。
标签: dependency-injection inversion-of-control aop decorator interception