Autofac композитный рисунок - PullRequest
6 голосов
/ 23 февраля 2011

Я заметил, что мне довольно часто нужно реализовывать составной шаблон.Например:

interface IService { ... }
class Service1 : IService { ... }
class Service2 : IService { ... }
class CompositeService : IService
{
    public CompositeService(IEnumerable<IService> services) { ... }
    ...
}

Я хочу зарегистрировать CompositeService в качестве IService в контейнере и добавить зависимости.

(выглядит несколько похоже на Decorator, но украшает набор служб вместо одного)

Каков наилучший способ сделать это в автофактуре?

Как будет выглядеть идеальное решение (для C #)?

Обновление:

Моя текущая регистрация:

builder.RegisterType<Service1>().Named<IService>("impl");
builder.RegisterType<Service2>().Named<IService>("impl");

builder.Register(c => new CompositeService(c.Resolve<IEnumerable<IService>>("impl")))
    .As<IService>();

Она похожа на Декорации от руки в http://nblumhardt.com/2011/01/decorator-support-in-autofac-2-4

Можно ли ее улучшить?

Ответы [ 2 ]

3 голосов
/ 26 февраля 2011

Я не реализовал это или даже не продумал полностью, но лучший синтаксис, которого я мог бы достичь, это:

builder
.RegisterComposite<IService>((c, elements) => new CompositeService(elements))
.WithElementsNamed("impl");

Параметр elements для функции регистрации будет иметь тип IEnumerable<IService> и инкапсулирует c.Resolve<IEnumerable<IService>>("impl").

Теперь, как это написать ...

1 голос
/ 23 февраля 2011

Вы можете попробовать именованные или ключевые регистрации.Именованная регистрация просто получает имя строки, чтобы отличать ее от других регистраций того же интерфейса.Точно так же ключ использует некоторый тип значения, например, перечисление, чтобы различать множественные регистрации.Ваш CompositeService, скорее всего, будет ссылкой по умолчанию, зарегистрированной по типу, и никакой другой специальной информации не потребуется.Вам понадобится какой-то метод для разрешения других зависимостей IService и передачи их конструктору;фабричный метод для CompositeService может работать.

...