Autofac: Разрешите все экземпляры Типа

List<T> очень обычно замечаемый контейнер, потому что это так очень универсально (с большим количеством удобных методов как Sort, Find, и т.д.) - но не имеет никаких точек расширения, если Вы хотите переопределить какое-либо поведение (начните работу, объекты вставляют, например).

Collection<T> обертка вокруг любого IList<T> (принимающий значение по умолчанию к List<T>) - она имеет точки расширения (virtual методы), но не как много методов поддержки как Find. Из-за косвенности это немного медленнее, чем List<T>, но не очень.

С LINQ, дополнительные методы в List<T> становятся менее важными, так как LINQ к объектам имеет тенденцию обеспечивать их так или иначе..., например First(pred), OrderBy(...), и т.д.

63
задан Keith Pinson 17 September 2013 в 17:50
поделиться

2 ответа

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

83
ответ дан 24 November 2019 в 16:15
поделиться

Обновление ради новой (2.x) версии. Все, что вам нужно сейчас, это:

container.Resolve<IEnumerable<I>>();

Больше нет необходимости в RegisterCollection() или ImplicitCollectionSupportModule — эта функциональность поставляется из коробки.

57
ответ дан 24 November 2019 в 16:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: