Подтвердить что ты не робот

Есть ли когда-либо случай для "нового" при использовании инъекции зависимостей?

Зависимость от инъекции означает, что вам никогда не понадобится "новое" ключевое слово? Или разумно ли прямо создавать простые классы листа, например коллекции?

В приведенном ниже примере я добавляю компаратор, запрос и дао, но SortedSet напрямую создается:

public Iterable<Employee> getRecentHires()
{
    SortedSet<Employee> entries = new TreeSet<Employee>(comparator);
    entries.addAll(employeeDao.findAll(query));
    return entries;
}
4b9b3361

Ответ 1

Просто потому, что Dependency Injection - полезный шаблон, не означает, что мы используем его для всего. Даже при использовании DI часто возникает необходимость в новых. Не удаляйте еще только что.

Ответ 2

В одном случае я обычно решаю, следует ли использовать инъекцию зависимостей, нужно ли мне издеваться или заглушить сотрудничающий класс при написании unit test для тестируемого класса. Например, в вашем примере вы (правильно) вводите DAO, потому что, если вы пишете unit test для своего класса, вы, вероятно, не хотите, чтобы какие-либо данные фактически были записаны в базу данных. Или, возможно, сотрудничающий класс записывает файлы в файловую систему или зависит от внешнего ресурса. Или поведение непредсказуемо или сложно объяснить в unit test. В таких случаях лучше всего вводить эти зависимости.

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

Последнее замечание: когда поле не может быть введено по какой-либо причине, но я все же хотел бы издеваться над ним в тесте, я нашел Junit -addons PrivateAccessor класс полезен, чтобы иметь возможность переключать классное поле класса в макет-объект, созданный EasyMock (или jMock или любой другой смешной каркас, который вы предпочитаете).

Ответ 3

Нет ничего плохого в использовании нового, как показано в фрагменте кода.

Рассмотрим случай, когда нужно добавить фрагменты String. Почему вы хотите спросить инжектора для StringBuilder?

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

Ответ 4

Да, конечно.

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

Однако есть достаточно ситуаций, когда вы точно знаете, что хотите создать, поэтому нет необходимости в DI.

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

Ответ 5

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

Итак, когда DI переполнен, я использую "новое" и просто позволяю ему катиться.

Ex: для меня проводка модели с видом на уровень контроллера. Она всегда выполняется через DI. Любые алгоритмы, которые используют мои приложения, DI, а также любой подключаемый отражающий код, DI. Уровень базы данных.. DI, но практически любой другой объект, который используется в моей системе, обрабатывается с помощью общего "нового".

надеюсь, что это поможет.

Ответ 6

Верно, что в сегодняшней среде, основанной на каркасе, вы все меньше и меньше создаете объекты. Например, сервлеты создаются контейнером сервлета, beans в Spring, созданным с помощью Spring и т.д.

Тем не менее, при использовании уровня сохранения вы создадите объекты, оставшиеся до того, как они будут сохранены. При использовании Hibernate, например, вы вызовете новый объект на своем персистентном объекте до вызова сохранения на HibernateTemplate.