sto faticando un po 'con i repository. Sto usando C# e NHibernate. La domanda che ho è: quanto dovrebbe fare il mio repository prima di chiamare un salvataggio o un get?Quanta logica dovrei inserire i miei metodi di repository quando si utilizza il pattern del repository?
Ad esempio, ho una classe utente che è una radice aggregata. Voglio chiamare un metodo chiamato "register" che aggiungerà l'utente e imposterà alcuni valori predefiniti basati su regole aziendali e creerà alcune altre entità che sono anche parti secondarie della radice "utente" (es. Indirizzo, gruppi, ecc.). Devo chiamare
userRepo.Register(newUser);
che sarebbe (ignorando i problemi evidenti):
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);
}
o forse ho messo il registro in un livello di business e lo hanno fare:
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.
}
Entrambi sembra leggermente sbagliato.
Qual è l'approccio corretto?
modificare -------------------------------
grazie per tutte le risposte. Non riesco a decidere chi è il più giusto e quindi quale risposta accettare.
In generale, tutti dicono di mettere le regole aziendali in un altro livello. questo ha senso, ma non sono sicuro delle chiamate dati per i gruppi - poiché i gruppi non sono una radice aggregata non dovrebbero avere il loro repository, quindi come faccio ad aggiungerli e salvarli? Nel mio progetto l'aggiunta di un gruppo alla raccolta di gruppi dell'utente non crea automaticamente il gruppo nel db; Devo anche chiamare session.save sull'oggetto. così lo metto nel repository utente come userRepo.SaveGroup (g)?
Se si dispone di un createGroup() nell'altro layer, sarà necessario utilizzare il proprio repository o gli utenti. o sono di spessore?
in questo esempio la creazione del gruppo è in userfactory. dove avviene l'interazione db della creazione di gruppo? in un repository di gruppo o in un repository utente? –
Dipende. Potrebbe esserci un caso per un repository di gruppo. In pratica, prova a limitare gli archivi a uno per radice aggregata. In tal caso, utilizzare un GroupRepository per trovare un gruppo esistente e passare il gruppo come parametro nel metodo UserFactory.CreateNewUser. Quando UserRepository salva l'utente, controlla la configurazione per assicurarti di salvare anche l'associazione di gruppo. –
In alternativa, potrebbe essere più opportuno creare un'istanza di un nuovo oggetto Utente e disporre di un metodo UserServices.RegisterWithDefaultGroup (Utente utente) con la seguente implementazione: Gruppo defaultGroup = _groupRepository.FindByName ("Default"); user.AddGroup (DefaultGroup); Registrati (utente); Dipende tutto dalla tua applicazione, dall'architettura del software e da quanto severi desideri aderire a determinati principi. In bocca al lupo! –