Vengo de un mundo de script de transacción y estoy empezando a echar un vistazo a DDD. No estoy seguro de la forma correcta de integrar un diseño DDD con la persistencia de la base de datos. Esto es lo que tengo:
Una clase de servicio llamada OrganisationService cuya interfaz contiene métodos para recuperar y guardar instancias de objetos de dominio de la Organización. La organización es una raíz agregada y tiene otros datos relacionados con ella: miembros y licencias. La primera base de datos EF6 DBContext se usa dentro del OrganisationService para recuperar las entidades OrganisationDB y las entidades relacionadas MemberDB y LicenseDB. Todos estos se transforman en sus equivalentes de clase de objeto de dominio cuando son recuperados por OrganisationService y se cargan en el objeto de dominio de Organización. Este objeto se ve así:
public class Organisation
{
public IList<Member> Members { get; set; }
public IList<License> Licenses { get; set; }
}
No estoy usando el patrón Repository en OrganisationService ... Estoy usando EF en sí como Repository ya que parece que EF6 ha hecho que el repositorio sea redundante ahora.
En este punto del diseño, el objeto de dominio de Organización está anémico: se parece a la clase de Organización EF POCO. ¡La clase OrganisationService se parece mucho a un repositorio!
Ahora necesito comenzar a agregar lógica. Esta lógica incluye administrar las licencias y los miembros de una organización. Ahora, en los días del script de transacción, agregaría métodos al OrganisationService para manejar estas operaciones y llamaría a un Repositorio para interactuar con la base de datos, pero con DDD creo que esta lógica debería encapsularse dentro del objeto de dominio de la Organización ...
Aquí es donde no estoy seguro de lo que debería estar haciendo: tendré que conservar estos datos en la base de datos como parte de la lógica. ¿Esto significa que debo usar DbContext dentro del objeto de dominio de la Organización para hacer esto? ¿Está mal utilizar el repositorio / EF dentro del objeto de dominio? Si es así, ¿a dónde pertenece esta persistencia?
public class Organisation
{
public IList<Member> Members { get; set; }
public IList<License> Licenses { get; set; }
public void AddLicensesToOrganisation(IList<License> licensesToAdd)
{
// Do validation/other stuff/
// And now Save to the DB???
using(var context = new EFContext())
{
context.Licenses.Add(...
}
// Add to the Licenses collection in Memory
Licenses.AddRange(licensesToAdd);
}
}
¿Debería simplemente mutar el objeto de dominio de la Organización en la memoria y luego devolverlo al OrganisationService para persistencia? Luego tengo que rastrear lo que realmente cambió en el objeto (¡que es lo que EF le hace a sus propios POCO! ¡Estoy sintiendo que EF no es solo un reemplazo del repositorio, sino que también podría ser la capa de dominio!)
Cualquier orientación aquí es apreciada.
fuente
No sé EF6, pero otros ORM manejan esto de manera transparente, por lo que no tendrá que agregar las licencias al contexto explícitamente, las detectará al guardar los cambios. Entonces el método se reducirá a
y el código a su alrededor
fuente