2010-05-06 11 views
0

J'ai 2 types concrets "CategoryFilter" & "StopWordsFilter" qui implémente "IWordTokensFilter".Problème IoC de StructureMap pour obtenir l'instance en cours d'exécution

ci-dessous est ma configuration:

ForRequestedType<IWordTokensFilter>().TheDefaultIsConcreteType<CategoryFilter>() 
      .AddInstances(x => 
      { 
       x.OfConcreteType<StopWordsFilter>(); 
      } 
     ); 

Le problème est l'exécution lorsque la carte de la structure auto injectent sur ma classe, bec. J'ai des arguments avec du même type de plug-in:

public ClassA(IWordTokensFilter stopWordsFilter, IWordTokensFilter categoryFilter) 

je suis toujours obtenir CategoryFilter dans mon premier argument, mais il devrait être stopWordsFilter.

Comment puis-je configurer cela correctement? merci à l'avance

Répondre

1

Il y a un certain nombre de solutions possibles:

1) Est-ce ClassA besoin de faire la différence entre les filtres, ou il ne suffit de les exécuter à la fois? Sinon, vous pouvez changer le constructeur d'accepter un tableau, ce qui entraînera tous les cas enregistrés de IWordTokensFilter à injecter:

public ClassA(IWordTokensFilter[] filters) 

Vous pouvez ensuite foreach sur les filtres pour les appliquer.

2) Si vous avez besoin de les différencier, car ils doivent être utilisés différemment, vous pouvez envisager d'avoir une implémentation d'une interface de marqueur pour mieux décrire son objectif. ClassA pourrait alors être changé pour prendre un IWordTokensFilter et un ICategoryFilter (ou tout ce que vous nommez l'interface du marqueur). Enregistrez CategoryFilter avec ICategoryFilter et les deux seront injectés correctement.

public ClassA(IWordTokensFilter stopWordsFilter, ICategoryFilter categoryFilter) 

3) Vous pouvez dire StructureMap explicitement comment créer ClasseA:

ForRequestedType<ClassA>().TheDefault.Is.ConstructedBy(c => { 
    return new ClassA(c.GetInstance<StopWordsFilter>(), c.GetInstance<CategoryFilter>()); 
}); 

4) Vous pouvez dire StructureMap pour remplacer une des dépendances pour ClasseA:

x.ForRequestedType<ClassA>().TheDefault.Is.OfConcreteType<ClassA>() 
    .CtorDependency<IWordTokensFilter>("stopWordsFilter").Is<StopWordsFilter>(); 
+0

Salut Joshua, Je suis vraiment satisfait de tes réponses. Je voudrais choisir la solution 1 mais j'ai beaucoup de filtres. Donc, j'ai décidé d'utiliser 3 ou 4. Btw, structuremap auto-injecter tous les types concrets à un tableau arguments dans votre solution 1? .. Merci beaucoup encore. –

+0

Oui, il va automatiquement injecter toutes les instances concrètes qu'il connaît. Vous pouvez le dire sur les instances en utilisant explicitement AddInstances (comme dans votre exemple), ou appelez AddAllTypesOf dans un balayage. –

+0

Merci encore Dude. –