28 votes

Gestion de session NHibernate dans ASP.NET MVC

Je suis actuellement en train de jouer avec le HybridSessionBuilder classe trouvés sur Jeffrey Palerme post de blog:

http://jeffreypalermo.com/blog/use-this-nhibernate-wrapper-to-keep-your-repository-classes-simple/

À l'aide de cette classe, mon référentiel ressemble à ceci:

public class UserRepository : IUserRepository
{
    private readonly ISessionBuilder _sessionBuilder;

    public UserRepository(ISessionBuilder sessionBuilder)
    {
        _sessionBuilder = sessionBuilder;
    }

    public User GetByID(string userID)
    {
        using (ISession session = _sessionBuilder.GetSession())
        {
            return session.Get<User>(userID);
        }
    }
}

Est-ce la meilleure façon d'aller sur la gestion de la NHibernate session / l'usine? J'ai entendu des choses sur l'Unité de Travail et la création d'une session par requête web et de rinçage à la fin. De ce que je peux dire, mon actuel de la mise en œuvre n'est pas de faire de tout cela. C'est essentiellement en s'appuyant sur le Référentiel de saisir la session à partir de la session de l'usine et de l'utiliser pour exécuter les requêtes.

Existe-il des pièges à faire de l'accès à la base de cette façon?

37voto

Jamie Ide Points 28680

Vous ne devriez pas envelopper votre ISession dans une instruction d'utilisation -- le point de passage de la ISessionBuilder dans le référentiel constructeur (dependency injection), c'est que le code d'appel est chargé de contrôler le cycle de vie de la ISession. En l'enveloppant dans une aide, Dispose() est appelée sur le ISession et vous ne serez pas en mesure de lazy load membres de l'objet ou de persister.

Nous faisons la même chose juste en passant dans un ISession au référentiel constructeur. M. de Palerme code, ce que je comprends, ajoute simplement paresseux initialisation de la ISession. Je ne pense pas que c'est nécessaire parce que pourquoi vous nouveau en place un dépôt si vous n'allez pas l'utiliser?

10voto

JoshBerke Points 34238

Avec ASP.Net MVC vous voulez vous assurer que la durée de la session est maintenue au cours de la méthode d'Action sur votre contrôleur, comme une fois que votre contrôleur est sorti de toutes vos données doivent être collectées. Je ne suis pas sûr si ce mécanisme permettra à ce.

Vous voudrez peut-être regarder dans la S#arp Architechure qui est un ensemble de bibliothèques et d'orientation pour la construction d'ASP.Net application MVC à l'aide de nHibernate. http://code.google.com/p/sharp-architecture/

3voto

Kevin Pang Points 16019

C'est la configuration que j'ai utilisée après avoir fait des recherches plus approfondies. Semble fonctionner très bien et n'a pas cette habitude ennuyeuse de créer une session sur les demandes de fichiers statiques comme la plupart des guides:

http://www.kevinwilliampang.com/2010/04/06/setting-up-asp-net-mvc-with-fluent-nhibernate-and-structuremap/

1voto

Min Points 2712

Je ne voudrais pas ouvrir et fermer des sessions sur chaque demande de données pour NHibernate. Je voudrais utiliser l'Unité de Travail des bibliothèques que de nombreux autres, de proposer ou de faire un peu plus de lecture. NHForge.org et de se lancer et je crois qu'il y a certaines pratiques sur la configuration de NHibernate pour une application web.

L'un des "oh wow c'est cool" que j'ai reçu de NHibernate de profiter de paresseusement chargement collections au cours du développement. Il a été soigné de l'expérience d'être en mesure de ne pas avoir à faire toutes ces jointures afin d'afficher des données sur certains objets qui lui sont associés.

Par la fermeture de la session comme ça, le scénario ci-dessus ne serait pas possible.

Il y a peut être quelque chose qui se passe avec des transactions que bien.

1voto

Giorgio Bozio Points 1354

Je viens de trouver une solution propre en utilisant Unity pour injecter une session par demande:

http://letsfollowtheyellowbrickroad.blogspot.com/2010/05/nhibernate-sessions-in-aspnet-mvc.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X