3

Unity에서 호출 핸들러를 사용하는 방법을 이해하려고합니다.왜 사용자 정의 호출 핸들러가 호출되지 않습니까?

void Main() 
{ 
    var container = new UnityContainer(); 
    container.AddNewExtension<Interception>() 
      .Configure<Interception>() 
      .AddPolicy("TestPolicy") 
      .AddCallHandler(new TestCallHandler()); 
    container.RegisterType<IFoo, Foo>(); 
    var foo = container.Resolve<IFoo>(); 
    foo.Test(); 
} 

interface IFoo 
{ 
    void Test(); 
} 

class Foo : IFoo 
{ 
    public void Test() 
    { 
     "Foo.Test()".Dump(); 
    } 
} 

class TestCallHandler : ICallHandler 
{ 
    public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) 
    { 
     Console.WriteLine("[Interceptor] Calling {0}.{1}", input.MethodBase.DeclaringType.FullName, input.MethodBase.Name); 
     return getNext()(input, getNext); 
    } 

    public int Order { get; set; } 
} 

그러나 TestCallHandler.Invoke가 호출되지 않습니다 그냥 직접 Foo.Test를 호출 : 여기에 지금까지 가지고있는 코드입니다. 내가 뭘 놓치고 있니?

답변

2

유형과 처리기를 모두 등록하고 PolicyInjectionBehavior를 가진 인터셉터를 추가하십시오.

var container = new UnityContainer(); 
container.AddNewExtension<Interception>() 
     .RegisterType<IFoo, Foo>() 
     .Configure<Interception>() 
     .SetInterceptorFor<IFoo>(new InterfaceInterceptor()); 
var foo = container.Resolve<IFoo>(); 
foo.Test(); 

그리고 당신은 HandlerAttribute에서 상속과 같은 intercept.Something에 방법이 속성을 추가 ICallHandler.Then 형식의 인스턴스를 반환하는 클래스를 만들 :

var container = new UnityContainer(); 
container.AddNewExtension<Interception>() 
     .RegisterType<TesCallHandler>() 
     .RegisterType<IFoo, Foo>(new Interceptor<TransparentProxyInterceptor>(), 
      new InterceptionBehavior<PolicyInjectionBehavior>()) 
     .Configure<Interception>() 
     .AddPolicy("TestPolicy") 
     .AddCallHandler(new TestCallHandler()); 
var foo = container.Resolve<IFoo>(); 
foo.Test(); 
+0

감사! 실제로 문제를 해결합니다. 모든 유형에 대해 전 세계적으로 그렇게 할 수 있다고 생각했습니다. –

+0

MSDN 문서에서 TransparentProxyInterceptor가 매우 느리게 작동한다고 경고합니다. InterfaceInterceptor가 권장됩니다. https://msdn.microsoft.com/en-us/library/dn178466(v=pandp.30).aspx#sec9 – Calvin

3

다른 방법은 다음과 같습니다

class MyAttribute : HandlerAttribute 
{ 
    override ICallHandler CreateHandler(IUnityContainer container) 
    { 
     return new TestCallHandler(); 
    } 
} 


Interface IFoo 
{ 
    [MyAttribute] 
    void AMethod(); 
}