我正在开发 Blazor 服务器项目,我有一个存储库服务,我可以从中执行数据库操作,并且我有一个使用该服务的 razor 组件 X。
基本上,我想在某些操作(例如添加、更新、删除)上触发存储库服务中的事件,以通知剃刀组件 X 有新的更改。
在组件 X 中,我使用异步方法链接该事件(来自存储库服务),如果我使用以下语法执行它,则效果很好:
protected override OnInitalized()
{
RepositoryService.SomethingChanged += async () => await AnAsynchronousMethod();
}
我的问题是,据我所知,我无法从事件中解开该异步方法:
public void Dispose()
{
RepositoryService.SomethingChanged -= async () => await AnAsynchronousMethod();
}
将无法解开异步方法(因为匿名方法将尝试在幕后创建另一个方法)。
也许您会发现使用事件来接收更新通知是不合理的,但原因是我这样做,是因为我将该存储库服务注入到另一个组件 Y 中。 在组件 Y 中使用存储库服务所做的更改需要在实际组件 X 中生效。
有什么办法可以克服这个问题,或者有没有其他你认为更有效的方法。
只需创建一个方法,以便您可以使用方法组转换而不是 lambda 表达式。我们不知道所涉及的委托类型,但如果它有效
Action
,您可能需要类似的东西:
protected override OnInitalized() =>
RepositoryService.SomethingChanged += InitializationHandler;
public void Dispose() =>
RepositoryService.SomethingChanged -= InitializationHandler;
// Note: async void is normally an antipattern, but it's common
// for event handlers.
private async void InitializationHandler() =>
await AnAsynchronousMethod();