[WCF][NHibernate] HttpModule pour gérer les sessions NHibernate
Bonjour à tous
3 couches dans mon "projet" :
- Accés aux données avec NHibernate (via Fluent NHibernate)
- Service Librairy (avec les références de l’accès aux données)
- 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:
1 2 3 4
|
<httpModules>
<add name="NHibernateHttpModule" type="Data.Connection.HttpModule.NHibernateHttpModule"/>
</httpModules> |
** Service Librairy **
Appel à une methode du contract
Code:
1 2 3 4
|
public IList<ContactData> GetContactInfo(string param){
(...)
ContactRepository.GetContacts(param); |
Le repository est créé de cette manière
Code:
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:
ICriteria criteria = Session.CreateCriteria<Contact>();
C'est ici que ça ne se passe pas bien. _session me renvoi null
Code:
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:
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:
1 2 3 4
|
public static ISession CreateSession() {
return SessionFactory.OpenSession();
} |
SessionFactory
Code:
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:
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