Якщо я не використовував контейнер DI, мені не довелося б посилатися на бібліотеку EntityFramework у моєму додатку MVC3
Навіть використовуючи контейнер DI, вам не потрібно дозволяти посилатися на проект проекту MVC3 EF, але ви (неявно) вирішите це зробити, застосувавши Root Composition (шлях запуску, де ви складаєте свої об'єктивні графіки) всередині вашого проекту MVC3. Якщо ви дуже суворо захищаєте свої архітектурні межі за допомогою збірок, ви можете перенести логіку презентації на інший проект.
Коли ви переміщуєте всю логіку MVC (контролери тощо) з проекту запуску в бібліотеку класів, це дозволяє збірці шару презентації залишатися відключеною від решти програми. Сам проект вашого веб-додатка стане дуже тонкою оболонкою з необхідною логікою запуску. Проектом веб-додатків буде Кореневий склад, який посилається на всі інші збірки.
Витягування логіки презентації до бібліотеки класів може ускладнити речі при роботі з MVC. Це буде важче підключити все, оскільки контролери не є в проекті запуску (в той час як перегляди, зображення, файли css повинні, швидше за все, залишатися в проекті запуску). Це, мабуть, можливо, але для його налаштування знадобиться більше часу.
Через мінуси я, як правило, раджу просто зберігати корінь складу у веб-проекті. Багато розробників не хочуть, щоб їх збірка MVC залежала від складання DAL, але це насправді не проблема. Не забувайте, що збірки є артефактом розгортання ; Ви розділите код на кілька збірок, щоб дозволити розгортання коду окремо. З іншого боку, архітектурний шар - це логічний артефакт. Дуже цілком можливо (і звичайно) мати кілька шарів в одній збірці.
У цьому випадку ми матимемо корінь Composition (шар) та презентаційний шар у тому ж проекті веб-додатків (таким чином, в одній збірці). І незважаючи на те, що збірка посилань збірки , що містять DAL, Стрітення шар ще не посилається на Access Data Layer . Це велика відмінність.
Звичайно, коли ми це робимо, ми втрачаємо можливість компілятора перевіряти це архітектурне правило під час компіляції, але це не повинно бути проблемою. Більшість архітектурних правил насправді неможливо перевірити компілятором, і завжди є щось на зразок здорового глузду. І якщо у вашій команді немає здорового глузду, ви завжди можете використовувати огляди коду (які кожна команда повинна IMO завжди робити btw). Ви також можете використовувати такий інструмент, як NDepend (комерційний), який допоможе вам перевірити свої архітектурні правила. Коли ви інтегруєте NDepend зі своїм процесом збирання, він може попереджати вас, коли хтось перевірив код, що порушує таке архітектурне правило.
Ви можете прочитати більш детальну дискусію про те, як працює Кореневий склад у главі 4 моєї книги Введення залежностей, принципи, практики та патерни .