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
1 2 3 4
|
<httpModules>
<add name="NHibernateHttpModule" type="Data.Connection.HttpModule.NHibernateHttpModule"/>
</httpModules> |
** Service Librairy **
Appel à une methode du contract
1 2 3 4
|
public IList<ContactData> GetContactInfo(string param){
(...)
ContactRepository.GetContacts(param); |
Le repository est créé de cette manière
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
ICriteria criteria = Session.CreateCriteria<Contact>();
C'est ici que ça ne se passe pas bien. _session me renvoi null
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
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
1 2 3 4
|
public static ISession CreateSession() {
return SessionFactory.OpenSession();
} |
SessionFactory
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)
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
Partager