Инъекция редко используемых сервисов - конструктор против метода - PullRequest
2 голосов
/ 18 августа 2011

Этот вопрос о тестируемом программном обеспечении, основанном в основном на объектах и ​​сервисах, имеющих значение.

Вот пример API простого сервиса, который может сохранять данные в файлы.

saveToFile(data, fileName)
saveToUniqueFile(data, fileNameGenerator)

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

Одной из альтернатив является инжекция конструктора, которая упростила бы API:

saveToFile(data, fileName)
saveToUniqueFile(data)

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

Существуют ли потенциальные проблемы / неудобства передачи служб в качестве параметров метода?Должен ли инжектор-конструктор быть предпочтительным в таких ситуациях?

Ответы [ 2 ]

4 голосов
/ 18 августа 2011

Передача сервисов в качестве параметров довольно проблематична, потому что вы никогда не знаете, когда они вам нужны. Методы и их параметры составляют ваш API, тогда как конструктор не . Использование конструктора для внедрения сервисов дает вам гораздо большую степень свободы, поскольку позволяет отделить зависимости от API, выраженного методами.

В противном случае вам пришлось бы передавать аргумент метода всем методам в вашем API на случай, если он понадобится одному или двум из них.

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

0 голосов
/ 18 августа 2011

Это зависит от того, имеет ли смысл в контексте вашей программы, к чему «принадлежит» метод saveToUniqueFile (). Если вы работаете с объектами, которые по логике должны быть в состоянии сохранить себя, используйте конструктор внедрения. Если сохранение объектов управляется другим, более крупным объектом или службой, используйте параметр метода thing.

Если вы используете сервис в качестве параметра метода, убедитесь, что вы передаете его по ссылке.

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