DI拦截与AOP

时间:2015-08-27 14:13:36

标签: dependency-injection inversion-of-control aop decorator interception

来自Unity文档:

  

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

由于在面向方面编程中使用了相同的DP(参见here

  

...在.NET Framework中,这些技术中最常用的是后处理和代码拦截。前者是PostSharp使用的技术,后者由依赖注入(DI)容器使用,例如Castle DynamicProxyUnity。这些工具通常使用名为Decorator或Proxy的设计模式来执行代码拦截。

在这些引文中Proxy被用作Decorator的同义词,尽管它们非常相似但有一些differences

所以,我的问题是: 什么(最重要的是为什么)AOP必须优先于DI拦截?或者DI拦截了一种更好的方式来增强对象的功能而不改变它的实现?一般来说,如果一个优先于另一个,那么为什么

1 个答案:

答案 0 :(得分: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