【问题标题】:DI Interception vs. AOPDI 拦截与 AOP
【发布时间】:2015-11-21 23:25:58
【问题描述】:

来自 Unity 文档:

Unity 拦截使您能够有效地捕获对对象的调用并向目标对象添加附加功能。当您想要修改单个对象而不是整个类的行为时,拦截很有用,就像您在使用 Decorator pattern 时所做的那样。它提供了一种在运行时向对象添加新行为的灵活方法。

因为在面向方面的编程中使用了相同的 DP(请参阅here

...在 .NET Framework 中,这些技术中最常用的是后处理和代码拦截。前者是 PostSharp 使用的技术,后者是由依赖注入 (DI) 容器使用的,例如 Castle DynamicProxyUnity。这些工具通常使用名为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


【解决方案1】:

以下是使用 DI 容器拦截的一些限制:

1) 使用 DI 容器的拦截仅限于使用该容器创建的对象。

例如,您可能有一个 factory 并在您的容器中注册。此类工厂创建的对象将不支持拦截。

考虑以下代码:

public interface IHelperFactory
{
    IHelper CreateHelper();
}

public interface IHelper
{
    void HelpMe();
}

class Helper : IHelper
{
    public void HelpMe()
    {

    }
}

class HelperFactory : IHelperFactory
{
    public IHelper CreateHelper()
    {
        return new Helper();
    }
}

如果向容器注册HelperFactory,则可以拦截CreateHelper方法,但不会拦截对IHelper.HelpMe的调用。

2) 通过 DI 容器进行拦截的另一个限制是您无法拦截私有方法,除非您将它们更改为虚拟受保护方法并使用 virtual method interceptors,这反过来又不允许您拦截对象 registered as instances

3) (IMO) 首先使用 DI 容器可能不是一个好主意。见我的文章here

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    相关资源
    最近更新 更多