List<T>
очень обычно замечаемый контейнер, потому что это так очень универсально (с большим количеством удобных методов как Sort
, Find
, и т.д.) - но не имеет никаких точек расширения, если Вы хотите переопределить какое-либо поведение (начните работу, объекты вставляют, например).
Collection<T>
обертка вокруг любого IList<T>
(принимающий значение по умолчанию к List<T>
) - она имеет точки расширения (virtual
методы), но не как много методов поддержки как Find
. Из-за косвенности это немного медленнее, чем List<T>
, но не очень.
С LINQ, дополнительные методы в List<T>
становятся менее важными, так как LINQ к объектам имеет тенденцию обеспечивать их так или иначе..., например First(pred)
, OrderBy(...)
, и т.д.
Для текущих версий Autofac: (2.0+, так что все, что вы должны использовать сегодня)
Вы регистрируете несколько ILogger
(например):
var builder = new ContainerBuilder();
builder.Register<ConsoleLogger>()
.As<ILogger>();
builder.Register<EmailLogger>()
.As<ILogger>()
.PreserveExistingDefaults(); //keeps console logger as the default
Затем получить все ILogger
s:
var loggers = container.Resolve<IEnumerable<ILogger>>();
Вам не нужно делать ничего особенного, просто запросите IEnumerable
желаемого типа. Autofac имеет встроенную поддержку сбора вместе с другими адаптерами , которые могут обернуть ваши компоненты дополнительными функциями.
Это то же использование, что и ImplicitCollectionSupportModule до версии 2.x, но встроено прямо в него.
Для старых версий (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
— эта функциональность поставляется из коробки.