StructureMap/Nibernate Sessão por solicitação, incluindo transcação constante
-
08-07-2019 - |
Pergunta
Eu apenas comecei a usar o StructureMap em meus aplicativos MVC, e tudo vai bem, exceto lidando com o meu ITranscation
a maneira correta.
O que eu quero fazer é criar uma nova isamento em cada solicitação. Juntamente com isso, quero iniciar uma transação.
No final da solicitação, comprometerei a transcação.
Minha pergunta é: como posso fazer isso da melhor maneira com o StructureMap. Encontrei muitos exemplos no Google, mas nenhum deles inicia uma transação com a solicitação, e eu realmente não quero fazer isso nos meus métodos.
Desde já, obrigado!
Solução
Outras dicas
Provavelmente não é tão fácil, mas aqui está minha opinião. Crie uma unidade de trabalho que basicamente envolva a sessão e a transação e guarde isso para a solicitação e confirme ou reversão quando a solicitação terminar.
public interface IUnitOfWork : IDisposable
{
ISession Session { get; }
void Commit();
void Rollback();
}
A implementação pode parecer:
public class UnitOfWork : IUnitOfWork
{
private readonly ITransaction _tx;
public ISessionFactory SessionFactory { get; set; }
public UnitOfWork()
{
SessionFactory = ObjectFactory.GetNamedInstance<ISessionFactory>(Keys.SessionFactoryName);
Session = SessionFactory.OpenSession();
_tx = Session.BeginTransaction();
}
public UnitOfWork(ISessionFactory sessionFactory)
{
SessionFactory = sessionFactory;
Session = SessionFactory.OpenSession();
_tx = Session.BeginTransaction();
}
public ISession Session { get; private set; }
public void Commit()
{
if (_tx.IsActive)
_tx.Commit();
}
public void Rollback()
{
_tx.Rollback();
}
}
Basta descartar a unidade de trabalho no Endrequest.