【问题标题】:Blazor WebAssembly: using Constructor injection for injecting Blazored.LocalStorage into a serviceBlazor WebAssembly:使用构造函数注入将 Blazored.LocalStorage 注入服务
【发布时间】:2020-11-09 10:44:46
【问题描述】:

Blazored.LocalStorage是:

提供对 Blazor 应用程序中本地存储的访问的库

将服务注入组件很容易:

@inject Blazored.LocalStorage.ILocalStorageService localStorage

如果我们想将其注入到后面的代码中:

[Inject]
private ILocalStorageService localStorage { get; set; }

但是假设我想将它注入到另一个服务中(比如说集中控制):

public class StorageManagement
{
    public StorageManagement(LocalStorageService localStorage)
    {
        //How to initialize it here?
    }
}

我不知道如何在StorageManagement的构造函数中初始化服务的实例,也不知道如何在Program.cs中设置StorageManagement的构造函数的参数:

builder.Services.AddSingleton(e => new StorageManagement(//?));

【问题讨论】:

    标签: dependency-injection blazor blazor-client-side


    【解决方案1】:

    只需builder.Services.AddBlazoredLocalStorage();builder.Services.AddBlazoredLocalStorage(config => config.JsonSerializerOptions.WriteIndented = true);,正如README 中所解释的那样。
    然后builder.Services.AddScoped<StorageManagement>();builder.Services.AddScoped(p => new StorageManagement(p.GetRequiredSerice<ILocalStorageService>()));

    但您的服务应该采用 ILocalStorageService 而不是 LocalStorageService 实例:

    public class StorageManagement
    {
        public StorageManagement(ILocalStorageService localStorage)
        {
            //How to initialize it here?
        }
    }
    

    【讨论】:

    • 根据您的建议,我将 builder.Services.AddBlazoredLocalStorage(); builder.Services.AddSingleton(p => new StorageManagement(p.GetRequiredService<ILocalStorageService>())); 放入 Program.cs 并将 public StorageManagement(ILocalStorageService localStorage) ... 放入构造函数,但我收到此错误:Unhandled exception rendering component: Cannot resolve scoped service 'Blazored.LocalStorage.ILocalStorageService' from root provider.
    • 用 AddScoped 替换 AddSingleton
    • @aguafrommars 为什么单例类不能解析 ILocalStorageService?我有确切的问题,AddTransient 解决了错误,但我真的想让我的类成为一个单例(由于它内部的缓存优化)。
    • @Heems 因为AddBlazoredLocalStorageILocalStorageService 注册为范围服务。如果您将StorageManagement 注册为单例,则无法解析,因为它需要范围。也就是说,对于作用域和单例的 WASM 应用程序具有相同的生命周期。对于服务器应用程序,您可能会管理每个浏览器连接的缓存。这就是为什么ILocalStorageService 是一个作用域实例。
    • @aguafrommars 谢谢你的解释。我在我的 WASM 应用程序中使用了 scoped,它按预期工作(即我的类的一个实例)。
    【解决方案2】:

    您没有在构造函数中使用接口ILocalStorageServer,它应该是

    public class StorageManagement
    {
        private readonly ILocalStorageService LocalStorage;
        
        public StorageManagement(ILocalStorageService localStorage)
        {
            LocalStorage = localStorage;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-10-09
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多