Solución:
¡Vaya, hay mucho que decir aquí! 😉
En primer lugar, hablemos de la arquitectura general.
Lo que puedo ver aquí es que no es realmente una arquitectura Onion. Olvidó la capa más externa, la capa “Resolución de dependencia”. En una arquitectura Onion, depende de esta capa conectar las interfaces Core a las implementaciones de infraestructura (donde debe residir su proyecto de persistencia).
Aquí hay una breve descripción de lo que debería encontrar en una aplicación Onion. Lo que entra en la capa Core es todo lo exclusivo de la empresa: modelo de dominio, flujos de trabajo empresariales … Esta capa define todas las necesidades de implementación técnica como interfaces (es decir: interfaces de repositorios, interfaces de registro, interfaces de sesión …). La capa Core no puede hacer referencia a ninguna biblioteca externa y no tiene un código específico de tecnología. La segunda capa es la capa de infraestructura. Esta capa proporciona implementaciones para interfaces Core no comerciales. Aquí es donde llama a su base de datos, sus servicios web … Puede hacer referencia a cualquier biblioteca externa que necesite para proporcionar implementaciones, implementar tantos paquetes de nugget como desee :-). La tercera capa es tu interfaz de usuario, bueno, ya sabes qué poner allí 😉 Y la última capa, es la Resolución de dependencia de la que hablé anteriormente.
La dirección de dependencia entre capas es hacia el centro.
Así es como podría verse:
La pregunta ahora es: cómo encajar lo que ya ha codificado en una arquitectura Onion.
Núcleo: contiene el modelo de dominio
¡Sí, este es el lugar indicado!
Persistencia: interfaz e implementaciones del repositorio
Bueno, necesitará separar las interfaces con las implementaciones. Las interfaces deben moverse al Core y las implementaciones deben moverse a la carpeta de Infraestructura (puede llamar a este proyecto Persistencia).
BusinessServices: una capa empresarial alrededor del repositorio. Toda la lógica empresarial debería estar aquí
Esto debe moverse en Core, pero no debe usar implementaciones de repositorios aquí, ¡solo manipule interfaces!
Web (o cualquier otra interfaz de usuario): en este caso particular, es una aplicación MVC
frio 🙂
Deberá agregar un proyecto “Bootstrapper”, solo eche un vistazo aquí para ver cómo proceder.
Acerca de sus sentimientos encontrados:
No discutiré sobre la necesidad de tener repositorios o no, encontrará muchas respuestas en stackoverflow.
En mi proyecto ViewModel tengo una carpeta llamada “Builder”. Depende de mis constructores discutir con mis interfaces de servicios comerciales para obtener datos. El constructor recibirá listas de objetos Core.Domain y los asignará al ViewModel correcto.
Sobre lo que no te gusta:
En la arquitectura clásica de Onion, solo la siguiente capa hace referencia al núcleo.
Falso ! 🙂 Cada capa necesita que el Núcleo tenga acceso a todas las interfaces definidas allí.
El DbContext se implementa en el proyecto .Core, porque lo está generando Entity Framework, en el mismo lugar donde se encuentra el .edmx
Una vez más, no es un problema tan pronto como sea realmente fácil editar la plantilla T4 asociada con su EDMX. Solo necesita cambiar la ruta de los archivos generados y puede tener el EDMX en la capa de Infraestructura y los POCO en su proyecto Core.Domain.
¡Espero que esto ayude!
Inyecto mis servicios en mis controladores. Los servicios devuelven DTO que residen en Core. El modelo que tienes se ve bien, yo no uso el patrón de repositorio, pero mucha gente lo hace. Es difícil trabajar con EF en este tipo de arquitectura, por eso elegí usar Nhibernate.
Una posible respuesta a tu pregunta final.
- CENTRO
- DOMINIO
- DI
- INFRAESTRUCTURA
- PRESENTACIÓN
- SERVICIOS
En mi opinión:
- “En la arquitectura clásica de Onion, solo la siguiente capa hace referencia al núcleo”. Eso no es cierto, Core debería ser referencia por cualquier capa … recuerde que la Dirección de dependencia entre capas es hacia el centro (Core).
“las capas de arriba pueden usar cualquier capa debajo de ellas” Por Jeffrey Palermo http://jeffreypalermo.com/blog/the-onion-architecture-part-3/
- Acerca de su EF, está en el lugar equivocado … debería estar en la capa Infraestructura, no en la capa Core. Y use POCO Generator para crear las entidades (clases POCO) en Core / Model. O use un mapeador automático para que pueda asignar el modelo principal (objetos de negocio) al modelo de entidad (entidades EF)