Después de ver la presentación NDC12 "Elaboración de modelos de dominio malicioso" de Jimmy Bogard (http://ndcoslo.oktaset.com/Agenda), estaba vagando cómo persistir ese tipo de modelo de dominio.
Esta es la clase de muestra de la presentación:Modelo de dominio enriquecido con comportamientos y ORM
public class Member
{
List<Offer> _offers;
public Member(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
_offers = new List<Offer>();
}
public string FirstName { get; set; }
public string LastName { get; set; }
public IEnumerable<Offer> AssignedOffers {
get { return _offers; }
}
public int NumberOfOffers { get; private set; }
public Offer AssignOffer(OfferType offerType, IOfferValueCalc valueCalc)
{
var value = valueCalc.CalculateValue(this, offerType);
var expiration = offerType.CalculateExpiration();
var offer = new Offer(this, offerType, expiration, value);
_offers.Add(offer);
NumberOfOffers++;
return offer;
}
}
por lo que hay algunas reglas contenidas en este dominio del modelo:
- Miembro debe tener nombre y apellido
- Número de ofertas no se puede cambiar fuera
- El miembro es responsable de crear una nueva oferta, calculando su valor y asignación
Si intenta asignar esto a algún ORM como Entity Framework o NHibernate, no funcionará. Entonces, ¿cuál es el mejor enfoque para asignar este tipo de modelo a la base de datos con ORM?
Por ejemplo, ¿cómo puedo cargar AssignedOffers desde DB si no hay un setter?
Lo único que tiene sentido para mí es utilizar la arquitectura de comando/consulta: las consultas siempre se hacen con DTO como resultado, no como entidades de dominio, y los comandos se realizan en modelos de dominio. Además, el abastecimiento de eventos es perfecto para los comportamientos en el modelo de dominio. Pero este tipo de arquitectura CQS no es adecuada para todos los proyectos, especialmente en el brownfield. ¿O no?
Estoy al tanto de preguntas similares aquí, pero no pude encontrar ejemplos concretos y soluciones.
Acabo de ver el mismo video, y me preguntaba lo mismo. ¿Qué piensas sobre pasar un poco en el constructor, y también tener una propiedad de solo lectura en la clase Member para devolver un clon de ese poco? De esta forma, puede obtener datos dentro y fuera del objeto de dominio para persistir o pasarlo. – stralsi
¿Algo como instantánea de objetos? Funcionaría probablemente, pero también requeriría algunos pirateo para que funcione con la herramienta ORM. Personalmente, no veo ninguna manera fácil, y traería muchas abstracciones y generalizaciones que tendrían que luchar durante el desarrollo de la aplicación. La fuente del evento es la única manera de ir a IMO –
De hecho, acabo de ver este video y estaba pensando lo mismo; ¿Eso significa que necesita un conjunto de objetos DTO/POCO para la capa de datos/persistencia que su ORM hidrata y luego utiliza un asignador como AutoMapper para asignar a un objeto de dominio? ¿Algo así sucede en el repositorio? Parece que un ORM como EF Code First espera un POCO con getters y setters. – Abe