Recientemente comencé a leer el libro de diseño impulsado por el dominio de Evans y comencé un pequeño proyecto de muestra para adquirir cierta experiencia en DDD. Al mismo tiempo, quería aprender más sobre MongoDB y comencé a reemplazar mis repositorios SQL EF4 con MongoDB y el último controlador oficial C#. Ahora esta pregunta es sobre el mapeo de MongoDB. Veo que es bastante fácil mapear objetos simples con captadores y decodificadores públicos, sin dolor. Pero tengo dificultades para mapear entidades de dominio sin setters públicos. Como aprendí, el único enfoque realmente limpio para construir una entidad válida es pasar los parámetros requeridos al constructor. Considere el siguiente ejemplo:C# MongoDB: ¿Cómo correlacionar correctamente un objeto de dominio?
public class Transport : IEntity<Transport>
{
private readonly TransportID transportID;
private readonly PersonCapacity personCapacity;
public Transport(TransportID transportID,PersonCapacity personCapacity)
{
Validate.NotNull(personCapacity, "personCapacity is required");
Validate.NotNull(transportID, "transportID is required");
this.transportID = transportID;
this.personCapacity = personCapacity;
}
public virtual PersonCapacity PersonCapacity
{
get { return personCapacity; }
}
public virtual TransportID TransportID
{
get { return transportID; }
}
}
public class TransportID:IValueObject<TransportID>
{
private readonly string number;
#region Constr
public TransportID(string number)
{
Validate.NotNull(number);
this.number = number;
}
#endregion
public string IdString
{
get { return number; }
}
}
public class PersonCapacity:IValueObject<PersonCapacity>
{
private readonly int numberOfSeats;
#region Constr
public PersonCapacity(int numberOfSeats)
{
Validate.NotNull(numberOfSeats);
this.numberOfSeats = numberOfSeats;
}
#endregion
public int NumberOfSeats
{
get { return numberOfSeats; }
}
}
Obviamente, la automatización no funciona aquí. Ahora puedo mapear esas tres clases a mano a través del BsonClassMaps
y se guardarán bien. El problema es que, cuando quiero cargarlos desde el DB, tengo que cargarlos como BsonDocuments
y analizarlos en mi objeto de dominio. Intenté muchas cosas, pero finalmente no conseguí una solución limpia. ¿Realmente tengo que producir DTOs con getters/setters públicos para MongoDB y asignarlos a mis objetos de dominio? Tal vez alguien me puede dar algunos consejos sobre esto.
¡Eso funciona! No puedo creer que me haya perdido esto. Supongo que para las aplicaciones que no son a gran escala, la eliminación de "solo lectura" de los campos privados es una compensación aceptable para no tener que crear una capa adicional de DTO. Como señaló, hay que tener cuidado de no construir objetos no válidos evitando el ctor. Sin embargo, me gustaría agradecer a Bryan y Niels por sus respuestas también. Todos ustedes me hicieron un poco más inteligente, gracias. – hoetz
Pequeño punto: eliminar el campo de solo lectura lo hace equivalente a 'public Id Id del objeto {get; conjunto privado; } 'auto-property y el campo se puede eliminar por completo. –
Si bien esta es una posible solución, ** aún influye en su modelo **, en el ejemplo concreto que dio al requerir que los campos no sean 'readonly'. Cada equipo debe decidir por sí mismo si esto es aceptable para su proyecto. – theDmi