Эмпирическое правило, которое я часто использую, заключается в том, что я внедряю вещи, которые мешают правильно написать модульные тесты. При этом вы иногда будете абстрагироваться от классов BCL (таких как DateTime.Now, File и т. Д.), А иногда и от своих собственных вещей. Хорошие вещи для внедрения - это сервисы (такие как ICustomerService, ICustomerUnitOfWorkFactory или ICustomerRepository). Не вводите такие вещи, как сущности, DTO и сообщения.
Однако существуют другие причины для внедрения объектов, такие как возможность замены модулей в более позднее время (например, реализация переключателей для проверки, пользовательский интерфейс или O / RM), чтобы позволить параллельную разработку внутри или между командами, и снизить техническое обслуживание.
Я предпочитаю использовать конструктор инъекций
и часто замечал, что мне нужно
около 5 или более объектов для инъекции
в конструкторе.
Как вы уже отмечали, наличие множества зависимостей может быть вызвано несоблюдением SRP . Однако вы можете сгруппировать общие зависимости с их логикой в агрегированную службу и внедрить ее в потребителей. Также см. Статью Марка Симанна о Совокупных услугах .
Объекты, которые являются настоящими синглетонами, такими как
Конфигурация приложения или те,
маленькие утилитарные уроки
их?
Лично я не фанат того, как Айенде предлагает это. Это Ambient Context , который является специфической разновидностью конструкции service locator . Это скрывает зависимость, потому что классы могут вызывать этот статический класс без необходимости его внедрения. Явная инъекция делает это намного более понятным, что вам нужно для модульного тестирования времени. Кроме того, это затрудняет написание тестов для фреймворков, таких как MSTest, которые склонны выполнять тесты параллельно. Без каких-либо контрмер это делает ваши тесты очень ненадежными. Лучшее решение - для примера DateTime.Now
- иметь интерфейс IClock
, как предлагается здесь . Как вы видите, этот ответ намного выше, чем подход Айенде, что показано в том же вопросе SO.
Общие объекты, такие как регистрация,
используются почти в каждом объекте,
они должны быть введены?
Я внедряю их в свой код, потому что это проясняет зависимости. Заметьте, однако, что в моем коде мне все еще вряд ли нужно вводить регистратор. Тщательно продумайте каждую строку, которую хотите записать, и это на самом деле не ошибка (или сквозная проблема, которую следует поместить в другом месте). Я обычно выбрасываю исключение, когда происходит что-то, чего я не ожидал. Это позволяет мне быстро находить ошибки. Или, говоря другими словами: не фильтруйте, но быстро терпите неудачу. И, пожалуйста, спросите себя: « В журнале слишком много? »
Надеюсь, это поможет.