Utilisation de l’injection de propriété au lieu de l’injection de constructeur

En résumé, j’essaie d’utiliser ELMAH avec MVC 2 et Ninject, et je dois utiliser des constructeurs sans paramètre. J’ai créé un post initial à ce sujet ici: Utilisation d’un constructeur de contrôleur sans paramètre avec Ninject?

On m’a conseillé d’utiliser l’injection de propriété au lieu de l’injection de constructeur. Alors je suis passé de ceci:

public class DepartmentsController : Controller { private IDepartmentsRepository departmentsRepository; public DepartmentsController(IDepartmentsRepository departmentsRepository) { this.departmentsRepository = departmentsRepository; } ... } 

pour ça:

 public class DepartmentsController : Controller { private IDepartmentsRepository _departmentsRepository; [Inject] public IDepartmentsRepository DepartmentsRepository { get { return _departmentsRepository; } set { _departmentsRepository = value; } } ... } 

Mais dans mes autres fonctions de contrôleur, que j’essaie d’accéder à DepartmentsRepository ou à _departmentsRepository, j’obtiens une référence d’object non définie à une instance d’ erreur d’ object lorsque j’essaie d’y accéder.

Y a-t-il autre chose que je dois faire ici?

J’avais un problème similaire. Regardez mes questions: Utilisation de Ninject avec Membership.Provider .

En gros, lorsque vous initialisez DepartmentsController vous devez injecter this (c’est-à-dire le contrôleur de votre département dans votre Ninject kernal. Il s’agit donc de quelque chose comme:

 public class DepartmentsController : Controller { private IDepartmentsRepository _departmentsRepository; [Inject] public IDepartmentsRepository DepartmentsRepository { get { return _departmentsRepository; } set { _departmentsRepository = value; } } public DepartmentsController() { NinjectHelper.Kernel.Inject(this); } } 

Où NinjectHelper obtient dans ce cas le kernel Ninject actuel.

Essayez quelque chose comme ça:

Global.asax.cs

  protected void Application_Start() { DependencyResolver.SetResolver( new MyDependencyResolver( new StandardKernel( new MyModule()))); //... } 

MyDependencyResolver.cs

  public class MyDependencyResolver : IDependencyResolver { private IKernel kernel; public MyDependencyResolver(IKernel kernel) { this.kernel = kernel; } public object GetService(Type serviceType) { return kernel.TryGet(serviceType); } public IEnumerable GetServices(Type serviceType) { return kernel.GetAll(serviceType); } } 

MyModule.cs

  public class MyModule : NinjectModule { public override void Load() { Bind().To(); } } 

Il peut y avoir 2 raisons pour lesquelles la référence d’object n’est pas définie comme exception

1) Ninject ne sait pas comment lier IDepartmentsRepository à une implémentation concrète de DepartmentsRepository (je doute cependant que ce soit le cas)

2) Si vous essayez d’accéder à la propriété DepartmentsRepository dans le constructeur de votre contrôleur, l’exception sera levée (Ninject ne pouvant injecter que des dépendances de propriétés après la construction de l’object).

J’espère que cela pourra aider.

Comme Daniel T. dans le commentaire ci-dessus posté, vous devriez vérifier Ninject.Web.Mvc . Si vous utilisez NinjectHttpApplication dans ce projet, tout se passera automatiquement dans le fichier. Ainsi, lorsque NinjectControllerFactory construira un nouveau contrôleur, il appellera Inject () pour que vous remplissiez les injections de propriétés.