DI 컨테이너를 사용하지 않았다면 MVC3 앱에서 EntityFramework 라이브러리를 참조 할 필요가 없습니다.
DI 컨테이너를 사용하는 경우에도 MVC3 프로젝트가 EF를 참조하도록 할 필요는 없지만 (암시 적으로)이를 구현하여이를 수행하도록 선택합니다. Composition Root (객체 그래프를 구성하는 시작 경로) . 어셈블리를 사용하여 건축 경계를 보호하는 데 매우 엄격한 경우 프레젠테이션 논리를 다른 프로젝트로 이동할 수 있습니다.
모든 MVC 관련 로직 (컨트롤러 등)을 시작 프로젝트에서 클래스 라이브러리로 이동하면이 프레젠테이션 레이어 어셈블리가 나머지 애플리케이션과 연결이 끊어진 상태로 유지됩니다. 웹 애플리케이션 프로젝트 자체는 필요한 시작 로직을 가진 매우 얇은 쉘이됩니다. 웹 애플리케이션 프로젝트는 다른 모든 어셈블리를 참조하는 컴포지션 루트가됩니다.
프레젠테이션 로직을 클래스 라이브러리로 추출하면 MVC로 작업 할 때 상황이 복잡해질 수 있습니다. 컨트롤러는 시작 프로젝트에 없기 때문에 모든 것을 연결하기가 더 어려울 것입니다 (뷰, 이미지, CSS 파일은 시작 프로젝트에 남아 있어야 함). 이것은 아마도 가능하지만 설정하는 데 더 많은 시간이 걸립니다.
단점 때문에 일반적으로 웹 프로젝트에서 Composition Root를 유지하는 것이 좋습니다. 많은 개발자는 MVC 어셈블리가 DAL 어셈블리에 의존하는 것을 원하지 않지만 실제로는 문제가되지 않습니다. 어셈블리는 배포 아티팩트 라는 것을 잊지 마십시오 . 코드를 개별적으로 배포 할 수 있도록 코드를 여러 어셈블리로 분할합니다. 반면에 아키텍처 계층은 논리적 아티팩트입니다. 동일한 어셈블리에 여러 레이어를 포함하는 것이 매우 가능하고 일반적입니다.
이 경우 동일한 웹 애플리케이션 프로젝트 (따라서 동일한 어셈블리에 있음)에서 컴포지션 루트 (레이어)와 프레젠테이션 레이어를 갖게됩니다. 그리고 해당 어셈블리가 DAL을 포함하는 어셈블리를 참조하더라도 프레젠테이션 계층은 여전히 데이터 액세스 계층을 참조하지 않습니다. . 이것은 큰 차이입니다.
물론이 작업을 수행하면 컴파일러가 컴파일 타임에이 아키텍처 규칙을 확인할 수있는 기능을 잃게되지만 문제가되지는 않습니다. 대부분의 아키텍처 규칙은 실제로 컴파일러에서 확인할 수 없으며 항상 상식과 같은 것이 있습니다. 그리고 팀에 상식이 없다면 언제든지 코드 리뷰를 사용할 수 있습니다 (모든 팀은 항상 btw를 수행해야합니다). 아키텍처 규칙을 확인하는 데 도움이되는 NDepend (상업용)와 같은 도구를 사용할 수도 있습니다. NDepend를 빌드 프로세스와 통합하면 누군가 이러한 아키텍처 규칙을 위반하는 코드를 체크인했을 때 경고 할 수 있습니다.
내 책 Dependency Injection, Principles, Practices, Patterns의 4 장에서 컴포지션 루트가 작동하는 방법에 대한 자세한 토론을 읽을 수 있습니다 .