导航树(NT)是从API(不在我的控制中)加载的,它显示的节点是每种类型中的一种(类别,进程等),并且每次都进行加载过程有人进入我的搜索页面(Search.cshtml
)。请注意,我从头开始创建NT。它不是任何形式的插件。
出于优化目的,我需要缓存整个NT(每个节点)。当该用户进入搜索页面时,将根据用户的权限快速加载和过滤缓存的NT。
现在,我有了加载所有节点并按用户过滤它们的方法,我还有一个名为partialNavigationTree
(pNT)的模型,它有1个用于擦除空文件夹的方法,以及3个像这样的列表{{1其中NTN也是一个模型,用于存储将节点呈现为搜索页面所需的一些信息。
因此,目标是拥有一个静态的,线程安全的pNT变量,该变量在Web应用程序初始化时加载,控制器的方法可以从中读取。我已经有一个特定的类来保存这个名为List<NavTreeNode>
的变量。
在类static class TheHelper
中,方法RouteConfig
,我会把代码从RegisterRoutes
类加载静态变量CachedNavigationTree
(CNT),然后让控制器显示搜索页面将CNT的内容复制到他的局部变量,过滤每个节点列表中的节点,然后传递给该局部变量的视图。这样我就可以在Web应用程序启动时获得CNT,并在为每个用户加载NT时获得速度。
TheHelper
删除会导致问题?这是保护1 public static CachedNavigationTree { get; set; }
变量的线程安全方式吗?class
是我找到的“最深的”功能(最接近网络应用启动点),因此我将“在应用启动时执行此操作”代码放在那里。是否有更深层次/更好的地方可以放入这种代码?RouteConfig.RegisterRoutes
,因此如何复制这些列表?如果我们有两个列表,A和B,并且让A说满,那么输入List<T>
,而B列表的项目只会引用列表A中的那些,这意味着更改列表Bs项目会更改列表作为项目,反之亦然。它是否正确?我是否应该担心我复制列表的方式,或者我上面说的是假的,我可以轻松地说B = A;
?问题3是实际的 - 如何将完整列表复制到空列表中,并再次从完整列表中生成项目。因为在C#中,当您放置var localList = TheHelper.CachedNavigationTree;
时,当您更改(假设)B列表中的第一个项目时,该项目也将在A列表中更改。因此,对于同一列表,实际上只有2个名称,而不是RAM中的2个列表。希望这个clearars问题3.另外,回答here。对不起,我很抱歉。
答案 0 :(得分:0)
1)我认为您使用MemoryCache来保存变量更明智,这仍然可以在整个应用中访问,但却是保存数据的特定设备(并且是为其设计的)。使用它也很简单。对于较旧的3.5之前的应用,您可以在Cache
中找到System.Web.Caching
;对于较新的应用,您可以找到MemoryCache
System.Runtime.Caching
。这还将为您提供一些额外的控件,如过期,可配置的大小限制,轮询间隔等。Cache
和MemoryCache
之间的主要区别在于较新的MemoryCache
也可用于工作在不直接ASP.NET
2)您可能想查看MSDN上的Application Life-cycle详细信息。更多处理程序和挂钩专门设计为在global.asax
文件中用于此类目的 - 无论是应用程序首次启动时(Application_Start
)还是页面请求时在(Application_BeginRequest
)。您可以在Application_Start
中构建缓存,然后让它调用过期回调,以便在事情发生变化时重新计算(并替换变量),而无需在每次进行更改时重新启动应用程序。
3)对不起,我在这里得不到你的要求。
4)个人ID切换到使用MemoryCache用于此系统并在那里缓存您的数据。如果您只是向请求导航树的用户发送静态API值,那么我也会考虑使用Vary
系统实施Response Caching