【发布时间】:2017-11-27 19:10:22
【问题描述】:
说明
导航树 (NT) 是从 API 加载的(这不在我的控制范围内),它显示的节点是几种类型之一(类别、进程等),并且每次都会完成加载过程有人访问我的搜索页面 (Search.cshtml)。请注意,我从头开始创建 NT。它不是任何类型的插件。
出于优化目的,我需要缓存整个 NT(每个节点)。当用户进入搜索页面时,缓存的 NT 将根据用户的权限快速加载和过滤。
现在,我有了加载所有节点并按用户过滤它们的方法,我还有一个名为 partialNavigationTree (pNT) 的模型,它有 1 种用于擦除空文件夹的方法,以及 3 个类似 List<NavTreeNode> 的列表,其中NTN 也是一个模型,它存储了将节点渲染到搜索页面所需的一些信息。
因此,目标是拥有一个静态的、线程安全的 pNT 变量,该变量在 Web 应用程序初始化时加载,控制器的方法可以从中读取。我已经有一个特定的类来保存这个名为static class TheHelper 的变量。
我的计划
在类RouteConfig,方法RegisterRoutes中,我将代码从TheHelper类中加载静态变量CachedNavigationTree(CNT),然后让显示搜索页面的控制器复制CNT的内容到他的局部变量,过滤每个节点列表中的节点,然后传递给视图那个局部变量。这样我在 web 应用程序启动时获得 CNT,并在为每个用户加载 NT 时获得速度。
疑虑和问题
- 如何声明静态 CNT?当多个用户试图同时读取它时,像这样
public static CachedNavigationTree { get; set; }清除它会导致问题吗?这是保护 1class变量的线程安全方式吗? -
RouteConfig.RegisterRoutes是我发现的“最深”功能(最接近 Web 应用程序启动点),因此我将“应用程序启动时执行此操作”代码放在那里。是否有一个“更深”/更好的地方可以放置这种代码? - 由于 pNT 模型中的节点列表是
List<T>s,我该如何复制这些列表?如果我们有 2 个列表,A 和 B,假设 A 已满,然后输入B = A;,那么 B 列表的项目将仅引用列表 A 中的项目,这意味着更改列表 B 的项目将更改列表作为项目反之亦然。这个对吗?我应该担心我复制列表的方式,还是我上面所说的错误,我可以轻松地说var localList = TheHelper.CachedNavigationTree;? - 这是我根据我所掌握的知识提出的缓存方式。如果在 C#/MVC 中已经存在缓存类变量的预制方式,我不会感到惊讶。如果它存在,并且您知道它,请详细说明。
编辑
问题 3 实际上是 - 如何将完整列表复制到空列表中,并再次从完整列表中生成项目。因为在 C# 中,当您输入 List<string> A = new ...; List<string> B = A; 时,当您更改(比如说)B 列表中的第一项时,该项目也会在 A 列表中更改。所以实际上同一个列表只有 2 个名称,而不是 RAM 中的 2 个列表。希望这可以清除问题 3。另外,请回答 here。我很抱歉解释不好。
【问题讨论】:
-
最好使用
MemoryCache来存储数据(你可以提供一个包装器来检查它是否存在于缓存中,如果不存在则调用api加载它以防万一缓存无效)。然后,每次用户导航到您的Search页面时,您只需调用一个获取数据的方法(您可以在启动时填充数据,或者让第一个导航到该方法的用户填充数据。跨度> -
不清楚您认为
RouteConfig与您的问题有什么关系。如果您的模型和现有代码至少看不到基本结构,那么很难理解您在第 3 点提出的问题
标签: c# list caching model-view-controller asp.net-mvc-5