Когда использовать Внедрение зависимости? Если не к?

Этот сайт использует платформу ASP.NET MVC и карту URL для маршрутов, а не физических страниц. Маршрут переходит к контроллеру, который затем решает, как отобразить страницу.

11
задан Asaph 9 October 2009 в 03:08
поделиться

4 ответа

Внедрение зависимостей, если оно сделано правильно (эффективно?), Безусловно, разделяет ваши объекты. На мой взгляд, область, в которой это преимущество реализуется больше всего, - это использование в модульных тестах объектов Mock или заглушек. Довольно часто это означает, что вы будете меньше проводить модульное тестирование в каждом отдельном тесте, что упростит их. Такое продвижение эффективных модульных тестов часто приносит свои собственные дополнительные преимущества.

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

5
ответ дан 3 December 2019 в 09:41
поделиться

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

Например, внедрение зависимостей позволяет использовать «настоящую» базу данных или «поддельную» базу данных, которая имитирует поведение настоящая база данных. В обоих случаях «внедряемая» зависимость имеет один и тот же интерфейс, но вы можете поменять реализацию.

4
ответ дан 3 December 2019 в 09:41
поделиться

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

Это также зависит от того, насколько четко определены или интуитивно понятны зависимости. Исходя из собственного опыта C ++, я нашел в .NET части, где зависимости явно очевидны и обеспечивали большую гибкость, но другие области, которые я просто не понимал вообще и не мог сразу понять требования к использовать определенный фрагмент кода или объект из-за множества факторов, включая наименование классов и мое знание системы.

Я говорю, если вы '

2
ответ дан 3 December 2019 в 09:41
поделиться

«Внедрение зависимостей» охватывает широкий спектр, от передачи параметров конструктора в структуру, сконфигурированную с помощью XML. Одна золотая середина, которую я недавно «обнаружил», охватывает многие «фиктивные» случаи, не нуждаясь в реальной структуре. Это немного подрывно, но с ним намного проще работать в отдельных случаях.

Вы переопределяете фабричный метод внутри своего основного кода, чтобы запускать тесты с поддельным сервисом. По сути, это компромисс между злоупотреблением наследованием (с помощью этого метода) и злоупотреблением конфигурацией (с помощью фреймворков). В любом случае это «внедрение зависимостей» или, как мы в реальном мире называем, параметризация.

Основной код:

public class A {
    // ...
    private service;

    protected Service getService() {
        return new RealService();
    }

    public A() {
        service = getService();
    }
    // ...
}

Тестовый код:

public class Test {
    void test() {
        final Service fakeService = new FakeService();
        A thingToTest = new A() { 
            protected Service getService() { return fakeService; }
        }
        thingToTest.doOneThing();
        // ...
    }
}
0
ответ дан 3 December 2019 в 09:41
поделиться