概述
我想連線Autofac來幫助管理我的MVC 4 RC項目中的NHibernate的ISession
。根據我的理解,Autofac應該按照我配置它的方式在每個HTTP請求的末尾調用ISession.Dispose
(見下文)。但是,似乎並不是這種情況 - 如果我沒有撥打ISession.Flush()
,數據不會保留在數據庫中。爲什麼我的ISession在使用Autofac時不會自動刷新?
配置
Autofac
container.Register(c => DbConfig.Generate(connectionString).BuildSessionFactory())
.As<ISessionFactory>()
.SingleInstance();
container.Register(c => c.Resolve<ISessionFactory>().OpenSession())
.As<ISession>()
.InstancePerLifetimeScope();
container.RegisterGeneric(typeof(Repository<>))
.As(typeof(IRepository<>))
.InstancePerLifetimeScope();
庫
public class Repository<T> : IRepository<T> where T : class
{
protected readonly ISession Session;
public Repository(ISession session)
{
Session = session;
}
public void Add(T entity)
{
Session.Save(entity);
}
}
數據庫種子(的Application_Start)
public class DatabaseSeed
{
public static void Seed(IContainer container)
{
var session = container.Resolve<ISession>();
var userRepo = container.Resolve<IRepository<User>>();
userRepo.Add(new User { Id = 5, Name = "Test User" });
//session.Flush(); <-- if not called, user will not be persisted!
}
}
閉幕詞
我知道我應該在交易中包裝這個。然而,我想在繼續研究更復雜的場景之前先掌握一些基礎知識,並且爲什麼上述方法不能按照我期望的方式工作,我感到困惑......
(作爲附註,我嘗試運行Autofac'profiler'這個Whitebox,但是它對我有些不正常(在Autofac group @ Google上發佈),所以我不完全確定它是Autfac,它取笑我還是NHibernate :-)
正如我所說,我知道將整個事情包裝在一個事務中並提交它可以解決問題,但我試圖理解爲什麼更簡單的解決方案似乎不夠用。 AFAIK InstancePerLifetimeScope在Web應用程序中使用時默認爲每個HTTP請求的實例。 – Dav 2012-07-25 09:30:34
這就是爲什麼你可以打開NHibernate日誌記錄來查看它的功能。 – Jeroen 2012-07-25 09:31:14
你的確說得對,'Dispose'本身並不會導致所有掛起的命令執行。我在想這可能是一些Autofac相關的,對象生存期的問題,但是由於測試的結果,我將db-init代碼移到了控制器中,並且經歷了相同的行爲。不知道我在哪裏得到了「Dispose」應該自動刷新的想法,除非另有說明......從其他人對互聯網上的評論中,交易確實被期望用作任何操作的標準部分。感謝您花時間回覆並測試! – Dav 2012-07-25 10:42:02