2009-12-27 6 views
4

Je travaille sur une extension d'infrastructure qui gère l'injection dynamique en utilisant Ninject comme conteneur IoC, mais j'ai du mal à trouver comment y parvenir.Liaison tardive avec Ninject

L'attente de mon cadre est que vous allez passer dans le IModule(s) il peut facilement être utilisé dans MVC, WebForms, etc. J'ai la classe structuré comme celui-ci:

public class NinjectFactory : IFactory, IDisposable { 
    readonly IKernel kernel; 
    public NinjectFactory(IModule[] modules) { 
    kernel = new StandardKernel(modules); 
    } 
} 

C'est très bien , Je peux créer une instance dans un test d'unité et passer une implémentation de base de IModule (en utilisant la version InlineModule qui semble être recommandée pour les tests).

Le problème est que ce n'est pas avant l'exécution que je sais que je dois injecter le type (s), et ils sont invités par le cadre que je me étendre, dans une méthode comme ceci:

public IInterface Create(Type neededType) { 

} 

et voici où je suis perplexe, je ne suis pas sûr de la meilleure façon de Check-> que (le cas échéant) -> retour, j'ai ce jusqu'à présent:

public IInterface Create(Type neededType) { 
    if(!kernel.Components.Has(neededType)) { 
    kernel.Components.Connect(neededType, new StandardBindingFactory()); 
    } 
} 

cela ajoute à la collection de composants, mais je ne peux pas travailler si c'est créé une instance ou comment je crée une instance et passer des arguments pour le .ctor. Est-ce que je suis sur le bon chemin, ou est-ce que Ninject n'est même pas destiné à être utilisé de cette façon?

Répondre

7

À moins que vous ne souhaitiez modifier ou étendre les composants internes de Ninject, il n'est pas nécessaire d'ajouter quoi que ce soit à la collection Components sur le noyau. Pour déterminer si une liaison est disponible pour un type, vous pouvez faire quelque chose comme ceci:

Type neededType = ...; 
IKernel kernel = ...; 

var registry = kernel.Components.Get<IBindingRegistry>(); 
if (registry.Has(neededType)) { 
    // Ninject can activate the type 
} 
Questions connexes