문제
다음 등록이 주어지면
builder.Register<A>().As<I>();
builder.Register<B>().As<I>();
builder.Register<C>().As<I>();
var container = builder.Build();
나는 타입 I의 모든 인스턴스를 IEnumerable
(배열 또는 컬렉션은 중요하지 않습니다).
윈저에서 나는 다음을 썼을 것입니다.
foreach(I i in container.ResolveAll<I>())
{
...
}
Windsor에서 Autofac 1.4.4.561로 마이그레이션하고 있지만 동등한 구문을 볼 수 없습니다.
해결책
현재 Autofac의 Verovers : (2.0+, 오늘 사용해야 할 모든 것은)
당신은 여러 번 등록합니다 ILoggers
(예를 들어):
var builder = new ContainerBuilder();
builder.Register<ConsoleLogger>()
.As<ILogger>();
builder.Register<EmailLogger>()
.As<ILogger>()
.PreserveExistingDefaults(); //keeps console logger as the default
그런 다음 모든 것을 얻으십시오 ILogger
에스:
var loggers = container.Resolve<IEnumerable<ILogger>>();
특별한 일을 할 필요가 없습니다. IEnumerable<T>
원하는 유형의. AutoFac에는 다른 상자와 함께 컬렉션 지원이 있습니다. 어댑터 이는 추가 기능으로 구성 요소를 래핑 할 수 있습니다.
이것은 pre-2.x implicitcollectionsupportmodule과 동일한 사용법이지만 바로 구워졌습니다.
이전 버전의 경우 (0.x -1.4)
두 가지 방법:
1) 수집 등록을 사용하십시오
var builder = new ContainerBuilder();
builder.RegisterCollection<ILogger>()
.As<IEnumerable<ILogger>>();
builder.Register<ConsoleLogger>()
.As<ILogger>()
.MemberOf<IEnumerable<ILogger>>();
builder.Register<EmailLogger>()
.As<ILogger>()
.MemberOf<IEnumerable<ILogger>>();
그 다음에:
var loggers = container.Resolve<IEnumerable<ILogger>>();
그것은 당신에게 ienumerable을 제공합니다.
또는 2) implicitCollectionsUpport 모듈을 사용할 수있어 코드가 최신 버전의 AutoFAC처럼 작동하게합니다.
builder.RegisterModule(new ImplicitCollectionSupportModule());
builder.Register(component1).As<ILogger>;
builder.Register(component2).As<ILogger>;
그런 다음 모든 것을 해결하기보다는 Ilogger 모음을 해결하십시오.
var loggers = container.Resolve<IEnumerable<ILogger>>();
그것은 당신에게 다시 ienumerable을 제공합니다.
다른 팁
새로운 (2.x) 버전을위한 업데이트. 지금 필요한 것은 다음과 같습니다.
container.Resolve<IEnumerable<I>>();
더 이상 필요가 없습니다 RegisterCollection()
또는 ImplicitCollectionSupportModule
-이 기능은 상자에서 나옵니다.