为 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

Blazor WebAssembly + Grpc Web = 未来?

Blazor WebAssembly 3.2 正式发布

为 blazor.webassembly.js 获取 404 NotFound(未找到 _framework 文件)