我们有一个高度可配置的asp.net Web应用程序。不同的组(100多个组)可以登录到应用程序。对于每个组,我们都有一个可配置的xml文件,其中包含有关如何显示页面的信息。当用户根据其组ID和xml文件中的配置设置登录时,将显示该网页。
例如: Group1.xml
<Group1>
<item key="Shape" value="True" />
<item key="Color" value="False" />
<item key="Submit" value="False" />
<Group1>
Group2.xml
<Group2>
<item key="Shape" value="True" />
<item key="Color" value="True" />
<item key="Submit" value="True" />
<Group2>
在上面的例子中,Shape和Color是文本框,Submit是一个按钮。根据值(True或False),我们要么显示文本框,要么隐藏文本框,从而动态呈现网页。
将此类型数据保存在app_data文件夹的xml文件中迄今为止效果非常好。但是当我们在每个页面上添加更多组和更多元素时,管理每个xml文件以确保每个xml文件具有相同的元素和正确的值变得越来越困难(有数千个元素和50多个网页)。
我们尝试将此数据保存在数据库的表中。但是,进行如此多的数据库调用以一次读取一个值是昂贵的,并且页面的性能会降低。
我们尝试将此数据保存在表中,并在页面加载时将表保存在数据表会话变量中。但是其他组可以更改这些配置设置。由于其他组所做的更改不会被加载到当前用户的会话,直到他们刷新页面,我们会得到不良结果。
我们还尝试在app_data文件夹中使用excel文件并将其用作表来一次读取一个值,因此即使其他组更改了值,我们也始终获取最新值来呈现页面。不确定这是否是正确或优雅的解决方案。
存储此类配置信息的最佳方法是什么,即使有大量读取和写入,页面性能也不会降低,同时也足以轻松管理所有组中的所有这些配置设置?
答案 0 :(得分:0)
通常情况下,我会提倡一个数据库驱动的解决方案,但是,听起来好像你已经拥有一个适合你并且经过验证的系统,所以不要把它扔掉。如果我正确地阅读了您的问题,那么您当前的xml驱动设置运行良好,解决方案可以正常扩展。
您的问题不在于运行时性能或准确性,因此请勿更改此问题。
相反,它是如何管理这些xml文件的。几个简单的问题:
是一个应用程序有50个左右的页面,而不是大量的应用程序? 每个组都有类似的设置,只是不同的值吗?
如果这两个问题的答案都是肯定的,那么您应该尝试ConfigGen。 它是为生成特定于机器的app.config和web.config文件而开发的,但它可以很容易地用于生成任何设置文件。
它的工作方式是你有一个标记化的xml模板。
<?xml version="1.0" encoding="utf-8"?>
<group name="[%groupName%]">
<item key="Shape" value="[%shape%]" />
<item key="Color" value="[%color%]" />
<item key="Submit" value="[%submit%]" />
</group>
您还有一个电子表格或csv文件,其中包含每个组的行和每个设置的列。组设置将进入此电子表格,列名称与模板文件中的标记匹配。
MachineName ConfigFilePath groupName shape color submit
Default default.xml defaultgroup True True True
Group1 Group1.xml Group1 True False False
Group2 Group2.xml Group2 True True True
在构建时(非运行时),configGen使用这两个文件为每个组生成输出配置。
这使得管理每个组的设置变得非常简单,并且您不必更改应用程序代码的单行。在Excel中向下看并在一个地方检查您的设置非常容易。我个人更喜欢使用csv文件,因为它在源代码管理系统中合并得更好。
我希望这会有所帮助。
另一方面,如果您遇到性能问题,并且听起来好像使用了数据库驱动的解决方案,那么您可能需要在应用中进行一些更改。无论您的设置如何存储,都只能从数据库或文件系统中检索一次,最好是在应用程序启动时检索。应将设置读入键控在组名称上的哈希表或字典,并在持续时间内进行缓存。如果它需要是动态的,那么你必须提供一些管理页面来使整个批次无效,或者最好只是受影响的设置。
阅读Read-Through缓存。