Modelando el dominio
En el corazΓ³n de cualquier aplicaciΓ³n orientada al dominio estΓ‘ el modelo que representa el conocimiento central y las reglas de negocio del sistema. Modelar bien el dominio significa traducir conceptos del mundo real en estructuras de software expresivas, cohesivas y consistentes.
Entidades
Una entidad es un objeto definido principalmente por su identidad y no solo por sus atributos. Aunque los atributos cambien con el tiempo, la identidad de una entidad permanece igual.
CaracterΓsticas principales:
- Tiene una identidad ΓΊnica (generalmente un
Id
). - Lo que importa es quiΓ©n es la entidad, no solo quΓ© contiene.
- Sus atributos pueden cambiar con el tiempo.
Creando una entidad con Lino
Para crear una nueva entidad utilizando Lino, ejecute:
lino entity new
El asistente del CLI solicitarΓ‘:
- Servicio β Servicio en el que se crearΓ‘ la entidad.
- MΓ³dulo β MΓ³dulo donde se crearΓ‘ la entidad (solo en servicios modulares).
- Nombre de la entidad β Nombre usado en el dominio y en la tabla de la base de datos.
Luego, definirΓ‘s los campos que componen la entidad configurando cada uno de ellos.
Tipos de campos disponibles
Tipo | DescripciΓ³n | Rango / Observaciones |
---|---|---|
short | Entero de 16 bits | -32 768 β 32 767 |
int | Entero de 32 bits | -2 147 483 648 β 2 147 483 647 |
long | Entero de 64 bits | -9 223 372 036 854 775 808 β 9 223 372 036 854 775 807 |
string | Texto | Hasta ~2 mil millones de caracteres |
bool | Valor booleano | true o false |
Guid | Identificador global ΓΊnico | Unicidad distribuida |
decimal | NΓΊmero decimal de alta precisiΓ³n | Ideal para valores monetarios |
float | Punto flotante (32 bits) | β 6β9 dΓgitos de precisiΓ³n |
double | Punto flotante (64 bits) | β 15β17 dΓgitos de precisiΓ³n |
DateTime | Fecha y hora | Incluye zona horaria |
DateOnly | SΓ³lo fecha (C# 10+) | β |
TimeOnly | SΓ³lo hora (C# 10+) | β |
Entity | Referencia a otra entidad | 1:1 o 1:N |
Value Object | Objeto de valor inmutable | Ej.: DirecciΓ³n, CPF |
Enum | EnumeraciΓ³n | Conjunto fijo de valores |
List<Entity> | Lista de entidades | 1:N |
ManyToMany | Muchos a muchos | Requiere tabla de uniΓ³n |
Ejemplo
Creando la entidad Person
:
ββββββ¬βββββ¬ββββββββββββββββ¬βββββββββ¬βββββββββ¬ββββββββββββ¬βββββββββββββββββ β PK β FK β Property name β Type β Length β Required β Auto-increment β ββββββΌβββββΌββββββββββββββββΌβββββββββΌβββββββββΌββββββββββββΌβββββββββββββββββ€ β x β β Id β int β β x β x β ββββββΌβββββΌββββββββββββββββΌβββββββββΌβββββββββΌββββββββββββΌβββββββββββββββββ€ β β β Name β string β 100 β x β β ββββββ΄βββββ΄ββββββββββββββββ΄βββββββββ΄βββββββββ΄ββββββββββββ΄βββββββββββββββββ
Estructura generada por Lino:
MyApp/ βββ src/ βββ Services/ βββ MyService/ βββ Domain/ βββ MyApp.MyService.Domain.csproj βββ Aggregates/ βββ People/ βββ Person.cs βββ Errors/ β βββ PersonErrors.cs βββ Repositories/ β βββ IPersonRepository.cs βββ Resources/ βββ Person/ βββ PersonResources.resx βββ PersonResources.en.resx βββ PersonResources.pt-BR.resx
DespuΓ©s de definir tus entidades, usa Lino para gestionar las Migrations y mantener la base de datos sincronizada. Este proceso se abordarΓ‘ en detalle en la secciΓ³n Capa de Persistencia.
Objetos de Valor
Un objeto de valor representa un concepto del dominio definido ΓΊnicamente por sus atributos β no posee identidad propia. Dos objetos de valor se consideran iguales si todos sus valores son iguales.
CaracterΓsticas principales:
- Inmutables despuΓ©s de la creaciΓ³n.
- No poseen
Id
.
Creando un objeto de valor con Lino
Ejecute:
lino value-object new
El CLI solicitarΓ‘:
- Servicio β Servicio en el que se crearΓ‘ el objeto.
- MΓ³dulo β MΓ³dulo en el que se crearΓ‘ el objeto (solo en servicios modulares).
- UbicaciΓ³n β RaΓz del dominio o agregado especΓfico.
- Nombre del objeto de valor.
Luego, defina los campos que componen el objeto.
Tipos de campos disponibles
Tipo | DescripciΓ³n | Observaciones |
---|---|---|
short | Entero de 16 bits | -32.768 β 32.767 |
int | Entero de 32 bits | -2.147.483.648 β 2.147.483.647 |
long | Entero de 64 bits | -9.223.372.036.854.775.808 β 9.223.372.036.854.775.807 |
string | Texto | Hasta ~2 mil millones de caracteres |
bool | Booleano | true /false |
decimal | Decimal preciso | Valores monetarios |
float | Punto flotante (32 bits) | β 6β9 dΓgitos |
double | Punto flotante (64 bits) | β 15β17 dΓgitos |
DateTime | Fecha/hora | Incluye zona horaria |
DateOnly | SΓ³lo fecha | C# 10+ |
TimeOnly | SΓ³lo hora | C# 10+ |
Ejemplo
Objeto de valor Address
:
βββββββββββββββββ¬βββββββββ¬βββββββββ¬ββββββββββββ β Property name β Type β Length β Required β βββββββββββββββββΌβββββββββΌβββββββββΌββββββββββββ€ β Street β string β 100 β x β βββββββββββββββββΌβββββββββΌβββββββββΌββββββββββββ€ β Number β string β 10 β x β βββββββββββββββββΌβββββββββΌβββββββββΌββββββββββββ€ β Neighborhood β string β 50 β β βββββββββββββββββΌβββββββββΌβββββββββΌββββββββββββ€ β City β string β 100 β x β βββββββββββββββββΌβββββββββΌβββββββββΌββββββββββββ€ β State β string β 2 β x β βββββββββββββββββΌβββββββββΌβββββββββΌββββββββββββ€ β PostalCode β string β 20 β x β βββββββββββββββββΌβββββββββΌβββββββββΌββββββββββββ€ β Country β string β 100 β x β βββββββββββββββββ΄βββββββββ΄βββββββββ΄ββββββββββββ
Estructura de archivos generada (agregado Person
):
MyApp/ βββ src/ βββ Services/ βββ MyService/ βββ Domain/ βββ MyApp.MyService.Domain.csproj βββ Aggregates/ βββ People/ βββ Person.cs βββ ValueObjects/ β βββ Address.cs βββ Errors/ β βββ AddressErrors.cs β βββ PersonErrors.cs βββ Repositories/ β βββ IPersonRepository.cs βββ Resources/ βββ Address/ β βββ AddressResources.resx β βββ AddressResources.en.resx β βββ AddressResources.pt-BR.resx βββ Person/ βββ PersonResources.resx βββ PersonResources.en.resx βββ PersonResources.pt-BR.resx
AsΓ como en las entidades, las Migrations pueden ser gestionadas por Lino para mantener el modelo de datos sincronizado.
Enumeraciones
Las enumeraciones en DDD pueden ir mΓ‘s allΓ‘ de los enum
tradicionales de C#. Pueden ser objetos ricos
que representan estados fijos, conteniendo validaciones, mΓ©todos auxiliares e incluso comportamiento.
MotivaciΓ³n:
- Los
enum
de C# estΓ‘n limitados a un valor entero o cadena. - Modelar una EnumeraciΓ³n como clase ofrece mayor flexibilidad y expresividad.
CaracterΓsticas principales:
- Son clases que heredan de una base comΓΊn y encapsulan
Id
yNombre
. - Permiten agregar validaciones, mΓ©todos auxiliares y comportamiento.
Creando una enumeraciΓ³n con Lino
Ejecute:
lino enum new
El asistente solicitarΓ‘:
- Servicio.
- MΓ³dulo (si aplica).
- UbicaciΓ³n β raΓz del dominio o agregado.
- Nombre de la enumeraciΓ³n.
- Tipo β
enum
tradicional o Smart Enum (class
). - Almacenamiento β
int
ostring
en la base de datos.
Ejemplo
EnumeraciΓ³n PersonStatus
:
βββββββββ¬ββββββββββββ¬βββββββββββββββ β Value β Name β Display Name β βββββββββΌββββββββββββΌβββββββββββββββ€ β 1 β Active β Active β βββββββββΌββββββββββββΌβββββββββββββββ€ β 2 β Inactive β Inactive β βββββββββΌββββββββββββΌβββββββββββββββ€ β 3 β Suspended β Suspended β βββββββββΌββββββββββββΌβββββββββββββββ€ β 4 β Deleted β Deleted β βββββββββ΄ββββββββββββ΄βββββββββββββββ
Estructura generada:
MyApp/ βββ src/ βββ Services/ βββ MyService/ βββ Domain/ βββ MyApp.MyService.Domain.csproj βββ Aggregates/ βββ People/ βββ Person.cs βββ Enums/ β βββ PersonStatus.cs βββ ValueObjects/ β βββ Address.cs βββ Errors/ β βββ AddressErrors.cs β βββ PersonErrors.cs βββ Repositories/ β βββ IPersonRepository.cs βββ Resources/ βββ Address/ β βββ AddressResources.resx β βββ AddressResources.en.resx β βββ AddressResources.pt-BR.resx βββ Person/ β βββ PersonResources.resx β βββ PersonResources.en.resx β βββ PersonResources.pt-BR.resx βββ PersonStatus/ βββ PersonStatusResources.resx βββ PersonStatusResources.en.resx βββ PersonStatusResources.pt-BR.resx
Almacenar el valor de una enumeraciΓ³n como string
es vΓ‘lido y puede mejorar la legibilidad, pero suele ser menos eficiente en tΓ©rminos de rendimiento y almacenamiento.
Por eso recomendamos almacenar el valor como int
, y para mantener la integridad referencial y facilitar el mantenimiento, crear una entidad (tabla) auxiliar donde la clave primaria corresponda al valor de la enumeraciΓ³n.
DespuΓ©s de definir las enumeraciones, use Lino para generar y aplicar las Migrations, asegurando que la base de datos refleje el modelo de dominio. Vea detalles en la secciΓ³n Capa de Persistencia.