Blazor 生命周期 scoped-service

Blazor lifetime scoped-service

首先,抱歉我的英语不好

我在 blazor 上做了一个水疗中心,当我关闭视图并在该服务上调用 Dispose 方法时,它并没有完全清除,因为下次我切换到同一视图时,该服务的构造函数是没有叫。服务声明为 Scoped。我创建了简单的 example.

关于这个例子的一些解释。有一个主页 - MainView 和第二个 ProfileView,它有一个带有两个选项卡的 TabControl:FirstTabView 和 SecondTabView。所有视图都声明为瞬态服务,ProfileService 声明为范围。

MainView 行为

有一个数字属性,它在构造函数(MainViewModel) 中无限递增,直到调用Dispose 方法。这个方法是为了给Transient的生命周期做一个例子。

ProfileView 行为

在第一个 ui 渲染 (OnAfterRenderAsync) 之后,在 ProfileService.LoadProfileAsync 服务中调用假加载。加载后显示ProfileView的创建时间、服务创建时间(每次检查是否创建)和最后更新时间。第一个选项卡显示名称,第二个选项卡显示不断从 ProfileView 更新的连接。

在 TabControl 中的选项卡(第一、第二)之间切换时,属性 订阅被删除并且一切正常,但是如果我离开 ProfileView 并导航到 MainView,那么我需要释放 ProfileService 本身,因为我不需要它。它已“释放”,但下次导航到 ProfileView 页面时,不会调用服务的构造函数。并且由于未从中调用构造函数,因此所有订阅都无法接收其数据,因为在该服务的 Dispose 方法中我为每个字段调用了 OnCompleted。

问题?

如果我之前调用过 Dispose,为什么当我导航到 ProfileView 时 ProfileService 构造函数没有被调用?

您不能调用 Dispose 来删除服务实例。

Scoped 服务在 SPA 会话的生命周期内存在。手动调用 Dispose 只会运行您在 Dispose 中放置的任何代码。在依赖注入容器被销毁之前,对象的 Scoped 实例不会被删除。如果您想将 Scoped 服务的生命周期限制为 component/page 继承自 OwningComponentBase 的生命周期。网上搜一下使用方法的例子,有好几个。