来自Unity文档:
Unity拦截使您能够有效捕获对象的调用并向目标对象添加其他功能。当您想要修改单个对象而不是整个类的行为时,拦截非常有用,就像使用Decorator pattern时那样。它提供了一种灵活的方法,可以在运行时向对象添加新行为。
由于在面向方面编程中使用了相同的DP(参见here)
...在.NET Framework中,这些技术中最常用的是后处理和代码拦截。前者是PostSharp使用的技术,后者由依赖注入(DI)容器使用,例如Castle DynamicProxy和Unity。这些工具通常使用名为Decorator或Proxy的设计模式来执行代码拦截。
在这些引文中Proxy
被用作Decorator
的同义词,尽管它们非常相似但有一些differences。
所以,我的问题是: 什么(最重要的是为什么)AOP必须优先于DI拦截?或者DI拦截了一种更好的方式来增强对象的功能而不改变它的实现?一般来说,如果一个优先于另一个,那么为什么?
答案 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