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, но не вижу эквивалентного синтаксиса.

457   2  

2 ответов:

для текущих версий 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

тогда получите все ILoggers:

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 - эта функция выходит из коробки.

Comments

    Ничего не найдено.