2015-10-14 23 views
1

我試圖使用Unity通過屬性對我的ApiController方法應用調用處理程序,但從不調用調用處理函數。使用ASP.NET Web Api統一屬性攔截

屬性:

public class LogAttribute : HandlerAttribute 
{ 
    private readonly int _order; 

    public LogAttribute(int order) 
    { 
     _order = order; 
    } 

    public override ICallHandler CreateHandler(Microsoft.Practices.Unity.IUnityContainer container) 
    { 
     return new LoggingCallHandler 
     { 
      Order = _order 
     }; 
    } 
} 

呼叫處理程序:

public class LoggingCallHandler : ICallHandler 
    { 
     public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) 
     { 
      //.....stuff 
     } 
    } 

註冊:

container.AddNewExtension<Interception>(); 
container.RegisterType<IMyApiController>(); 
container.Configure<Interception>() 
    .SetInterceptorFor<IMyApiController>(new InterfaceInterceptor()); 

依賴解析器(使用WebActiviatorEx):

public static class UnityWebApiActivator 
{ 
    public static void Start() 
    {    
     var resolver = new UnityDependencyResolver(UnityConfig.GetConfiguredContainer()); 

     GlobalConfiguration.Configuration.DependencyResolver = resolver; 
    } 
} 
+0

你在哪裏申請'LogAttribute'? –

+0

就在一個ApiController方法... –

回答

1

Web API系統將使用依賴解析器來解析控制器類(例如, MyApiController),而不是這種控制器類實現的接口(例如IMyApiController)。我不知道如何讓Web API系統請求界面(我懷疑是否有辦法做到這一點)。

一種解決方案是攔截控制器它自(MyApiController),但是因爲它是一個類,可以不使用界面攔截器(InterfaceInterceptor),而是必須使用虛擬方法的攔截器是這樣的:

container.Configure<Interception>() 
    .SetInterceptorFor<MyApiController>(new VirtualMethodInterceptor()); 

這將需要你制定你想攔截的動作方法virtual

請注意,您仍然可以通過InterfaceInterceptor攔截注入您的控制器(定義爲接口)的其他依賴項。這是因爲Web API系統會要求容器將它們解析爲接口,而不是類。

+0

謝謝 - 這是有道理和工程。恥辱你必須使這些方法變得虛擬,但我想這沒關係。 –

+0

歡迎你。您可能想要搜索以查看是否有辦法強制Web API框架要求「IMyApiController」而不是「MyApiController」。雖然我的直覺告訴我可能沒有。 –