Tengo un método que quiero que sea "transaccional" en el sentido abstracto. Llama a dos métodos que hacen cosas con la base de datos, pero este método no lo sabe.El método sabe demasiado sobre los métodos que está llamando
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
}
}
Debido a que en términos reales el TransactionScope
significa que se utilizará una transacción de base de datos, tenemos un problema por el que bien podría ser promovido a una transacción distribuida, si tenemos dos conexiones diferentes de la piscina.
pude solucionar este problema mediante el método de embalaje DoOperation()
en un ConnectionScope:
public void DoOperation()
{
using (var tx = new TransactionScope())
using (var connection = new DbConnectionScope())
{
Method1();
Method2();
tc.Complete();
}
}
me hizo a mí mismo por DbConnectionScope
tal propósito, por lo que no tengo que pasar objetos de conexión a los sub-métodos (Este es un ejemplo más artificial que mi verdadero problema). Tengo la idea de este artículo: http://msdn.microsoft.com/en-us/magazine/cc300805.aspx
Sin embargo no me gusta esta solución ya que significa DoOperation
ahora tiene conocimiento de que los métodos se llaman pueden utilizar una conexión (y posiblemente una conexión diferente cada uno). ¿Cómo podría refactorizar esto para resolver el problema?
Una idea que estoy pensando es la creación de una más general OperationScope
, de modo que cuando se asoció con una costumbre castillo de Windsor el estilo de vida que voy a escribir, significará cualquier componente solicitado del recipiente con OperationScopeLifetyle
siempre obtener el mismo instancia de ese componente. Esto resuelve el problema porque OperationScope
es más ambiguo que DbConnectionScope
.
¿Qué? ¿Alguien votó para que se cierre esta pregunta? ¿Por qué? –