0

J'utilise le module Ninject.Web.Mvc (la version MVC 2) avec ASP.NET MVC 2. Ceci est un extrait de mon Global.asax.cs:Ninject.Web.Mvc add-on ne fonctionne pas avec ASP.NET MVC 2

protected override void OnApplicationStarted() 
{ 
    AreaRegistration.RegisterAllAreas(); 
    RegisterRoutes(RouteTable.Routes; 
    // RegisterAllControllersIn() is not available in the MVC 2 version of Ninject 
} 

protected override IKernel CreateKernel() 
{ 
    var kernel = new StandardKernel(); 
    kernel.Bind<IRepository>().To<NHibernateRepository>(); 

    return kernel; 
} 

J'ai aussi une base RepositoryController:

public class RepositoryController : Controller 
{ 
    protected IRepository Repository { get; set; } 

    public RepositoryController() 
    { 

    } 

    public RepositoryController(IRepository repository) 
    { 
     Repository = repository; 
    } 
} 

comme vous pouvez le voir, il est une configuration très simple où RepositoryController attend à injecter avec une instance d'un IRepository et Ninject est configuré pour utiliser une instance concrète de NHibernateRepository Toutefois, cela ne fonctionne pas et la propriété Repository est nulle lorsque j'essaie d'y accéder dans un contrôleur. Toutefois, si je change le code à la place:

[Inject] 
public IRepository Repository { get; set; } 

Ensuite, cela fonctionne très bien. Est-ce que quelqu'un sait pourquoi l'injection de constructeur ne fonctionne pas, mais l'injection de propriété est?

Répondre

1

Essayez de supprimer le constructeur sans paramètre.

Ninject peut choisir le mauvais constructeur à résoudre.

Pour le tester, vous pouvez mettre un point d'arrêt dans les deux constructeurs et voir lequel se déclenche, mais j'ai l'impression qu'il est sans paramètre.

+0

Whoa vous avez raison! C'est vraiment étrange parce que selon la documentation, il sélectionnera soit celui qui a l'attribut '[Inject]' (que j'ai essayé, mais il choisit toujours le paramètre sans paramètre), soit le constructeur qui a le plus de paramètres que Ninject sait procéder. http://github.com/ninject/ninject/wiki/Injection-Patterns –

+0

@Daniel c'est correct, et si vous utilisiez directement Ninject, je serais prêt à parier qu'il fonctionnerait de cette façon, mais j'ai l'impression que l'extension MVC ne fait pas tout à fait ça. Si vous aviez le noyau vous-même et avez fait Kernel.Resolve () alors vous auriez probablement ce que vous attendiez (mais là encore vous n'avez pas enregistré le contrôleur dans vos bindings, l'extension mvc le fait automagiquement problème) – Joseph

+1

J'ai trouvé la source du problème. Mon 'RepositoryController' est une classe de base pour tous mes autres contrôleurs qui ont besoin d'utiliser mon référentiel. Les sous-classes n'ont pas de constructeur, ce qui a amené Ninject à faire correspondre sa troisième condition: "Si aucun constructeur n'est défini, Ninject sélectionnera le constructeur par défaut sans paramètre." Donc, en d'autres termes, il regardait dans la sous-classe, ne trouvant aucun constructeur, et utilisait le constructeur par défaut sans paramètre, qui est celui que j'ai défini dans la classe de base. –

Questions connexes