2010-09-18 7 views
9

J'ai vu de nombreuses implémentations sur le Web de personnes gérant leurs sessions et transactions NHibernate dans un HttpModule.Gestion des sessions et des transactions NHibernate dans HttpModule

Le HttpModule:

  1. crée une session au début de la demande
  2. enveloppe la demande entière dans une transaction
  3. engage la transaction à la fin de la demande

Si les gens utilisent cette stratégie, comment traitent-ils le scénario suivant:

  1. demande vient
  2. base de données objet récupérer
  3. update objet
  4. objet
  5. validation échoue
  6. modifications de l'objet sont toujours persisté parce que la transaction est validée dans le HttpModule.

Il semble qu'il n'existe aucun bon moyen de restaurer la transaction dans le scénario ci-dessus. Le seul plan que je peux mettre en place est de:

  1. écrivez ma validation de manière à ce qu'elle réussisse avant de mettre à jour mon objet de domaine (prend ma validation hors de mon modèle de domaine).
  2. gérer ma transaction plus proche de ma logique métier et jeter l'idée de le faire de manière transparente dans un HttpModule. (J'ai vu pas mal de messages le recommander)

Vu que tant de gens semblent utiliser l'approche HttpModule, j'espère qu'il y a une troisième façon de gérer ce scénario auquel je n'ai pas pensé. ?

+0

Je vient aussi à la même question ces derniers temps. Je commence par NHibernate sur un projet. Ma dernière approche utilise Autofac pour IOC et utilise HttpRequestScope pour les sessions. Et toutes les opérations de transaction au niveau du référentiel métier. Peut-être que ce n'est pas le meilleur, mais ça fonctionne bien pour l'instant. – Elph

+0

Valider les changements au lieu de valider les changements appliqués à l'entité est beaucoup plus facile. – Paco

+0

Avez-vous trouvé une réponse à cette question? – Rippo

Répondre

2

Vous pouvez utiliser une sorte de gestion des exceptions globales. Maintenant, j'utilise System.AppDomain.CurrentDomain.UnhandledException. Dans ce gestionnaire, vous devrez appeler le Transaction.Rollback(); Et aussi de définir un drapeau (qui vit aussi pendant la requête actuelle seulement) qui indiquera si vous devez valider votre transaction ou revenir en arrière. Cela peut rendre le code plus clair.

Modifier Alternativly vous pouvez utiliser l'événement d'erreur du HttpApplication

public class HelloWorldModule : IHttpModule 
{ 
    void Init(HttpApplication application) 
    { 
     application.BeginRequest += 
      (new EventHandler(this.Application_BeginRequest)); 
     application.EndRequest += 
      (new EventHandler(this.Application_EndRequest)); 
     //this is it 
     applicaiton.Error += 
      (new EventHandler(this.Application_Error)); 
    } 
Questions connexes