Передача параметров из составного корня по цепочке DI - PullRequest
0 голосов
/ 27 ноября 2018

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

Чтобы проверить это, я хотел бы предоставить конечную точку 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.

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

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

1 Ответ

0 голосов
/ 27 ноября 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...