7

Я атрибут метод, который предполагает несколько свойств, который будет введен с помощью Ninject 2, но userSession и jobRepository приходят в нуль:Ninject 2 Injection Недвижимость ActionFilterAttribute не работает

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] 
public class JobAttribute : ActionFilterAttribute { 
    [Inject] 
    private IUserSession userSession; 

    [Inject] 
    private IJobRepository jobRepository; 

    public override void OnActionExecuting(ActionExecutingContext filterContext) { 
     var filter = new JobFilter(userSession, jobRepository); 

     filter.OnActionExecuting(filterContext); 
    } 
} 

А вот метод контроллер:

[AcceptGet, Job] 
public ActionResult Dimensions(Job job) { 
    return View(job.Building); 
} 

Я знаю, что у меня есть установка работает, потому что, если я использую инъекцию конструкторы на контроллере параметры контроллера получить впрыскиваются. Это не очень помогает мне для атрибутов, хотя это необходимо для использования вложения свойств. Я что-то упустил?

Вот соответствующие зелий Global.asax.cs:

public class MvcApplication : Ninject.Web.Mvc.NinjectHttpApplication { 
    protected override void OnApplicationStarted() { 
     RegisterRoutes(RouteTable.Routes); 
     RegisterAllControllersIn(Assembly.GetExecutingAssembly()); 
    } 

    ...snip... 

    protected override IKernel CreateKernel() { 
     return new StandardKernel(
      new RepositoryConfiguration(), 
      new AuthenticationModule(), 
      new AutoMapperConfiguration() 
     ); 
    } 
} 

public class RepositoryConfiguration : NinjectModule { 
    public override void Load() { 
     Bind<ICustomerRepository>().To<CustomerRepository>(); 
     Bind<IJobRepository>().To<JobRepository>(); 
    } 
} 

public class AuthenticationModule : NinjectModule { 
    public override void Load() { 
     Bind<MbdQuote.Core.AppService.IUserSession>().To<UserSession>(); 
    } 
} 

ответ

13

Ninject2 не делает инъекции поля, изменять их свойства с общественным сеттера.

class JobAttribute : ActionFilterAttribute { 
    [Inject] 
    public IUserSession UserSession 
    { set; private get; } 

    [Inject] 
    public IJobRepository JobRepository 
    { set; private get; } 
} 

С Ninject 2 Beta announcement:

вещи, которые были в Ninject 1.x, что не в Ninject 2:

  • инъекции поле: Ninject 2 в инъекции теперь управляется выражением деревьев, а в .NET 3.5 нет способа установить значения полей с выражением tree. Так как это плохая практика так или иначе, я решил ее разрезать.
+0

Всё! В свойствах должен быть установлен публичный сеттер, который будет инъецирован Ninject. Я бы не подумал, что это будет иметь значение. – DavGarcia

+0

Спасибо за этот ответ - я искал везде решение этой проблемы. – Mustafakidd