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>()));