在 Blazor Webassembly 中初始化服务

Initialize Service in Blazor Webassembly

我有一个在各种组件之间共享的服务 A。该服务需要在启动时使用来自 WebApi 的值进行初始化。

我怎样才能做到这一点?我尝试了两件事。

_1.

程序中cs/main方法我做

builder.Services.AddScoped

使用 A 和其他服务 B 和 C。

然后我调用一个方法

async LoadSetupData(wasmBuilder)

通过

获得服务A、B、C
wasmBuilder.GetRequiredService<T(A)>...

然后

A.MySetupValues = await B.GetSetupValues().

通过 WebApi 检索值。

到目前为止一切正常。但是当我通过 [Inject] A a 在组件中使用 A 时,我得到的服务对象不是我在 LoadSetupData 中检索到的服务对象(服务有一个 Guid 属性,它们是不同的)。

_2.

我尝试通过向 AddScoped 提供工厂方法来添加 A。这不起作用,因为从 WebApi 获取值本质上是异步的。并且不能从程序中使用异步调用。cs/main(“无法在此运行时等待监视器”)。

非常感谢您的阅读!非常感谢任何帮助!

尝试重新定义你的设计。

我更喜欢在构造函数中进行服务的所有初始化。
你需要一些其他服务(B&C),所以你需要在服务A的构造函数中使用DI。

解决方案“A”

我认为以下设计应该适合您的情况:

builder.Services.AddScoped<IServiceA,ServiceA>();

var hostInstance = builder.services.Build();
var theServiceA = hostInstance.GetRequiredService<IServiceA>();

...

hostInstance.RunAsync()

解决方案“B”

试试这个替代品:

builder.Services.AddScoped(sp => sp.GetRequiredService<IServiceA>().LoadSetupData());

请注意,在 Blazor WASM ScopedSingleton 中,生命周期是相同的。不在服务器中。

在Program.cs中你可以加载你的数据然后说明如何解决依赖注入。

var datas = await (new TheProvidingDataService()).LoadDataAsync();
builder.Services.AddSingleton(s => new NeedYourDataService(data));

感谢您的所有回答!我能够通过在 OnInitializedAsync 中的 App 组件中执行初始化来解决问题。

[Inject] IServiceProvider sp { get; set; }

protected override async Task OnInitializedAsync() {

  ISvcB svcb = sp.GetRequiredService<ISvcB>();
  ISvcA svca = sp.GetRequiredService<ISvcA>();

  svca.SetupData = await svcb.GetSetupData();
}