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!

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top