由于appsettings.json与 blazor WA 配合得不好,我正在创建自己的文件并将文件放入.json,wwwroot在需要它的页面中,我使用HttpClient来获取文件,如下所示
config = await Http.GetJsonAsync<Configuration>("/config/appsettings.json");
这很好用,但是我在多个页面中执行此操作,因此我想Configuration在startup.cs 中注入对象/服务,并让我的页面使用它而不是多次执行此操作。
我很难找到如何正确读取 Startup.cs 中的文件,任何帮助将不胜感激。
更新
似乎App.OnInitializedAsync之前已被触发Index.OnInitializedAsync,但Settings = await httpClient.GetJsonAsync<Settings>("/config/appsettings.json").ConfigureAwait(false);需要更长的时间导致App.OnInitializedAsync在上面的行之前执行。
这是所有代码
启动.cs
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<ConfigurationManager>();
services.AddBlazoredToast();
}
public void Configure(IComponentsApplicationBuilder app)
{
app.AddComponent<App>("app");
}
}
Run Code Online (Sandbox Code Playgroud)
应用剃刀
protected override async Task OnInitializedAsync()
{
Console.WriteLine("App.OnInitializedAsync");
await configManager.InitializeAsync();
}
Run Code Online (Sandbox Code Playgroud)
索引剃刀
protected override async Task OnInitializedAsync()
{
Console.WriteLine("Index.OnInitializedAsync");
//config = await Http.GetJsonAsync<Configuration>("/config/appsettings.json");
if (configManager == null)
{
Console.WriteLine("Index.OnInitializedAsync config manager is null");
}
else
{
if (configManager.Settings == null)
{
Console.WriteLine("Index.OnInitializedAsync config.Settings is null");
}
else
{
Console.WriteLine("base url" + configManager.Settings.ApiBaseUrl);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是顺序
WASM: App.OnInitializedAsync
WASM: ConfigurationManager.InitializeAsync
WASM: Index.OnInitializedAsync
WASM: Index.OnInitializedAsync config.Settings is null
WASM: ConfigurationManager.Setting has been set: ApiBaseUrl https://localhost:44316
Run Code Online (Sandbox Code Playgroud)
恕我直言,最好的方法是注册一个单例Task
public void ConfigureServices(IServiceCollection services)
{
services
.AddSingleton(async p =>
{
var httpClient = p.GetRequiredService<HttpClient>();
Console.WriteLine("Get settings called");
return await httpClient.GetJsonAsync<Settings>("settings.json")
.ConfigureAwait(false);
});
}
Run Code Online (Sandbox Code Playgroud)
并在需要设置的地方使用异步调用。在示例页面中
@inject Task<Settings> _getSettings
...
@code {
protected override async Task OnInitializedAsync()
{
var settings = await _getSettings;
Console.WriteLine("Settings received in main {0}", settings?.ApiBaseUrl);
}
}
Run Code Online (Sandbox Code Playgroud)
这样,对settings.json的调用只需一次
| 归档时间: |
|
| 查看次数: |
5227 次 |
| 最近记录: |