2

我已经使用带有 ninject 注入的实体和存储库模式构建了我的站点。我的问题是我的连接似乎没有得到处理。我有大约 30 个存储库(每个表一个),并且我很快就获得了 sql expire timout preety。我不能使用常规的 using 语句,因为代码只识别注入前的接口。(在每个控制器中,我都有通过 ninject 注入的存储库接口实例)。

我已经搜索了网络,但找不到对我来说准确的解决方案。谁能帮帮我吗?代码示例:

这是在 addBindings() 下的 ninject 控制器中:

 ninjectKernel.Bind<IMovieRepository>().To<MovieRepository>().InRequestScope();

和我的一个存储库:

 public class MovieRepository : IMovieRepository, IDisposable 
        {
         private Entities dataContext = new Entities();
         public System.Data.Entity.DbContext DbContext 
         {
            get { return dataContext ?? (dataContext = new Entities()); } 
         }
         public void Dispose() { dataContext.Dispose(); }
        }

在 Global.asax 文件中:

 ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory() as IControllerFactory);
4

2 回答 2

3

如果长寿命的对象依赖于短寿命的对象,通常会出现这种问题。例如,单例服务在请求范围内使用存储库。

于 2012-04-22T20:01:57.730 回答
3

我猜你的存储库(因此可能是你的 DbContexts)被绑定在瞬态范围内,我相信这意味着每次 Ninject 需要在某个地方注入一个时都会创建一个新的。我不确定,但我猜测这些都会在您的应用程序的生命周期内一直存在,并且可能不会被处理掉。

尝试在请求范围内绑定您的存储库,以便根据 Web 请求创建和处理它们。

例如

Bind<IFooRepository>().To<ConcreteFooRepository>().InRequestScope();

忍者维基

Ninject 中有四个内置作用域:

  • 瞬态 - 每次请求时都会创建该类型的新实例。(这是默认范围)。绑定方法是 .InTransientScope()
  • Singleton - 只会创建该类型的单个实例,并且将为每个后续请求返回相同的实例。绑定方法是 .InSingletonScope()
  • 线程 - 每个线程将创建该类型的一个实例。绑定方法是 .InThreadScope()
  • 请求 - 每个 Web 请求将创建该类型的一个实例,并在请求结束时销毁。绑定方法是 .InRequestScope()
于 2012-04-21T08:49:24.117 回答