Gdybym nie korzystał z kontenera DI, nie musiałbym odwoływać się do biblioteki EntityFramework w mojej aplikacji MVC3
Nawet w przypadku korzystania z kontenera DI nie musisz zezwalać na odwołanie do EF projektu MVC3, ale (niejawnie) decydujesz się to zrobić, implementując element główny kompozycji (ścieżkę startową, w której tworzysz wykresy obiektów) w projekcie MVC3. Jeśli bardzo rygorystycznie podchodzisz do ochrony granic architektonicznych za pomocą zespołów, możesz przenieść logikę prezentacji do innego projektu.
Po przeniesieniu całej logiki związanej z MVC (kontrolery itp.) Z projektu startowego do biblioteki klas, pozwala to zestawowi warstwy prezentacji pozostać odłączonym od reszty aplikacji. Twój projekt aplikacji internetowej sam stanie się bardzo cienką powłoką z wymaganą logiką uruchamiania. Projekt aplikacji internetowej będzie katalogiem głównym kompozycji, który będzie odwoływał się do wszystkich innych zestawów.
Wyodrębnienie logiki prezentacji do biblioteki klas może skomplikować sprawę podczas pracy z MVC. Trudniej będzie wszystko połączyć, ponieważ kontrolerów nie ma w projekcie startowym (podczas gdy widoki, obrazy, pliki css muszą prawdopodobnie pozostać w projekcie startowym). Jest to prawdopodobnie wykonalne, ale konfiguracja zajmie więcej czasu.
Ze względu na wady generalnie radzę po prostu zachować główny katalog kompozycji w projekcie internetowym. Wielu programistów nie chce, aby ich zestaw MVC był zależny od zestawu DAL, ale tak naprawdę nie stanowi to problemu. Nie zapominaj, że zestawy są artefaktem wdrażania ; dzielisz kod na wiele zestawów, aby umożliwić oddzielne wdrażanie kodu. Z drugiej strony warstwa architektoniczna jest logicznym artefaktem. Bardzo możliwe (i powszechne) jest posiadanie wielu warstw w tym samym zespole.
W tym przypadku w końcu będziemy mieć główny element kompozycji (warstwę) i warstwę prezentacji w tym samym projekcie aplikacji internetowej (a więc w tym samym zestawie). Mimo że ten zestaw odwołuje się do zestawu zawierającego DAL, warstwa prezentacji nadal nie odwołuje się do warstwy dostępu do danych . To duże wyróżnienie.
Oczywiście, kiedy to robimy, tracimy zdolność kompilatora do sprawdzenia tej reguły architektonicznej w czasie kompilacji, ale nie powinno to stanowić problemu. Kompilator nie może sprawdzić większości reguł architektonicznych i zawsze istnieje coś takiego jak zdrowy rozsądek. A jeśli w Twoim zespole nie ma zdrowego rozsądku, zawsze możesz skorzystać z przeglądu kodu (który każdy zespół powinien zawsze robić w IMO). Możesz także użyć narzędzia takiego jak NDepend (które jest komercyjne), które pomaga Ci zweryfikować reguły architektoniczne. Integracja NDepend z procesem kompilacji może Cię ostrzec, gdy ktoś włączy kod, który narusza taką zasadę architektoniczną.
Możesz przeczytać bardziej szczegółową dyskusję na temat tego, jak działa Composition Root, w rozdziale 4 mojej książki Dependency Injection, Principles, Practices, Patterns .