Recentemente ho iniziato ad implementare eventi di dominio nel mio livello di dominio che mi consente di disaccoppiare l'applicazione dal dominio. Alla fine, mi piacerebbe avere un'infrastruttura CQRS con l'infrastruttura di sourcing completo.
La domanda che ho è che ho una classe Account
e uno dei casi d'uso è poterlo rinominare. Tuttavia, esiste un vincolo di dominio che dice "nessun account può avere lo stesso nome". Sulla base del mio progetto rapido, presumo che ciò dovrebbe essere implementato con un servizio di dominio che controlla se il nome dell'account è già stato preso e, in caso contrario, rinominare l'account. Ho pensato che potrei allontanarmi da un servizio di dominio utilizzando gli eventi di dominio, ma tutti i gestori di eventi del mio dominio risiedono nel livello applicazione (non nel livello dominio). Ovviamente non voglio avere alcuna logica di business nel livello applicazione.
Sto capendo correttamente la differenza tra servizi di dominio ed eventi di dominio? Mi sembra (basato su quello che ho letto) che gli eventi di dominio ti consentano di separare il livello dell'applicazione dal livello del dominio, ma quando si tratta di garantire la coerenza tra più aggregati, ho bisogno di utilizzare i servizi di dominio. Oppure è possibile farlo con eventi di dominio e mantenere tutto isolato sul livello del dominio? La mia classe Account
assomiglia a:
public class Account
{
public string Name { get; private set; }
public Account(string name) { // blah // }
public void AddSubAccount(Account subAccount)
{
// do work
}
public void RemoveSubAccount(Account subAccount)
{
// do work
}
public void Rename(string newName)
{
Name = newName;
// How to ensure domain model invariants remain true?
// No two accounts can have same name
// Domain Event example:
// DomainEvents.Publish(new AccountRenamedEvent(oldName, newName));
}
}