12
votes

Structuremap, constructeur qui prend une liste de plugins

J'ai eu une interface comme celle-ci xxx

et une classe xxx

je veux structure de structure pour remplir l'argument de constructeur sur l'écrivain Tous les Iwriter enregistrés. J'ai enregistré les différents écrivains avec xxx

si appelant xxx

renvoie une exception "aucune instance par défaut définie pour PlugInfamily System.Collections.Generic.Inienmere`1 [[iwriter ..]] " (nom de classe édité)

n'importe quel tour pour le faire automatiquement? ou devrai-je faire une méthode d'usine personnalisée?


0 commentaires

4 Réponses :


1
votes

Je pense que ce que cela vous dit, c'est que vous devez définir l'un de ces iyroils comme défaut. Imaginez une classe différente présentant le contrecoupeur suivant:

public class Test{
  public Test(IWriter writer){}
}


0 commentaires

10
votes

Lorsque vous souhaitez que toutes les instances concrètes d'un type à injecter, vous devez déclarer le paramètre en tant que tableau. Vous pouvez corriger votre problème en modifiant votre constructeur sur:

StructureMap.ObjectFactory.Initialize(x =>
{
    x.Scan(scan =>
    {
        scan.TheCallingAssembly();
        scan.AddAllTypesOf<IWriter>();
    });
});


0 commentaires

2
votes

I Dupliquiez votre problème et je pense que votre code fonctionnera si vous modifiez votre classe consommatrice de IWRITER pour avoir un CTOR qui prend un éventail de iwriter.

public class WriterMerger {  public WriterMerger(IWriter[] writers) }


0 commentaires

18
votes

En réalité, cela peut être fait sans changer votre constructeur

Changer votre configuration de conteneur sur: P>

StructureMap.ObjectFactory.Initialize(x =>
{
    x.Scan(scan =>
    {
        scan.TheCallingAssembly();
        scan.AddAllTypesOf<IWriter>();
    });
    x.ForRequestedType<IEnumerable<IWriter>>()
        .TheDefault.Is.ConstructedBy(x => ObjectFactory.GetAllInstances<IWriter>());
});


3 commentaires

Bien que cela nécessite un peu plus de spécifications, cette approche est moins couplée à la condition de StructureMap de spécifier la collection en tant que tableau et reçoit donc un +1 de moi.


Pour ceux qui utilisent SM3, il ressemble à andréquestype <> a été supprimé.


Je n'ai pas utilisé SM dans un moment, mais je crois que la prérequéetype <> est maintenant juste pour <>