Если бы я не использовал контейнер DI, мне бы не пришлось ссылаться на библиотеку EntityFramework в моем приложении MVC3.
Даже при использовании контейнера DI вам не нужно позволять вашему проекту MVC3 ссылаться на EF, но вы (неявно) решите сделать это, реализовав Composition Root (путь запуска, по которому вы составляете свои графы объектов) внутри вашего проекта MVC3. Если вы очень строго относитесь к защите архитектурных границ с помощью сборок, вы можете перенести логику представления в другой проект.
Когда вы перемещаете всю логику, связанную с MVC (контроллеры и т. Д.) Из запускаемого проекта в библиотеку классов, это позволяет этой сборке уровня представления оставаться отключенной от остальной части приложения. Сам проект вашего веб-приложения станет очень тонкой оболочкой с необходимой логикой запуска. Проект веб-приложения будет корнем композиции, который ссылается на все другие сборки.
Извлечение логики представления в библиотеку классов может усложнить работу с MVC. Будет сложнее подключить все, поскольку контроллеры не входят в запускаемый проект (в то время как представления, изображения, файлы css, скорее всего, должны оставаться в запускаемом проекте). Вероятно, это выполнимо, но для настройки потребуется больше времени.
Из-за недостатков я обычно советую просто оставить корневой каталог композиции в веб-проекте. Многие разработчики не хотят, чтобы их сборка MVC зависела от сборки DAL, но это не проблема. Не забывайте, что сборки - это артефакт развертывания ; вы разделяете код на несколько сборок, чтобы можно было развертывать код отдельно. С другой стороны, архитектурный слой - это логический артефакт. Вполне возможно (и часто) иметь несколько слоев в одной сборке.
В этом случае у нас будет корень композиции (слой) и уровень презентации в одном проекте веб-приложения (то есть в одной сборке). И несмотря на то, что сборка ссылок сборки , содержащие DAL, Сретение слой еще не ссылается на Access Data Layer . Это большое различие.
Конечно, когда мы делаем это, мы теряем возможность компилятора проверять это архитектурное правило во время компиляции, но это не должно быть проблемой. Большинство архитектурных правил фактически не могут быть проверены компилятором, и всегда есть что-то вроде здравого смысла. И если в вашей команде нет здравого смысла, вы всегда можете использовать обзоры кода (которые, кстати, должна делать каждая команда, IMO). Вы также можете использовать такой инструмент, как NDepend (который является коммерческим), который поможет вам проверить ваши архитектурные правила. Когда вы интегрируете NDepend в процесс сборки, он может предупреждать вас, когда кто-то проверил код, нарушающий такое архитектурное правило.
Вы можете прочитать более подробное обсуждение того, как работает корень композиции, в главе 4 моей книги « Внедрение зависимостей, принципы, практики, шаблоны» .