Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NHibernate + WCF + Windows Service and WcfOperationSessionContext class

  • I have a Windows Service Application in which i create WCF services in it.
  • One of the services is data services: add, delete, read , updatte data via WCF.
  • WCF use NHibernate for data manipulation

So my guestions are:

  • Any advice (best practice) for session management for Hibernate using with WCF?

  • Anybody knows anything about

WcfOperationSessionContext (hibernate 3.0) class?

how to use it with WCF?

Well to make it concrete :

Suppose that i have WCF Service called DataServices

class WCFDataService .....
{

   void SaveMyEntity(MyEntity entity)
    {



         .....................?? // How to do? Best Way

         // Should i take one session  and use it all times
         // Should i take session and dipsose when operation finished then get 
         //new session for new operations?
         // If many clients call my WCF service function at the same time?
         // what may go wrong?
         // etc....


     }


 }

And I need a NHibernateServiceProvider class

class NHibernateServiceProvider ....
{

    // How to get Session ?? Best way

     ISession GetCurrentSession(){.... }
     DisposeSession(){ ....}
}

Best Wishes

PS: I have read similiar entries here and other web pages. But can not see "concrete" answers.

like image 553
NoviceAndNovice Avatar asked Mar 22 '11 13:03

NoviceAndNovice


1 Answers

The WcfOperationSessionContext, similar to ThreadStaticSessionContext and WebRequestSessionContext is an implementation for a session context. The session context is used to bind (associate) a ISession instance to a particular context.

The session in the current context can be retrieved by calling ISessionFactory.GetCurrentSession().

You can find more information about session context here.

The WcfOperationSessionContext represents a context that spans for the entire duration of a WCF operation. You still need to handle the binding of the session in the begining of the operation and the unbinding/commiting/disposal of the session at the end of the operation.

To get access to the begin/end actions in the wcf pipeline you need to implement a IDispatchMessageInspector. You can see a sample here.

Also regarding WCF integration: if you use ThreadStatic session context it will appear to work on development, but you will hit the wall in production when various components (ex: authorization, authentication ) from the wcf pipeline are executed on different threads.

As for best practices you almost nailed it: Use WcfOperationSessionContext to store the current session and the IDispatchMessageInspector to begin/complete your unit of work.

EDIT - to address the details you added: If you configured WcfOperationSessionContext and do the binding/unbinding as i explained above, all you have to do to is inject the ISessionFactory into your service and just use factory.GetCurrentSession(). I'll post a sample prj if time permits.

Here is the sample project

like image 62
Iulian Margarintescu Avatar answered Jun 07 '23 02:06

Iulian Margarintescu