Asp.net mvc 解决模型绑定器中的依赖关系问题

Asp.net mvc 解决模型绑定器中的依赖关系问题,asp.net-mvc,nhibernate,fluent-nhibernate,ninject,Asp.net Mvc,Nhibernate,Fluent Nhibernate,Ninject,我正在开发一个ASP.netmvc4应用程序+NHibernate/fluentnhibernate+Ninject应用程序 我已经创建了一个单独的模块来解决下面ISession和ISessionFactory的依赖关系 public class RepositoryModule: NinjectModule { public override void Load() { Bind<ISessionFactory>() .ToMet

我正在开发一个
ASP.netmvc4应用程序+NHibernate/fluentnhibernate+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
实例

我在Global.asax.cs上尝试过类似的东西

ModelBinders.Binders.Add(typeof(Post), new PostModelBinder(Kernel.Get<IBlogRepository>()));
ModelBinders.Binders.Add(typeof(Post),newpostmodelbinder(Kernel.Get());
在第一个请求中,一切正常,但在第二个请求中,我得到了

会话关闭错误


。有什么建议吗?

这是因为
ModelBinder
的生命周期比一个请求更长。如您所见,您正在使用
new
操作符注册
PostModelBinder
。MVC应用程序保留对该活页夹的引用,该活页夹引用了
IBlogRepository
,其
ISession
将在第一个请求结束时处理

您可以使用工厂解决此问题:

您将注入工厂
IBlogRepositoryFactory
对象,而不是
IBlogRepository
,然后在每个
BindModel
调用上创建新的
IBlogRepository

要实现这一点,您可以使用


或者按照此处接受的答案中所述创建自己的工厂:

这是因为
ModelBinder
的生命周期比一个请求更长。如您所见,您正在使用
new
操作符注册
PostModelBinder
。MVC应用程序保留对该活页夹的引用,该活页夹引用了
IBlogRepository
,其
ISession
将在第一个请求结束时处理

您可以使用工厂解决此问题:

您将注入工厂
IBlogRepositoryFactory
对象,而不是
IBlogRepository
,然后在每个
BindModel
调用上创建新的
IBlogRepository

要实现这一点,您可以使用

或者按照以下接受答案中的描述创建自己的工厂:

ModelBinders.Binders.Add(typeof(Post), new PostModelBinder(Kernel.Get<IBlogRepository>()));