是否更好地读取一次xml文件并传递值,或者在需要的地方多次读取xml?

时间:2013-10-04 18:24:14

标签: xml asp.net-mvc-4 config viewbag

我有一个Asp.Net MVC Web应用程序,其xml配置文件中包含大约40个值。

我的网络应用只是一个页面,但它被分成几个部分视图(每个视图都有自己的模型和控制器)。每个部分都需要使用配置文件中的一些但不是全部的值,尽管存在一些重叠。例如,ViewA需要valueX,而ViewB需要valueXvalueY

我的问题是 - 在主HomeController中读取一次.xml文件是否更好,并将值传递给所有其他视图/控制器?我不确定我会怎么做。我无法将这些值放入模型中,因为每个部分都有自己的模型,我认为我不想使用ViewBag来存储40个值。

或者让每个Controller自己读取xml文件并获取所需的数据更好吗?这将导致相同的xml文件最多只能读取5次以加载一个屏幕,然后每次更新部分视图。

其中一个或这些选项会对性能或内存产生影响吗?

2 个答案:

答案 0 :(得分:3)

  

其中一个或这些选项会对性能或内存产生影响吗?

是。多次读取文件比读取文件要慢得多。持有这些值将消耗更多的内存,而不是将它们保留在它们上面。

但我们并不是在谈论大量时间或大量内存,而是仅仅使用40个值。除非这些值都是兆字节。

有许多方法可以加载XML数据并对其进行缓存。您可以加载一次 - 第一次访问应用程序。或者您可以为每个请求加载它。在我的应用程序中,我在第一次访问应用程序时加载数据。它被加载到一个基本上是名称/值集合的对象中。我将接口引用传递给需要它的每个控制器。但后来我使用了StructureMap,这使得这种事情变得非常容易。

如果不了解应用程序的结构,很难说哪种更适合。您可以使用延迟加载的单例对象,模型调用该对象来获取数据。单例对象本身会在首次使用时加载数据。查看Jon Skeet的Implementing the Singleton Pattern in C#

虽然你可能会不必要地担心。如果文件很小,则第一次读取可能会将数据从磁盘送入缓存,然后从缓存中读取读取文件的调用。您仍然需要为每次调用解析XML的成本,但读取文件很便宜,因为它已经在内存中。如果现在它的工作速度足够快,并且您不希望请求数量发生巨大变化,那么您在优化其他方面的努力可能会更好。

答案 1 :(得分:2)

我当前的解决方案是使用全局资源文件(.resx)而不是使用xml文件,我可以从任何地方直接访问值。但是如果有一个很好的方法用xml做这个,我仍然有兴趣听到它。