Quando avrei scritto un'implementazione UoW in cima a ciò che è già fornita da NHibernate? Qualche esempio del mondo reale?Perché dovrei utilizzare il modello Unità di lavoro in cima a una sessione di NHibernate?
risposta
l'unità di lavoro si sta descrivendo è già fornita da NHibernate quindi non c'è motivo di fare una tale unità di lavoro.
Quello che abbiamo in nostro servizio WCF è un'unità più alto livello di lavoro che contiene informazioni importanti nella nostra applicazione per l'unità corrente del lavoro. Ciò include l'astrazione dell'NHibernate ISession per noi. Quando si interrompe il basso si dispone di codice che si inserisce in tre categorie
codice che deve occuparsi di un'unità di lavoro. Non importa chi appoggia l'unità di lavoro. Potrebbe essere NHibernate, iBatis o un ORM personalizzato. Tutto il codice deve essere carico, rollback, salvataggio, ecc. Non deve preoccuparsi del meccanismo utilizzato per farlo.
codice che deve affrontare un ISession direttamente perché sta facendo NHibernate cose specifiche. Di solito questo ha a che fare con query complesse che devono essere create.
non ha bisogno di sapere che è in esecuzione in un'unità di lavoro o accedere al ISession. Possiamo ignorarlo completamente come parte di questa discussione.
Mentre il codice a 1. potrebbe solo lavorare contro un ISession la nostra preferenza è di cercare di cose astratte via nel codice che noi non controlliamo direttamente o che potrebbero cambiare. Questo ha un valore per due ragioni.
Quando abbiamo iniziato, non eravamo venduti al 100% su NHibernate. Stavamo considerando iBatis o qualcosa di personalizzato. Ovviamente questo non è più un problema.
L'intero team non sono esperti in NHibernate né vogliamo che siano. Per la maggior parte le persone scrivono il codice che rientra nella categoria 1. e tutto ciò che sanno è la nostra unità di lavoro. Quando il codice della categoria 2 deve essere scritto, viene scritto dalle persone della squadra che comprendono bene l'NHibernate.
Quindi, per chiudere vorrei dire che il tipo di unità di lavoro si sta parlando non è necessario vorrei suggerire che un'unità più elevato livello di lavoro in grado di fornire un sacco di valore.
Se si configurano correttamente tutti i mapping (ovvero le cascate), non è necessario eseguire operazioni speciali e l'operazione ISession
funzionerà correttamente. Tuttavia, se stai scrivendo un'applicazione a 3 livelli, dovrai eseguire manualmente le operazioni sul database che desideri vengano eseguite in una singola transazione. "Implementazione di riferimento" di Fowler in "Modelli di Enterprise Application Architecture" può essere un buon punto di partenza:
class UnitOfWork...
public void registerNew(DomainObject obj) {
Assert.notNull("id not null", obj.getId());
Assert.isTrue("object not dirty", !dirtyObjects.contains(obj));
Assert.isTrue("object not removed", !removedObjects.contains(obj));
Assert.isTrue("object not already registered new", !newObjects.contains(obj));
newObjects.add(obj);
}
public void registerDirty(DomainObject obj) {
Assert.notNull("id not null", obj.getId());
Assert.isTrue("object not removed", !removedObjects.contains(obj));
if (!dirtyObjects.contains(obj) && !newObjects.contains(obj)) {
dirtyObjects.add(obj);
}
}
public void registerRemoved(DomainObject obj) {
Assert.notNull("id not null", obj.getId());
if (newObjects.remove(obj)) return;
dirtyObjects.remove(obj);
if (!removedObjects.contains(obj)) {
removedObjects.add(obj);
}
}
public void registerClean(DomainObject obj) {
Assert.notNull("id not null", obj.getId());
}
È un'app a 3 livelli. Tuttavia, vogliamo che ogni richiesta dell'utente sia atomica, quindi 1 richiesta utente = 1 transazione DB. Elaborerò la richiesta dell'utente, modificheremo gli oggetti del dominio, quindi chiederò a NHibernate di mantenere la mia radice aggregata. – ng5000
Questa è un'astrazione su una mappa di identità. È utile quando si crea il datamapping manuale come descritto in POEA di Fowler, ma con NHibernate, perché la mappa di identità è integrata nell'ISession. – Paco
La mia unità di base dell'interfaccia lavoro contiene i seguenti metodi - Inizializzare - Commit - rollback - IDisposable.Dispose
lo uso sia per la sessione e la gestione delle transazioni. È utile perché non devo scrivere più volte quel codice per diversi ambiti di sessione.(unità di lavoro per richiesta, per serie di richieste, per thread, ecc.)
Puoi pubblicare un esempio? –
Che tipo di esempio? usando l'unità di lavoro o l'unità di lavoro stessa? – Paco
Come hai gestito i diversi ambiti di sessione? –
- 1. Unità di lavoro/gestori repository per NHibernate?
- 2. Uso del modello di progettazione dell'unità di lavoro/Sessioni NHibernate in un MVPM WPF
- 3. Perché dovrei utilizzare il modello di threading "Both" anziché "Free"?
- 4. Il modo migliore per utilizzare NHibernate con il modello di repository
- 5. PetaPoco + unità di lavoro + repository modello
- 6. WCF msmq transazione e unità di lavoro
- 7. Qual è il significato del concetto di "Unità di lavoro" in NHibernate e in altri ORM?
- 8. Modello di fabbrica astratto in cima a IoC?
- 9. unità di lavoro Design Pattern
- 10. Come utilizzare correttamente un oggetto di sessione di NHibernate - La sessione è chiusa! errori
- 11. Come e perché dovrei utilizzare il modello "Contenuto acquisto in-app" all'interno di Xcode?
- 12. sails.js Utilizzare il parametro di sessione nel modello
- 13. Errore di NHibernate sulla sessione. Salvataggio
- 14. Unità di lavoro in mongodb e C#
- 15. Visualizza oggetti sessione NHibernate
- 16. Ottenere il modello di unità dalla lettera di unità
- 17. Perché utilizzare bean di sessione stateful?
- 18. Quale dovrebbe essere la durata di una sessione di NHibernate?
- 19. L'unità di modello di lavoro all'interno di un'applicazione asp.net mvc
- 20. Le migliori pratiche di attuazione di unità di lavoro e il modello repository utilizzando ServiceStack.ORMLite
- 21. Unità di lavoro con più origini dati?
- 22. "La sessione è chiusa!" - NHibernate
- 23. Unità di lavoro, repository e IDisposable
- 24. L'impostazione di una variabile di sessione in un modello di
- 25. Come implementare il pattern Unità di lavoro con Dapper?
- 26. ServiceStack NHibernate Sessione per richiesta
- 27. Posso staccare un oggetto da una sessione di NHibernate?
- 28. Come posso implementare la sessione di NHibernate per richiesta senza una dipendenza su NHibernate?
- 29. API RESTful: dove dovrei codificare il mio flusso di lavoro?
- 30. Metodi di implementazione dell'unità di lavoro in ASP.NET MVC
ShaneC, ho una domanda simile, e sembra che tu abbia creato un'unità di lavoro che si adatta alle mie esigenze meglio della mia. Puoi dare un'occhiata alla mia domanda e offrire i tuoi $ 0.02? http://stackoverflow.com/questions/2604762/using-unit-of-work-design-pattern-nhibernate-sessions-in-an-mvvm-wpf – Echiban