En casi todas las circunstancias, las claves principales no son parte de su dominio comercial. Claro, es posible que tenga algunos objetos importantes para el usuario con índices únicos ( UserNamepara usuarios o OrderNumberpara pedidos), pero en la mayoría de los casos, no es necesario identificar abiertamente los objetos de dominio por un solo valor o conjunto de valores, para cualquier persona que no sea un usuario administrativo Incluso en esos casos excepcionales, especialmente si está utilizando identificadores únicos globales (GUID) , le gustará o querrá emplear una clave alternativa en lugar de exponer la clave primaria en sí.
Entonces, si mi comprensión del diseño impulsado por el dominio es precisa, las claves primarias no necesitan y, por lo tanto , no deben exponerse, y una buena solución. Son feos y obstaculizan mi estilo. Pero si elegimos no incluir claves primarias en el modelo de dominio, hay consecuencias:
- Ingenuamente, los objetos de transferencia de datos (DTO) que se derivan exclusivamente de combinaciones de modelos de dominio no tendrán claves primarias
- Los DTO entrantes no tendrán una clave principal
Entonces, ¿es seguro decir que si realmente va a permanecer puro y eliminar las claves primarias en su modelo de dominio, debe estar preparado para poder manejar cada solicitud en términos de índices únicos en esa clave primaria?
Dicho de otra manera, ¿cuál de las siguientes soluciones es el enfoque correcto para tratar de identificar objetos particulares después de eliminar PK en modelos de dominio?
- Ser capaz de identificar los objetos con los que necesita lidiar por otros atributos
- Recuperar la clave principal en el DTO; es decir, ¿eliminar la PK al mapear desde la persistencia al dominio, luego recombinar la PK al mapear del dominio a DTO?
EDITAR: Hagamos esto concreto.
Di mi modelo de dominio es VoIPProviderque incluye campos como Name, Description, URL, así como referencias como ProviderType, PhysicalAddressy Transactions.
Ahora supongamos que quiero crear un servicio web que permita a los usuarios privilegiados administrar VoIPProviders.
Quizás una identificación fácil de usar es inútil en este caso; después de todo, los proveedores de VoIP son empresas cuyos nombres tienden a ser distintos en el sentido de la computadora e incluso lo suficientemente distintos en el sentido humano por razones comerciales. Por lo tanto, puede ser suficiente decir que un único VoIPProviderestá completamente determinado por (Name, URL). Así que ahora digamos que necesito un método PUT api/providers/voippara que los usuarios privilegiados puedan actualizar VoIPproveedores. Envían un VoIPProviderDTO, que incluye muchos pero no todos los campos del VoIPProvider, incluido un posible aplanamiento. Sin embargo, no puedo leer sus mentes, y todavía necesitan decirme de qué proveedor estamos hablando.
Parece que tengo 2 (quizás 3) opciones:
- Incluir una clave principal o alternativa en mi modelo de dominio y enviarla al DTO, y viceversa
- Identifique el proveedor que nos interesa a través del índice único, como
(Name, Url) - Introduzca algún tipo de objeto intermedio que siempre pueda mapearse entre la capa de persistencia, el dominio y el DTO de una manera que no exponga los detalles de implementación sobre la capa de persistencia, por ejemplo, al introducir un identificador temporal en memoria al pasar del dominio a DTO y viceversa,