Я размышлял, как сбалансировать тестируемый дизайн, используя внедрение зависимостей, с предоставлением простого фиксированного общедоступного API. Моя дилемма заключается в следующем: люди хотели бы сделать что-то подобное var server = new Server(){ ... }
и не должны беспокоиться о создании множества зависимостей и графа зависимостей, которые Server(,,,,,,)
могут иметь. При разработке я не слишком беспокоюсь, поскольку для этого я использую инфраструктуру IoC / DI (я не использую аспекты управления жизненным циклом любого контейнера, что еще более усложнит ситуацию).
Теперь зависимости вряд ли будут повторно реализованы. Компонентация в этом случае почти исключительно для тестируемости (и достойного дизайна!), А не для создания швов для расширения и т. Д. Люди будут 99,999% времени желать использовать конфигурацию по умолчанию. Так. Я мог бы жестко закодировать зависимости. Не хочу этого делать, мы теряем наше тестирование! Я мог бы предоставить конструктор по умолчанию с жестко запрограммированными зависимостями и конструктор, который принимает зависимости. Это ... грязно и, вероятно, сбивает с толку, но жизнеспособно. Я мог бы сделать конструктор получения зависимостей внутренним и сделать мои модульные тесты дружественной сборкой (предполагая, что C #), что приводит в порядок публичный API, но оставляет неприятную скрытую ловушку для обслуживания. Наличие в моей книге двух конструкторов, которые неявно связаны, а не явно, были бы плохим дизайном вообще.
На данный момент это самое меньшее зло, о котором я могу думать. Мнения? Мудрость?