#c# #winforms #dependency-injection #inversion-of-control #simple-injector
Вопрос:
В огромном решении Winforms есть устаревший класс, который я не могу изменить в конструкторе (потому что на него много ссылок).
Однако мне нужно вызвать новый метод класса в одном из методов внутри этого устаревшего класса.
Ниже приведен пример.
/// <summary>
/// This class has been referenced by number of other legacy code
/// </summary>
public class LegacyClass
{
public void LegacyMethod(string message)
{
LegacyHelper helper = new LegacyHelper();
helper.Print();
// I need to call my new class method here.
INewClass newClass = new NewClass(new Logger());
newClass.Print(message);
}
}
/// <summary>
/// Newly created class with interface. All registered with the container.
/// </summary>
public class NewClass : INewClass
{
private readonly ILogger _logger;
public NewClass(ILogger logger)
{
_logger = logger;
}
public void Print(string message)
{
Console.WriteLine(message);
_logger.Save();
}
}
public interface INewClass
{
void Print(string message);
}
Я использую простой инжектор в качестве контейнера DI. Какой вариант у меня есть здесь, чтобы свободно сочетаться с недавно созданным классом?
INewClass newClass = new NewClass(new Logger());
Я знаю, что мне следует избегать использования Service Locator. (Корень композиции находится в другом проекте)
Комментарии:
1. Я использую сервис-локатор. Это либо так, либо фабрика для создания экземпляра.
2. @GHDevOps вы хотите сказать, что используете фабрику внутри устаревшего кода? Затем фабрику необходимо обновить до устаревшего класса.
3. Квадратный колышек, круглое отверстие и много технических долгов. Вы пытаетесь применить DI, но затрудняете подход. Чего вы надеетесь достичь, пытаясь применить DI к этому устаревшему сценарию. Любой рефакторинг здесь должен будет всплывать вверх и наружу, туда, где на него ссылаются.