2010-12-02 4 views
3

J'ai construit une application avec Fluent nHibernate/ASP.NET MVC - et j'ai creusé et j'ai compris que c'était la pratique la plus appropriée pour garder un ' permanent 'SessionFactory ouvert, puis utiliser des sessions pour chaque demande à la base de données. Bon, ça sonne bien ...La SessionFactory 'permanente', ASP.NET MVC et nHibernate

Je suis assez confus sur la façon d'accomplir cela, cependant. Tout ce que je trouve suppose un cadre structuré complet qui utilise une sorte de système de conteneurs IoC ... et c'est trop avancé pour ce que j'ai jusqu'ici. Existe-t-il des exemples plus simples de la façon de mettre en œuvre ce type de conception?

J'ai pris un coup d'œil à Where can I find a good NHibernate and ASP.NET MVC Reference Application

Et même lu le livre « ASP.NET MVC en action », mais il est par exemple est juste beaucoup plus compliqué que ce que je suis en train de réaliser. Je pensais qu'un modèle singleton fonctionnerait dans l'Application_Start du 'global.asax' mais cela n'a pas donné les résultats espérés. Il continuerait à disposer de mon usine et ne la recréerait jamais.

Répondre

5

Vous pouvez exposer le ISessionFactory comme singleton:

public sealed class FactoryManager 
{ 
    private static readonly ISessionFactory _instance = CreateSessionFactory(); 

    static FactoryManager() 
    { } 

    public static ISessionFactory Instance 
    { 
     get { return _instance; } 
    } 

    private static ISessionFactory CreateSessionFactory() 
    { 
     // TODO: configure fluentnhibernate and create a session factory 
    } 
} 

Maintenant, vous pouvez utiliser FactoryManager.Instance dans votre code:

using (var session = FactoryManager.Instance.OpenSession()) 
using (var tx = session.BeginTransaction()) 
{ 
    // TODO: use the session here 
    tx.Commit(); 
} 
+0

Est-ce que je veux toujours 'Ouvrir' et 'Fermer' La session? Je suis désolé si j'ai l'air stupide, c'est très difficile à saisir pour moi. Les SessionFactories créent des Sessions - et les Sessions sont 'jetables' - mais je veux que les Factories restent Singleton? – Ciel

+0

Une fabrique de sessions est une ressource coûteuse à créer, c'est pourquoi il est recommandé de la créer une seule fois pour la durée de vie de l'application et de la réutiliser. Ils sont également thread safe. Les sessions sont créées à l'aide de la fabrique de sessions chaque fois que vous avez besoin d'accéder à la base de données. Ils sont très rapides à créer et peuvent être ouverts et fermés à chaque requête. Contrairement aux usines de sessions, les sessions ne sont pas sécurisées. –

+0

C'est exactement ce que je veux faire. Je rencontre juste des problèmes avec les usines qui sont souvent recréées dans mon code de test. Dans un scénario en direct, cela ne devrait pas arriver, n'est-ce pas? Je ne lance pas l'application souvent, et donc l'endroit où il est fait ne devrait pas être appelé à moins que je ne redémarre le site Web. – Ciel

2

Faire une méthode GetSessionFactory statique sur votre classe mondiale MvcApplication. Cette méthode initialise une fabrique de sessions la première fois qu'elle est appelée et la stocke en tant que variable statique privée. Lors d'appels ultérieurs, il renvoie simplement la variable statique. Cette méthode peut également vérifier si l'objet est nul ou supprimé et recréer si nécessaire, bien que cela ne devrait pas se produire puisque la variable serait statique et resterait ainsi active pendant toute la durée de vie de l'application.