В данный момент я работаю с внедрением зависимостей. Фактически это включает в себя уровень пользовательского интерфейса (например, веб-приложение), включая контейнер DI, в котором есть целый набор данных об интерфейсах, с которыми он будет работать, и о том, какую реализацию использовать для каждого из них.
Однако из-за необходимости удовлетворения зависимостей контейнер DI также должен знать об интерфейсах и классах, к которым в противном случае он не нуждался бы в доступе. Например:
Слой пользовательского интерфейса должен работать с IWidgetManager интерфейсом. Настроенная реализация - ConcreteWidgetManager. Это зарегистрировано в контейнере DI.
ConcreteWidgetManager зависит от IWidgetRepository. Желаемая реализация для этого - ConcreteWidgetRepository. Таким образом, контейнер DI также должен знать о IWidgetRepository и ConcreteWidgetRepository.
Если бы я просто жестко закодировал зависимость ConcreteWidgetManager от ConcreteWidgetRepository, то ConcreteWidgetRepository можно было бы сделать внутренним и, следовательно, невидимым для моего уровня пользовательского интерфейса. Никакой код пользовательского интерфейса не может обойти уровень менеджера и работать напрямую со слоем репозитория.
Таким образом, кажется, что использование DI, хотя во многих отношениях и является прекрасным шаблоном, побеждает инкапсуляцию с точки зрения уровня пользовательского интерфейса.
Прав ли я, что так думаю, и есть ли способ смягчить ситуацию?
ConcreteWidgetRepositoryвиден слою пользовательского интерфейса? Тот факт, что он упоминается в конфигурации фреймворка, не означает, что он виден, если только ваш код пользовательского интерфейса не имеет автоматически подключенной ссылки наIWidgetRepository. И это проблема кодирования, точно эквивалентная вашему коду пользовательского интерфейса, содержащему жестко запрограммированную ссылку наConcreteWidgetRepository- person parsifal   schedule 14.09.2011ConcreteWidgetRepository(что он делает, чтобы вставить его вConcreteWidgetManager), то эти знания также свободно доступны в другом месте на уровне пользовательского интерфейса. - person David   schedule 14.09.2011