Digamos que tenemos una entidad de raíz agregada del tipo Orden que relaciona clientes y líneas de pedido. Cuando pienso en una entidad de orden, es más natural conceptualizarla como no definida sin una Id. Una orden sin identificación parece estar mejor representada como una solicitud de pedido que como una orden.¿Cómo se debe expresar la adición de una raíz agregada a un repositorio?
Para añadir una orden a un repositorio, por lo general veo a la gente una instancia del orden sin la identificación y luego tener el repositorio completar el objeto:
class OrderRepository
{
void Add(Order order)
{
// Insert order into db and populate Id of new order
}
}
Lo que me gusta de este enfoque es que está añadiendo una Pedir instancia a un OrderRepository. Eso tiene mucho sentido. Sin embargo, la instancia de pedido no tiene un Id. Y, al alcance del consumidor del repositorio, aún no tiene sentido para mí que un pedido no tenga un Id. Podría definir una OrderRequest como una instancia de orden y agregar eso al repositorio, pero eso se siente como derivar una manzana de una naranja y luego agregarla a una lista de naranjas.
Alternativamente, también he visto este enfoque:
class OrderRepository
{
Order AddOrder(Customer customer)
// It might be better to call this CreateOrder
{
// Insert record into db and return a new instance of Order
}
}
Lo que me gusta de este enfoque es que una orden es indefinido y sin una identificación. El repositorio puede crear el registro de la base de datos y reunir todos los campos requeridos antes de crear y devolver una instancia de un pedido. Lo que huele aquí es el hecho de que nunca se agrega una instancia de un pedido al repositorio.
De cualquier manera funciona, entonces mi pregunta es: ¿Tengo que vivir con una de estas dos interpretaciones, o hay una mejor práctica para modelar la inserción?
Encontré esta respuesta que es similar, pero para objetos de valor: how should i add an object into a collection maintained by aggregate root. Cuando se trata de un objeto de valor no hay confusión, pero mi pregunta se refiere a una entidad con identidad derivada de una fuente externa (Id de base de datos autogenerada).
Argumento que una orden sin identificación no es una entidad de orden en absoluto, que es de donde proviene su primer pensamiento inicial. Para combatir esto, debes recordar el estado de tus objetos. Mire 'estado' como una pausa en el tiempo. Es decir, una solicitud de página web. Durante la creación de un pedido, sí, no tiene un Id al principio, pero aún no ha terminado su estado: lo agrega en el repositorio, completando así el estado persistente del Pedido(), que ahora es completar. – eduncan911
No estoy en desacuerdo con usted hasta el momento, sin embargo, si usted reclama que una orden sin ID es una entidad por una breve pausa en el tiempo, durante esa pausa no tendrá una identidad discernible. Creo, al menos semánticamente, que esto es una contradicción con la definición de una entidad. –
La identidad no es tan cortante y seca como se podría pensar. En mi fe, nuestras identidades son nuestras almas únicas presentes desde nuestra concepción. Pero para el gobierno, nuestras identidades se pueden establecer a través de más de un medio: certificado de nacimiento, pasaporte, etc. Hay un momento en el que el niño no tiene una identidad oficial para el gobierno, pero el gobierno aún lo ve como una entidad, aunque necesita una identificación. Piense en una orden como un pequeño bebé precioso y en el repositorio como el gobierno (¡de todos modos, los usuarios son más amigables con el usuario!) :) – tuespetre