我刚刚偶然发现了一个以前没有遇到过的依赖注入问题.DI的概念和它的优点对我来说非常清楚,我在我的项目中使用了构造函数注入.所以DI容器为构造函数所需的接口创建类,我可以使用它们而不用考虑它背后的具体实现.如果类实现了IDisposable,则当它超出作用域(注册为类型)或容器本身被释放时(注册为单例),它会被容器释放.使用此接口实例的类不需要知道.我喜欢.太好了!
但一旦我注入一家这样的工厂并投入使用,这些假设就不再成立.
public class SomeClass(Func<ISomeDisposeableInterface> factory)
{
var x = factory();
//or even
using (var x = factory())
{...}
}
当实例超出范围时,不调用Dispose.我的意思是,它当然不会.DI容器不能知道我正在对创建的实例做什么.如果对该工厂创建的实例调用Dispose(),或者将其放在Using块中,我现在必须知道它是否注册为单例,否则将出现异常.这似乎与整个概念不符.
问题:
- 我是不是理解了DI概念中的错误?
- 使用这样的工厂被认为是反模式吗?
- 有没有其他方法可以在类中生成不与DI概念冲突的"SomeDisposeableInterface"的新实例?
亲切的问候!