2016-06-16 2 views
0

키를 사용하여 제공 서비스의 모든 유형을 해결할 수있는 방법이 있으며 그 키는 여러 번 사용됩니까? 이것은 의존성 주입을위한 것이 아닙니다. 달성하고자하는 것은 그룹 구성 요소이며 그룹의 구성 요소 목록을 가져옵니다.Castle Windsor Resolve 여러 구성 요소의 키를 사용하여 해결

내가, 각각의 목적은 여러 구현을 가질 수있다하고 나는 각각의 목적을 위해 인터페이스를 만들려고하지 않는 여러 가지 목적으로이 인터페이스를 사용하려면
interface ICommand 
{ 
    void Execute(); 
} 

, 내가 원하는 :
예를 들어 , 나는 인터페이스가 이 ICommand 인터페이스를 사용하십시오.
나는 다음과 같은 일을 할 수 있도록하려면 :

ICommand[] commands = container.ResolveAll<ICommand>("purpose1"); 
ICommand[] commands2 = container.ResolveAll<ICommand>("purpose2"); 

위는 등록이 이미 수행 된 가정합니다. 누구든지이 작업을 수행하는 방법에 대해 알고 있습니까?
캐슬 윈저는 의존성 주입을하기위한 것이지만이 목적에 도움이된다는 것을 알았습니다. 자연적으로 MEF를 사용할 수 있지만 일부 구성 요소에는 의존성이 있습니다. 미리 감사드립니다.

+1

왜 ICommand 대신 ICommand []를 등록하지 않으시겠습니까? –

+0

당신이 제안하는대로 할 수 있기를 바란다. @yacoub – arturomonriv

+0

BTW 감사합니다. @YacoubMassad – arturomonriv

답변

1

키 이름을 제공하는 것은 컨테이너 아래 동일한 서비스를 여러 번 구현하는 것과 구별되는 것입니다.

아마도 구현에 속한 그룹의 이름을 보유 할 수있는 서비스에서 서비스를 정의 할 수 있습니다.

당신은 다음과 같은 것을 할 수 UnityContainer 사용 :

interface ICommand 
{ 
    void Execute(); 
    string GroupName { get; } 
} 

class CommandImpl1 : ICommand 
{ 
    void Execute() { ... } 
    string GroupName { get { return "group1"; } 
} 

class CommandImpl2 : ICommand 
{ 
    void Execute() { ... } 
    string GroupName { get { return "group1"; } 
} 

그런 다음 당신이 등록 할 수 있습니다

Container.Register<ICommand, CommandImpl1>("a"); 
Container.Register<ICommand, CommandImpl2>("b"); 

을 그리고 당신이 찾고있는 그룹에 대한 모든 당겨 :

IEnumerable<ICommand> allCommands = Container.ResolveAll<ICommand>(); 
IEnumerable<ICommand> group1Commands = allCommands 
    .Where(cmds => cmds.GroupName.Equals("group1")); 

그것을 테스트하지 않았지만 그것이 효과가 있다고 생각합니다. 또 다른 접근법은 구현 된 서비스에서 주석을 사용하는 것입니다.

건배 !!

+0

이 접근법의 가장 큰 문제점은 내가 추가해야 할 것입니다. 인터페이스가 허용되지 않는 속성 @erickpimienta – arturomonriv

관련 문제