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