Cuando uso autofac uso el mismo método de contenedores de ámbito pero en lugar de pasar la misma sesión a mi repositorio/objetos DAO que pase un UnitOfWork que es de ámbito contenedor. La Unidad de trabajo tiene esto en el constructor.
private readonly ISession _session;
private ITransaction _transaction;
public UnitOfWork(ISession session)
{
_session = session;
_transaction = session.BeginTransaction();
}
Y dispose es:
public void Dispose()
{
try
{
if (_transaction != null &&
!_transaction.WasCommitted &&
!_transaction.WasRolledBack)
_transaction.Commit();
_transaction = null;
}
catch (Exception)
{
Rollback();
throw;
}
}
soy (ab) uso de la materia disposición determinista en autofac el fin de gestionar esto, y así en cierto modo me gusta mucho.
La otra cosa es que básicamente me estoy enfocando en un entorno ASPNet y tomé la decisión consciente de que una transacción está vinculada a una solicitud web. Entonces, una transacción por patrón de solicitud web.
Debido a que yo puedo hacer esto en un código de manejo de errores IHttpModule:
void context_Error(object sender, System.EventArgs e)
{
_containerProvider.RequestContainer.Resolve<IUnitOfWork>().Rollback();
}
no he echado un vistazo a NHibernate.Burrow demasiado de cerca, pero estoy seguro de que hay algo allí que hace la mayor parte de esta.
Me gusta la solución. Sin embargo, otra pregunta es ¿qué métodos debo aplicar [Transacción]? De acuerdo con este http://nhprof.com/Learn/Alert?name=DoNotUseImplicitTransactions, parece que siempre debería tener una transacción si tengo una sesión, sin embargo, esta solución requiere que agregue manualmente [Transaction] en todos los lugares donde se usa la sesión. –
Compruebe la versión modificada. Probablemente sabrá cómo modificarlo desde allí. También puede omitir el atributo [Transaction] por completo y siempre iniciar la transacción. Es tu elección. Necesitaba el atributo, porque a veces tenía que hacer 2 cosas en diferentes transacciones. Lo hice así: // Sin atributo de transacción vacío virtual público CallThis() { Trans1(); // confirma Trans2(); // compromete } [Transacción] pública virtual vacío Trans1() {} [Transacción] pública virtual vacío Trans2() {} – dmonlord
Podría explicar el caso de uso de dos operaciones? Esto es importante ya que si también encuentro un caso de uso similar, veré el problema de forma diferente. –