Где (слой) должен использоваться DI? - PullRequest
3 голосов
/ 01 июня 2010

Есть ли слой, где плохая практика - использовать DI? В предыдущем вопросе пользователь упомянул, что DI должен использоваться только на уровне пользовательского интерфейса.

Ответы [ 4 ]

5 голосов
/ 01 июня 2010

Я думаю, что вы, возможно, неправильно истолковали ответ, предоставленный Дарен Димитров . Если я не ошибаюсь, строка, которая породила этот вопрос: « Кроме того, вы не должны создавать зависимость с инфраструктурой DI в бизнес-уровнях приложения. Я считаю, что он говорит, что вся информация / отображения зависимостей должна создаваться на самом высоком уровне приложения. Это не означает, что зависимости не будут присутствовать на всех уровнях вашего приложения, просто нижние уровни не отвечают за настройку сопоставлений.

Если моя интерпретация верна, то я согласен с ним - настройте ваши отображения зависимостей на поверхности вашего приложения. Если вместо этого он говорит, что вы никогда не должны разрешать зависимость на нижних уровнях, я бы не согласился.

4 голосов
/ 01 июня 2010

Dependency Injection (DI) следует использовать везде .Однако обратите внимание, что DI - это всего лишь набор шаблонов, а не фреймворк или библиотека.Лучший способ думать о DI - это то, что это слабосвязанный код , включаемый Constructor Injection .Вы можете написать DI-дружественный код полностью, даже не обращаясь к DI-контейнеру или используя анти-паттерн Service Locator .

Следующий вопрос, который приходит на умто есть где должны быть составлены компоненты? Это, вероятно, то, что подразумевается под первоначальным утверждением: only compose приложение на самом внешнем уровне - UI или(веб) интерфейс сервиса.Это то, что я называю Композиционный корень .Остальной код остается модульным и гибким.

В корне композиции вы можете использовать DI для бедного человека или соответствующий DI-контейнер .Я настоятельно рекомендую вам использовать DI-контейнер, но это не обязательно.

Чтобы проиллюстрировать, что я имею в виду под DI, вот пример:

public class Foo : IFoo
{
    private readonly IBar bar;

    public Foo(IBar bar)
    {
        if (bar == null)
        {
            throw new ArgumentNullException("bar");
        }

        this.bar = bar;
    }

    public IBaz Baz(ISnafu snafu)
    {
        return this.bar.Snafize(snafu).ToBaz();
    }
}

Реализация IBaz может быть реализована в виде полностью отдельная библиотека от той, которая определяет класс Foo.Кроме того, потребителям, находящимся выше в стеке, не нужно ничего знать о Foo и IBar - они могут просто потреблять IFoo:

public class MyClass : ISomeInterface
{
    private readonly IFoo foo;

    public MyClass(IFoo foo)
    {
        if (foo == null)
        {
            throw new ArgumentNullException("foo");
        }

        this.foo = foo;
    }

    // ...
}

Это обеспечивает слабую связь, которая является мотивацией для DI.Повторите столько, сколько необходимо.

3 голосов
/ 01 июня 2010

DI следует использовать в любом случае, когда один компонент зависит от другого, будь то пользовательский интерфейс -> Бизнес, бизнес -> Доступ к данным или любой другой. Я не думаю, что его следует использовать только для пользовательского интерфейса, просто DI облегчает тестирование пользовательского интерфейса и, таким образом, дает больше непосредственных преимуществ.

2 голосов
/ 01 июня 2010

Я не согласен с этим утверждением. Либо предыдущий вопрос, который вы цитируете, неверен, либо вы его неправильно истолковали.

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

Вы используете DI везде, где могут быть правильно предоставлены зависимости.

Независимо от того, выберете ли вы заводское или цифровое решение,

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