[dependency-injection] Ioc / DI - Почему мне нужно ссылаться на все слои / сборки в приложении ввода?



Answers

Если я не использовал контейнер DI, мне не пришлось бы ссылаться на библиотеку EntityFramework в моем приложении MVC3

Даже при использовании контейнера DI вам не нужно позволять ссылку на проект MVC3 EF, но вы (неявно) решили сделать это, внедряя Root Composition (путь запуска, в котором вы составляете графические объекты) внутри вашего проекта MVC3. Если вы очень строго относитесь к защите своих архитектурных границ с помощью сборок, вы можете либо переместить свой материал композиции, либо материал вашего MVC-представления в библиотеку классов.

В первом варианте вы позволяете проекту MVC3 ссылаться на эту отдельную сборку «bootstrapper», и она будет ссылаться на все другие сборки в вашем решении, а также ссылаться на вашу библиотеку контейнеров DI. Проблема заключается в том, что этот проект bootstrapper не может ссылаться на типы, расположенные в проекте MVC3 (потому что это вызовет зависимость циклической сборки). Эти типы необходимо перенести в проект bootstrapper (который, возможно, должен ссылаться на System.Web.Mvc), или вам нужно сохранить небольшую часть конфигурации контейнера внутри вашего приложения MVC3. Также обратите внимание, что ваш проект MVC по-прежнему ссылается на все другие сборки неявно через новую сборку bootstrapper, потому что зависимости сборки являются транзитивными.

Хотя размещение корневого состава в отдельной сборке является правильной вещью, большинство DI purist (включая меня) обычно перемещают корень композиции в библиотеку классов, когда есть несколько конечных приложений (например, веб-приложение + веб-сервис + служба Windows ), которые используют один и тот же бизнес-уровень. Когда у меня есть одно приложение, я сохраняю корневую структуру внутри моего конечного приложения.

Второй вариант - переместить все связанные с MVC классы (представления, контроллеры и т. Д.) Из проекта запуска в библиотеку классов. Это позволяет этой новой сборке уровня презентации оставаться отсоединенной от остальной части приложения. Сам проект веб-приложения станет очень тонкой оболочкой с требуемой логикой запуска. Проект веб-приложения будет корнем композиции, который ссылается на все остальные сборки.

Извлечение логики представления в библиотеку классов может усложнить работу при работе с MVC. Сложнее всего подключить все, поскольку в проекте запуска нет контроллеров и представлений, изображений, файлов css и т. Д. Это, вероятно, выполнимо, но потребуется больше времени для настройки.

Оба варианта имеют свои недостатки, и именно поэтому я обычно советую просто сохранить корневой состав в веб-проекте. Многие разработчики не хотят, чтобы их сборка MVC зависела от сборки DAL, но это не проблема. Не забывайте, что сборки - это артефакт развертывания ; вы разбиваете код на несколько сборок, чтобы разрешить развертывание кода отдельно. С другой стороны, архитектурный уровень является логическим артефактом. Очень хорошо (и обычно) иметь несколько слоев в одной сборке. В этом случае мы закончим тем, что в том же проекте веб-приложения (таким образом, в той же сборке) будет создан Root (слой) композиции и слой презентации. И хотя эта сборка ссылается на сборку, содержащую DAL, уровень представления по-прежнему не ссылается на уровень доступа к данным. Это большое различие. Конечно, когда мы это делаем, мы теряем способность компилятора проверять это архитектурное правило во время компиляции, но это не должно быть проблемой. Большинство архитектурных правил на самом деле не могут быть проверены компилятором, и всегда есть что-то вроде здравого смысла. И если в вашей команде нет здравого смысла, вы всегда можете использовать обзоры кода (которые каждая команда должна делать IMO всегда. Вы также можете использовать такой инструмент, как NDepend (который является коммерческим), который поможет вам проверить ваши архитектурные правила. Когда вы интегрируете NDepend в процесс сборки, он может предупредить вас, когда кто-то проверял код, нарушающий такое архитектурное правило.

Question

(В связи с этим вопросом, EF4: Почему создание прокси-сервера должно быть включено, когда включена ленивая загрузка? ).

Я новичок в DI, так что медведь со мной. Я понимаю, что контейнер отвечает за создание экземпляров всех моих зарегистрированных типов, но для этого требуется ссылка на все DLL-файлы в моем решении и их ссылки.

Если бы я не использовал контейнер DI, мне не пришлось бы ссылаться на библиотеку EntityFramework в моем приложении MVC3, только на моем бизнес-уровне, который ссылался бы на мой уровень DAL / Repo.

Я знаю, что в конце дня все библиотеки DLL включены в папку bin, но моя проблема заключается в том, чтобы явно ссылаться на нее через «добавить ссылку» в VS, чтобы иметь возможность публиковать WAP со всеми необходимыми файлами.




+ Существует зависимость: если объект создает экземпляр другого объекта. + Нет зависимости: если объект ожидает абстракции (инъекция конструктора, инъекция метода ...)

+ Ссылки на сборку (ссылки на dll, webservices ..) независимы от концепции зависимости, потому что для разрешения абстракции и возможности компиляции кода слой должен ссылаться на нее.




Related