2017-04-19 20 views
3

我想註冊同一類的多個實例,以便當我注入該類的枚舉時,我檢索所有實例。C#Unity依賴注入,我如何檢索一個可枚舉的實例?

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 
    } 
} 

到目前爲止,我已經有了:

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; 
    } 
} 

誰能告訴我怎麼做呢?

+0

似乎是一個奇怪的事情,但不會你只需要添加這些'ActionDialogType's到一個數組,該數組的'RegisterInstance'? – Crowcoder

回答

3

只需註冊依賴與名稱然後解析:

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

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

而且構造應具有相同的類型(你的情況接口):

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

你應該能夠解決的IEnumerable依賴關係:

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

由於Unity理解數組,因此您只需將枚舉映射到相同類型的數組。這將允許您返回實例的枚舉。

然後,你可以簡單地做到以下幾點:

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

感謝您的迴應,我想解決一個類的實例。你的回答只能解決各類 – chris31389

+0

@ chris313​​89我做出了改變,如果這是asp.net的核心將是這麼簡單'Container.GetAllInstances ()交易;' – Greg