2015-03-09 1 views
0

Я новичок в архитектуре архитектуры, ориентированной на домен. Мое решение проекта, как это:Должен ли я отделить привязку привязки IoC по проекту

  • Презентация (Web)
  • протоколов прикладного уровня
  • QueryLayer
  • QueryHandlerLayer
  • DataLayer

Я читал из статей theese разделений делают, чтобы изолировать рабочие места ,

Презентация ссылки проекта протоколы прикладного уровня, но не ссылается QueryLayer, QueryHandlerLayer и DataLayer.

Но я использую контейнер IoC и связываю типы с интерфейсом.

  • container.Bind (интерфейсы данных) .to (классы данных);
  • container.Bind (интерфейсы запросов) .To (классы запросов);

Я могу это сделать на PresentationLayer. Но теперь все проекты будут добавлять ссылку на уровень представления.

Это проблема архитектуры? Или я могу отделить привязку контейнера IoC для всех слоев?

ответ

2

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

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

Существует 3 общие рекомендации по составлению приложений с несколькими слоями, и все они вполне приемлемы.

  1. Не отделяйте слои от физических сборок.
  2. Составьте приложение в слое презентации и укажите все остальные слои из уровня представления.
  3. Создайте отдельный слой композиции, который ссылается на все остальные слои.

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

См. this answer для обоснования этой ссылки и почему важно, чтобы вы do ссылались на каждую библиотеку из корня композиции, чтобы избежать жесткой связи. Или, как уже упоминалось, вы можете использовать позднюю привязку для компоновки своего приложения, не ссылаясь непосредственно на сборки, если ваш сценарий развертывания копируется через библиотеки DLL.

1

Я думаю, что самая большая вещь, которую я узнал в последнее время, заключается в том, что на фундаментальном уровне DI - это инжекционная зависимость. Это довольно избыточное описание, поэтому позвольте мне уточнить:

DI начинается с дизайна. Все должно иметь то, что ему нужно предоставить, через конструктор или фабрику. Здесь Interfaces - ваш лучший друг. Как только вы это сделаете, большая часть работы будет выполнена. Предполагая, что некоторые из проектов разделены, вы теперь делегировали всю работу тому, кто ее использует. Это, вероятно, старые новости.

Далее, если вы контролируете контейнер, подумайте о создании модуля по умолчанию, который в случае с Ninject равен a, NinjectModule. Создайте один из них для каждого уровня приложения. Это сформирует «инструкции», так сказать, для контейнера на самом высоком уровне вашей программы, чтобы собрать все части.

Это может быть загружено обтеканием отражения, о котором есть много информации, like this.

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