ContexteComment et où stocker la session NHibernate dans WinForms par demande
J'ai lu toutes sortes de blogs et de la documentation sur la gestion de la session NHibernate. Mon problème, c'est que j'en ai besoin pour les winforms et les webforms. C'est vrai, j'utilise la même couche de données dans une application winforms (windows .exe) et webforms (asp.net web). J'ai lu un peu sur le modèle unit of work et est un bon choix pour winforms. Stocker la session nhibernate dans HttpRequest.Current.Items semble être un bon moyen d'aller chercher des applications web. Mais qu'en est-il un accord de combo? J'ai des applications Web, des applications Windows et des services WCF qui doivent tous utiliser la même couche de données nhibernate. Revenons donc à ma question ...
Je prévois d'utiliser cette conception: NhibernateBestPractices dans mon application web comme ceci:
private ISession ThreadSession {
get {
if (IsInWebContext()) {
return (ISession)HttpContext.Current.Items[SESSION_KEY];
}
else {
return (ISession)CallContext.GetData(SESSION_KEY);
}
}
set {
if (IsInWebContext()) {
HttpContext.Current.Items[SESSION_KEY] = value;
}
else {
CallContext.SetData(SESSION_KEY, value); // PROBLEM LINE HERE!!!
}
}
}
Le problème
Le problème que j'ai lorsque vous utilisez cette code dans mon application windows, est avec la ligne
CallContext.SetData(SESSION_KEY, value);
Si je comprends bien CallContext(), cela gardera la session ouvre toute la durée de vie de mon application Windows car elle stocke la session nhibernate dans le thread principal des applications. Et j'ai entendu toutes sortes de mauvaises choses au sujet de garder une session de nhibernate ouverte trop longtemps et je sais par conception, ce n'est pas moyen de rester ouvert très longtemps. Si toutes mes hypothèses sont correctes, alors la ligne de code ci-dessus est un non, non. Compte tenu de tout cela, je voudrais remplacer la ligne ci-dessus avec quelque chose qui va détruire la session nhibernate plus fréquemment dans une application Windows. Quelque chose de similaire à la durée de vie de HttpRequest. Je ne veux pas laisser le client windows connaître la session nhibernate (ou la transaction) et quand l'ouvrir et la fermer. Je voudrais que cela soit déclenché automagiquement.
La question
Alors, où puis-je stocker la session NHibernate dans une application windows qui me permettra (ie. Autre chose que le client) pour commencer automatiquement et mettre fin à une transaction sur une demande par base de données (c'est-à-dire, chaque fois qu'un client appelle la base de données)?
** Mise à jour **
Voici 2 autres liens sur la façon de mettre en œuvre l'unité de modèle de travail
http://msdn.microsoft.com/en-us/magazine/dd882510.aspx
http://www.codeinsanity.com/2008/09/unit-of-work-pattern.html
Merci pour la brève explication du motif d'unité de travail. J'avais besoin de plus d'infos mais j'ai trouvé quelques liens expliquant cela plus en détail (voir la mise à jour dans mon post). –