3

似乎 Unity 提供了 2 种不同的途径来实现 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()
                );

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

4

2 回答 2

7

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

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

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

于 2013-03-08T18:16:23.013 回答
5

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

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

所以差异最终就像一个简单的与一个多演员代表。策略注入允许您使用容器范围的查询(多播)定义切入点,并将建议应用于与查询匹配的多种类型,而 IInterceptionBehavior 允许您仅对特定类型应用特定建议(单播)​​。

PolicyBehavior 是提供多播功能的 IInterceptionBehavior 的实现。

于 2013-03-06T09:19:23.860 回答