2009-12-18 4 views
1

J'utilise Ninject 2 avec une application Web ASP.NET MVC. Toutes les dépendances sont gérées correctement dans la pile (Contrôleurs-> Services-> Référentiels). Cependant j'ai quelques classes dans le projet de services qui ne sont pas dans cette «chaîne» que je veux également injecter quand l'application commence. Comment faire pour que Ninject les reconnaisse? J'ai des propriétés publiques avec [Inject] attributs mais quand l'application s'exécute, ils sont null. Qu'est-ce que je rate?Question d'injection lors de l'utilisation de Ninject 2 dans une application ASP.NET MVC

Voici ma classe MvcApplication:

public class MvcApplication : NinjectHttpApplication 
{ 
    protected override void OnApplicationStarted() { 
     RegisterRoutes(RouteTable.Routes); 
     RegisterAllControllersIn(Assembly.GetExecutingAssembly()); 
    } 

    protected override IKernel CreateKernel() { 
     var modules = new INinjectModule[] { 
      new Services.ServiceModule(), 
      new Data.DataModule() 
     }; 

     var kernel = new StandardKernel(modules); 

     return kernel; 
    } 

    // route registration removed 
} 

Je double vérifié les deux modules pour vous assurer que les liaisons existent correctes.

Exemple d'un module:

public class ServiceModule : NinjectModule 
{ 
    public override void Load() { 
     Bind<IAccountService>().To<AccountService>(); 
     .... 
    } 
} 

Répondre

2

Afin que Ninject puisse injecter des dépendances, vous devez créer l'objet en utilisant le noyau. C'est facile pour les objets de la chaîne de dépendance naturelle (c'est-à-dire dans votre application, Contrôleurs-> Services-> Référentiels), mais cela peut être difficile pour ceux qui n'en font pas partie.

Vous devez soit ajouter les types supplémentaires en tant que dépendances d'un des types créés dans la chaîne naturelle, soit obtenir un hook sur le noyau et appeler Get <T>. Pour ce faire, vous devrez peut-être utiliser un localisateur de service statique.

0

CreateKernel Êtes-vous essentiels()? Vous devez faire cela et faire votre liaison là-bas.

+0

Ouais je fais ça. Je vais mettre à jour la question –

+0

Ajouté le code et a essayé de clarifier mieux –

+0

Tout semble bien là. Pouvez-vous poster une partie du code dans l'un de vos modules? –