2009-06-11 7 views

risposta

5

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

  1. 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.

  2. 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.

  3. 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.

+0

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

0

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()); 
    } 
+0

È 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

+0

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

1

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.)

+0

Puoi pubblicare un esempio? –

+0

Che tipo di esempio? usando l'unità di lavoro o l'unità di lavoro stessa? – Paco

+0

Come hai gestito i diversi ambiti di sessione? –

Problemi correlati