【问题标题】:How Can I let the End User Control AppSettings Themselves?如何让最终用户自己控制 AppSettings?
【发布时间】:2012-06-22 01:01:07
【问题描述】:

我有一个我在 MVC 3 中构建的系统,该系统目前提供一个年度提交周期,其中系统通过与存储在 web.config 作为 AppSettings 的日期相关的七个步骤进行。然而,每年,为了适应最终用户,我总是不得不在之前的步骤之间来回滚动系统。我想让管理员无需联系开发人员即可控制系统状态。最好的方法是什么?

我计划构建一个具有适当验证功能的页面,让管理员可以设置日期。我已经考虑了如何存储这些日期的几个选项,但它们似乎都不正确。我们的整个权限系统都使用这些日期,并且页面上的各种文本会根据我们当前所处的时间段打开和关闭。

到目前为止,我提出了两个选择:

选项 1:创建数据库表——这是我的第一个想法。我已经在 global.asax 中的 MvcApplication 类上设置了属性,并将它们从数据库中提取出来。使用惰性加载器,我可以在第一次需要时设置属性。但是,当它们在数据库中更改时,我没有办法强制系统“重置”并读取日期更改。如果我在 Begin_Request() 上执行此操作,我会不断打开连接并重置 Web 浏览器在服务器上打开的每个文件的属性,无论它是否是静态内容。

每次我需要其中一个日期时,我都可以直接从数据库中获取日期,但是我不得不重做很多功能以减少重复的数据库调用。我想缓存每个请求的日期,只在需要时才拉取它们,

选项 2:允许通过应用程序编辑配置文件 – 我已经查找了如何使用 split the web.config file,因此我可以拥有一个仅包含 appSettings 的单独文件。然后我可以update the new config file from a controller action。我认为这会很好地工作,并且不需要我重写任何现有功能,但感觉就像我会在代码中引入一个糟糕的设计模式。

【问题讨论】:

  • 你没有真正说出最终的结果是什么吗?您只是想根据日期范围更改内容吗?如果是这样,请从您的日期中删除年份部分,在数据库中有一个开始日期、结束日期和内容,并根据 x 和 y 之间的时间加载内容。给他们一个页面来改变日期和月份???但只是在这里猜测实际结果是什么
  • web.config 中的日期已经控制了一个复杂的工作流程过程,该过程会随着工作流程的进行打开和关闭功能。这部分已经实现,但是开发人员控制着这个过程。我们需要更改系统,以便管理员可以在我们不参与的情况下对其进行控制。

标签: asp.net-mvc asp.net-mvc-3 web-config global-asax


【解决方案1】:

我会为数据库投票。为了性能起见,您可以将这些参数值缓存在应用程序内的静态类中,并提供一种方法从同一类中的 DB 重新读取它们。所以:

  1. 当用户发出请求时,检查这些属性是否已被缓存。如果是 - 使用缓存值,如果不是 - 从数据库中读取它们
  2. 当管理员更改这些参数时 - 将它们存储到数据库并强制您的静态缓存类从数据库中重新读取它们。

【讨论】:

  • 您的设计将如何让当前登录的其他用户知道日期已更改?为进行更改的管理员更新日期缓存很简单,但是当前登录的其他用户呢?
  • 静态类是应用程序域范围的,所以如果静态类中的数据发生变化,那么所有用户会话的数据都会同时发生变化。例外:如果您使用的是网络农场,那么静态类将被限定为网络农场进程,因此我的设计将无法正常工作。
  • 我们实际上正在使用一个小型网络农场,所以感谢您的提示。
【解决方案2】:

我会建议一种方法,它不关心设置是存储在数据库还是配置文件中的键/值对

由于您希望所有用户全局访问设置,因此您可以缓存设置,并且缓存实现应该是通用的和分布式的。有很多在线资源可以用来创建这样的界面。

由于您希望缓存与基础数据同步,因此您必须设置缓存依赖项(AppFabric 不支持 sql 缓存依赖项,请参阅此thread,而NCache 支持 sql 和文件)。

【讨论】:

  • 这种方法有什么好处?
  • @ICodeForCoffee:最重要的好处是,当您在持久存储(数据库或配置文件)中更改缓存依赖项时,缓存依赖项可以自动触发缓存中当前日期值的更新。我比我更喜欢这个解决方案。
【解决方案3】:

我会将值存储在数据库中,并使用分布式缓存在整个网络场中持久保存数据。 MS AppFabric 缓存对我来说效果很好。您将需要实现一个标准的缓存模式(检查缓存,如果从 db 加载空并插入缓存)。我可能只是创建一个静态 Load() 方法来抽象这个逻辑。当管理员更新数据库时,您可以更新缓存或删除缓存键。

【讨论】:

  • 您将如何实现这一点,使用这项技术有什么好处?这看起来需要重新配置服务器才能实现。
【解决方案4】:

还有其他要添加到性能的考虑因素。即如果您修改配置文件thr应用程序池是re iniyializrd,而数据库解决方案不会导致应用程序重新初始化 ...所以您是否需要在更改后重新初始化应用程序?...如果我无法避免对应用程序进行剧烈更改的初始化,那么配置文件解决方案会更好

【讨论】:

  • 在这种情况下,我们通常需要实际重新初始化应用程序。功能根据这些日期打开和关闭。虽然我认为只有在将系统更改为另一种状态时才强制重新初始化是理想的,但这会使已经很复杂的逻辑更加复杂。
  • 如果应用程序没有被设计为“易于重新初始化”,通过简单地更改一些全局应用程序字典属性或类似属性,那么修改它以便可以重新初始化并不容易重新初始化应用程序池,那么重新初始化它而不冒引入错误的唯一可靠方法就是重新启动应用程序池。可以通过与 IIS api 交互,或者通过更改代码或 web 配置来强制应用程序重新初始化......所以更改 web 配置是唯一简单的解决方案
猜你喜欢
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
  • 2019-05-27
  • 2011-06-26
相关资源
最近更新 更多