Предположим, у меня есть интерфейс с несколькими реализациями базовыми:Украсьте каждый элемент разрешенное в коллекции с замок Виндзор
interface IPrinter
{
void Print();
}
class Printer1 : IPrinter
{
public void Print()
{
Console.WriteLine(GetType());
}
}
class Printer2 : IPrinter
{
public void Print()
{
Console.WriteLine(GetType());
}
}
У меня также есть реализация декоратора:
class ModifyingPrinter : IPrinter
{
private readonly IPrinter _printer;
public ModifyingPrinter(IPrinter printer)
{
_printer = printer;
}
public void Print()
{
Console.Write("Modified ");
_printer.Print();
}
}
Наконец, у меня есть сервис который требует набора интерфейса:
class Service
{
private readonly IEnumerable<IPrinter> _printers;
public Service(IEnumerable<IPrinter> printers)
{
_printer = printer;
}
public void Print()
{
foreach (var printer in _printer)
{
printer.Print();
}
}
}
Что я хочу для Service
иметь Printer1
и Printer2
в коллекции, каждый из которых оформлен с ModifyingPrinter
так, что выход Service.Print()
является:
Modified Printer1
Modified Printer2
Я пытался регистрировать классы следующим образом:
var container = new WindsorContainer();
container.Kernel.Resolver.AddSubResolver(
new CollectionResolver(container.Kernel, true));
container.Register(Component.For<IPrinter>()
.ImplementedBy<ModifyingPrinter>()
.LifestyleTransient());
container.Register(Component.For<IPrinter>()
.ImplementedBy<Printer1>());
container.Register(Component.For<IPrinter>()
.ImplementedBy<Printer2>());
container.Register(Component.For<Service>());
Но это приводит к следующий вывод:
Modified Printer1
Printer1
Printer2
оказывается, что CollectionResolver
I Виндзора s, поставляющий одну из всех реализаций IPrinter
(что понятно) вместо того, чтобы признать, что ModifyingPrinter
является декоратором и использует его для обертывания двух других реализаций.
Мой вопрос: Есть ли способ зарегистрировать эти классы, чтобы коллекция содержала только декорированные базовые реализации?
Я читал в другом месте где-то, что я могу создать перехватчик и зарегистрировать Printer1
и Printer2
с перехватчиком, но я хотел бы оставить шаблон декоратора, если смогу.