Hacemos las nuestras de una manera ligeramente diferente a bigglesby, y no estoy diciendo que la suya sea incorrecta, o que la nuestra sea perfecta.
En el Global.asax tenemos al iniciar la aplicación tenemos:
...
protected void Application_Start() {
ISessionFactory sf =
DataRepository
.CreateSessionFactory(
ConfigurationManager
.ConnectionStrings["conn_string"]
.ConnectionString
);
//use windsor castle to inject the session
ControllerBuilder
.Current
.SetControllerFactory(new WindsorControllerFactory(sf));
}
...
Nuestra DataRepository tenemos: NOTA: (No es un repositorio - mi error de diseño: mal nombre -, es más como su NHibernateHelper, supongo que es más de un envoltorio de configuración NH de algún tipo ...)
....
public static ISessionFactory CreateSessionFactory(string connectionString) {
if (_sessionFactory == null){
_sessionFactory = Fluently.Configure()
.Database(MsSqlConfiguration ...
...
//custom configuration settings
...
cfg.SetListener(ListenerType.PostInsert, new AuditListener());
})
.BuildSessionFactory();
}
return _sessionFactory;
}
....
la cosa con la fábrica de sesiones, es que usted no desea generar/construir uno en cada petición. El DataRepository actúa como un singleton, asegurando que la fábrica de sesiones solo se crea una vez, y eso es en el inicio de la aplicación. En nuestro controlador base, inyectamos la sesión o la sesión en nuestros controladores (algunos controladores no requieren una conexión de base de datos, por lo que derivan de un controlador base "sin base de datos"), utilizando WindosrCastle. Nuestra WindsorControllerFactory tenemos:
...
//constructor
public WindsorControllerFactory(ISessessionFactory) {
Initialize();
// Set the session Factory for NHibernate
_container.Register(
Component.For<ISessionFactory>()
.UsingFactoryMethod(
() => sessionFactory)
.LifeStyle
.Transient
);
}
private void Initialize() {
_container = new WindsorContainer(
new XmlInterpreter(
new ConfigResource("castle")
)
);
_container.AddFacility<FactorySupportFacility>();
// Also register all the controller types as transient
var controllerTypes = from t in Assembly.GetExecutingAssembly().GetTypes()
where typeof(IController).IsAssignableFrom(t)
select t;
foreach (var t in controllerTypes) {
_container.AddComponentLifeStyle(t.FullName, t, LifestyleType.Transient);
}
}
....
Con esta configuración, cada solicitud genera una sesión de NHibernate, y con nuestro diseño también somos capaces de tener los controladores que no generan sesiones. Y así es como funciona actualmente para nosotros.
También puedo decir que he encontrado NHProf muy útil al intentar configurar o solucionar problemas que hemos tenido.
No noté que necesita ICurrentSessionContext, pensó que cualquier "sesión por solicitud" está bien. – queen3