Ho un metodo che voglio essere "transazionale" in senso astratto. Chiama due metodi che capita di fare cose con il database, ma questo metodo non lo sa.conosce troppo i metodi che sta chiamando
public void DoOperation()
{
using (var tx = new TransactionScope())
{
Method1();
Method2();
tc.Complete();
}
}
public void Method1()
{
using (var connection = new DbConnectionScope())
{
// Write some data here
}
}
public void Method2()
{
using (var connection = new DbConnectionScope())
{
// Update some data here
}
}
perché in termini reali del TransactionScope
significa che una transazione di database verrà utilizzato, abbiamo un problema in cui si potrebbe essere promosso a una transazione distribuita, se otteniamo due connessioni diverse dalla piscina.
ho potuto risolvere questo avvolgendo il metodo DoOperation()
in un ConnectionScope:
public void DoOperation()
{
using (var tx = new TransactionScope())
using (var connection = new DbConnectionScope())
{
Method1();
Method2();
tc.Complete();
}
}
ho fatto DbConnectionScope
me stesso per una simile scopo, in modo che io non devo passare oggetti di connessione al sub-modalità (questo è un esempio più elaborato del mio vero problema). Ho avuto l'idea da questo articolo: http://msdn.microsoft.com/en-us/magazine/cc300805.aspx
Tuttavia non mi piace questa soluzione in quanto significa DoOperation
ora ha conoscenza che i metodi che è chiamata può utilizzare una connessione (ed eventualmente un collegamento diverso ogni). Come potrei refactoring questo per risolvere il problema?
Un'idea che sto pensando di sta creando un più generale OperationScope
, in modo che quando fatto squadra con un costume stile di vita Castello di Windsor scriverò, significherà qualsiasi componente richiesto del contenitore con OperationScopeLifetyle
sarà sempre ottenere lo stesso istanza di quel componente. Questo risolve il problema perché OperationScope
è più ambiguo di DbConnectionScope
.
Cosa? Qualcuno ha votato affinché questa domanda sia chiusa? Perché? –