我目前正在用.NET6构建一个Blazor服务器项目。无论如何,我不确定今天构建组件的最佳实践是什么。
这篇文章描述了我如何构建项目。我基本上有一个MVVM模式。视图(例如,MyView.rarzor(具有相应的ViewModels(例如,MySView.rarz.cs(,ViewModels可以使用IoC容器注入的服务。
当项目试图从Azure SQL数据库中获取数据时,我遇到了一些问题,在我们的数据库上下文上发生了并发读/写。在Startup.cs中使DB上下文成为瞬态并没有帮助。当时,当我第一次遇到这个问题时,我在StackOverflow上偶然发现了一个类似的问题(我再也找不到了(,该问题指出,当子组件使用DB服务时会出现这个问题,应该避免这种情况。
在命名帖子的帮助下,我通过以下操作解决了这个问题:所有DB调用现在都在";根视图模型";(例如,MyPage.rarzor(。然后将相应的数据连同参数一起传递给子组件。这意味着只有我的根ViewModel注入了任何服务。对于嵌套组件,这增加了传递相应参数和确保属性正确更新的额外开销(这有时非常令人沮丧,尤其是当您在嵌套组件的3层下面时(。
现在我的问题是:这样做真的是最好的做法吗?
我猜您使用的是Blazor服务器。微软发布了在Blazor服务器上使用EF核心的具体指导方针。你可以在这里找到它们。简而言之,一旦建立了SignalR连接,该状态将无限期保持。这与EF核心模型不匹配,所以我建议您按照他们的建议使用IDBContextFactory。