Ha pasado casi un año desde que hice esta pregunta y mi equipo y yo hemos aprendido mucho desde entonces. Así es como respondería esta pregunta hoy:
El dominio debe representar (en código) lo que es o hace la empresa (en la vida real). Las entidades de dominio, entonces, son los artefactos o actores que se encuentran en ese negocio de la vida real. ¿Qué tipo de comportamiento tienen esos artefactos y actores de la vida real? Todo ello. A su vez, ¿qué tipo de comportamiento DEBERÍAN tener las entidades de dominio sobre ellos? Todo ello.
Por ejemplo, en la vida real, un gerente puede contratar a un nuevo empleado. La representación del dominio de eso debe incluir entidades como "gerente" y "nuevo empleado". El gerente es el actor, aquí.
//newEmployee comes from somewhere else... possibly the UI
//someManagerId comes from the logged in user
var manager = _repository.Get<Manager>(someManagerId);
manager.Hire(newEmployee);
Por lo tanto, la entidad gestora modela/refleja el comportamiento del negocio real, aquí. La alternativa es saltarse la entidad gestora como actor, y empujarlo a la esquina por lo que un trabajo pesado "servicio de dominio" puede hacer todo el trabajo ... como esto:
//newEmployeeService comes from somewhere else... possibly injected using IOC
newEmployeeService.Create(newEmployee, someManagerId);
En un dominio anémica , usaría un servicio de dominio como este para crear o contratar un empleado. Funciona, pero no es expresivo y el comportamiento no es tan reconocible. ¿Quien hace que? ¿Por qué se le exige al gerente que cree un nuevo empleado?
Creo que cuando hice la pregunta originalmente, quería probar a empezar a incluir más el comportamiento de mis entidades, pero realmente no sabía cómo sin inyectar en mis servicios de entidades (por ejemplo, la inyección de constructor) Desde entonces, hemos aprendido algunos trucos nuevos y las entidades de nuestro equipo son súper expresivas. Aquí, en pocas palabras, lo que estamos haciendo:
- Intentamos, siempre que sea posible, usar entidades de actor para expresar la persona o cosa que está realizando la acción.
- Los actores tienen métodos que expresan las acciones que pueden realizar
- Cuando se necesita un servicio, se inyecta como argumento en el método donde se usa.
- Disparemos eventos de dominio usando BlingBag en cada método en cada entidad de dominio para proporcionar extensibilidad y dar a las entidades la capacidad de auto persistir.
La única responsabilidad es bastante antitética al diseño impulsado por el dominio. Tuvimos una discusión interesante sobre esto en la reunión de NYCDDD hace un par de meses ... – Domenic
Me interesaría esa discusión. No creo que sea el caso –