2017-04-19 13 views
3

同じクラスの複数のインスタンスを登録しようとしています。そのクラスの列挙型を挿入すると、すべてのインスタンスが取得されるようになります。C#Unity Dependency Injectionでは、インスタンスの列挙型を取得するにはどうすればよいですか?

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

関連する問題