2017-04-19 1 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

@ chris31389 만약 이것이 asp.net 코어라면'Container.GetAllInstances ();'처럼 간단하게 변경했습니다. – Greg

관련 문제