2017-04-19 1 views
3

J'essaie d'enregistrer plusieurs instances de la même classe de sorte que lorsque j'injecte un énumérable de cette classe, je récupère toutes les instances.C# Unity Dependency Injection, comment puis-je récupérer une énumération d'instances?

public class ActionDialogType 
{ 
    public Type Type { get; set; } 

    public string Name { get; set; } 
} 



public class ActionDialogTypeUser 
{ 
    private IEnumerable<ActionDialogType> _types; 
    public ActionDialogTypeUser(IEnumerable<ActionDialogType> types) 
    { 
     _types = types 
    } 
    public void DoSomethingWithTypes() 
    { 
     // Do Something with types 
    } 
} 

Jusqu'à présent, j'ai:

public class UnityConfig 
{ 
    public IUnityContainer Register() 
    { 
     UnityContainer container = new UnityContainer(); 

     ActionDialogType actionDialogType1 = new ActionDialogType 
     { 
      Name = "Something", 
      Type = typeof(Something) 
     }; 
     container.RegisterInstance<IActionDialogType>(actionDialogType1, new ContainerControlledLifetimeManager()); 

     ActionDialogType actionDialogType2 = new ActionDialogType 
     { 
      Name = "SomethingElse", 
      Type = typeof(SomethingElse) 
     }; 
     container.RegisterInstance<ActionDialogType>(actionDialogType2, new ContainerControlledLifetimeManager()); 
     container.RegisterType<IEnumerable<ActionDialogType>, ActionDialogType[]>(); 

     return container; 
    } 
} 

Quelqu'un peut-il me montrer comment faire cela?

+0

On dirait une chose étrange à faire, mais cela ne vous suffit d'ajouter ces 'ActionDialogType's à un tableau et' RegisterInstance' de ce tableau? – Crowcoder

Répondre

3

registre juste des dépendances avec des noms puis résoudre:

... 
container.RegisterInstance<IActionDialogType>("actionDialogType1", actionDialogType1, new ContainerControlledLifetimeManager()); 
... 
container.RegisterInstance<IActionDialogType>("actionDialogType2", actionDialogType2, new ContainerControlledLifetimeManager()); 

var actionDialogTypeUser = container.Resolve<ActionDialogTypeUser>(); 

constructeur devrait également avoir les mêmes types (interfaces dans votre cas):

public ActionDialogTypeUser(IEnumerable<IActionDialogType> types) 
{ 
    _types = types 
} 
0

Vous devriez être en mesure de résoudre un IEnumerable de les dépendances avec:

container.RegisterType<IEnumerable<IActionDialogType>, IActionDialogType[]>(); 

Puisque Unity comprend un tableau, il suffit de mapper l'énumérable à un tableau du même type. Ce qui vous permettrait de renvoyer un énumérable de l'instance.

Ensuite, vous pouvez simplement faire ce qui suit:

public class ExampleController : Controller 
{ 
    private readonly IEnumerable<IActionDialogType> actionDialogType; 
    public ExampleController(IActionDialogType actionDialogType) 
    { 
     this.actionDialogType = actionDialogType; 
    } 

    public IActionResult Get() 
    { 
     foreach(IActionDialogType instance in actionDialogType) 
     { 
       // Should expose via each now. 
       var name = instance.GetType().Name; 
     } 
    } 
} 
+0

Merci pour la réponse, je veux cependant résoudre les instances d'une classe. Votre réponse ne concerne que les types de résolution – chris31389

+0

@ chris31389 J'ai fait un changement, si c'était le noyau d'asp.net, il serait aussi simple que 'Container.GetAllInstances ();' – Greg