Wenn ich keinen DI-Container verwenden würde, müsste ich in meiner MVC3-App nicht auf die EntityFramework-Bibliothek verweisen
Selbst wenn Sie einen DI-Container verwenden, müssen Sie Ihr MVC3-Projekt nicht auf EF verweisen lassen, aber Sie entscheiden sich (implizit) dafür, indem Sie den Kompositionsstamm (den Startpfad, in dem Sie Ihre Objektdiagramme erstellen) in Ihrem MVC3-Projekt implementieren. Wenn Sie Ihre Architekturgrenzen mithilfe von Assemblys sehr streng schützen möchten, können Sie Ihre Präsentationslogik entweder in ein anderes Projekt verschieben.
Wenn Sie die gesamte MVC-bezogene Logik (Controller usw.) aus dem Startprojekt in eine Klassenbibliothek verschieben, bleibt diese Präsentationsschicht-Assembly vom Rest der Anwendung getrennt. Ihr Webanwendungsprojekt selbst wird zu einer sehr dünnen Hülle mit der erforderlichen Startlogik. Das Webanwendungsprojekt ist das Composition Root, das auf alle anderen Assemblys verweist.
Das Extrahieren der Präsentationslogik in eine Klassenbibliothek kann die Arbeit mit MVC erschweren. Es wird schwieriger sein, alles zu verkabeln, da sich die Controller nicht im Startprojekt befinden (während Ansichten, Bilder und CSS-Dateien wahrscheinlich im Startprojekt verbleiben müssen). Dies ist wahrscheinlich machbar, die Einrichtung dauert jedoch länger.
Aufgrund der Nachteile empfehle ich generell, nur die Kompositionswurzel im Webprojekt zu belassen. Viele Entwickler möchten nicht, dass ihre MVC-Assembly von der DAL-Assembly abhängt, aber das ist kein wirkliches Problem. Vergessen Sie nicht, dass Assemblys ein Bereitstellungsartefakt sind . Sie teilen Code in mehrere Assemblys auf, damit Code separat bereitgestellt werden kann. Eine architektonische Schicht ist dagegen ein logisches Artefakt. Es ist sehr gut möglich (und üblich), mehrere Schichten in derselben Baugruppe zu haben.
In diesem Fall befinden sich der Composition Root (Layer) und der Presentation Layer im selben Webanwendungsprojekt (also in derselben Assembly). Und obwohl diese Versammlung verweist auf die Baugruppe die DAL enthält, das Presentation - Layer noch verweist nicht auf die Datenzugriffsschicht . Dies ist ein großer Unterschied.
Wenn wir dies tun, verlieren wir natürlich die Fähigkeit des Compilers, diese Architekturregel beim Kompilieren zu überprüfen, aber dies sollte kein Problem sein. Die meisten Architekturregeln können vom Compiler nicht überprüft werden, und es gibt immer so etwas wie gesunden Menschenverstand. Und wenn es in Ihrem Team keinen gesunden Menschenverstand gibt, können Sie immer Codeüberprüfungen verwenden (was IMO übrigens jedes Team immer tun sollte). Sie können auch ein Tool wie NDepend (kommerziell) verwenden, mit dem Sie Ihre Architekturregeln überprüfen können. Wenn Sie NDepend in Ihren Erstellungsprozess integrieren, kann es Sie warnen, wenn jemand Code eingecheckt hat, der gegen eine solche Architekturregel verstößt.
Eine ausführlichere Diskussion über die Funktionsweise der Kompositionswurzel finden Sie in Kapitel 4 meines Buches Abhängigkeitsinjektion, Prinzipien, Praktiken, Muster .