Dopo aver visto la presentazione di NDC12 "Creazione di modelli di domini malvagi" da Jimmy Bogard (http://ndcoslo.oktaset.com/Agenda), stavo vagando su come mantenere quel tipo di modello di dominio.
Questa è classe di esempio dalla presentazione:Modello di dominio ricco con comportamenti e 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;
}
}
quindi ci sono alcune norme contenute nel presente modello di dominio:
- Membro deve avere nome e cognome
- Numero di offerte non può essere modificato al di fuori
- Il membro è responsabile della creazione di una nuova offerta, calcolandone il valore e l'assegnazione
Se prova a mappare questo ad un ORM come Entity Framework o NHibernate, non funzionerà. Quindi, qual è l'approccio migliore per mappare questo tipo di modello al database con ORM?
Ad esempio, come caricare AssignedOffers dal DB se non è impostato alcun setter?
L'unica cosa che per me ha senso è l'utilizzo dell'architettura di comando/query: le query vengono sempre eseguite con DTO come risultato, non con le entità di dominio e i comandi vengono eseguiti sui modelli di dominio. Inoltre, l'event sourcing è perfetto per comportamenti sul modello di dominio. Ma questo tipo di architettura CQS non è forse adatto a tutti i progetti, specialmente brownfield. O no?
Sono a conoscenza di domande simili qui, ma non sono riuscito a trovare esempi e soluzioni concrete.
Ho appena visto lo stesso video, e mi stavo chiedendo la stessa cosa. Cosa ne pensi di passare un poco nel costruttore e avere anche una proprietà readonly sulla classe Member per restituire un clone di quello poco? In questo modo è possibile ottenere dati dentro e fuori dall'oggetto dominio per mantenerlo o passarlo. – stralsi
Qualcosa come l'istantanea dell'oggetto? Probabilmente funzionerebbe, ma richiederebbe anche qualche hacking per farlo funzionare con lo strumento ORM. Personalmente non vedo alcun modo semplice, e porterebbe molte astrazioni e generalizzazioni che dovresti combattere durante l'applicazione. L'individuazione degli eventi è l'unico modo per andare IMO –
In realtà ho appena guardato questo video e stavo pensando la stessa cosa; vuol dire che hai bisogno di un set di oggetti DTO/POCO per il livello dati/persistenza che il tuo ORM idrata e poi usi un mappatore come AutoMapper per mappare su un oggetto dominio? Succede qualcosa del genere nel repository? Sembra che un ORM come il Codice EF in primo luogo si aspetta un POCO con getter e setter. – Abe