Я изучаю шаблоны проектирования и наткнулся на шаблон «Декоратор». Я провел исследование и реализовал рабочую версию.
Код: Выделить всё
public interface IWriter{
void Write(string text);
}
public class ConsoleWriter : IWriter{
public void Write(string text){
Console.WriteLine(text);
}
}
public class ConsoleWriterDecorator : IWriter{
private IWriter _writer;
public ConsoleWriterDecorator(IWriter writer){
_writer = writer;
}
public void Write(string text){
text = "Hello, Im decorator - " + text;
_writer.Write(text);
}
}
public void Main(string args[]){
IWriter consoleWriter = new ConsoleWriter();
IWriter decor = new ConsoleWriterDecorator(consoleWriter);
decor.Write("Pootis");
}
Однако я не уверен, насколько подходит внедрение зависимостей. Если бы я использовал DI-контейнер, я бы добавил такие зависимости:
Код: Выделить всё
services.AddTransient();
services.AddTransient();
Но каждый раз, когда я вызываю GetRequiredService();, возвращается IEnumerable, что имеет смысл. Он отлично работает с шаблоном стратегии, но я понятия не имею, как он сюда подходит. Но как мне тогда использовать декоратор с DI-контейнером? Я пытался найти решения, но в большинстве сообщений в блогах, которые я видел, тема внедрения зависимостей тихо опускалась. Я также пробовал использовать это:
Код: Выделить всё
AddTransient(x => {
IWriter consoleWriter = x.GetReqiuredService();
IWriter decor = new ConsoleWriterDecorator(consoleWriter);
return decor;
});
Но опять же, поскольку внутри лямбды есть еще один GetRequiredService, это тоже бесполезно. Более того, что, если ConsoleWriterDecorator или ConsoleWriter имеют другие зависимости? Что, если я добавлю больше декораторов? Это один из тех шаблонов проектирования, которые не поддерживают внедрение внедрения, или я просто не могу найти решение?
Заранее спасибо!