看起来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()
);
那么使用哪一个?为什么在单一框架中存在看似冗余的解决方案?
答案 0 :(得分:7)
答案主要是历史性的。在Unity存在之前,策略注入的东西首先出现在Enterprise Library 3.0中。需要所有匹配规则的东西,因为没有容器或中心点可以解决问题。
当我们开始将拦截整合到Unity中时,这给了我们简化事物的机会;政策注入区块的经验表明,对于很多人而言,PIAB的经验是过度的。
然而,我们不想随意使用PIAB打破每个人(我们已经做了几次)所以我们保留了新的,更简单的界面并实现了旧的界面。
答案 1 :(得分:5)
没关系,我看得不够仔细。
您可以创建自己的InterceptionBehavior,但这只适用于该类,或者您可以使用提供的PolicyInjectionBehavior库,然后使用ICallHandler和策略。
因此差异最终会像简单与多播委托一样。策略注入允许您使用容器范围的查询(多播)定义切入点,并针对与查询匹配的多个类型应用建议,而IInterceptionBehavior允许您仅针对特定类型应用特定建议(单播)。
PolicyBehavior是IInterceptionBehavior的一个实现,它提供多播功能。