В проекте, который использует структуру DI, вы НИКОГДА не должны использовать оператор 'new'? - PullRequest
7 голосов
/ 28 марта 2010

Я пытаюсь обернуть голову вокруг инъекции зависимости.

Одна из вещей, которые меня смущают, заключается в том, должен ли весь создания вашего объекта управляться инфраструктурой DI (Spring, Guice и т. Д.).

Или, если нет, как вы определяете, какие объекты создаются в рамках инфраструктуры, а какие объекты создаются с помощью оператора new?

Ответы [ 5 ]

11 голосов
/ 28 марта 2010

Нет, еще есть место для нового. Не все объекты должны находиться под контролем фабрики DI.

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

Любой локальный объект в реализации имеет право вызывать новый. Объекты модели, созданные для удовлетворения конкретного варианта использования, следует создавать, вызывая new и передавая значения параметров для этого конкретного экземпляра.

10 голосов
/ 28 марта 2010

Я нашел этот пост . Автор Miško. Очень полезен для определения того, какие объекты следует вводить как зависимости, а какие можно создавать. Он различает классы «Newable» и «Injectable».

2 голосов
/ 11 апреля 2010

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

То, что «исключает нового оператора», в основном просто дает хорошее руководство, где искать DI-способные вещи.

1 голос
/ 29 марта 2010

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

Так что, хотя new и управляемый контейнером DI в java обычно являются взаимоисключающими, это не жесткое и быстрое правило.

1 голос
/ 28 марта 2010

Пока обновление не мешает вам изолировать единицы поведения для тестирования, вы в порядке. Примерами могут быть создание коллекций или типов значений, используемых в реализации, но на самом деле не выполнение «объектной работы» per se.

Сосредоточьтесь на слове «зависимость» - полагается ли рассматриваемый объект каким-либо образом на то, чтобы содержащий объект выполнил свою единственную истинную цель для существования? Если это так, его следует вводить извне.

...