Unity ICallHandler与IInterceptionBehavior

时间:2013-03-06 08:45:45

标签: c# dependency-injection unity-container aop unity-interception

看起来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()
                );

那么使用哪一个?为什么在单一框架中存在看似冗余的解决方案?

2 个答案:

答案 0 :(得分:7)

答案主要是历史性的。在Unity存在之前,策略注入的东西首先出现在Enterprise Library 3.0中。需要所有匹配规则的东西,因为没有容器或中心点可以解决问题。

当我们开始将拦截整合到Unity中时,这给了我们简化事物的机会;政策注入区块的经验表明,对于很多人而言,PIAB的经验是过度的。

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

答案 1 :(得分:5)

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

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

因此差异最终会像简单与多播委托一样。策略注入允许您使用容器范围的查询(多播)定义切入点,并针对与查询匹配的多个类型应用建议,而IInterceptionBehavior允许您仅针对特定类型应用特定建议(单播)​​。

PolicyBehavior是IInterceptionBehavior的一个实现,它提供多播功能。