Инъекция свойства Ninject 2 для ActionFilterAttribute не работает
-
20-09-2019 - |
Вопрос
У меня есть атрибут метода, который ожидает, что Ninject 2 введет несколько свойств, но userSession
и jobRepository
выдаются как нулевые:
[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>();
}
}
Решение
Ninject2 не выполняет внедрение полей, измените их на свойства с помощью общедоступного установщика.
class JobAttribute : ActionFilterAttribute {
[Inject]
public IUserSession UserSession
{ set; private get; }
[Inject]
public IJobRepository JobRepository
{ set; private get; }
}
Из бета-версии Ninject 2 объявление:
Вещи, которые были в Ninject 1.x, которых нет в Ninject 2:
- Полевая инъекция:Ninject 2 внедрение теперь осуществляется с помощью выражения деревьев, а в .NET 3.5 нет способа задать значения полей с помощью выражения дерева.Поскольку это плохая практика в любом случае, я решил сократить это.
Не связан с StackOverflow