【问题标题】:entity and repository pattern with ninject, Dispose Issue带有 ninject、Dispose 问题的实体和存储库模式
【发布时间】:2012-04-23 04:01:57
【问题描述】:

我已经使用带有 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);

【问题讨论】:

  • 您能否展示您的 Ninject 绑定和您的存储库类之一的示例?我对如何管理 DbContext 的生命周期很感兴趣。
  • 你在哪里做的?在 Global.asax 中?你一开始是如何设置 Ninject 的?如果可以的话,也许可以用这段代码更新你的问题。
  • @ngm:这是在 addBindings 下的 ninject 控制器中:ninjectKernel.Bind().To().InRequestScope();和我的存储库之一: public class MovieRepository : IMovieRepository, IDisposable { private Entities dataContext = new Entities();公共 System.Data.Entity.DbContext DbContext { 获取 { 返回 dataContext ?? (dataContext = 新实体()); } } public void Dispose() { dataContext.Dispose(); } }

标签: entity-framework-4.1 ninject repository-pattern dispose connection


【解决方案1】:

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

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

例如

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

来自Ninject wiki

Ninject 中有四个内置作用域:

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

【讨论】:

  • 实际上我在 ninject 版本 2 中使用了 inRequestScope,但我假设由于我将实例从控制器移动到站点的不同部分,ninject 不知道范围到底在哪里结束。
【解决方案2】:

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

【讨论】:

  • 如果一个长期存在的对象,例如单例范围内的服务依赖于一个较短的对象,这将适用于第一个请求。在第一次请求之后,对象将由 ninject 处理,因为范围已结束。在下一次请求时,服务将尝试使用导致异常的已处置对象。
  • 感谢 Remo 的提示。我正在使用的是 InRequestScope()。这样我就不会得到已处置对象的空异常。谢谢你的
  • @Ad Alokbi 除了说谢谢,我们还在这里使用了向上箭头。这意味着答案会根据优点进行排序。作为原始海报,您的意见与任何人看到的一样有价值。
猜你喜欢
  • 2011-03-09
  • 1970-01-01
  • 2011-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-21
  • 2010-12-11
相关资源
最近更新 更多