2

Comment dois-je avoir la NHibernate Session Factory et les sessions pour une application WinForms?NHibernate Design pour WinForms

La SessionFactory doit-elle être un singleton? Ou puis-je le créer à chaque fois? Qu'en est-il des sessions et des transactions?

Toute aide serait appréciée. Merci

Répondre

4

L'usine de la session doit être un singleton car il est coûteux de créer. Il est sûr pour les threads donc il n'y a pas de problème de threading avec l'utilisation.

J'ai utilisé le modèle de session par conversation dans les applications winforms, et j'ai trouvé que cela fonctionnait bien. Avec ce modèle, vous utilisez la même session pour une série d'opérations qui appartiennent ensemble. Comme je le vois, une conversation dans une application WinForms pourrait, à peu près, être mappée à une opération GUI dans votre application. L'utilisation d'une nouvelle session pour chaque opération de l'interface graphique permet de réduire la taille de la session afin d'éviter les problèmes de performance de nombreuses entités du cache de premier niveau, tout en évitant d'utiliser une session distincte pour chaque opération. causer des problèmes de performance. Pour l'implémenter, vous devez ensuite créer une nouvelle session avant de gérer la commande GUI et lorsque la commande a été traitée, vous disposez de la session. Voici un exemple de ceci, qui utilise une classe (PersistenceContext) qui crée une session quand elle est instanciée et élimine la session quand elle est éliminée. Cette classe peut ensuite créer des référentiels qui utilisent la session en cours.

public void SomeGuiEvent(...) 
{ 
    using (var context = new PersistenceContext()) 
    { 
     ProcessStuff(context); 
    } 
} 

Il y a beaucoup d'autres options ofcourse de la façon de mettre en œuvre, mais cependant vous choisissez de le mettre en œuvre, je peux recommander la session-per-conversation, modèle lors de l'utilisation de NHibernate dans une application Winforms.

2

Cela a été demandé plusieurs fois sur Stack Overflow. Session Factory doit être un singleton, car ils sont coûteux à créer.

Pour les sessions, il semble y avoir un consensus approximatif sur une approche «une session par formulaire» pour NHibernate et WinForms. Cela signifie que vous devez ouvrir une session lorsque vous ouvrez un formulaire qui accède à votre base de données et fermez la session lorsque vous fermez le formulaire.

Regardez les réponses à cette question - What should be the lifetime of an NHibernate session? - pour des descriptions plus détaillées et de bons liens pour d'autres lectures.