Wir machen das etwas anders als Bigglesby, und ich sage nicht, dass er falsch ist oder dass unser perfekt ist.
Im global.asax wir beim Start der Anwendung haben wir haben:
...
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));
}
...
Unsere DataRepository haben wir: Hinweis: (es ist nicht ein Repository - mein Design-Fehler: Verruf -, seine eher wie Ihre NHibernateHelper, ich denke, es ist eher ein NH-Konfiguration Wrapper von einer Art ...)
....
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;
}
....
die Sache mit der Session-Fabrik, werden Sie wollen jede Anforderung nicht generieren/bauen eine auf. Das DataRepository fungiert als Singleton und stellt sicher, dass die Sitzungsfactory nur einmal erstellt wird, und zwar beim Start der Anwendung. In unserem Basis-Controller injizieren wir entweder die Sitzung oder die Sessionfactory in unsere Controller (einige Controller benötigen keine Datenbankverbindung, so dass sie von einem "datenbanklosen" Basis-Controller stammen), indem sie WindosrCastle verwenden. Unsere WindsorControllerFactory haben wir:
...
//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);
}
}
....
Mit dieser Einrichtung, jede Anforderung erzeugt eine NHibernate-Sitzung, und mit unserem Design sind wir auch in der Lage Controller zu haben, die Sitzungen nicht erzeugen. Und genau so funktioniert es für uns.
Kann ich auch sagen, dass ich NHProf sehr nützlich gefunden habe, wenn Sie versuchen, das Problem, das wir hatten, zu konfigurieren oder zu debuggen.
Ich habe nicht bemerkt, dass Sie ICurrentSessionContext brauchen, dachte jede "Sitzung pro Anfrage" ist in Ordnung. – queen3