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.