Si no estaba usando un contenedor DI, no tendría que hacer referencia a la biblioteca ADO.NET Entity Framework en mi aplicación MVC3
Incluso cuando se utiliza un contenedor de DI, usted no tiene que dejar su EF de referencia de proyecto MVC3, pero usted (implícitamente) elige hacer esto implementando el Composition Root (la ruta de inicio donde compila sus gráficos de objetos) dentro de su proyecto MVC3. Si eres muy estricto con respecto a la protección de los límites arquitectónicos mediante ensamblajes, puedes mover tus elementos de presentación Composition Root o your (MVC) a una biblioteca de clases.
En la primera opción, permite que su proyecto MVC3 haga referencia a este ensamblaje separado de 'arranque automático', y hará referencia a todos los demás ensambles en su solución, además de hacer referencia a su biblioteca de contenedor DI. El problema con esto es que este proyecto de arranque no puede hacer referencia a los tipos ubicados en el proyecto MVC3 (porque provocará una dependencia de ensamblado cíclico). Estos tipos tienen que ser movidos al proyecto bootstrapper (que posiblemente necesite referenciar System.Web.Mvc), o usted necesita mantener una pequeña parte de la configuración del contenedor dentro de su aplicación MVC3. También tenga en cuenta que su proyecto MVC todavía hace referencia indirectamente a todos los demás ensamblados a través del nuevo ensamblaje de arranque, porque las dependencias de ensamblaje son transitivas. Aunque colocar la raíz de composición en un ensamblaje separado es algo válido, la mayoría de DI Purist (incluyéndome a mí) generalmente solo mueve la raíz de composición a una biblioteca de clase cuando hay múltiples aplicaciones finales (es decir, una aplicación web + web servicio + servicio de Windows) que usan la misma capa de negocios. Cuando tengo una sola aplicación, mantengo la raíz de composición dentro de mi aplicación final.
La segunda opción es mover todas las clases relacionadas con MVC (vistas, controladores, etc.) desde el proyecto de inicio a una biblioteca de clases. Esto permite que este nuevo conjunto de capa de presentación permanezca desconectado del resto de la aplicación. Su proyecto de 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 ensamblajes.
Extraer la lógica de presentación a una biblioteca de clases puede complicar las cosas al trabajar con MVC. Será más difícil conectar todo, ya que los controladores y vistas, imágenes, archivos css, etc. no están en el proyecto de inicio. Esto es probablemente factible, pero llevará más tiempo configurarlo.
Ambas opciones tienen sus inconvenientes y es por eso que generalmente les aconsejo que mantengan 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 despliegue; divide el código en varios conjuntos para permitir que el código se implemente por separado. Por otro lado, una capa arquitectónica es un artefacto lógico. Es muy posible (y común) tener múltiples capas en el mismo conjunto. En este caso, tendremos 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 ensamblado hace referencia al ensamblaje que contiene el DAL, la Presentación Capa aún no hace referencia al Acceso a datos Capa. Esta es una gran distinción. Por supuesto, cuando hacemos esto, perdemos la capacidad del compilador para verificar esta regla de arquitectura en tiempo de compilación, pero esto no debería ser un problema. La mayoría de las reglas arquitectónicas en realidad no pueden ser verificadas por el compilador 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 debe hacer siempre por IMO). 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 revisó el código que infringe dicha regla de arquitectura.
Muchas gracias, esto ahora tiene perfecto sentido ... Necesitaba saber si esto era por diseño. En cuanto a imponer el uso correcto de las dependencias, he implementado un proyecto separado con mi iniciador DI como Steven mencionado a continuación, donde hago referencia al resto de las bibliotecas. Este proyecto es evaluado por la aplicación de punto de entrada y al final de la construcción completa, esto hace que todos los dlls necesarios estén en la carpeta bin. ¡Gracias! – diegohb
@Mark Seemann ¿Es esta pregunta/respuesta específica de Microsoft? Me gustaría saber si esta idea de mover todas las dependencias al "punto de entrada de la aplicación" tiene sentido para un proyecto de Java EE/Spring usando Maven ... ¡gracias! –
Esta respuesta se aplica más allá de .NET. Es posible que desee consultar el capítulo * Principios de diseño de paquetes * de Robert C. Martin, por ejemplo. [Desarrollo de software ágil, principios, patrones y prácticas] (http://amzn.to/195wrPB) –