Ich habe eine Reihe von ASP.NET 4-Projekten, die in einer MVC (3 RC2) -App gipfeln. Die Lösung verwendet Unity und EntLib Validation für die übergreifende Abhängigkeitsinjektion und -validierung. Beide eignen sich hervorragend zum Implementieren von Repository- und Service-Layer-Implementierungen.So führen Sie eine doppelte Schlüsselvalidierung mithilfe von Entlib- (oder DataAnnotations), MVC- und Repository-Mustern durch
Ich kann jedoch nicht herausfinden, wie die doppelte Schlüsselüberprüfung durchgeführt wird. Wenn sich ein Benutzer beispielsweise anmeldet, möchten wir sicherstellen, dass er keine Benutzer-ID auswählt, die bereits von einem anderen Benutzer verwendet wird. Für diese Art der Validierung muss das validierende Objekt eine Repository-Referenz haben ... oder eine andere Möglichkeit, einen IQueryable/IEnumerable-Verweis auf andere Zeilen im DB zu überprüfen.
Was ich habe, ist eine UserMetadata-Klasse, die alle Eigenschaften-Setter und Getter für einen Benutzer zusammen mit allen entsprechenden DataAnnotations und EntLib-Validierungsattributen hat. Es gibt auch eine UserEntity-Klasse, die mithilfe von EF4 POCO Entity Generator-Vorlagen implementiert wird. Die UserEntity hängt von UserMetadata ab, da sie über ein MetadataTypeAttribute verfügt. Ich habe auch eine UserViewModel-Klasse, die dasselbe genaue MetadataType-Attribut hat. Auf diese Weise kann ich die gleichen Validierungsregeln über Attribute sowohl auf die Entity als auch auf das Viewmodel anwenden.
Es gibt keine konkreten Verweise auf die Repository-Klassen. Alle Repositories werden mit Unity injiziert. Es gibt auch eine Service-Schicht, die die Abhängigkeitsinjektion erhält. Im MVC-Projekt werden Service-Layer-Implementierungsklassen in die Controller-Klassen eingefügt (die Controller-Klassen enthalten nur Service-Layer-Schnittstellenreferenzen). Unity fügt dann die Repository-Implementierungen in die Service-Layer-Klassen ein (Serviceklassen enthalten auch nur Schnittstellenreferenzen).
Ich habe mit dem DataAnnotations CustomValidationAttribute in der Metadatenklasse experimentiert. Das Problem dabei ist, dass die Validierungsmethode statisch sein muss und die Methode eine Repository-Implementierung nicht direkt instanziieren kann. Meine Repository-Schnittstelle ist IRepository <T>, und ich habe nur eine einzige Repository-Implementierungsklasse definiert als EntityRepository <T> für alle Domain-Objekte. Um ein Repository explizit zu instantiieren, müsste ich das neue EntityRepository <UserEntity>() sagen, was zu einem zirkulären Abhängigkeitsdiagramm führen würde: UserMetadata [hängt ab] DuplicateUserIDValidator [hängt ab] UserEntity [hängt ab von] UserMetadata.
Ich habe auch versucht, einen benutzerdefinierten EntLib Validator <T> zusammen mit einem benutzerdefinierten Validierungsattribut zu erstellen. Hier habe ich nicht das gleiche Problem mit einer statischen Methode. Ich denke, ich könnte das zum Laufen bringen, wenn ich herausfinden könnte, wie Unity mein EntityRepository in die Validator-Klasse injizieren kann ... was ich nicht kann. Im Moment befindet sich der gesamte Validierungscode in meiner Metadata-Klassenbibliothek, da das benutzerdefinierte Validierungsattribut dort hingehört.
Haben Sie Ideen, wie Sie Validierungen durchführen, die mit dem aktuellen Repository-Status verglichen werden müssen? Kann Unity verwendet werden, um eine Abhängigkeit in eine Klassenbibliothek der unteren Ebene einzufügen?
Werfen Sie einen Blick auf diesen Artikel: http://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=47. – Steven