문제

다음 등록이 주어지면

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 -이 기능은 상자에서 나옵니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top