c# - 如何处理并发用户对 Blazor webassembly 中的数据进行更改
问题描述
我目前对 Blazor webassembly 的理解是用户加载应用程序,对 Web API 进行一次初始调用并检索要显示的数据集。然后,用户可以在本地与数据交互,并且仅在用户插入、更新或删除项目时才调用 API。除了初始调用之外,不需要进一步的“获取”调用,因为数据的状态是在本地加载的。
如果期望多个并发用户与同一个数据集进行交互怎么办?传统上,在标准 Web 应用程序中,每当重新加载页面并从后端存储检索新的数据集时,对数据集的外部更改将很快可见。在某些情况下,如果希望用户长时间坐在页面上而不重新加载,则可能需要引入轮询。
我不确定在 Blazor 世界中处理此类用例的最佳实践是什么。轮询 Web API 是一种公认的解决方案吗?我应该期待 SignalR 通知客户数据集中的变化吗?我忽略了任何内置机制?
解决方案
我认为 Blazor 在这方面与其他框架没有什么不同。如果您在浏览器上编辑对象,您有两种选择:
让每个用户编辑和保存,无需用户之间的任何协调。对象将保持上次用户保存它的状态。
实现某种对象锁定。我不知道 .NET Core 是否提供这种东西,但应该不难管理自己。因此,在这种情况下,如果用户签出了一个对象,则在返回签出之前不允许其他用户对其进行编辑。但我怀疑这种策略是否适用于通用应用程序。对于企业来说,这可能会奏效。问题是有人在返回对象之前关闭了他/她的浏览器。在您实施某种超时之前,其他用户将无法访问该对象。更新:EF Core 具有并发检测功能,您可以将其配置为引发 DbUpdateConcurrencyException。然后,您可以使用它来覆盖另一个用户所做的更改,或者为用户提供重新加载新数据的选项等。
关于刷新数据的问题,一般的做法似乎是在组件初始化时获取数据,进行更改然后将其保存回来。您很少会想要在两者之间重新获取,尽管您可以随心所欲。但这也会一次又一次地刷新用户界面。
推荐阅读
- flutter - 如何将 Flutter 应用程序与辅助 Firebase Web 应用程序连接起来?
- laravel - 获取laravel中的最后一个条目
- react-native - mapmyindia-map-react-native-beta ios 构建失败
- javascript - 关于修剪字符串的车把问题
- c# - 在 C# (.NET Core 3.1) 上的 Selenium Firefox 中使用 Socks5 代理服务器导致超时
- mime-types - 哪个是 FLAC 的“正确”内容类型?
- azure-devops - Azure DevOps Server 2019 - 自定义状态
- android - 使用 Dagger 或 Hilt 进行 Android 库开发
- python - datetime.time 对象的持续时间:datafame 中 datetime.time 元素的减法
- python - 目录中的python seach文件 - 无法打开文件