7

he un atributo de método que espera varias propiedades para ser inyectado por Ninject 2, pero userSession y jobRepository están subiendo como nulo:Ninject 2 Inyección Propiedad en ActionFilterAttribute no trabajar

[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 de 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 en cuanto a los atributos que necesitan para usar la inyección de propiedades. ¿Me estoy perdiendo de algo?

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>(); 
    } 
} 

Respuesta

13

Ninject2 no hace la inyección de campo, cambie a las propiedades con un colocador pública.

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

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

Desde el Ninject 2 Beta announcement:

cosas que estaban en Ninject 1.x que no están en Ninject 2:

  • inyección de Campo: Ninject inyección de 2 es ahora impulsado por la expresión árboles, y en .NET 3.5 no hay forma de para establecer valores de campo con un árbol de expresión . Dado que esta es una mala práctica de todos modos, decidí cortarla.
+0

Eso es todo! Las propiedades tienen que tener un setter público para ser inyectado por Ninject. No hubiera pensado que eso importaría. – DavGarcia

+0

Gracias por esta respuesta: estaba buscando en todas partes la solución a este problema exacto. – Mustafakidd

Cuestiones relacionadas