2011-02-23 5 views
5

나는 종종 복합 패턴을 구현해야한다는 것을 알았다. 예 :자동 합성 패턴

interface IService { ... } 
class Service1 : IService { ... } 
class Service2 : IService { ... } 
class CompositeService : IService 
{ 
    public CompositeService(IEnumerable<IService> services) { ... } 
    ... 
} 

컨테이너에 IService로 CompositeService를 등록하고 종속성을 주입하려고합니다.

는 (장식 다소 비슷하지만 서비스 대신 하나의 세트 장식)

autofac에서 할 수있는 가장 좋은 방법은 무엇입니까?

이상적인 솔루션은 (C#의 경우) 어떻게 생겼습니까?

업데이트 :

나의 현재 등록은 다음과 같습니다

builder.RegisterType<Service1>().Named<IService>("impl"); 
builder.RegisterType<Service2>().Named<IService>("impl"); 

builder.Register(c => new CompositeService(c.Resolve<IEnumerable<IService>>("impl"))) 
    .As<IService>(); 

그것은 http://nblumhardt.com/2011/01/decorator-support-in-autofac-2-4

에 손에 의해 장식과 유사 그것이 개선 할 수 있습니까?

답변

3

나는 이것을 구현하거나 완전히 통해 생각했지만, 내가 얻을 수있는 최선의 구문은하지 않은 :

builder 
.RegisterComposite<IService>((c, elements) => new CompositeService(elements)) 
.WithElementsNamed("impl"); 

가 등록 기능에 elements 매개 변수 유형 IEnumerable<IService>의 수와 c.Resolve<IEnumerable<IService>>("impl")을 캡슐화한다.

작성 방법 ...

+0

또한 간단한 경우에 더 간단한 버전을 제안합니다 : 'builder.RegisterCompositeType ("impl")'. 의존성을 이미 주입 할 수 있기 때문에 나는 생성자를 수동으로 호출하는 것을 좋아하지 않는다. –

+1

@ Constantin Spirin : 나는 그 오버로드를 가하는 것을 고려해 왔지만 내 대답에서 어떤 일이 벌어지고 있는지에 대해 명시하고 싶었다. 필자가 변경하는 유일한 방법은 여전히 ​​WithElementsNamed (및 WithElementsKeyed) 메서드를 사용하므로 다양한 등록 유형에 대해 'RegisterComposite'오버로드를 만들 필요가 없다는 것입니다. 다른 등록 메소드는 명명 된/키 유형에 대해 수행됩니다). –

1

이름이 있거나 키가있는 등록을 시도 할 수 있습니다. 명명 된 등록은 동일한 인터페이스의 다른 등록과 구별하기 위해 단순히 문자열 이름을 가져옵니다. 마찬가지로, 키는 여러 값 사이를 구별하기 위해 enum과 같은 값 유형을 사용합니다. 귀하의 CompositeService는 다른 특별한 정보가 필요없는 유형별로 등록 된 기본 참조 일 가능성이 높습니다. 다른 IService 종속성을 해결하고이를 생성자에 전달하는 방법이 필요합니다. CompositeService의 팩토리 메서드가 작동 할 가능성이 있습니다.

+0

고마워요! 나는 현재 당신이 묘사 한 것을 정확하게하고 있습니다. 더 똑똑하고 짧은 코드를 원했습니다. –