概要
ISession
MVC 4 RC プロジェクトでNHibernate を管理するために Autofac を接続しようとしています。私が理解したことから、Autofac はISession.Dispose
各 HTTP リクエストの最後に、私が設定した方法で呼び出す必要があります (以下を参照)。ただし、そうではないようです。 を呼び出さないとISession.Flush()
、データはデータベースに保持されません。
構成
オートファク
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 の「プロファイラー」である Whitebox を実行してみましたが、いくつかの例外を除いて失敗します (Autofac グループ @ Google に投稿)。 NHibernate :-)