2016-05-17 3 views
0

Мне дано приложение webapi2 для управления, и я начал писать для него некоторые модульные тесты, так как у него их не было.Правильный способ использования ninject в webapi actionfilter

Тестирование контроллеров и сервисов довольно легко сделать, поскольку они вводят свои зависимости через инъекцию конструктора.

Для действия фильтров я вижу, что все сделано по-другому, поскольку невозможно использовать инжектор конструктора.

Теперь я еще не использовал ninject намного раньше, но это пример того, как были настроены фильтры.

public class CustomFilterAttribute : ActionFilterAttribute 
{ 
    public ILog Log { get; set; } 

    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     var id = int.Parse(actionContext.ActionArguments["id"].ToString()); 
     Log = actionContext.Request 
      .GetDependencyScope() 
      .GetService(typeof(ILog)) 
      as ILog; 


    Log.WriteMessage(string.Format("Got id:{0}",id)); 

    } 
} 

Моя регистрация выглядит

kernel.Bind<ILog>().ToConstant(new Log()); 

Похож ли это хорошо? Я не уверен, как написать тест для фильтра, мне как-то нужно высмеивать .GetDependencyScope, чтобы включить мои обязательные ILog?

Путь Журнал подключается через фильтр, это правильно?

+0

Престола [Атрибуты Passive] (HTTP: //blog.ploeh .dk/2014/06/13/пассивные-атрибуты /). Я понимаю, что Ninject «решил» эту проблему совершенно по-другому, но всегда лучше создавать приложение, которое работает с конкретным контейнером или без него, чтобы вы могли его поменять в любое время или даже использовать [Pure DI] (http://blog.ploeh.dk/2014/06/10/pure-di/). – NightOwl888

ответ

0

Чтобы получить к нему доступ через DependencyResolver, вам необходимо зарегистрировать его с помощью http-конфигурации.

public class NinjectDependencyResolver : NinjectDependencyScope, IDependencyResolver, System.Web.Mvc.IDependencyResolver { 
    private readonly IKernel kernel; 

    public NinjectDependencyResolver(IKernel kernel) 
     : base(kernel) { 
     this.kernel = kernel; 
    } 

    public IDependencyScope BeginScope() { 
     return new NinjectDependencyScope(this.kernel.BeginBlock()); 
    } 
} 

А затем зарегистрировать его во время запуска ...

// Use the kernal and the NinjectDependencyResolver as 
// application's resolver 
var resolver = new NinjectDependencyResolver(kernal); 

//Register Resolver for Web Api 
GlobalConfiguration.Configuration.DependencyResolver = resolver; 

Вы можете получить доступ к распознаватель через ActionContext

public class CustomFilterAttribute : ActionFilterAttribute { 
    public ILog Log { get; set; } 

    public override void OnActionExecuting(HttpActionContext actionContext) { 
     var id = int.Parse(actionContext.ActionArguments["id"].ToString()); 
     Log = actionContext 
      .RequestContext 
      .Configuration 
      .DependencyResolver 
      .GetService(typeof(ILog)) 
      as ILog; 


     Log.WriteMessage(string.Format("Got id:{0}",id)); 
    } 
}