在依赖注入中刷新缓存
Refreshing cache in Dependency Injection
我是 C# 开发的新手,所以仍有一些问题需要解决。
我试图坚持良好的设计原则,以保持我的代码可维护。为此,我正在使用 MVVM 和工厂模式构建业务线应用程序。我也在使用依赖注入(Unity)。
我的问题是关于刷新使用依赖注入创建的数据缓存。当我创建我的视图模型时,数据缓存加载如下:
_container.RegisterType<IRepo<Relation>, RelationRepo>(new TransientLifetimeManager());
我的方案是在 GridView 中向用户显示数据。我有一个包含动态信息的多用户环境,因此缓存中的数据有时可能会过时。正如预期的那样,这可能会不时导致 DBConcurrency 错误。我正在努力解决的是如何以正确的方式处理这个问题。我应该中止整个过程并让用户重新加载应用程序从而重新创建 DI,还是有一种优雅的方式来刷新缓存并在向用户提供必要信息后重新呈现数据。使用 2n'd 选项,我或许可以在屏幕上放置一个刷新按钮或一个定时事件来刷新数据,以便用户可以看到数据的任何变化。
所以基本上我要问的是如何使缓存与底层数据库实时同步?
提前致谢。
这是一个非常宽泛的问题,您可能更愿意将其带到软件工程堆栈交换站点。处理这类问题的方法有很多。
无论如何,您将不得不处理并发异常。您可以采取一种方法来减少它们发生的可能性,即通过 SignalR 向客户端分发更新。采用单个更新将通过 SignalR 中心分发给所有其他客户端的方法。尽管如此,更新可能会在并发更新后立即广播,这将需要一些 UI 功能来解释事情发生了变化。
虽然不久前我想我会 post 我的问题的解决方案,以防其他人像我一样努力解决这些概念。
问题是当我离开视图时(或者出现数据库错误)我没有正确处理我的视图模型。因此,当我返回视图时,EF DBContext 仍在使用本地存储。即未处置。
我随后实现了 Prism Framework 并在基础 class 上实现了 IRegionMemberLifetime,我的所有 ViewModels 都继承自该基础。这会导致放置在区域管理器 (IRegion) 中的 ViewModel 实例在从激活状态转换为停用状态时被删除。
我的(伪)基地 class 看起来像这样:
using Prism.Mvvm;
using Prism.Regions;
public MyBindableBase : BindableBase, IRegionMemberLifetime
{
public virtual bool KeepAlive => false;
...
}
我是 C# 开发的新手,所以仍有一些问题需要解决。 我试图坚持良好的设计原则,以保持我的代码可维护。为此,我正在使用 MVVM 和工厂模式构建业务线应用程序。我也在使用依赖注入(Unity)。
我的问题是关于刷新使用依赖注入创建的数据缓存。当我创建我的视图模型时,数据缓存加载如下:
_container.RegisterType<IRepo<Relation>, RelationRepo>(new TransientLifetimeManager());
我的方案是在 GridView 中向用户显示数据。我有一个包含动态信息的多用户环境,因此缓存中的数据有时可能会过时。正如预期的那样,这可能会不时导致 DBConcurrency 错误。我正在努力解决的是如何以正确的方式处理这个问题。我应该中止整个过程并让用户重新加载应用程序从而重新创建 DI,还是有一种优雅的方式来刷新缓存并在向用户提供必要信息后重新呈现数据。使用 2n'd 选项,我或许可以在屏幕上放置一个刷新按钮或一个定时事件来刷新数据,以便用户可以看到数据的任何变化。
所以基本上我要问的是如何使缓存与底层数据库实时同步?
提前致谢。
这是一个非常宽泛的问题,您可能更愿意将其带到软件工程堆栈交换站点。处理这类问题的方法有很多。
无论如何,您将不得不处理并发异常。您可以采取一种方法来减少它们发生的可能性,即通过 SignalR 向客户端分发更新。采用单个更新将通过 SignalR 中心分发给所有其他客户端的方法。尽管如此,更新可能会在并发更新后立即广播,这将需要一些 UI 功能来解释事情发生了变化。
虽然不久前我想我会 post 我的问题的解决方案,以防其他人像我一样努力解决这些概念。
问题是当我离开视图时(或者出现数据库错误)我没有正确处理我的视图模型。因此,当我返回视图时,EF DBContext 仍在使用本地存储。即未处置。
我随后实现了 Prism Framework 并在基础 class 上实现了 IRegionMemberLifetime,我的所有 ViewModels 都继承自该基础。这会导致放置在区域管理器 (IRegion) 中的 ViewModel 实例在从激活状态转换为停用状态时被删除。
我的(伪)基地 class 看起来像这样:
using Prism.Mvvm;
using Prism.Regions;
public MyBindableBase : BindableBase, IRegionMemberLifetime
{
public virtual bool KeepAlive => false;
...
}