Attualmente sto refactoring del codice su un progetto che si sta concludendo e ho finito per inserire molta logica aziendale nelle classi di servizio piuttosto che negli oggetti di dominio. A questo punto la maggior parte degli oggetti di dominio sono solo contenitori di dati. Avevo deciso di scrivere la maggior parte della logica di business negli oggetti di servizio, e di rifattorizzare tutto in seguito in forme migliori, più riutilizzabili e più leggibili. In questo modo ho potuto decidere quale codice deve essere inserito negli oggetti del dominio e quale codice deve essere scorporato in nuovi oggetti e quale codice deve essere lasciato in una classe di servizio. Così ho qualche codice:Nella progettazione basata su domini, sarebbe una violazione di DDD mettere le chiamate ai repository di altri oggetti in un oggetto 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;
}
Questo codice sembra che sarebbe una buona aggiunta a un oggetto di dominio, perché è solo parametro di input è l'oggetto dominio stesso. Sembra un candidato perfetto per alcuni refactoring. Ma l'unico problema è che questo oggetto chiama il repository di un altro oggetto. Il che mi fa venir voglia di lasciarlo nella classe di servizio.
Le mie domande sono quindi:
- Dove ti inserire questo codice?
- Vuoi interrompere questa funzione?
- Dove lo metterebbe qualcuno che segue il rigoroso disegno Domain-Driven?
- Perché?
Grazie per il vostro tempo.
Modifica Nota: non è possibile utilizzare un ORM su questo, quindi non è possibile utilizzare una soluzione di caricamento lenta.
Modifica Nota2: Non riesco a modificare il costruttore per prendere i parametri, a causa di come il potenziale livello di dati istanzia gli oggetti del dominio utilizzando la riflessione (non è la mia idea).
Modifica Nota3: Non credo che un oggetto batch debba essere in grado di totalizzare solo un elenco di applicazioni, sembra che dovrebbe essere possibile solo per le applicazioni totali che si trovano in quel particolare batch. Altrimenti, ha più senso per me lasciare la funzione nella classe di servizio.
Variabili locali con rivestimento Pascal. Che schifo. – yfeldblum
@Justice, sento il tuo dolore – mbillard