【发布时间】:2021-06-19 11:01:40
【问题描述】:
我在尝试使用我在 _Host.cshtml 文件中初始化的范围服务时遇到了奇怪的行为。 这就是服务,很简单:
public interface IUserSessionService
{
void SetUserData(UserSessionData userData);
UserSessionData GetUserData();
}
public class UserSessionService : IUserSessionService
{
private UserSessionData userSessionData;
public void SetUserData(UserSessionData userData)
{
userSessionData = userData;
}
public UserSessionData GetUserData()
{
return userSessionData;
}
}
服务在Startup.cs文件中注册为Scoped服务
services.AddScoped<IUserSessionService, UserSessionService>();
该服务在 host.cshtml 页面后面的代码中以下列方式从数据库中获取用户信息:
public class _Host : PageModel
{
private readonly IUserSessionService userSessionService;
public _Host(IUserSessionService userSessionService)
{
this.userSessionService = userSessionService;
}
public async Task OnGet()
{
var authenticatedUser = Request.HttpContext.User;
var userData = await GetUserDataFromDb(authenticatedUser);
await userSessionService.SetUserData(userData);
}
}
理想情况下,我希望这能够初始化服务,以便从现在开始我可以将其注入到我的组件中,并在需要时访问用户的信息。
但这不起作用:当页面加载时,我能够在屏幕上看到用户信息一秒钟,然后它就消失了。一开始我以为是页面渲染模式ServerPrerendered引起的,但是在Server模式下问题依然存在。
我能找到的唯一解决方法是将服务注册为Singleton;这并不理想,因为它将在所有用户之间共享(至少这是我的理解!)。
有没有更好的地方可以存储这些信息?
更新
这个问题主要是因为我对 Blazor 电路的工作原理理解不佳 :) 我按照@enet 的建议让它工作了。我所做的是:
- 从为
_Host.cshtml创建的HostModel类中的HttpContext获取信息,并使其可用于具有属性的html 代码
public class HostModel : PageModel
{
public UserSessionData UserSessionData { get; private set; }
// ... set the information up
}
- 在 ComponentTagHelper 中创建参数并传递属性数据
@model HostModel
<component type="typeof(App)" render-mode="ServerPrerendered" param-UserSessionData="@Model.UserSessionData" />
- 以
[Parameter]身份访问App.razor中的信息
@code {
[Parameter]
public UserSessionData UserSessionData { get; set; }
}
- 在
OnInitializedAsync()方法内的作用域服务中设置信息
protected override async Task OnInitializedAsync()
{
await UserSessionService.SetUserData(UserSessionData);
}
现在UserSessionData 将通过IUserSessionService 的注入在应用程序中随处可用
【问题讨论】:
-
将请求状态传递给 Blazor 应用程序的推荐方式是在应用程序的初始渲染中通过参数给根组件:docs.microsoft.com/en-us/aspnet/core/fundamentals/…我的答案(stackoverflow.com/a/59538319/6152891)写了一年多在 Blazor 团队提出他们的建议之前,它的声望为 -4,因为这里有些人拒绝看到这一点……总是在接受或拒绝之前先测试一下。