2015-10-14 2 views
1

Я пытаюсь использовать Unity для применения обработчика вызовов через атрибут к моему методу ApiController, но обработчик вызова никогда не вызывается.Перехват атрибута Unity с 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()); 

Dependency Резольвер (с использованием 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

Добро пожаловать. Возможно, вам захочется найти, есть ли способ заставить веб-интерфейс API запросить 'IMyApiController' вместо' MyApiController'. Моя интуиция говорит мне, что, вероятно, нет. –