Cómo acceder a las funcionalidades de EF en la arquitectura limpia y .NET Core.
El EF Core incluye funcionalidades que es posible que desee utilizar para consultas complejas. Por ejemplo, AsNoTracking()
, SumAsync
, MaxAsync
o la búsqueda de entidades cambiadas/modificadas, etc., están disponibles en la biblioteca Microsoft.EntityFrameworkCore
.
En la arquitectura limpia, la capa ApplicationCore
no permite el acceso directo al DBContext, y los datos solo se pueden acceder a través de una interfaz de repositorio común y especificaciones.
Entiendo la idea de la separación de responsabilidades y de abstraer la capa persistente de la capa de dominio. Y en el futuro, si cambias la base de datos, solo necesitarás cambiar la capa persistente. Sin embargo, en la realidad, ¿con qué frecuencia cambias la base de datos en una aplicación a nivel empresarial? Una vez que está en producción, se vuelve más difícil reemplazarla simplemente.
public class ToDoItemSearchService : IToDoItemSearchService
{
private readonly IRepository<Proyecto> _repositorio;
public ToDoItemSearchService(IRepository<Proyecto> repositorio)
{
_repositorio = repositorio;
}
public async Task<Resultado<List<ElementoPorHacer>>> ObtenerTodosLosElementosIncompletosAsync(int idProyecto, string cadenaBusqueda)
{
var proyecto = await _repositorio.ObtenerPorEspecificacionAsync(especificacionProyecto);
// cómo cargar entidades sin rastreo
}
}
¿Cómo acceder a las funcionalidades de EF? ¿Debería el repositorio exponerlas? Por ejemplo:
public interface IRepository<TEntidad>
{
List<TEntidad> ObtenerPorEspecificacionAsync(...);
List<TEntidad> ObtenerPorEspecificacionAsyncSinRastreo(...)
}
davy.ai
En la arquitectura limpia, la capa
ApplicationCore
no debería acceder directamente aDBContext
, sino a través de una interfaz de repositorio y especificaciones. Si bienEF Core
tiene funcionalidades comoAsNoTracking()
,SumAsync
,MaxAsync
y la posibilidad de encontrar entidades cambienas/modificadas disponibles en el conjunto de ensamblados deMicrosoft.EntityFrameworkCore
, no se recomienda exponer estas funcionalidades en la interfaz del repositorio. En su lugar, el repositorio debería tener un método separado comoGetBySpecAsyncWithNoTracking
para cargar entidades sin seguimiento. Mantener la interfaz del repositorio simple y centrada en su responsabilidad principal promoverá la separación de preocupaciones y la mantenibilidad. Si bien puede resultar desafiante reemplazar una base de datos que ya está en producción, abstraer la capa de persistencia de la capa de dominio proporcionará flexibilidad y ayudará a evitar el bloqueo del proveedor.