3

Unity가 AoP 기능을 달성하기 위해 2 개의 다른 경로를 제공하는 것처럼 보입니다.Unity ICallHandler vs. IInterceptionBehavior

질문은 이유가 무엇입니까? 차이점은 무엇입니까? 각 접근법의 장점과 단점은 무엇입니까? 예를 들어

ICallHandler 사용 :

unity.Configure<Interception>() 
.AddMatchingRule(
        new TypeMatchingRule(typeof (ComplexEntity)) 
       ).AddMatchingRule(
        new TypeMatchingRule(typeof (ComplexEntity.InnerEntity)) 
       ).AddMatchingRule(
        new MemberNameMatchingRule("*") 
       ).AddCallHandler(
        new CallHandler() 
       ); 

그러나 비슷한 기능도 ICallHandler 대신에 IInterceptionBehavior을 사용하여 달성 할 수 있습니다 당신이 차단을 설정하지만 수 있다는 곳도 하이브리드

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

Nevermind 충분히 신중하게 검토하지 않았습니다.

자신 만의 InterceptionBehavior를 만들 수는 있지만 클래스에만 적용됩니다. 제공되는 라이브러리 인 PolicyInjectionBehavior를 사용하여 ICallHandler와 정책을 사용할 수 있습니다.

이렇게 차이는 단순한 대 멀티 캐스트 위임과 같습니다. 정책 삽입을 사용하면 컨테이너 와이드 쿼리 (멀티 캐스트)를 사용하여 pointcut을 정의하고 쿼리와 일치하는 여러 유형에 대한 조언을 적용 할 수 있습니다. 반면 IInterceptionBehavior에서는 특정 유형 (단일 캐스트)에 대해 특정 조언을 적용 할 수 있습니다.

PolicyBehavior는 다중 전송 기능을 제공하는 IInterceptionBehavior의 구현입니다.

7

답변은 주로 역사적인 것입니다. Unity가 존재하기 전에 Policy Injection 항목이 Enterprise Library 3.0에서 처음으로 나왔습니다. 물건을 연결하기위한 콘테이너 또는 중앙 지점이 없었기 때문에 모든 일치 규칙 항목이 필요했습니다.

우리가 차단을 Unity에 통합하는 작업을 시작할 때, 이것은 우리에게 사물을 단순화 할 기회를주었습니다. 정책 투입 블록을 사용한 경험은 많은 사람들에게 PIAB 경험이 과도하다는 것을 나타 냈습니다.

그러나 우리는 PIAB를 사용하여 모든 사람을 임의로 중단하고 싶지 않았습니다. (우리는 이미 몇 번 했으므로) 새로운 간단한 인터페이스를 유지하고 이전 인터페이스도 구현했습니다.

+0

하나의 질문 : PIAB가 향후 버전의 Entlib에서 쓸모 없게된다는 뜻입니까? 따라서 IInterfaceBehaviors에 대한 일치 규칙을 적용 할 수있는 방법은 없습니다. 최상위 계층 클래스와 각 인터페이스 (예 : IBf 및 Bf)를 구현할 때 이름 지정 규칙을 통해 한 번에 등록 할 수있는 유일한 방법은 무엇입니까? 그리고 네임 스페이스 필터를 만들고 그 네임 스페이스 내의 모든 클래스를 반복하십시오 .. – Legends

+0

이것은 Entlib의 소유자에게 달려 있습니다. 나는 그 팀에 더 이상 있지 않고 (몇 년되지 않았 음) 그들의 계획에 대한 통찰력을 가지고 있지 않습니다. –