【问题标题】:Is there a way to combine dependency injection with IDisposable?有没有办法将依赖注入与 IDisposable 结合起来?
【发布时间】:2017-12-14 06:16:42
【问题描述】:

当我意识到我在某些情况下编写代码的方式不同时,我和一位同事正在谈论单元测试......

如果我自己使用实体框架,我会倾向于通过using 块使用IDisposable 接口:

using (Context ctx = new Context()) { whatever(); }

但是当我编写将进行单元测试的代码时,我将上下文的实例化移动到构造函数中,以便我可以传入模拟来代替使用。我知道这是一种依赖注入,特别是“构造函数注入”。

粗略看了一下,我在几篇文章中看到了后一种模式推荐:

这个问题(正如我和我的同事所反映的那样)是 dispose 方法永远不会被调用。我想这些对象在超出范围时会最终确定,但这似乎不太理想。

所以,我的问题是:有没有办法将依赖注入与使用 IDisposable 结合起来?

我可以想象三种可能的答案:

  1. “是的,有一种方法,方法如下……”
  2. “不,没有办法。这是你必须忍受的。”
  3. “汤姆,你完全误解了一些东西。”

不管是什么,我们都将不胜感激!

【问题讨论】:

  • 3.当您将其配置为时,容器将处理它。这意味着您不必再在代码中使用using () { }
  • 如 CC 所说,如果您的对象在正确的时间实现 IDisposable,则容器将调用 Dispose,具体取决于您的注册方式。
  • 您使用的是什么 DI 框架?或者您是否使用构造函数链接并从默认构造函数传入一个新的 DbContext 实例(即,您没有使用 DI 框架)。
  • @Igor 后者。我们只使用 DI 来注入模拟数据库上下文,所以我们没有使用成熟的 DI 容器。

标签: .net entity-framework unit-testing dependency-injection constructor-injection


【解决方案1】:

后者。我们只使用 DI 来注入模拟 DB 上下文,因此我们没有使用成熟的 DI 容器。

你是对的,DbContext 实例永远不会调用Dispose假设你没有在你的方法之一中手动调用 dispose)。我建议你选择一个好的 DI 框架(我个人最喜欢的是AutoFac)。框架将处理任何实现IDisposable、在框架中注册并由框架注入/提供的东西。

【讨论】:

    猜你喜欢
    • 2011-08-24
    • 2015-04-05
    • 2013-12-28
    • 1970-01-01
    • 2021-07-28
    • 2013-09-15
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    相关资源
    最近更新 更多