Ich kämpfe ein bisschen mit Repositories. Ich benutze C# und NHibernate. Die Frage, die ich habe, ist: Wie viel sollte mein Repository tun, bevor es ein Speichern oder ein Holen aufruft?Wie viel Logik sollte ich meine Repository-Methoden bei der Verwendung von Repository-Muster setzen?
Zum Beispiel habe ich eine Benutzerklasse, die eine aggregierte Wurzel ist. Ich möchte eine Methode namens "register" aufrufen, die den Benutzer hinzufügt und einige Standardwerte basierend auf Geschäftsregeln setzt und einige andere Entitäten erstellt, die auch Unterteile des "Benutzer" -Stamms sind (dh Adresse, Gruppen usw.). Sollte ich nennen
userRepo.Register(newUser);
was wäre (die offensichtlichen Probleme zu ignorieren):
Regsiter(User newUser){
newUser.SomeProp = "Default Data";
Group g= new Group;
g.SomeProp2 = "Default Data";
newUser.Groups.Add(g);
Session.Save(g);
Session.Save(newUser);
}
oder sollte ich Register in einer Business-Schicht gesetzt haben und haben es tun:
Regsiter(User newUser){
newUser.SomeProp = "Default Data";
Group g= new Group;
g.SomeProp2 = "Default Data";
newUser.Groups.Add(g);
userRepo.Register(newUser, g);// this does session.save on both objects.
}
Both scheint etwas falsch zu sein.
Was ist der richtige Ansatz?
bearbeiten -------------------------------
Dank für alle Antworten. Ich kann nicht entscheiden, wer am richtigsten ist und daher welche Antwort zu akzeptieren.
Im Allgemeinen sagen alle die Geschäftsregeln in eine andere Schicht. das macht Sinn, aber ich bin unsicher über die Datenaufrufe für Gruppen - da Gruppen keine aggregierte Wurzel sind, sollten sie kein eigenes Repository haben. Wie gehe ich also vor, sie hinzuzufügen und zu speichern? In meinem Projekt wird beim Hinzufügen einer Gruppe zur Gruppensammlung des Benutzers die Gruppe in der Datenbank nicht automatisch erstellt. Ich muss auch session.save für das Objekt aufrufen. also lege ich das in den Benutzer Repo als userRepo.SaveGroup (g)?
Wenn ich eine createGroup() in der anderen Schicht habe, dann muss sie entweder ihr eigenes Repo oder die Benutzer verwenden. oder bin ich dick?
In diesem Beispiel befindet sich die Gruppenerstellung in der userfactory. Wo passiert die Gruppenbildung db Interaktion? in einer Gruppe Repo oder Benutzer Repo? –
Kommt drauf an. Es kann einen Fall für ein Gruppen-Repository geben. Versuchen Sie in der Praxis, Repositorys auf einen pro Gesamtsystemstamm zu beschränken. Verwenden Sie in einem solchen Fall ein GroupRepository, um eine vorhandene Gruppe zu finden und die Gruppe als Parameter an die UserFactory.CreateNewUser-Methode zu übergeben. Wenn das UserRepository den Benutzer speichert, überprüfen Sie Ihre Konfiguration, um sicherzustellen, dass Sie auch die Gruppenzuordnung speichern. –
Alternativ kann es sinnvoller sein, ein neues User-Objekt zu instanziieren und eine UserServices.RegisterWithDefaultGroup (User user) -Methode mit der folgenden Implementierung zu verwenden: Group defaultGroup = _groupRepository.FindByName ("Default"); user.AddGroup (defaultGroup); Registrieren (Benutzer); Es hängt wirklich von Ihrer Anwendung ab, von der Software-Architektur und davon, wie streng Sie bestimmte Prinzipien einhalten wollen. Viel Glück! –