Существует ли когда-нибудь случай для 'нового' при использовании внедрения зависимости?

Вы можете установить входное значение по умолчанию. Вы не можете связать myValue в HTML без некоторых JS Framework. Для получения входного значения используйте событие change. Проверьте мой фрагмент кода.

var input = document.getElementById('Name');
var myValue = 'Name example';
input.value = myValue;

var myFunction = function (e) {
  console.log(e.target.value);
}
<input type="text" id="Name" class="form-control form-control-alternative" placeholder="Usernam" onchange="myFunction(event)" value="myValue">

16
задан parkr 10 February 2009 в 02:49
поделиться

6 ответов

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

9
ответ дан 30 November 2019 в 22:24
поделиться

Одним путем я обычно решаю, использовать ли внедрение зависимости, должен ли я дразнить или погасить сотрудничающий класс при записи модульного теста на класс под тестом. Например, в Вашем примере Вы (правильно) вводите ДАО, потому что, если Вы пишете модульный тест на свой класс, Вы, вероятно, не хотите, чтобы любые данные на самом деле были записаны в базу данных. Или возможно сотрудничающий класс пишет файлы в файловую систему или зависит от внешнего ресурса. Или поведение является непредсказуемым или трудным составлять в модульном тесте. В тех случаях лучше вводить те зависимости.

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

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

6
ответ дан 30 November 2019 в 22:24
поделиться

Да, конечно.

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

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

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

0
ответ дан 30 November 2019 в 22:24
поделиться

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

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

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

4
ответ дан 30 November 2019 в 22:24
поделиться

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

Таким образом, когда DI является излишеством, я использую 'новый' и просто позволяю ему прокрутиться.

Исключая: для меня соединяющий Модель проводом к Представлению к уровню Controller.. это всегда делается через DI. Любые Алгоритмы мое использование приложений, DI и также любой сменный отражающий код, DI. Уровень Database.. DI, но в значительной степени любой другой объект, используемый в моей системе, обрабатывается с общим 'новым'.

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

0
ответ дан 30 November 2019 в 22:24
поделиться

Это верно, что в сегодня, управляемая платформой среда Вы инстанцируете объектов все меньше и меньше. Например, Сервлеты инстанцируют контейнер сервлета, бобы в Spring, который инстанцируют с Spring и т.д.

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

0
ответ дан 30 November 2019 в 22:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: