Передача параметров из составного корня по цепочке DI

2

Я работаю над проектом, в котором очень мало внедрения зависимостей, и я хотел бы начать добавлять его постепенно.

Чтобы проверить это, я хотел бы предоставить конечную точку API, взять параметры, переданные вызывающему клиенту методу API, создать корень композиции, а затем передать параметры по цепочке. Контейнер IoC, который я использую, - Autofac.

Вопрос, который у меня возник, заключается в том, каков наилучший способ передачи параметров времени выполнения конструктору (параметрам, переданным потребителем API) разрешенного сервиса из корня композиции? Также допустим, что каждый конструктор принимает параметр, переданный API, как бы передать ему параметр по цепочке через все конструкторы служб?

Ответы, которые я вижу, ища ответ, включают прохождение фабрики. Так что у меня будет что-то вроде этого:

class Example
{
    private readonly ISftpClientFactory _clientFactory;

    public Example(ISftpClientFactory injectedFactory)
    {
        _clientFactory = injectedFactory;
    }

    public void DoTheWork()
    {
        var client = _clientFactory.GetClient(host, userName, password, timeout);
    }
}

Проблема с этим ответом состоит в том, что я не знаю строковые параметры, передаваемые в GetClient в DoTheWork, он должен быть передан этому классу через конструктор из корня композиции, который получает параметры из метода API.

Другие решения, которые я видел на фабрике, всегда выглядят так, как будто у меня есть информация, доступная в глобальном хранилище, таком как текстовое поле или сеанс. В моем случае я мог сохранить параметры в другом классе, а затем создать фабрику для извлечения из этого хранилища, а затем передать эту фабрику вниз, но это выглядит как избыточное и нарушает инкапсуляцию.

Вопрос может быть

  • 0
    Как вызывается DoTheWork() ? Можете ли вы добавить метод, который вызывает метод, пожалуйста?
Теги:
dependency-injection
inversion-of-control
autofac

1 ответ

1
Лучший ответ

Корень композиции не должен иметь дело с данными времени выполнения. Это касается только фиксированных значений конфигурации и конструкции компонентов. Как описано более подробно здесь, данные времени выполнения должны "течь" через методы и свойства уже созданных экземпляров графов объектов:

Не вставляйте данные времени выполнения в компоненты приложения во время построения; это вызывает двусмысленность, усложняет корень композиции с дополнительной ответственностью и чрезвычайно затрудняет проверку правильности конфигурации DI. Вместо этого, пусть данные времени выполнения проходят через вызовы методов построенных графов объектов.

  • 0
    Это имеет смысл. Я предполагаю, что моя проблема в том, что я хотел бы заставить потребителя класса передавать определенную информацию для создания экземпляра класса. Если я делаю это в методе, я должен продолжать проверять, являются ли вещи нулевыми, и выбрасывать исключения. Также я хотел бы иметь возможность передавать информацию сверху всем инициализируемым классам, что было бы здорово, если бы я мог сделать это через контейнер IoC

Ещё вопросы

Сообщество Overcoder
Наверх
Меню