7

J'ai un attribut de méthode qui prévoit plusieurs propriétés à injecter par Ninject 2, mais userSession et jobRepository arrivent comme nuls:Ninject 2 Injection propriété pour ActionFilterAttribute ne fonctionne pas

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

Et est la méthode ici le contrôleur:

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

Je sais que j'ai la configuration de travail parce que si j'utilise l'injection de constructeur sur le contrôleur s'injecte des paramètres du contrôleur. Cela ne m'aide pas beaucoup pour les attributs mais qui ont besoin d'utiliser l'injection de propriété. Est-ce que j'ai râté quelque chose?

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

Répondre

13

Ninject2 ne fait pas l'injection sur le terrain, les changer de propriétés avec un setter public.

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

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

De la Ninject 2 Beta announcement:

choses qui étaient 1.x Ninject que ne sont pas en Ninject 2:

  • injection de terrain: Ninject injection de 2 est maintenant conduit par l'expression arbres, et dans .NET 3.5 il n'y a aucun moyen pour définir des valeurs de champ avec une expression arbre. Comme c'est une mauvaise pratique, j'ai décidé de le couper.
+0

C'est tout! Les propriétés doivent avoir un paramètre public à injecter par Ninject. Je n'aurais pas pensé que cela aurait de l'importance. – DavGarcia

+0

Merci pour cette réponse - je cherchais partout la solution à ce problème précis. – Mustafakidd