Ninject 2 Inyección Propiedad en ActionFilterAttribute no funciona
-
20-09-2019 - |
Pregunta
I tienen un atributo método que espera varias propiedades para ser inyectados por Ninject 2, pero userSession
y jobRepository
están subiendo como nulo:
[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);
}
}
Y aquí es el método en el controlador:
[AcceptGet, Job]
public ActionResult Dimensions(Job job) {
return View(job.Building);
}
Sé que tengo la configuración de trabajo, porque si uso la inyección de constructor en el controlador consiguen inyectar parámetros del controlador. Eso no me ayuda mucho para los atributos sin embargo, que la necesidad de usar la inyección propiedad. Me estoy perdiendo algo aquí?
Estas son las pociones pertinentes de 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>();
}
}
Solución
Ninject2 no hace la inyección de campo, cambiarlos a las propiedades con un colocador público.
class JobAttribute : ActionFilterAttribute {
[Inject]
public IUserSession UserSession
{ set; private get; }
[Inject]
public IJobRepository JobRepository
{ set; private get; }
}
Las cosas que estaban en Ninject 1.x que no están en Ninject 2:
- inyección de Campo: 2 de ninject inyección está ahora impulsado por la expresión árboles, y en .NET 3.5 no hay manera para establecer los valores de campo con una expresión árbol. Dado que esta es una mala práctica de todos modos, decidí cortar.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow