Actualmente estoy refabricando un código en un proyecto que está terminando, y terminé poniendo mucha lógica comercial en clases de servicio en lugar de en los objetos de dominio. En este punto, la mayoría de los objetos de dominio son solo contenedores de datos. Había decidido escribir la mayor parte de la lógica empresarial en objetos de servicio, y refactorizar todo después en formas mejores, más reutilizables y más legibles. De esa forma, podría decidir qué código debería colocarse en los objetos de dominio, y qué código debería dividirse en nuevos objetos propios, y qué código debería quedar en una clase de servicio. Así que tengo algo de código:En el diseño impulsado por dominio, ¿sería una violación de DDD poner llamadas a las reposiciones de otros objetos en un objeto de dominio?
public decimal CaculateBatchTotal(VendorApplicationBatch batch)
{
IList<VendorApplication> applications = AppRepo.GetByBatchId(batch.Id);
if (applications == null || applications.Count == 0)
throw new ArgumentException("There were no applications for this batch, that shouldn't be possible");
decimal total = 0m;
foreach (VendorApplication app in applications)
total += app.Amount;
return total;
}
Este código parece que sería una buena adición a un objeto de dominio, porque es único parámetro de entrada es el objeto de dominio propio. Parece un candidato perfecto para algunas refactorizaciones. Pero el único problema es que este objeto llama al repositorio de otro objeto. Lo que me hace querer dejarlo en la clase de servicio.
Mis preguntas son por lo tanto:
- dónde pondría este código?
- ¿Romperías esta función?
- ¿Dónde lo pondría alguien que sigue un diseño estricto basado en el dominio?
- ¿Por qué?
Gracias por su tiempo.
Editar Nota: No se puede usar un ORM en este caso, por lo que no puedo usar una solución de carga diferida.
Editar Nota 2: No puedo modificar el constructor para que tome los parámetros, debido a cómo la capa de datos aspirante instancia los objetos de dominio utilizando la reflexión (no es mi idea).
Editar Nota3: No creo que un objeto por lotes deba ser capaz de sumar cualquier lista de aplicaciones, parece que solo debería ser capaz de totalizar las aplicaciones que están en ese lote en particular. De lo contrario, tiene más sentido para mí dejar la función en la clase de servicio.
Variables locales de Pascal-cased. Yuck. – yfeldblum
@Justice, siento tu dolor – mbillard