Programing

Autofac : 유형의 모든 인스턴스 해결

lottogame 2020. 11. 27. 07:37
반응형

Autofac : 유형의 모든 인스턴스 해결


다음 등록을 감안할 때

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의 현재 버전 : (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은 추가 기능으로 구성 요소를 래핑 할 수 있는 다른 어댑터 와 함께 즉시 컬렉션을 지원 합니다.

이것은 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이 기능이 필요하지 않습니다 .

참고 URL : https://stackoverflow.com/questions/1406148/autofac-resolve-all-instances-of-a-type

반응형