我有一个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;
});