2009-11-29 3 views
4

Je viens de commencer à utiliser StructureMap dans mes applications MVC, et tout se passe bien, sauf la gestion correcte de mon ITranscation.StructureMap/NHibernate Session Per Request y compris la transcation constante

Ce que je veux faire est de créer un nouveau ISession sur chaque demande. Ensemble, je veux commencer une transcation.

À la fin de la demande, je vais commettre la transcation.

Ma question est, comment puis-je le faire de la meilleure façon avec StructureMap. J'ai trouvé beaucoup d'exemples sur Google, mais aucun d'entre eux ne commence une transcation avec la requête, et je ne veux vraiment pas le faire dans mes méthodes.

Merci d'avance!

Répondre

3
+0

Le deuxième lien semble très intéressant. Je reviendrai vers toi. Merci pour l'instant. – jhovgaard

+1

+1 pour le blog de Weston. – mxmissile

+0

http://trason.net/journal/2009/10/14/nhibernate-transactional-boundaries.html était un article génial! :) – jhovgaard

1

Ce n'est probablement pas si facile mais voici ma prise. Créez une unité de travail qui encapsule fondamentalement la session et la transaction et stockez-la pour la requête et validez ou annulez lorsque la requête est terminée.

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

La mise en œuvre pourrait alors ressembler à:

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

Juste disposer l'unité de travail à EndRequest.

+0

qui ressemblent exactement ce que je dois, merci! Puis-je simplement appeler Commit() et disposer sur EndRequest dans mon IHttpModule? – jhovgaard

+0

Oui, n'essayez pas de vous débarrasser de la transaction après l'avoir validée (elle est éliminée après la validation). Juste l'unité de travail. – mhenrixon