UnitOfWork è uguale alla transazione? O è più di questo?

Internet è pieno di informazioni sul pattern di UnitOfWork ; anche SO non è un’eccezione.

Ancora non capisco qualcosa a riguardo. Nella mia comprensione UnitOfWork = Transaction in DB . È tutto; niente di più, niente di meno.

È corretto?

La mia confusione è dovuta a come è implementata in diversi ORM . NHibernate utilizza l’ ISession per più di una semplice Transaction . Dapper lascia tutto.

La mia domanda qui riguarda solo il modello di progettazione senza considerare alcun ORM o tecnologia.

    Se è più di una semplice Transaction , per favore spiega come.

    Modifica 1

    Riferimento a questo link come suggerito in risposta da @ David Osborne.

    Un’unità di lavoro tiene traccia di tutto ciò che fai durante una transazione commerciale che può influire sul database. Quando hai finito, capisce tutto ciò che deve essere fatto per alterare il database come risultato del tuo lavoro.

    Quindi questo significa che UnitOfWork è DBTransaction e Altro .

    Di seguito sono le ulteriori responsabilità: –

    • Mantenere lo stato di ciò che è stato modificato, inserito, cancellato in questa sessione di lavoro.

    • In base a questo stato, modificare il database al termine del lavoro.

    Anche se non è chiaramente menzionato nella citazione di cui sopra, ma può anche controllare il batching delle query.

    La mia comprensione è corretta ora?

    Ha origine , AFAIK, dalla necessità di strumenti ORM per tenere traccia dello stato [persistence] degli oggetti durante una transazione logico / commerciale.

    Il modo in cui un’unità di lavoro gestisce questo e il suo rapporto con la tecnologia di archiviazione sottostante e gli oggetti archiviati, è un dettaglio di implementazione.

    Una transazione di database con un numero di istruzioni SQL intermedie, è probabilmente anche un’unità di lavoro. Tuttavia, suppongo, la differenza fondamentale è che l’unità di lavoro, come definita nel modello, ha astratto quel livello di dettaglio a livello di object.

    Un UnitOfWork è una transazione commerciale. Non necessariamente una transazione tecnica (transazione DB) ma spesso legata a transazioni tecniche.

    Nei modelli di applicazione enterprices è definito come

    Mantiene un elenco di oggetti interessati da una transazione commerciale e coordina la scrittura delle modifiche e la risoluzione dei problemi di concorrenza.

    Non definisce come vengono scritte le modifiche né il tipo di archiviazione.

    Un applcation potrebbe scrivere modifiche a a

    • database usando SQL
    • file system utilizzando i flussi
    • servizio di persistenza che utilizza le richieste http
    • cache distribuita o persino memoria in memoria mediante invocazioni di metodi

    Un UnitOfWork (transazione commerciale) raccoglie le modifiche agli oggetti di business e garantisce che le altre transazioni commerciali vedano solo oggetti di business validi.

    Ad esempio, quando l’applicazione esegue un caso d’uso modifica gli oggetti di business. Se vengono eseguite in parallelo due transazioni commerciali (di solito casi d’uso), l’applicazione deve prestare attenzione alle modifiche apportate da ciascuna transazione aziendale e al momento in cui le altre transazioni commerciali le vedranno.

    Tecnicamente questo è spesso fatto usando una transazione db. Pertanto un’unità di lavoro è solitamente una transazione DB.

    Le applicazioni che utilizzano i framework ORM per gestire la persistenza di solito hanno una relazione uno a uno tra l’unità di word e la transazione db. Pertanto, la differenza tra un’unità di lavoro e una transazione di database non è di solito rilevante per gli sviluppatori.