Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在dotnet中,为什么作用域服务比临时服务更早被释放?_C#_.net - Fatal编程技术网

C# 在dotnet中,为什么作用域服务比临时服务更早被释放?

C# 在dotnet中,为什么作用域服务比临时服务更早被释放?,c#,.net,C#,.net,文档链接: 我已经一步一步地完成了教程,但我喜欢一个问题:为什么作用域服务比dotnet中的临时服务更早被处理 Scope 1... ScopedDisposable.Dispose() TransientDisposable.Dispose() Scope 2... ScopedDisposable.Dispose() TransientDisposable.Dispose() 另外,我在前面的文档链接上找到了另一个描述。在“瞬态和共享实例的IDisposable指南”部分 还有一种更为混

文档链接:

我已经一步一步地完成了教程,但我喜欢一个问题:为什么作用域服务比dotnet中的临时服务更早被处理

Scope 1...
ScopedDisposable.Dispose()
TransientDisposable.Dispose()

Scope 2...
ScopedDisposable.Dispose()
TransientDisposable.Dispose()
另外,我在前面的文档链接上找到了另一个描述。在“瞬态和共享实例的IDisposable指南”部分

还有一种更为混乱的描述:

应在作用域结束之前释放实例


这将帮助您更好地学习依赖注入:

链接的示例包含以下内容:

//snip
示例DisposableScoping(host.Services,“范围1”);
Console.WriteLine();
//剪断
静态void exampledisposablescoping(IServiceProvider服务,字符串范围)
{
WriteLine($“{scope}…”);
使用IServiceScope serviceScope=services.CreateScope();
IServiceProvider provider=serviceScope.ServiceProvider;
_=provider.GetRequiredService();
_=provider.GetRequiredService();
_=provider.GetRequiredService();
}
从你的输出

Scope 1...
ScopedDisposable.Dispose()
TransientDisposable.Dispose()

Scope 2...
ScopedDisposable.Dispose()
TransientDisposable.Dispose()

在输出中间看到空白行吗?这应该告诉您,这两个服务都是在调用

.WriteLine($“{scope}…”)之间释放的
.WriteLine()。更具体地说,在
exampledisposablescoping
返回之前,应该在处置
serviceScope
时处置它们

Dispose方法不应依赖于其他对象被处置的顺序。因此,您不应该关心实际首先处理的是哪个服务


尽管我相信默认的.NET5
IServiceProvider
将在中处理对象。由于
TransientDisposable
是首先创建的,所以应该最后处理。

鉴于这两个生命周期都被记录为“在请求结束时处理”,我没有看到任何说明应该遵守的特定顺序的内容。您认为这里存在什么实际问题?即,在处理它们的时候(请求结束时),任何东西都不应该使用它们。在下面的文档描述中,有一句话“应该在范围结束之前处理实例”。因此,我认为临时服务将比作用域服务更早被处理,但输出显示的顺序相反@Damien_The_虽然这个链接可以回答这个问题,但最好在这里包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能无效。-谢谢。我已经检查了你的anwser提到的源代码链接。我发现IServiceProvider提供了类似于stack的容器服务管理结构。
Scope 1...
ScopedDisposable.Dispose()
TransientDisposable.Dispose()

Scope 2...
ScopedDisposable.Dispose()
TransientDisposable.Dispose()