在 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 Scoped 和 Singleton 中,生命周期是相同的。不在服务器中。
在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();
}
我有一个在各种组件之间共享的服务 A。该服务需要在启动时使用来自 WebApi 的值进行初始化。
我怎样才能做到这一点?我尝试了两件事。
_1.
程序中cs/main方法我做
builder.Services.AddScoped
使用 A 和其他服务 B 和 C。
然后我调用一个方法
async LoadSetupData(wasmBuilder)
通过
获得服务A、B、CwasmBuilder.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 Scoped 和 Singleton 中,生命周期是相同的。不在服务器中。
在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();
}