【发布时间】:2021-10-26 16:08:58
【问题描述】:
我有一个服务 A 在各个组件之间共享。该服务需要在启动时使用来自 WebApi 的值进行初始化。
我怎样才能做到这一点?我尝试了两件事。
_1.
在 program.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 获取值本质上是异步的。并且不能从 program.cs/main 使用异步调用(“无法在此运行时等待监视器”)。
非常感谢您的阅读!非常感谢任何帮助!
【问题讨论】:
-
async LoadSetupData(wasmBuilder)既不是调用也不是定义,只是无效的 C#。你在等吗? -
这是伪代码!是的,我确实在等待它。
-
太伪了。这样你就会得到伪答案。阅读minimal reproducible example
-
为什么需要预加载数据?当第一个组件需要它时获取它。你说“我有一个服务 A,它在各个组件之间共享。”然后你开始谈论服务 A、B、C。如果服务 A 的范围是但您获得不同的 guid,那么您很可能会重新启动 SPA。组件 A、B、C.... 都将在同一个 SPA “会话”中获得同一个 Scoped Service A 实例。与上面关于“伪代码”的想法相同。
-
如果你认为你必须讨论如何使用伪代码,那么你就不懂伪代码。琐碎地讨论它的细节直接违背了它的目的。我现在投票决定停止这种反叛,因为它对任何人都没有好处。
标签: asynchronous .net-core blazor asp.net-core-webapi webassembly