Nachdem ich die NDC12-Präsentation "Crafting Wicked Domain Models" von Jimmy Bogard (http://ndcoslo.oktaset.com/Agenda) gesehen hatte, war ich auf der Suche nach einem solchen Domänenmodell.
Dies ist ein Beispielklasse von der Präsentation:Rich-Domain-Modell mit Verhaltensweisen und 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;
}
}
so gibt es einige Regeln in diesem Bereich Modell enthalten:
- Mitglied ersten und letzten haben müssen Name
- Anzahl der Angebote kann nicht außerhalb
geändert werden - Mitglied ist verantwortlich für die Erstellung eines neuen Angebots, Berechnung seines Werts und seiner Zuweisung
Wenn versuchen, dies zu einigen ORM wie Entity Framework oder NHibernate zuordnen, wird es nicht funktionieren. Also, was ist der beste Ansatz für die Zuordnung dieser Art von Modell zur Datenbank mit ORM?
Zum Beispiel, wie kann ich AssignedOffers von DB laden, wenn es keinen Setter gibt?
Das einzige, was für mich Sinn macht, ist die Verwendung der Befehls-/Abfragearchitektur: Abfragen werden immer mit DTO als Ergebnis durchgeführt, nicht als Domänenentitäten, und Befehle werden in Domänenmodellen ausgeführt. Event-Sourcing eignet sich auch perfekt für Verhaltensweisen im Domänenmodell. Aber diese Art von CQS-Architektur ist vielleicht nicht für jedes Projekt geeignet, besonders für Brownfields. Oder nicht?
Ich kenne ähnliche Fragen hier, konnte aber kein konkretes Beispiel und keine Lösung finden.
Ich habe gerade das gleiche Video angesehen, und ich habe mich gefragt, die gleiche Sache. Was denkst du darüber, ein poco im Konstruktor zu übergeben und auch eine readonly-Eigenschaft für die Member-Klasse, um einen Klon dieses poco zurückzugeben? Auf diese Weise können Sie Daten innerhalb und außerhalb des Domänenobjekts abrufen, um sie zu erhalten oder weiterzugeben. – stralsi
So etwas wie Objekt-Snapshot? Es würde wahrscheinlich funktionieren, würde aber auch etwas Hacking erfordern, um es mit dem ORM-Tool arbeiten zu lassen. Ich persönlich sehe keinen einfachen Weg, und es würde viele Abstraktionen und Verallgemeinerungen mit sich bringen, die man während der gesamten App-Entwicklung bekämpfen müsste. Event Sourcing ist die einzige Möglichkeit, um IMO zu gehen. –
Ich habe gerade dieses Video angeschaut und dachte über dasselbe nach; Bedeutet das, dass Sie eine Menge von DTO/POCO-Objekten für die Daten/Persistenzschicht benötigen, die Ihr ORM hydratisiert, und dann einen Mapper wie AutoMapper verwenden, um ein Domänenobjekt zuzuordnen? Kommt so etwas im Repository vor? Es scheint, als ob ein ORM wie EF Code First einen POCO mit Gettern und Setter erwartet. – Abe