Tengo una situación (supongo que es bastante estándar) en la que necesito realizar algunos cálculos comerciales y crear un conjunto de registros en la base de datos. Si algo sale mal en algún momento, necesito retirar todo de la base de datos. Obvio, necesito algún tipo de transacción. Mi pregunta es dónde implemento el soporte de transacciones. Aquí está mi ejemploUso de transacciones con procesos empresariales y el patrón de repositorio
//BillingServices - This is my billing service layer. called from the UI
public Result GenerateBill(BillData obj)
{
//Validate BillData
//Create a receivable line item in the receivables ledger
BillingRepository.Save(receivableItem);
//Update account record to reflect new billing information
BillingRepository.Save(accountRecord);
//...do a some other stuff
BillingRepository.Save(moreStuffInTheDatabase);
}
Si falla alguna de las actualizaciones de la base de datos, necesito retirar las demás y salir. No acabo de exponer un objeto de conexión a través de mi repositorio en el que puedo llamar
Connection.BeginTransaction()
o lo hago yo solo valido en la capa de servicio y a llamar un método en el repositorio que guarda toda los objetos y maneja la transacción? Esto no me parece muy bien. Parece que me obligaría a poner mucha lógica de negocios en la capa de datos.
¿Cuál es el enfoque correcto? ¿Qué pasa si necesito abarcar repositorios (o sería un mal diseño)?
+1, buena pregunta. –
Espero tener una buena respuesta =). En realidad, cualquier respuesta en este punto sería agradable – Micah