Chúng ta làm chúng ta hơi khác với bigglesby, và tôi không nói rằng anh ta sai, hay rằng chúng ta là hoàn hảo.
Trong global.asax chúng ta có trên đầu ứng dụng chúng ta có:
...
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));
}
...
DataRepository của chúng tôi, chúng tôi có: GHI CHÚ: (nó không phải là một kho lưu trữ - Lỗi thiết kế của tôi: tên xấu -, nó giống như NHibernateHelper của bạn, tôi đoán nhiều hơn của một wrapper cấu hình NH của một số loại ...)
....
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;
}
....
Điều với nhà máy phiên, là bạn không muốn tạo/xây dựng một trên mỗi yêu cầu. DataRepository hoạt động như một singleton, đảm bảo rằng nhà máy phiên chỉ được tạo một lần, và đó là khi ứng dụng khởi động. Trong bộ điều khiển cơ sở của chúng ta, chúng ta tiêm phiên làm việc hoặc sessionfactory vào bộ điều khiển của chúng ta (Một số bộ điều khiển không yêu cầu kết nối cơ sở dữ liệu, do đó chúng lấy từ bộ điều khiển cơ sở "cơ sở dữ liệu"), sử dụng WindosrCastle. WindsorControllerFactory, chúng ta có:
...
//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);
}
}
....
Với điều này thiết lập, Mỗi yêu cầu tạo ra một phiên NHibernate, và với thiết kế của chúng tôi, chúng tôi cũng có thể có điều khiển mà không tạo ra phiên. Và đó là cách nó hoạt động cho chúng ta.
Tôi cũng có thể nói rằng tôi đã tìm thấy NHProf rất hữu ích khi cố gắng định cấu hình hoặc gỡ lỗi sự cố mà chúng tôi đã gặp phải.
Tôi không nhận thấy rằng bạn cần ICurrentSessionContext, nghĩ rằng bất kỳ "phiên cho mỗi yêu cầu" là OK. – queen3