C# 在dotnet中,为什么作用域服务比临时服务更早被释放?
文档链接: 我已经一步一步地完成了教程,但我喜欢一个问题:为什么作用域服务比dotnet中的临时服务更早被处理C# 在dotnet中,为什么作用域服务比临时服务更早被释放?,c#,.net,C#,.net,文档链接: 我已经一步一步地完成了教程,但我喜欢一个问题:为什么作用域服务比dotnet中的临时服务更早被处理 Scope 1... ScopedDisposable.Dispose() TransientDisposable.Dispose() Scope 2... ScopedDisposable.Dispose() TransientDisposable.Dispose() 另外,我在前面的文档链接上找到了另一个描述。在“瞬态和共享实例的IDisposable指南”部分 还有一种更为混
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方法不应依赖于其他对象被处置的顺序。因此,您不应该关心实际首先处理的是哪个服务
尽管我相信默认的.NET5IServiceProvider
将在中处理对象。由于TransientDisposable
是首先创建的,所以应该最后处理。鉴于这两个生命周期都被记录为“在请求结束时处理”,我没有看到任何说明应该遵守的特定顺序的内容。您认为这里存在什么实际问题?即,在处理它们的时候(请求结束时),任何东西都不应该使用它们。在下面的文档描述中,有一句话“应该在范围结束之前处理实例”。因此,我认为临时服务将比作用域服务更早被处理,但输出显示的顺序相反@Damien_The_虽然这个链接可以回答这个问题,但最好在这里包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能无效。-谢谢。我已经检查了你的anwser提到的源代码链接。我发现IServiceProvider提供了类似于stack的容器服务管理结构。
Scope 1...
ScopedDisposable.Dispose()
TransientDisposable.Dispose()
Scope 2...
ScopedDisposable.Dispose()
TransientDisposable.Dispose()