2012-05-30 6 views
6

Ich versuche, in der Welt "DDD mit C#" zu beginnen. Ich verwende NHibernate als mein ORM-Tool und versuche so, ein PI (Persistence Ignorance) -Modell zu entwickeln. Jedoch, in einigen meiner Entitäten (die als POCOS dargestellt werden) habe ich Geschäftsregeln in den Setter meiner Eigenschaften. Zum Beispiel habe ich eine Entität "Benutzer" mit einem Flag, das anzeigt, ob dieser Benutzer blockiert ist oder nicht, wenn dieses Flag wahr ist, muss ein zweites Feld namens "Block Date" automatisch mit dem aktuellen Datum gefüllt werden. Alles scheint sehr klar und einfach, aber das Problem entsteht in dem Moment, dass ich die Benutzer wiederherstellen, die bereits in der Datenbank, obwohl die blockierten Benutzer ihre "Blocked Dates" update auf das aktuelle Datum, entsprechend haben diese Logik. Zuerst dachte ich in einer zweiten Flagge "isLoaded", die anzeigen würde, dass das Objekt von NHibernate hydratisiert wird und dann würde diese Logik nicht gestartet werden, jedoch schien dies nicht wie PI. Irgendwelche Vorschläge, wie man das verbessert?Domain-Modell mit Nhibernate Design-Problem

Antwort

4

Sie können die Feldzugriffsstrategie in Ihrem Mapping für die IsBlocked-Eigenschaft definieren. Im Grunde würden Sie sagen, dass NHibernate das zugrunde liegende private Feld (_isBlocked) anstelle der Eigenschaft verwendet und daher Ihre Setter-Logik in der IsBlocked-Eigenschaft nicht ausgeführt wird.

This SO question hat eine gute Antwort auf Zugriffsstrategien.

Offizielle NHibernate documentation.

Wenn Sie Fluent NHibernate für die Zuordnung verwenden, ist dies, wie Sie es definieren könnte:

für das NHibernate Problem
Map(x => x.IsBlocked).Access.CamelCaseField(Prefix.Underscore); 
4

Neben Miroslavs Lösung, würde ich wirklich empfehlen davon ab, Logik hinter Eigenschaft weg Setter, besonders wenn andere Felder geändert werden müssen.

public void Block() 
{ 
    _isBlocked = true; 
    _blockedDate = DateTime.Now; 
} 

Siehe Antworten auf this question für warum.

+0

+1 für diese Empfehlung –