有没有办法将依赖注入与 IDisposable 结合起来?

Is there a way to combine dependency injection with IDisposable?

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

如果我单独使用实体框架,我将倾向于通过 using 块使用 IDisposable 接口:

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

但是当我编写将要进行单元测试的代码时,我将上下文的实例化移到了构造函数中,这样我就可以传入要使用的模拟。我明白这是一种依赖注入,具体来说 "constructor injection".

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

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

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

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

  1. "Yes, there is a way and here's how..."
  2. "No, there isn't a way. This is something you'll have to live with."
  3. "Tom, you have completely misunderstood something."

无论是哪一个,我们都将不胜感激!

The latter. We're only using DI to inject mock DB contexts, so we're not using a full-blown DI container.

你是对的,DbContext 实例永远不会 Dispose 调用它(假设你没有在你的方法之一中手动调用 dispose ).我向您推荐 select 一个好的 DI 框架(我个人最喜欢的是 AutoFac)。该框架将处理任何实现 IDisposable、已在框架中注册并被框架 injected/supplied 的任何东西。