2010-09-18 8 views
5

Je suis relativement nouveau sur Ninject, mais j'ai réussi à l'utiliser pour DI en utilisant un fournisseur personnalisé.Ninject, Providers et Activator.CreateInstance

La liaison est initialisées comme suit

kernel = new StandardKernel(); 

kernel.Bind<IPatientRecordLocator>().ToProvider<PatientRecordLocatorProvider>(); 

et le fournisseur personnalisé J'appelle Activator.CreateInstance comme si

protected override IPatientRecordLocator CreateInstance(IContext context) 
{ 
    var name = ConfigurationManager.AppSettings["PatientRecordLocator"]; 
    var typeName = name.Split(',')[0]; 
    var assemblyName = name.Split(',')[1]; 
    return Activator.CreateInstance(assemblyName, typeName).Unwrap() as IPatientRecordLocator; 
} 

(oui, je suis conscient qu'il n'y a pas de traitement d'erreur, etc. dans le code ci-dessus :))

et tout cela fonctionne comme un charme. Maintenant, le problème auquel je suis confronté est lorsque je présente une nouvelle classe que je souhaite injecter dans des instances de IPatientRecordLocator. Le problème se produit lorsque j'ajoute un constructeur comme le suivant par exemple. une de ces classes

[Inject] 
public MockPatientRecordLocator (IContactAdapter contactAdapter) 
{ 
    ... 
} 

Ensuite, pour Activator.CreateInstance à je travaille ont aussi d'ajouter un constructeur à la classe MockPatientRecordLocator parameterless, à savoir

public MockPatientRecordLocator() 
{ 
} 

Alors, ma question est la suivante: comment puis-je faire Ninject injecter une instance d'une classe qui implémente IContactAdapter dans par exemple MockPatientRecordLocator? J'ai essayé l'injection de méthode, mais en vain. J'ai oublié d'expliquer que ce que j'essaye de réaliser est une sorte d'injection chaînée où une instance de la classe PatientRecordSummary est injectée avec une instance de MockPatientRecordLocator (en utilisant l'injection de constructeur) et ladite instance de MockPatientRecordLocator devrait être injectée avec un instance de IContactAdapter (utilisant à nouveau l'injection du constructeur (si possible)). La première partie de la chaîne fonctionne, la seconde ne fonctionne pas.

Répondre

1

Pas mal pour une première question!

Vous voulez utiliser la surcharge Bind(Type) pour permettre l'enregistrement des choses que vous n'avez pas statiquement disponible dans le cadre de votre code Load() - faire les choses que vous faites dans votre fournisseur (c.-à-résoudre le Type) à l'avance . Cela permettra Ninject faire l'instanciation d'objet (sans aucune exigence d'une .ctor par défaut)

IIRC two or 3 of my most recent answers toucher aussi ce genre de choses découverte/chargement, et avoir des exemples qui devraient être pertinents pour votre cas.

(Et vous n'aurez pas besoin de recourir à [Inject] attributs lorsque vous avez appris à enlever des choses)

+0

Salut Ruben, merci pour votre aide (et compliment). Essayer le mieux que je peux :-) Dans cette configuration particulière, je n'ai pas utilisé de modules, mais je vais passer à les utiliser pour que je puisse utiliser plus facilement Bind(). – norgie

Questions connexes