gpt4 book ai didi

c# - 如何正确处置未实现 IDisposable 的已注册 C# 服务中保存的实例?

转载 作者:行者123 更新时间:2023-12-03 07:54:31 25 4
gpt4 key购买 nike

假设我有以下 C# 类 ClassA :

public class ClassA
{
private readonly ClassB _b;

public ClassA(ClassB b)
{
_b = b;
}
}

此类持有对 ClassB 实例的引用,它实现 IDisposable :

public class ClassB : IDisposable
{
public void Dispose()
{
// dispose
}
}

现在,我注册ClassA通过依赖注入(inject)作为服务,并创建并传递 ClassB 的实例给它:

services.AddSingleton(service => new ClassA(new ClassB()));

在服务生命周期结束时,是 Dispose() B类的方法调用?根据this stackoverflow post regarding the disposal of singleton instances ,如果ClassA还将实现 IDisposable ,然后 Dispose()方法ClassA也会被叫到。我是否也必须为 ClassA 实现该接口(interface)? ,然后调用Dispose()ClassB Dispose()内的ClassA ?或者我能以某种方式确信 Dispose()方法ClassB被调用而不执行 IDisposableClassA

编辑:我将 Philip Stuyck 的答案标记为正确,因为它似乎推荐了解决此问题的最简单的解决方案。至于我的问题Dispose()方法ClassB曾经被调用过吗?,我认为下面的讨论清楚地表明它没有被调用。相反,GC 会清理ClassB 的实例。通过调用 Finalize method instead of the Dispose method就在上面。

最佳答案

如果您更改将事物注册到控制反转容器的方式,那么您根本不必实现 idisposable :

services.AddSingleton<ClassB>(ClassB);
services.AddSingleton<ClassA>(ClassA);

当您请求 ClassA 的实例时,它会查看构造函数并发现它需要 classB。因此,您让容器解析 ClassA,而不是自己控制它。

然后当应用程序关闭时,将根据需要在 ClassB 上调用 dispose

可以通过完全控制反转并为 A 类和 B 类创建接口(interface)来完成进一步的改进。 ClassA 将包含对接口(interface)而不是类的引用。这就是依赖倒置的全部内容。

关于c# - 如何正确处置未实现 IDisposable 的已注册 C# 服务中保存的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76374537/

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