为 Blazor WebAssembly 中的所有 blazor 页面实例化一个对象?
Posted
技术标签:
【中文标题】为 Blazor WebAssembly 中的所有 blazor 页面实例化一个对象?【英文标题】:Instantiate one object for all blazor pages in Blazor WebAssembly? 【发布时间】:2021-12-06 11:06:21 【问题描述】:我有一个 blazor webassmbly 应用程序,我只想实例化一个对象,该对象可以在客户端的所有 blazor 页面之间共享。我想要做的是在应用程序启动时在Program.cs
中实例化该对象,然后将该对象注入所有页面以使用它。我所做的是创建这个类:
public class AccountService
HttpCaller _httpCaller;
AuthenticationStateProvider _provider;
public AccountViewModel _currentAccount;
public AccountService(HttpCaller caller, AuthenticationStateProvider provider)
_httpCaller = caller;
_provider = provider;
public async Task<OperationResult<AccountViewModel>> GetCurrentAccount()
if (await UserIsAuthenticated())
return await _httpCaller.HttpCall<bool, AccountViewModel>(API.GetCurrentAccount, true, true);
return NotAuthenticated<AccountViewModel>();
我调用GetCurrentAccount()
方法并将结果关联到Program.cs
类中的_currentAccount
属性:
AccountService accountService = serviceProvider.GetRequiredService<AccountService>();
var result = await accountService.GetCurrentAccount();
if (result.IsSucces)
accountService._currentAccount = result.Result;
;
然后我在 blazor 页面中注入 AccountService
对象,我的期望是 _currentAccount
属性应该包含与 Program.cs
关联的 AccountViewModel
对象。但是是null
。在Program.cs
类中调用GetCurrentMethod()
之前,将AccountService
对象创建为作用域对象:
builder.Services.AddScoped<AccountService>();
据我所知,在重新加载应用程序之前,范围对象应该存在,没有重新加载,但 _currentAccount
属性仍然是 null
。
【问题讨论】:
不清楚您的serviceProvider
来自哪里,这可能就是问题所在。
我只是像这样在 Program.cs 文件中实例化服务提供者:ServiceProvider serviceProvider = builder.Services.BuildServiceProvider();
【参考方案1】:
我只是像这样在 Program.cs 文件中实例化服务提供者:
ServiceProvider serviceProvider = builder.Services.BuildServiceProvider();
试试这样:
var app = appBuilder.Build();
AccountService accountService = app.Services.GetRequiredService<AccountService>();
... // do your thing here
await app.Run();
这样你就可以在你的程序中使用相同的服务提供者了。
【讨论】:
它有效,但我不明白为什么。我正在构建 2 个不同的服务提供商? 是的,BuildServiceProvider() 为您提供了一个新实例,具有自己的***范围。当您跟踪 AccountService 的构造函数时,您应该已经看到了 2 个实例。以上是关于为 Blazor WebAssembly 中的所有 blazor 页面实例化一个对象?的主要内容,如果未能解决你的问题,请参考以下文章
Blazor Webassembly:对象引用未设置为对象 i 的实例
Blazor Webassembly 中的 JavaScript 免费引导轮播
Angular 项目中的 Blazor webassembly