gpt4 book ai didi

.net - 非 IDisposable 接口(interface)的 IDisposable 实现

转载 作者:行者123 更新时间:2023-12-01 01:29:10 25 4
gpt4 key购买 nike

出现时,正确处理接口(interface)的默认实现的最佳方法是什么?接口(interface)不继承自 IDisposable ?例如,假设我想做

public class FooGetter : IDisposable {

private IFooProvider fooProvider = MyContainer.GetDefault<IFooProvider>();
...
public void Dispose(){
...
if (fooProvider != null) fooProvider.Dispose(); // obviously has compile error here
}
}

恰好 IFooProvider 的默认实现是 IDisposable,但 IFooProvider 接口(interface)不继承自 IDisposable。我应该如何/在哪里处理它?

问题不仅仅在于依赖注入(inject)容器;它也适用于紧密耦合的依赖项:
private IFooProvider fooProvider = new PatrickProvider();

在这种情况下,我可以保留另一个引用,以便以后可以 Dispose() 它,但这似乎真的很笨拙:
private PatrickProvider defaultFooProvider = new PatrickProvider();
private IFooProvider fooProvider = defaultFooProvider;

在这里寻找最佳(或良好)实践。

最佳答案

使用 DI 容器的最佳实践是让您的 DI 容器为您处理对象的生命周期。如果您将 DI 容器用作服务定位器,这是不可能的(嘘!反模式!!),就像您似乎正在使用 MyContainer.GetDefault ,但是如果您通过构造函数注入(inject)正确地注入(inject)了依赖项,那么它将运行良好。

对于紧密耦合的依赖项,您将不得不做一些愚蠢的事情,例如

using(fooProvider as IDisposable)
{
// Code that uses fooProvider
}

我认为(但不是 100% 确定) using如果通过 null 将不执行任何操作, 所以无论 fooProvider实现 IDisposable .

有一个很好的讨论 IDisposable因为它与 Mark Seemann 的 Dependency Injection in .NET 中的依赖项有关第 8 章。

关于.net - 非 IDisposable 接口(interface)的 IDisposable 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5890154/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com