Skip to main content

Dominio

Visión general

El nivel de dominio contiene todas las clases de entidad que se asignan a las tablas de base de datos. Algunas de las clases más utilizadas son:

  • Cliente
  • Prestamo
  • Actividad
  • Contacto
  • Producto
  • MedioArchivo

Una clase de entidad en un "objeto CLR sin formato" (POCO) o (No anemicos). Por lo general, representa una tabla de base de datos, y cada propiedad suele representar una columna de la tabla

info

Puede establece cualquier relación entre entidades (1:1, 1:n, n:m)

EntidadBase

Una clase de entidad concreta debe derivar de la clase abstracta EntidadBase. Por convención:

  • EntidadBase.Id se utiliza como clave principal
  • Todas las propiedades públicas con un getter y un setter se incluirán en el esquema de la base de datos.

Para personalizar las convenciones de asignación predeterminadas:

  • Utilice los atributos DataAnnotation en clases y propiedades.
  • Escriba el código de asignación de la API de Fluent
info

Consulte Entity Framework Core: Creación y configuración de un modelo para obtener más información sobre el modelado de datos en Entity Framework.

tip

Puede parecer un poco desordenado a primera vista, pero es una buena práctica mantener la asignación de la clase de entidad y la API de Fluent en un solo archivo de código.

Por razones de rendimiento, Crono no utiliza clases de proxy para la carga diferida, sino la interfaz. Por lo tanto, se declara en la clase una propiedad protegida que permite la carga diferida de las propiedades de navegación. No es necesario insertar el servicio, la propiedad se inserta automáticamente cuando se adjunta una entidad al contexto. Si se carga una entidad sin que se realice un seguimiento, o si se separa manualmente del contexto, se inyectará en su lugar el - que no hace nada - en su lugar. ILazyLoader LazyLoader EntidadBase CargadorDiferido CargadorDiferidoNulo

Ejemplo de uso del cargador diferido:

public class MiEntidad : EntidadBase 
{
// 1:1 propiedad de navegación
private Producto _producto;
public Producto Producto
{
// La propiedad "CargadorDiferido" se declara en la clase "EntidadBase"
get => _producto ?? CargadorDiferido?.Load(this, ref _producto);
set => _producto = value;
}

// 1:n propiedad de navegación
private List<Categoria> _categorias;
public IReadOnlyCollection<Categoria> Categorias
{
// La propiedad "CargadorDiferido" se declara en la clase "EntidadBase"
get => CargadorDiferido?.Load(this, ref _categorias) ?? (_categorias ??= new List<Categoria>());
// impedir la asignación sin setter
}
}

Ensamblados de dominio

Al iniciar la aplicación, Crono analiza todos los ensamblados principales de la aplicación en busca de tipos de entidad. Si ha creado una nueva clase de entidad y desea que sea accesible, existen diferentes enfoques en función del tipo de proyecto.

En un proyecto principal, simplemente extienda la clase parcial. CronoDbContexto

public partial class CronoDbContexto
{
public DbSet<MiEntidad> MisEntidades { get; set; }
}

En un proyecto de módulo, debe informar a Entity Framework de que el ensamblado del módulo contiene tipos de entidad para recoger y registrar en el inicio.

Para ello necesitas una clase de iniciación.

internal class Startup : IniciadorBase
{
public override void ConfigurarServicios(IServiceCollection servicios, IAplicacionContexto appContexto)
{
servicios.AddTransient<IDbContextoConfiguracionFuente<CronoDbContexto>, CronoDbContextoConfigurador>();
}

class CronoDbContextoConfigurador : IDbContextoConfiguracionFuente<CronoDbContexto>
{
public void Configurar(IServiceProvider servicios, DbContextOptionsBuilder constructor)
{
constructor.UsarDbFabrica(b =>
{
b.AgregarModeloEnsamblado(this.GetType().Assembly);
});
}
}
}

Para mayor comodidad durante el desarrollo, puede agregar esta extensión:

public static class CronoDbContextoExtensiones
{
public static DbSet<MiEntidad> MisEntidades(this CronoDbContexto db)
=> db.Set<MiEntidad>();
}

Características de la entidad

Se pueden implementar numerosas interfaces y se pueden derivar algunas clases base abstractas para especificar lo que una entidad tiene, admite o representa.

Los siguientes tipos declaran algunas propiedades que la entidad debe implementar para seguir el contrato.

Interfaces

NombreCaracterística
IAclRestringidoTiene resticciones de acceso
IAuditableTiene propiedades de auditoría
IEntidadVisualizadaSe muestra de alguna manera en la interfaz de usuario
IOrdenVisualizacionSe puede ordenar
IEntidadLocalizadaEs localizable (traducible)
IEntidadNombradaTiene un nombre conceptual
IDatosCombinadosTiene datos combinables
IReglasContenedorEn un contenedor para otras reglas
IEliminacionLogicaEs eliminación logica (temporal)
IOrganizacionRestringidoAdmite el mapeo de organizaciones
ITransitorioAdmite la transitoriedad

Clases base abstractas

NombreCaracteréstica
EntidadConAtributosTiene atributos genéricos
UsuarioContenidoRepresenta el contenido introducido por el usuario