2009-07-11 9 views
1

Disons que j'ai une vue simple qui affiche un nom de produit et si elle a été abandonnée. Je retire les données de la base de données Northwind. J'utilise un simple Model View Pattern et un pattern DAO avec NHibernate. Lorsque le formulaire charge, j'ai mon interface utilisateur avec un bouton de chargement et un bouton Enregistrer. Si j'appuie sur le bouton Charger plutôt que sur mon code, je passe simplement l'appel à mon présentateur pour charger les données. Le présentateur appelle le DAO pour obtenir les données et remplir la vue avec les données. Que je clique sur le bouton Enregistrer. encore une fois mon code passe l'appel au présentateur. Le présentateur doit avoir l'objet de session qui a été créé sur Load pour faire une simultanéité optimiste, changer le suivi etc ...Nhibernate et ISession

Donc ma question est où dois-je créer mon objet ISession afin qu'il puisse faire le suivi des changements et la concurrence optimiste?

Répondre

0

HTTP est sans état. Votre unité de travail existe uniquement sur le serveur. Pour cliquer sur "Charger", votre UOW récupère simplement l'enregistrement et le mappe sur votre modèle de vue. 'Enregistrer' et l'unité de travail commence lorsque vous touchez le serveur - plutôt que d'être au cours du chargement, éditer dans le navigateur, puis de nouveau au serveur. L'implémentation ne doit pas garder l'ISession en mémoire (dans notre cas, l'objet session ASP.Net), c'est un moyen rapide d'épuiser la mémoire et les ressources ado.net non gérées. Il existe divers exemples UOW que certaines personnes choisissent d'associer un ISession avec le contexte HTTP à begin_request et disposent sur end_request, vous pouvez bien sûr être plus granulaire, mais dans tous les cas il n'existe jamais plus loin que cela. Dans un système simplictique, lorsque vous cliquez sur Enregistrer, vous devez extraire le produit de la base de données en utilisant un ID (champ masqué ou autre), définir les propriétés à partir de Request.Form, puis les mettre à jour dans la base de données.

Comme pour la simultanéité. Si vous enregistrez l'horodatage ou une version d'incrément dans un champ caché

<input type="hidden" name="version" value="12"/> 

Ensuite, lorsque vous cliquez sur Enregistrer, vous tirez le produit hors de la base de données, vérifiez que le numéro de version dans les matchs de Request.Form puis enregistrez, si ce n'est pas le cas, retournez à l'utilisateur que les données ont changé depuis la dernière extraction, voulez-vous continuer? NHibernate a des champs d'horodatage/de version, donc la comparaison est faite quand vous frappez la base de données avec une clause where sur la mise à jour, donc dans cette instance, elle prend même en compte les changements au moment où vous commettez.

Il existe des méthodes plus élaborées et plus sophistiquées, mais généralement, vous ne pouvez/ne devez pas coller ISession dans votre objet Session asp.net.

+0

ne pas penser aux applications Web. Je m'interroge sur les applications winform. désolé pour le fait que je n'ai pas précisé que dans ma question – codemnky

+0

Mon mauvais, créer votre ISession au démarrage de l'application, fermer à la fin. Vraisemblablement, vos opérations de base de données ne sont pas enfilées, cela devrait aller. Utilisez un manager singleton si vous osez –

+0

Bien que je puisse attester du fait que la création d'une session pour la durée de vie de l'application fonctionne, elle n'est pas recommandée par la plupart des 'experts' nHibernate. Je crois qu'il existe un problème d'utilisation de la mémoire lié à la mise en cache et des problèmes potentiels si des exceptions sont levées ou si vous devez annuler une transaction. –