Separación de inquietudes y arquitectura de n niveles en ASP.NET 5 / ASP.NET Core 1

asp.net asp.net-core asp.net-core-mvc dependency-injection entity-framework-core

Pregunta

Estoy luchando para encontrar una forma elegante de mantener mi capa DAL separada de mi capa MVC / UI en ASP.NET 5 gracias a la nueva inyección de dependencia incorporada que quiero usar.

Por ejemplo, tengo un proyecto ASP.NET 5, un proyecto de Business Layer y un Proyecto de acceso a datos donde tengo varios códigos de Entity Framework, como entidades y contextos. En ASP.NET 5 para obtener el contexto configurado y dirigido a una base de datos, la documentación principal sugiere que haga algo como esto en mi clase StartUp.cs

services.AddEntityFramework()
    .AddSqlServer()
    .AddDbContext<BookContext>(options =>
    {
        options.UseSqlServer(Configuration.Get("Data:ConnectionString"));
    });

Esto significa que ahora tengo que hacer referencia a mi DAL en lo que es básicamente mi capa de UI, algo que durante años siempre ha sido una mala práctica según los diversos expertos y publicaciones de blog.

Una forma de solucionar esto es crear dos nuevos proyectos, uno es un proyecto CompositeRoot que contiene clases de fábrica para generar mis clases de negocios que luego acceden al DAL y también un proyecto de Utilidades con una clase de Configuración en la que tiene una propiedad ConnectionString que puedo pasar a mi contexto, luego uso el DI incorporado para cablear todo y evitar hacer referencia a mi DAL en mi capa de interfaz de usuario. Pero me he topado con problemas con la última versión de Entity Framework (beta 7), ya que ahora no parece posible especificar una cadena de conexión ni en el constructor del contexto ni en el método OnConfiguration . Además, toda la documentación hasta el momento no parece preocuparse en absoluto por esta mezcla de preocupaciones. ¿Es así como hacemos las cosas ahora? ¿Confía en que los desarrolladores no harán cosas 'malas' como las clases DAL de referencia directamente en la interfaz de usuario? ¿O hay un patrón que la gente está empleando para mantener las cosas SÓLIDAS con esta nueva configuración / configuración integrada para ASP.NET 5?

Respuesta popular

Si pides a 10 arquitectos civiles que te construyan un puente, terminarás teniendo 10 arquitecturas diferentes. Ninguno será igual y ninguno será mejor que el otro.

Independientemente de cuántas mejores prácticas y patrones de diseño apliquen, cada arquitecto justificará su idea. Algunos serán demasiado entusiastas, mientras que otros lo mantendrán simple y harán el trabajo. Entre otras cosas, el presupuesto, las fechas de entrega y la mano de obra tendrán un impacto directo en el tipo de arquitectura que usted decida.

La misma regla se aplica con los arquitectos de software.

He visto a una gran cantidad de arquitectos que tienen las mejores intenciones del mundo solo para darse cuenta de que la capa UI tiene una dependencia de la DAL. Quizás el razonamiento detrás de esto es que:

  • No lo han pensado
  • Realmente no les importa
  • Facilita la DI ya que usted ve cada capa, lo que a su vez facilita el mapeo de las interfaces a su implementación.

De vuelta en MVC 5, tuve las siguientes capas:

-Contoso.Core (Class Library)
-Contoso.Data (Class Library)
-Contoso.Service (Class Library)
-Contoso.Web (asp.net MVC 5)
-Contoso.Web.Configuration (Class Library)

La capa Web.Configuration tenía una dependencia de Core , Data y Service . Esta capa es donde configuraría mis cosas DI.

La capa Web no dependía de la capa de Data y, para empezar, estaba usando el paquete Bootstrapper Nuget .

Quizás puedas lograr algo similar con ASP.NET 5.

Me encantaría que Microsoft (o cualquiera) creara una plantilla de proyecto de trabajo que esté más orientada a muestras de nivel empresarial utilizando un enfoque desacoplado o incluso algo como una muestra de Arquitectura de Cebolla.

Al final, lo que considero una arquitectura desacoplada razonable puede ser demasiado para algunos, mientras que no es suficiente para otros ...

Siéntase libre de compartir sus hallazgos ya que tengo curiosidad por saber cómo ha logrado hacer que funcione.




Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué