2009-03-09 8 views
5

ich eine RentalProperty Klasse haben, die etwa wie folgt aussieht:DDD User Security Policies

class RentalProperty 
{ 
    Money MonthlyRent; 
    List<MaintainenceCall> MaintainenceCalls; 
} 

Von meinem Verständnis, DDD mit dem MonthlyRent zu ändern, würde ich die RentalProperty bekommen, die MonthlyRent Eigenschaft ändern, und rufen RentalPropertyRepository .Sparen(). Derselbe Prozess wird behandelt, um einen neuen Wartungscall hinzuzufügen.

Das Problem, das ich habe, ist, dass zum Beispiel ein Handyman in der Lage sein sollte, einen MaintenanceCall hinzuzufügen, aber es sollte nicht erlaubt sein, den MonthlyRent zu ändern. Wie soll ich diese (und andere ähnliche) Sicherheitsrichtlinien implementieren?

+0

Vielleicht stelle ich wirklich die gleiche fundamentale Frage wie du, aber ich habe mich zuerst in eine andere Richtung gewagt. http://stackoverflow.com/questions/5374176/can-ddd-repositories-be-aware-of-user-context – jpierson

Antwort

2

AOP. PostSharp ist wirklich glatt für solche Sachen.

Weil Sicherheit wirklich eine Querschnittsaufgabe ist.

+0

Interessant, wie ich dieses Konzept auch gerissen habe. +1 – eduncan911

+1

Sicherheit ist nicht so eindeutig ein Querschnittsthema wie etwa Logging. Wenn es um die Protokollierung geht, unterscheidet sich nur das, was protokolliert wird. Ob ein Benutzer berechtigt ist, etwas zu tun, hängt von bestimmten Informationen in der Domäne ab. –

8

Kurz gesagt, sollten Sie diese Geschäftsregel direkt in Ihrem Modell anwenden. In Ihrem Fall direkt in der Getter- und Setter-Eigenschaft MonthlyRent. Wir alle wissen, wie kompliziert das mit vielen Überprüfungen und Sicherheitsstufen werden kann; Also, das sind die Spezifikationen für.

Das DDD playbook stellt das Konzept Spezifikationen vor, genau zu diesem Zweck, das Licht auf das Modell selbst zu fokussieren. Sie richten zuerst Ihren Getter und Setter wie oben beschrieben ein, um die Funktionalität zu erhalten. Suchen Sie dann während des Refactoring nach dem Modell, indem Sie den langen Getter/Setter-Code in Specification-Klassen abstrahieren.

Das Lesen des Codes macht es sehr offensichtlich, was genau der Code tut. Dies ist das Kern-DDD-Konzept an sich. Spezifikationen sollten sehr einfach und geradlinig gehalten werden.

Dieser Code kommt von Domain-Driven Design Quickly, eine kurze und schnelle Lese für DDD schnell. Es ist wirklich ein kurzes Buch über DDD, das ein Lesen über ein paar Stunden garantiert. Nur 100 Seiten oder so.