TransactionScope nella classe business o data / repository?

0

Qual è il posto migliore per utilizzare la classe TransactionScope? Si trova nella business logic o nelle classi data / repository?

Esempio se usato nella classe della business logic:

using (var scope = new TransactionScope())
{
    Repository.DoSomething();
    Repository.DoSomethingMore();
    scope.Complete();
}

Esempio se usato nella classe data / repository:

using (var scope = new TransactionScope())
{
    "INSERT INTO ..."  // some actual SQL
    scope.Complete();
}
    
posta Lassi Autio 01.08.2017 - 08:53
fonte

2 risposte

1

Una singola transazione rappresenta un'unica operazione coerente all'interno del sistema. Dove si avvia una transazione dipende esclusivamente dalle esigenze della tua attività.

Uno scenario tipico è il bonifico bancario, in cui è OBBLIGATORIO assicurare che i fondi siano stati prelevati dall'account A e accreditati sull'account B. In questo caso, prima di eseguire qualsiasi operazione su database il prelievo / credito verrebbe incluso in una transazione per rendere operazione completamente completata.

Se la tua attività aziendale richiede più modifiche a un database ed è importante che tutte le operazioni o nessuna vadano a buon fine, avviare una transazione a livello aziendale è quello che desideri.

Per query semplici come un singolo inserto (il secondo esempio) non è necessario eseguire una transazione perché tali operazioni garantiscono la sicurezza operativa per impostazione predefinita.

    
risposta data 01.08.2017 - 09:11
fonte
1

Uno dei vantaggi dell'ambito della transazione rispetto a una transazione è che puoi utilizzarlo senza fare riferimento alla connessione.

Ciò consente di utilizzarlo potenzialmente al di fuori del livello dati in modo che la logica aziendale possa decidere se due o più operazioni di dati debbano essere parte della stessa transazione o meno.

Tuttavia, avendo detto che TransactionScope dipende ancora dall'oggetto di connessione che lo supporta. Quindi usarlo al di fuori del DAL introduce questa dipendenza nascosta. Che è tutt'altro che ideale.

Il mio approccio personale è di mantenere il suo uso nella classe Repository in cui metodi privati generici come InsertMyObject (connessione con) presuppongono che una transazione possa essere nell'ambito e metodi pubblici specifici come UpdateMyObjectsByDate () crea le transazioni e chiama i metodi privati come richiesto.

Si può sostenere che i metodi specifici si sovrappongono in una certa misura alla logica aziendale. Ma questo è un problema un po '"soft" piuttosto che un "duro", in realtà hai una dipendenza a cui posso puntare, problema

    
risposta data 01.08.2017 - 10:02
fonte

Leggi altre domande sui tag