Buscando un niño a través de raíces agregadas

El patrón de repository sugiere que solo puede extraer raíces agregadas. Pero, ¿cómo recuperaría un solo hijo utilizando solo su identidad única (Child.ID) si no sabe que es padre (raíz)?

class Parent { public int ID { get; set; } IEnumerable Children { get; private set; } } class Child { public int ID { get; private set; } public virtual Parent Parent { get; private set; } // Navigational model } 

Mi aplicación es sin estado (web), por simplicidad, la solicitud solo contiene el ID del niño.

Estoy pensando en tres enfoques:

  1. Llame a todos los padres y luego pregúnteles educadamente quién es el dueño de este niño.
  2. Tenga una rutina especial en el ParentRepository llamada get GetChildByID, que falla un poco en la abstracción del repository.
  3. Modifique la solicitud para incluir el padre, pero parece innecesario ya que ya tiene una identidad única.

Parece probable que estés mirando un contexto acotado diferente aquí. Usted mencionó en su pregunta que “el repository … solo puede extraer raíces agregadas”. ; esto es correcto. Otra respuesta también menciona que si necesita consultar un objeto secundario, el objeto secundario también puede ser una raíz agregada. Esto también puede ser correcto dentro de un contexto limitado diferente . Es bastante posible que una entidad sea una raíz agregada en un contexto y una entidad de valor en otro.

Tomemos, por ejemplo, el dominio de los Users y las aplicaciones móviles / tabletas que tienen instaladas en sus dispositivos. En el contexto del usuario, podríamos querer las propiedades básicas de los usuarios, como nombre, edad, etc., y también podríamos querer una lista de aplicaciones que el usuario haya instalado en su dispositivo. En este contexto, el User es la raíz agregada y la App es un objeto de valor.

 bounded context UserApps { aggregate root User { Id : Guid Name : string Age : int InstalledApps : App list } value object App { Id : Guid Name : string Publisher : string Category : enum } } 

En otro contexto, podemos tomar una visión del mundo centrada en la App y decidir que la App es la raíz agregada. Digamos, por ejemplo, que queríamos informar qué usuarios han instalado una aplicación determinada.

 bounded context AppUsers { aggregate root App { Id : Guid Name : string InstalledBy : User list } value object User { Id : Guid Name : string InstalledOn : Date } } 

Ambos contextos limitados tendrían su propio repository que devuelve la raíz agregada respectiva. Hay una diferencia sutil pero crucial en su perspectiva de los datos.

Creo que si retrocedes un paso y piensas por qué quieres consultar un objeto secundario, es posible que encuentres que realmente estás en un contexto delimitado por completo.

Si necesita que el niño se muestre / informe / visualización / informe, una simple capa de consulta funcionará.

Si está manipulando al niño de alguna manera, entonces tiene un límite de consistencia y suena muy parecido a un agregado.

Trate de no consultar sus objetos de dominio. Otra regla simple no es incluir una referencia agregada en otro agregado, sino usar el Id. Del agregado referenciado o incluso un objeto de valor que represente la relación.

La navegación de entidades no es un propósito de un modelo de dominio.
Una raíz agregada es una composición de entidades y valores que exponen las operaciones comerciales.
Como efecto secundario, aún puede realizar alguna consulta o navegación simple a través de su AR, pero, para consultas complejas, crear y utilizar un Modelo de consulta es más eficiente.
Estoy hablando de CQRS .

Espero que esto le pueda ayudar.

    Intereting Posts