Muy buena pregunta. He pasado bastante tiempo pensando en esos temas.
Demuestra gran comprensión al notar la tensión entre un modelo de dominio expresivo y la separación de preocupaciones. Esto es muy parecido a la tensión en la pregunta que hice sobre Tell Don't Ask and Single Responsibility Principle.
Aquí está mi punto de vista sobre el tema.
Un modelo de dominio es anémico porque no contiene lógica de dominio. Otros objetos obtienen y configuran datos usando un objeto de dominio anémico. Lo que describes no me parece lógica de dominio. Podría ser, pero en general, las tablas de búsqueda y otro lenguaje técnico son términos que significan algo para nosotros pero no necesariamente para los clientes. Si esto es incorrecto, aclare.
De todos modos, la construcción y la persistencia de los objetos de dominio no deberían estar contenidos en los propios objetos de dominio porque eso no es lógica de dominio.
Para responder a la pregunta, no, no debe inyectar un montón de objetos/conceptos que no sean de dominio, como tablas de búsqueda y otros detalles de infraestructura. Esta es una filtración de una preocupación a otra. Los patrones Factory y Repository del Domain-Driven Design son los más adecuados para mantener estas preocupaciones aparte del modelo de dominio en sí.
Pero tenga en cuenta que si no tiene ninguna lógica de dominio, terminará con objetos de dominio anémicos, es decir, bolsas de getters y setters sin cerebro, que es como some shops claim to do SOA/service layers.
Entonces, ¿cómo se obtiene lo mejor de ambos mundos? ¿Cómo enfoca sus objetos de dominio solo en la lógica del dominio, mientras mantiene la interfaz de usuario, la construcción, la persistencia, etc. fuera del camino? Te recomiendo que uses una técnica como Double Dispatch, o alguna forma de restricted method access.
Aquí hay un ejemplo de Double Dispatch. Digamos que tiene esta línea de código:
entity.saveIn(repository);
En su pregunta, saveIn() tendría todo tipo de conocimiento sobre la capa de datos. El uso de doble Despacho, saveIn() hace esto:
repository.saveEntity(this.foo, this.bar, this.baz);
Y el método saveEntity() del repositorio tiene todo el conocimiento de cómo ahorrar en la capa de datos, como debe ser.
Además de esta configuración, usted podría tener:
repository.save(entity);
la que sólo llama
entity.saveIn(this);
vuelvo a leer esto y me di cuenta de que la entidad sigue siendo delgada, ya que es simplemente despachando su persistencia en el repositorio. Pero en este caso, se supone que la entidad es delgada porque no describió ninguna otra lógica de dominio. En esta situación, podría decir "atornillar doble despacho, dar acceso".
Y sí, podría, pero la OMI expone demasiado sobre cómo se implementa su entidad, y esos accesadores son distracciones de la lógica del dominio. Creo que la única clase que debería tener y establecer es una clase cuyo nombre termina en "Accesor".
Lo resumiré pronto. Personalmente, no escribo mis entidades con métodos saveIn(), porque creo que el simple hecho de tener un método saveIn() tiende a ensuciar el objeto de dominio con distracciones. Uso el patrón de clase de amigo, el acceso privado del paquete o posiblemente el Builder pattern.
Bien, he terminado. Como dije, me obsesioné bastante con este tema.
En resumen, ¿está proponiendo acceder al repositorio desde el dominio? – aaimnr