Dopo aver a che fare con DDD da mesi, sono ancora confuso riguardo agli scopi generali dei servizi di dominio, delle fabbriche e delle radici aggregate in relazione l'uno con l'altro, ad es. dove si sovrappongono nella loro responsabilità.
Esempio: ho bisogno di 1) creare un'entità di dominio complessa in una saga (gestore di processi) che è seguita da 2) un determinato evento di dominio che deve essere gestito altrove mentre 3) l'entità è chiaramente una radice aggregata che contrassegna un contesto limitato ad alcune altre entità.
- La fabbrica è responsabile della creazione dell'entità / radice aggregata
- Il servizio PU CAN creare l'entità, poiché lancia anche l'evento di dominio
- Il servizio CAN può fungere da root aggregato (creare 'subentity' di 'entity' con ID 4)
- La radice aggregata può creare e gestire le "sottenticità"
Quando introduco il concetto di una radice aggregata e una fabbrica nel mio dominio, un servizio non sembra più necessario. Tuttavia, se non lo sono, il servizio può gestire tutto ciò che è necessario e con le conoscenze e le dipendenze che ha.
Esempio di codice basato sul linguaggio ubiquitario di un'officina automobilistica
public class Car : AggregateRoot {
private readonly IWheelRepository _wheels;
private readonly IMessageBus _messageBus;
public void AddWheel(Wheel wheel) {
_wheels.Add(wheel);
_messageBus.Raise(new WheelAddedEvent());
}
}
public static class CarFactory {
public static Car CreateCar(string model, int amountofWheels);
}
.. o ...
public class Car {
public ICollection<Wheel> Wheels { get; set; }
}
public interface ICarService {
Car CreateCar(args);
void DeleteCar(args);
Car AddWheel(int carId, Wheel wheel);
}