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 ICallHandler vs. IInterceptionBehavior

答案主要是历史的。在Unity出现之前的Enterprise Library 3.0中,策略注入最先出现。所有的匹配规则都是需要的,因为没有容器或中心点来连接东西。

当我们开始将拦截整合到Unity中时,这给了我们简化事情的机会;策略注入块的经验表明,对于很多人来说,PIAB的经验是多余的。

然而,我们不想随意破坏每个人使用PIAB(我们已经这样做了几次),所以我们保留了新的,更简单的接口,并实现了旧的接口。

没关系,我看得不够仔细。

你可以创建自己的InterceptionBehavior,但这只适用于类,或者你可以使用库提供的PolicyInjectionBehavior,然后使用ICallHandler和策略。

所以区别就像简单委托和多强制转换委托。策略注入允许您使用容器范围的查询(多强制转换)来定义切入点,并针对匹配查询的多个类型应用通知,而IInterceptionBehavior允许您仅针对特定类型应用特定通知(单强制转换)。

PolicyBehavior是IInterceptionBehavior的一个实现,它提供了多类型转换功能。

相关文章:
  • 没有找到相关文章