运行Blazor Singleton服务的异步方法



我有一个Blazor服务器应用程序,它有一个状态SharedStateService和(伪(数据DummyDataService服务。

public class SharedStateService
{
public event Action OnChange;
private ICollection<DummyData> data;
public ICollection<DummyData> Data
{
get => this.data;
set
{
this.data = value;
this.OnChange?.Invoke();
}
}
}
public class DummyDataService
{
private readonly SharedStateService sharedStateService;
private readonly TestContext context;
public CompanyService(TestContext context, SharedStateService sharedStateService)
{
this.context = context;
this.sharedStateService = sharedStateService;
}
public async Task<bool> AddData(DummyData data)
{
try
{
await this.context.Set<DummyData>().AddAsync(data);
await this.context.SaveChangesAsync();
}
catch (Exception)
{
return false;
}
await this.ReloadData();
return true;
}
public async Task ReloadData()
{
this.sharedStateService.Data = await this.context.Set<DummyData>().ToListAsync();
}
}

我现在有以下问题。我不知道在服务器启动后如何调用我的ReloadData函数。我可以将它放入我的App.razor中,但最初会为每个打开的连接调用它。我不想那样。我希望数据在启动后被提取到SharedStateService中一次,然后只有在发生更改时(添加、删除、编辑数据(。

我首先尝试将它放入DummyDataService的构造函数中,但我无法调用其中的异步方法(除了_ = ReloadData,它有时会导致任务中止(。是我的做法完全错了,还是我遗漏了什么?是否可以调用我的Program.cs中的方法?

尝试在DI 期间运行ReloadData

builder.Services.AddSingleton( sp =>
{
var context = sp.GetRequiredService<TestContext>();
var sharedStateService = sp.GetRequiredService<SharedStateService>();
var service = new DummyDataService(context, sharedStateService);
service.ReloadData();
return service;
});

最新更新