Allerdings scheint dies ... gut falsch. Es ist eine schlechte Idee, meine Entität von meinem Repository abhängig zu machen (korrigiere mich, wenn ich falsch liege).
Im Allgemeinen ist die Abhängigkeit vom Repository nicht "falsch", es ist manchmal unvermeidbar. Ich denke jedoch, dass dies eine Ausnahme sein sollte und so weit wie möglich vermieden werden sollte. In Ihrem Szenario können Sie diese Abhängigkeit noch einmal überdenken. Wenn Sie darüber nachdenken, ist "Einzigartigkeit" keine Verantwortung der Entität selbst, da die Entität nichts über andere Entitäten weiß. Warum sollte diese Regel von Entitäten durchgesetzt werden?
Aber der Validierungscode in der Entität ist sinnvoll. Wo ist der beste Ort, um einen komplexen Validierungscode einzugeben?
Ich denke, dass Sie "Validierung" übergeneralisieren können. Ich würde die "Validate" -Methode loswerden und sicherstellen, dass das Objekt überhaupt nicht in den "ungültigen" Zustand gelangt. I answered ähnliche Frage vor ein paar Monaten.
Jetzt zurück zur Eindeutigkeitsregel. Ich denke, dass dies eines der Beispiele ist, bei denen DDD ein wenig "leckt", in einem Sinne, dass die Durchsetzung dieser Geschäftsregel nicht nur im Domänencode ausgedrückt werden kann. Ich würde es so nähern:
// repository
interface Users {
// implementation executes SQL COUNT in case of relation DB
bool IsNameUnique(String name);
// implementation will call IsNameUnique and throw if it fails
void Add(User user);
}
Der Client-Code würde wissen, dass vor dem Hinzufügen eines neuen Benutzers, es explizit auf Eindeutigkeit prüfen sollte, sonst wird es zum Absturz bringen. Diese Kombination erzwingt Geschäftsregel im Domänencode, aber es ist normalerweise nicht genug. Als zusätzliche Erzwingungsschicht möchten Sie möglicherweise die UNIQUE-Einschränkung in der Datenbank hinzufügen oder explizit sperren.
Siehe auch [diese Antwort] (http://Stackoverflow.com/a/9676307/706456) – oleksii