Unity ICallHandler vs. IInterceptionBehavior
本文关键字:IInterceptionBehavior vs ICallHandler Unity | 更新日期: 2023-09-27 18:02:24
似乎Unity提供了两种不同的途径来实现AoP功能。
问题是为什么?有什么不同?每种方法的优缺点是什么?
例如使用ICallHandler:
unity.Configure<Interception>()
.AddMatchingRule(
new TypeMatchingRule(typeof (ComplexEntity))
).AddMatchingRule(
new TypeMatchingRule(typeof (ComplexEntity.InnerEntity))
).AddMatchingRule(
new MemberNameMatchingRule("*")
).AddCallHandler(
new CallHandler()
);
但是类似的功能也可以用IInterceptionBehavior代替ICallHandler
来实现unity.RegisterType<ComplexEntity,ComplexEntity>
(new VirtualMethodInterceptor(), new InterceptionBehavior)
也有一个混合的地方,让你设置拦截,但使用调用处理程序,例如
unity.Configure<Interception>()
.SetInterceptorFor<ComplexEntity>(new VirtualMethodInterceptor())
.AddPolicy("TestPolicy")
.AddMatchingRule(
new TypeMatchingRule(typeof (ComplexEntity))
).AddMatchingRule(
new TypeMatchingRule(typeof (ComplexEntity.InnerEntity))
).AddMatchingRule(
new MemberNameMatchingRule("*")
).AddCallHandler(
new CallHandler()
);
那么该用哪一个呢?为什么在单一框架中会出现看似冗余的解决方案?
答案主要是历史的。在Unity出现之前的Enterprise Library 3.0中,策略注入最先出现。所有的匹配规则都是需要的,因为没有容器或中心点来连接东西。
当我们开始将拦截整合到Unity中时,这给了我们简化事情的机会;策略注入块的经验表明,对于很多人来说,PIAB的经验是多余的。
然而,我们不想随意破坏每个人使用PIAB(我们已经这样做了几次),所以我们保留了新的,更简单的接口,并实现了旧的接口。
没关系,我看得不够仔细。
你可以创建自己的InterceptionBehavior,但这只适用于类,或者你可以使用库提供的PolicyInjectionBehavior,然后使用ICallHandler和策略。
所以区别就像简单委托和多强制转换委托。策略注入允许您使用容器范围的查询(多强制转换)来定义切入点,并针对匹配查询的多个类型应用通知,而IInterceptionBehavior允许您仅针对特定类型应用特定通知(单强制转换)。
PolicyBehavior是IInterceptionBehavior的一个实现,它提供了多类型转换功能。