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
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.Idse 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
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.
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
| Nombre | Característica |
|---|---|
| IAclRestringido | Tiene resticciones de acceso |
| IAuditable | Tiene propiedades de auditoría |
| IEntidadVisualizada | Se muestra de alguna manera en la interfaz de usuario |
| IOrdenVisualizacion | Se puede ordenar |
| IEntidadLocalizada | Es localizable (traducible) |
| IEntidadNombrada | Tiene un nombre conceptual |
| IDatosCombinados | Tiene datos combinables |
| IReglasContenedor | En un contenedor para otras reglas |
| IEliminacionLogica | Es eliminación logica (temporal) |
| IOrganizacionRestringido | Admite el mapeo de organizaciones |
| ITransitorio | Admite la transitoriedad |
Clases base abstractas
| Nombre | Caracteréstica |
|---|---|
| EntidadConAtributos | Tiene atributos genéricos |
| UsuarioContenido | Representa el contenido introducido por el usuario |