Bonjour à tous

3 couches dans mon "projet" :
  1. Accés aux données avec NHibernate (via Fluent NHibernate)
  2. Service Librairy (avec les références de l’accès aux données)
  3. WebService (.svc) (avec les références au Service Librairy)


Je voudrais que les sessions (NHibernate) soient créées et détruites dans le même timing que les requêtes http. J'ai vu et lu beaucoup d'articles sur le net qui parle de ce système. Malgré cela je ne parviens pas réussir cette prouesse.

Voici ce que j'ai fait :

** Web service **

web.config

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
<httpModules>
	<add name="NHibernateHttpModule" type="Data.Connection.HttpModule.NHibernateHttpModule"/>
</httpModules>
** Service Librairy **

Appel à une methode du contract

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
public IList<ContactData> GetContactInfo(string param){
(...)
ContactRepository.GetContacts(param);
Le repository est créé de cette manière

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
private IContactRepository ContactRepository {
            get {
                if (_contactRepository == null)
                    _contactRepository = RepositoryFactory<IContactRepository>.CreateRepository();
                return _contactRepository;
            }
            set { ;}
        }
** Accès aux données **

Repository contact fait appel à la propriété Session

Code : Sélectionner tout - Visualiser dans une fenêtre à part
ICriteria criteria = Session.CreateCriteria<Contact>();
C'est ici que ça ne se passe pas bien. _session me renvoi null

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
protected ISession Session{
            get {
                if (_session == null) { 
                    //_session = FNSettings.CreateSession();
                    log.Debug("Create new session");
                    _session = FNSettings.GetCurrentSession();
                }
                return _session;
            }
        }
HttpModule dans la couche d'accès au données

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
public class NHibernateHttpModule : IHttpModule
    {
 
        public void Dispose(){ ; }
 
        public void Init(HttpApplication context)
        {
            context.EndRequest += ApplicationEndRequest;
            context.BeginRequest += ApplicationBeginRequest;
        }
 
        public void ApplicationBeginRequest(object sender, EventArgs e) {
            NHibernate.Context.CurrentSessionContext.Bind(FNSettings.CreateSession());
        }
 
        public void ApplicationEndRequest(object sender, EventArgs e) {
            ISession currentSession = NHibernate.Context.CurrentSessionContext.Unbind(FNSettings.SessionFactory);
            currentSession.Close();
            currentSession.Dispose();
        }
    }
Create Session

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
public static ISession CreateSession() {
            return SessionFactory.OpenSession();
        }
SessionFactory

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
public static ISessionFactory SessionFactory {
            get {
                if (_sessionFactory == null)
                    _sessionFactory = FNSettings.CreateSessionFactory();
                return _sessionFactory;
            }
        }
Configuration Nhibernate (via Fluent NHibernate)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
private static FluentConfiguration FNConfiguration{
            get {
                if (_fnConfiguration == null){
                    var cfg = OracleClientConfiguration.Oracle10
                        .ConnectionString(c => c.Is(FNSettings.ConnectionString))
                        .Dialect<NHibernate.Dialect.Oracle10gDialect>()
                        .ShowSql();
 
                    _fnConfiguration = Fluently.Configure()
                        .Database(cfg)
                        .ExposeConfiguration(
                            c => c.SetProperty("current_session_context_class", "web")) //use for HttpModule 
                        .Mappings(m => m.FluentMappings.AddFromAssemblyOf<ContactMap>());
                }
                return _fnConfiguration;
            }
        }
Voilà qqu'un peut-il m'aider ?

Bien à vous