有没有办法将依赖注入与 IDisposable 结合起来?
Is there a way to combine dependency injection with IDisposable?
当我意识到在某些情况下我编写代码的方式不同时,我和一位同事正在谈论单元测试...
如果我单独使用实体框架,我将倾向于通过 using
块使用 IDisposable
接口:
using (Context ctx = new Context()) { whatever(); }
但是当我编写将要进行单元测试的代码时,我将上下文的实例化移到了构造函数中,这样我就可以传入要使用的模拟。我明白这是一种依赖注入,具体来说 "constructor injection".
粗略地看一下,我在几篇文章中看到了推荐的后一种模式:
- Mocking Entity Framework when Unit Testing ASP.NET Web API 2
- Entity Framework Testing with a Mocking Framework (EF6 onwards)
这个问题(正如我和我的同事反映的那样)是从未调用过 dispose 方法。我想这些对象在移出范围时会最终确定,但它似乎不太理想。
所以,我的问题是:有没有办法将依赖注入与 IDisposable 的使用结合起来?
我可以想象三种可能的答案类别:
- "Yes, there is a way and here's how..."
- "No, there isn't a way. This is something you'll have to live with."
- "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 的任何东西。
当我意识到在某些情况下我编写代码的方式不同时,我和一位同事正在谈论单元测试...
如果我单独使用实体框架,我将倾向于通过 using
块使用 IDisposable
接口:
using (Context ctx = new Context()) { whatever(); }
但是当我编写将要进行单元测试的代码时,我将上下文的实例化移到了构造函数中,这样我就可以传入要使用的模拟。我明白这是一种依赖注入,具体来说 "constructor injection".
粗略地看一下,我在几篇文章中看到了推荐的后一种模式:
- Mocking Entity Framework when Unit Testing ASP.NET Web API 2
- Entity Framework Testing with a Mocking Framework (EF6 onwards)
这个问题(正如我和我的同事反映的那样)是从未调用过 dispose 方法。我想这些对象在移出范围时会最终确定,但它似乎不太理想。
所以,我的问题是:有没有办法将依赖注入与 IDisposable 的使用结合起来?
我可以想象三种可能的答案类别:
- "Yes, there is a way and here's how..."
- "No, there isn't a way. This is something you'll have to live with."
- "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 的任何东西。