Cosmos.Types.Contactos
1.1.1
dotnet add package Cosmos.Types.Contactos --version 1.1.1
NuGet\Install-Package Cosmos.Types.Contactos -Version 1.1.1
<PackageReference Include="Cosmos.Types.Contactos" Version="1.1.1" />
<PackageVersion Include="Cosmos.Types.Contactos" Version="1.1.1" />
<PackageReference Include="Cosmos.Types.Contactos" />
paket add Cosmos.Types.Contactos --version 1.1.1
#r "nuget: Cosmos.Types.Contactos, 1.1.1"
#:package Cosmos.Types.Contactos@1.1.1
#addin nuget:?package=Cosmos.Types.Contactos&version=1.1.1
#tool nuget:?package=Cosmos.Types.Contactos&version=1.1.1
Cosmos.Types.Contactos
Contacto — Value Object de contacto para el ERP Cosmos: nombre, rol (catálogo embebido de 7 roles)
y al menos un medio de comunicación (correos y/o teléfonos). Viaja dentro de eventos event-sourced
(JSONB) aguas abajo, por lo que su forma serializada es un contrato estable.
Instalación
dotnet add package Cosmos.Types.Contactos
Construcción
Dos tipos, dos puertas distintas:
Roles un VO de catálogo: se obtiene conRol.Obtener(codigo), que lanzaArgumentExceptionsi el código no existe/activo en el vocabulario. SuCrearesinternal.Contactoes un VO compuesto: su factory públicaCrear(...) : Result<Contacto>valida sin lanzar (EsExitoso/.Valor/.Errores).
using Cosmos.Types.Contactos;
using Cosmos.Types.CorreosElectronicos;
using Cosmos.Types.Telefonos;
var correo = CorreoElectronico.Crear("ventas@acme.co").Valor;
var telefono = Telefono.Crear("+57", "3001234567").Valor;
var rol = Rol.Obtener("comercial"); // VO de catálogo: Obtener (lanza)
var resultado = Contacto.Crear( // VO compuesto: Crear (Result)
nombre: "Acme S.A.S.",
rol: rol,
correos: [correo],
telefonos: [telefono]);
if (resultado.EsExitoso)
UsarContacto(resultado.Valor);
else
foreach (var error in resultado.Errores)
Console.WriteLine(error.Codigo); // V01 (sin medios), V04 (nombre), V05 (duplicados)
El rol llega como Rol tipado (no un string): su obligatoriedad y validez quedan implícitas en el
tipo. Los medios (correos/teléfonos) llegan ya válidos; Contacto los compone sin revalidar sus
formatos. Un contacto sin ningún correo ni teléfono es inválido.
Forma serializada
{
"nombre": "Acme S.A.S.",
"rol": { "codigo": "comercial" },
"correos": [ { "valor": "ventas@acme.co" } ],
"telefonos": [ { "indicativoPais": "+57", "numero": "3001234567" } ]
}
Las claves son camelCase ancladas con [JsonPropertyName]; el rol anidado y los medios de las
colecciones componen sus propias formas serializadas. El Nombre del rol es un accessor derivado
[JsonIgnore]: no viaja.
Rehidratación (deserialización)
No requiere setup: ni JsonConverter ni JsonSerializerContext registrados; basta el STJ por
defecto. Al deserializar un evento histórico el VO se rehidrata crudo ([JsonConstructor]), sin
validar — un contacto que ya no cumple "al menos un medio", o cuyo rol fue retirado del vocabulario,
igual se rehidrata.
Listado
Para poblar un selector de roles (frontends) usá Rol.Listar() — devuelve los mismos Rol que consume
la escritura. El backend proyecta su propio DTO de API:
var rolesDto = Rol.Listar().Select(rol => new { rol.Codigo, rol.Nombre });
Dependencias
Cosmos.Types.Abstractions(kernel:Result<T>)Cosmos.Types.CorreosElectronicosCosmos.Types.Telefonos
Requiere net10.0.
Documentación
Licencia
Uso interno del ERP Cosmos.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Cosmos.Types.Abstractions (>= 1.1.1)
- Cosmos.Types.CorreosElectronicos (>= 1.1.1)
- Cosmos.Types.Telefonos (>= 1.1.1)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.