Как использовать контейнер DI в устаревшем классе для создания экземпляра нового класса

#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 к этому устаревшему сценарию. Любой рефакторинг здесь должен будет всплывать вверх и наружу, туда, где на него ссылаются.