1

我正在开发一个ASP.NET MVC 4 application + NHibernate/Fluent NHibernate + Ninject应用程序。

我创建了一个单独的模块来解决下面ISessionISessionFactorys 的依赖关系,

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

在第一个请求时一切正常,但从第二个请求我得到

会话关闭错误

. 有什么建议么?

4

1 回答 1

1

这是因为ModelBinder生命周期比一个请求长。如您所见,您正在PostModelBinder使用new操作员进行注册。MVC 应用程序保持对这个 binder 的引用,并且 binder 具有对 的引用IBlogRepository,其ISession将在第一个请求结束时被释放。

您可以使用factory解决此问题:

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

为此,您可以使用Ninject factory extension

或者按照接受的答案中的描述创建自己的工厂:Inject a dependency into a custom model binder and using InRequestScope using Ninject

于 2013-01-25T12:30:02.560 回答