如何在 blazor .net 8 中以不同渲染模式渲染的组件之间共享要注入的状态?

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

我对 .net8 中的双项目设置有点困惑,特别是围绕 DI 和不同渲染模式之间共享状态。

现在,以这个示例服务为例

public class GuidService
{
    public Guid Guid { get; } = Guid.NewGuid();
}

将其作为客户端项目中的单例添加到服务器项目中,根据组件是否呈现为静态 SSR、交互式服务器或交互式 WASM,我会获得不同的值。

此外,当我从该页面导航离开(在同一个应用程序中,而不是离开或刷新)并返回时,交互式 WASM 和交互式服务器显示的 GUID 与之前相同,这是我所期望的。然而,我没想到的是,每次我导航到不同的页面并返回时,静态 SSR 组件都会获得一个新的 Guid。

dependency-injection blazor
1个回答
0
投票

您需要考虑三种不同的应用程序,但有些不同。

  1. 静态SSR和主动SSR共享Singleton服务。
  2. 静态 SSR 范围服务容器仅在 Http 请求期间存在。标准服务器端 asp/razor/mvc/api 行为。
  3. 活动 SSR 范围服务在 SPA 会话期间存在,每个 Blazor Hub 会话一个。
  4. CSR 范围服务和单例服务在 SPA 范围内存在。 Scoped 和 Singleton 之间没有真正的区别。

您可以将预渲染状态从 SSSR 传递到 SPA。请参阅 - https://learn.microsoft.com/en-us/aspnet/core/blazor/components/prerender?view=aspnetcore-8.0#persist-prerendered-state

否则,正如 Brian Parker 建议的那样,您需要考虑无状态或在应用程序上下文之外保留状态。

我在这里更详细地介绍了该主题:https://github.com/ShaunCurtis/Blazor.ExploreRendering/blob/master/Documents/Going-For-Broke.md

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