Domanda

Ho appena iniziato a utilizzare StructureMap nelle mie app MVC e tutto va bene, tranne gestire il mio ITranscation nel modo corretto.

Quello che voglio fare è creare una nuova ISession su ogni richiesta. Insieme a questo voglio iniziare una transazione.

Alla fine della richiesta commetterò la transazione.

La mia domanda è: come posso farlo nel modo migliore con StructureMap. Ho trovato molti esempi su Google, ma nessuno di essi avvia una transazione con la richiesta e non voglio davvero farlo nei miei metodi.

Grazie in anticipo!

Altri suggerimenti

Probabilmente non è così facile ma ecco la mia opinione. Creare un'unità di lavoro che sostanzialmente avvolge la sessione e la transazione e archiviarla per la richiesta e eseguire il commit o il rollback al termine della richiesta.

public interface IUnitOfWork : IDisposable
{
    ISession Session { get; }
    void Commit();
    void Rollback();
}

L'implementazione potrebbe quindi apparire come:

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();
    }
}

Smaltisci semplicemente l'unità di lavoro su richiesta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top