Actualmente tengo un repositorio para casi todas las tablas en la base de datos y me gustaría alinearme más con DDD reduciéndolos a raíces agregadas solamente.
Supongamos que tengo las siguientes tablas User
y Phone
. Cada usuario puede tener uno o más teléfonos. Sin la noción de raíz agregada, podría hacer algo como esto:
//assuming I have the userId in session for example and I want to update a phone number
List<Phone> phones = PhoneRepository.GetPhoneNumberByUserId(userId);
phones[0].Number = “911”;
PhoneRepository.Update(phones[0]);
El concepto de raíces agregadas es más fácil de entender en papel que en la práctica. Nunca tendré números de teléfono que no pertenezcan a un usuario, así que ¿tendría sentido eliminar el PhoneRepository e incorporar métodos relacionados con el teléfono en el UserRepository? Suponiendo que la respuesta sea sí, voy a reescribir el ejemplo de código anterior.
¿Puedo tener un método en UserRepository que devuelva números de teléfono? O debería devolver siempre una referencia a un Usuario y luego atravesar la relación a través del Usuario para llegar a los números de teléfono:
List<Phone> phones = UserRepository.GetPhoneNumbers(userId);
// Or
User user = UserRepository.GetUserWithPhoneNumbers(userId); //this method will join to Phone
Independientemente de la forma en que adquiera los teléfonos, suponiendo que modifique uno de ellos, ¿cómo hago para actualizarlos? Mi conocimiento limitado es que los objetos debajo de la raíz deben actualizarse a través de la raíz, lo que me llevaría hacia la opción # 1 a continuación. Aunque esto funcionará perfectamente bien con Entity Framework, parece extremadamente poco descriptivo, porque al leer el código no tengo idea de lo que estoy actualizando, aunque Entity Framework mantiene la pestaña de los objetos modificados dentro del gráfico.
UserRepository.Update(user);
// Or
UserRepository.UpdatePhone(phone);
Por último, en el supuesto tengo varias tablas de búsqueda que no son realmente vinculados a cualquier cosa, como por ejemplo CountryCodes
, ColorsCodes
, SomethingElseCodes
. Podría usarlos para completar menús desplegables o por cualquier otra razón. ¿Son estos repositorios independientes? ¿Se pueden combinar en algún tipo de agrupación / repositorio lógico como CodesRepository
? ¿O va en contra de las mejores prácticas?