Si no estuviera usando un contenedor DI, no tendría que hacer referencia a la biblioteca EntityFramework en mi aplicación MVC3
Incluso cuando usa un contenedor DI, no tiene que dejar que su proyecto MVC3 haga referencia a EF, sino que (implícitamente) elige hacer esto implementando la raíz de composición (la ruta de inicio donde compone sus gráficos de objetos) dentro de su proyecto MVC3. Si es muy estricto sobre la protección de sus límites arquitectónicos mediante el uso de ensamblajes, puede mover su lógica de presentación a un proyecto diferente.
Cuando mueve toda la lógica relacionada con MVC (controladores, etc.) del proyecto de inicio a una biblioteca de clases, permite que este ensamblaje de capa de presentación permanezca desconectado del resto de la aplicación. El proyecto de su aplicación web se convertirá en un shell muy delgado con la lógica de inicio requerida. El proyecto de aplicación web será la raíz de composición que hace referencia a todos los demás ensamblados.
Extraer la lógica de presentación a una biblioteca de clases puede complicar las cosas cuando se trabaja con MVC. Será más difícil conectar todo, ya que los controladores no están en el proyecto de inicio (mientras que las vistas, imágenes, archivos CSS, probablemente deben permanecer en el proyecto de inicio). Esto probablemente sea factible, pero llevará más tiempo configurarlo.
Debido a las desventajas, generalmente aconsejo mantener la raíz de composición en el proyecto web. Muchos desarrolladores no quieren que su ensamblaje MVC dependa del ensamblaje DAL, pero eso no es realmente un problema. No olvide que los ensamblajes son un artefacto de implementación ; divide el código en múltiples ensamblajes para permitir que el código se implemente por separado. Una capa arquitectónica, por otro lado, es un artefacto lógico . Es muy posible (y común) tener varias capas en el mismo ensamblaje.
En este caso, terminaremos teniendo la raíz de composición (capa) y la capa de presentación en el mismo proyecto de aplicación web (por lo tanto, en el mismo ensamblaje). Y aunque ese ensamblaje hace referencia al ensamblaje que contiene el DAL, la capa de presentación aún no hace referencia a la capa de acceso a datos . Esta es una gran distinción.
Por supuesto, cuando hacemos esto, perdemos la capacidad del compilador de verificar esta regla arquitectónica en el momento de la compilación, pero esto no debería ser un problema. El compilador no puede verificar la mayoría de las reglas arquitectónicas y siempre hay algo como el sentido común. Y si no hay sentido común en su equipo, siempre puede usar revisiones de código (que cada equipo debería hacer IMO siempre por cierto). También puede usar una herramienta como NDepend (que es comercial), que le ayuda a verificar sus reglas arquitectónicas. Cuando integra NDepend con su proceso de compilación, puede advertirle cuando alguien ingresó un código que viola dicha regla arquitectónica.
Puede leer una discusión más elaborada sobre cómo funciona la raíz de composición en el capítulo 4 de mi libro Inyección de dependencia, principios, prácticas, patrones .