Blazor 服务器 - 短暂的服务生命周期有多长

问题描述 投票:0回答:1

阅读 ASP.NET Core Razor 组件生命周期 我认为这意味着一个瞬态服务,每个请求都有一个生命周期,然后可以用于非线程安全的实例(假设我不在我的加工)。

是的,有几个步骤,可以在 OnInitialized() 中编写代码,说这需要几秒钟。但基本上所有代码都将执行并呈现页面。然后完成,请求完成,那个瞬态实例消失了——永远。

所以就 DbContext 而言,再次假设我没有创建任何后台线程,虽然将它作为单例或作用域服务注入是不安全的,但 transient 应该是安全的。或者我错过了什么?

如果这是真的,有没有办法告诉

AddDbContextFactory()
提供 DbContext 作为临时服务?查看相关类,我没有看到任何设置生成的 DbContext 生命周期的方法。并在剃刀文件中将其声明为
[Inject]
意味着范围或单例生命周期,因为它在组件的生命周期内存在,而不是组件处理的每个请求。


更新:

我想我上面写错了(或不巧妙)。我担心的是使用:

[Inject] private UserDbContext UserDbContext { get; set; } = default!;

据我了解,这是由 AddDbContextFactory 创建的。而且我相信这给了我一个具有范围生命周期的 DbContext。而且我担心这个范围的生命周期是有问题的。

但我几乎在每个演示中都看到了

[Inject]

dependency-injection blazor blazor-server-side dbcontext
1个回答
1
投票

有没有办法告诉 AddDbContextFactory() 提供 DbContext 作为临时服务?

不,DbContext 是 IDisposable 所以你不应该想要那个。

DbContextFactory 本身是瞬态的,您可以使用它创建一个 DbContext,该 DbContext 的范围限定为每个方法,带有

using
子句:
using var db = Factory.Create();
。所以 DbContext 是资源管理的和线程安全的。

这意味着一个瞬态服务,每个请求都有一个生命周期,然后可以用于非线程安全的实例

瞬态对象与请求无关,只要您的代码持有对它们的引用,它们就会存在。

它可用于非线程安全的状态,但主要用于不需要处理的无状态服务。

© www.soinside.com 2019 - 2024. All rights reserved.