私はASP.NET MVC 4 application + NHibernate/Fluent NHibernate + Ninject
アプリケーションに取り組んでいます。
以下のISession
との依存関係を解決するために、別のモジュールを作成しました。ISessionFactory
public class RepositoryModule: NinjectModule
{
public override void Load()
{
Bind<ISessionFactory>()
.ToMethod(e => Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008.ConnectionString(c => c.FromConnectionStringWithKey("DbConnString")))
.Cache(c => c.UseQueryCache().ProviderClass<HashtableCacheProvider>())
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Post>())
.BuildConfiguration()
.BuildSessionFactory())
.InSingletonScope();
Bind<ISession>()
.ToMethod((ctx) => ctx.Kernel.Get<ISessionFactory>().OpenSession())
.InRequestScope();
}
}
BlogRepository
を実装するリポジトリクラスがありますIBlogRepository
。
public class BlogRepository : IBlogRepository
{
private readonly ISession _session;
public BlogRepository(ISession session)
{
_session = session;
}
public IList<Post> Posts(int pageNo, int pageSize)
{
var query = _session.Query<Post>()
.Where(p => p.Published)
.OrderByDescending(p => p.PostedOn)
.Skip(pageNo * pageSize)
.Take(pageSize)
.Fetch(p => p.Category);
query.FetchMany(p => p.Tags).ToFuture();
return query.ToFuture().ToList();
}
// others
}
BlogRepository
カスタムモデルバインダーのインスタンスが必要です。
Global.asax.csでこのようなことを試しました。
ModelBinders.Binders.Add(typeof(Post), new PostModelBinder(Kernel.Get<IBlogRepository>()));
最初のリクエストではすべてが正常に機能しますが、2番目のリクエストからは
セッションは閉じられましたエラー
。助言がありますか?