È passato quasi un anno da quando ho fatto questa domanda e io e il mio team abbiamo imparato parecchio da allora. Ecco come risponderei a questa domanda oggi:
Il dominio dovrebbe rappresentare (in codice) cosa è o cosa fa l'attività (nella vita reale). Le entità di dominio, quindi, sono gli artefatti o gli attori trovati in quell'attività reale. Che tipo di comportamento hanno questi artefatti e attori di vita? Tutto. A sua volta, che tipo di comportamento DOVREBBE le entità di dominio hanno su di loro? Tutto.
Ad esempio, nella vita reale, un manager può assumere un nuovo dipendente. La rappresentazione del dominio di questo dovrebbe includere entità come "manager" e "nuovo dipendente". Il manager è l'attore, qui.
//newEmployee comes from somewhere else... possibly the UI
//someManagerId comes from the logged in user
var manager = _repository.Get<Manager>(someManagerId);
manager.Hire(newEmployee);
Così, i modelli entity manager/riflette il comportamento del business vita reale, qui. L'alternativa è quella di ignorare l'entità responsabile come attore, e lo spingere verso l'angolo in modo da un pesante di sollevamento "servizio di dominio" può fare tutto il lavoro ... in questo modo:
//newEmployeeService comes from somewhere else... possibly injected using IOC
newEmployeeService.Create(newEmployee, someManagerId);
In un dominio anemico , dovresti utilizzare un servizio di dominio come questo per creare o assumere un dipendente. Funziona, ma non è espressivo e il comportamento non è così individuabile. Chi fa cosa? Perché il manager ha bisogno di creare un nuovo dipendente?
Credo che quando ho fatto la domanda in origine, ho voluto provare ad avviare di cui più comportamento nei miei entità, ma io davvero non sapevo come senza iniettare servizi nelle mie entità (per esempio, con l'iniezione del costruttore). Da allora, abbiamo imparato alcuni nuovi trucchi e le entità della nostra squadra sono super-espressive. Ecco, in poche parole, cosa stiamo facendo:
- Cerchiamo, quando possibile, di utilizzare le entità attore per esprimere la persona o la cosa che sta eseguendo l'azione.
- Gli attori dispongono di metodi che esprimono le azioni che possono eseguire
- Quando un servizio è necessario, viene iniettato come argomento nel metodo in cui viene utilizzato.
- Gli eventi del dominio vengono attivati utilizzando BlingBag in ogni metodo su ogni entità di dominio per fornire l'estensibilità e dare alle entità la possibilità di autodeterminarsi.
La singola responsabilità è piuttosto antitetica alla progettazione basata su domini. Abbiamo avuto un'interessante discussione su questo incontro al NYCDDD un paio di mesi fa ... – Domenic
Sarei interessato a quella discussione. Non trovo che sia il caso –