【问题标题】:Best method for a generic web applications 'features' / global properties通用 Web 应用程序“功能”/全局属性的最佳方法
【发布时间】:2011-12-19 08:56:09
【问题描述】:

我正在创建一个通用的灵活网站,我可以反复使用它,但启用或停用不同的功能。我正在寻找解决我的解决方案的最佳方法。

在某些情况下需要关闭特定区域,例如,应用程序将包含一个事件管理页面,但并不总是需要。应用程序将从数据源中提取活动和停用的功能。

它们将类似于应用程序范围的设置,每个页面都需要这些设置,隐藏那些从菜单中关闭的设置,并且不允许用户访问已停用的功能页面。

我想了很多方法来实现这一点:

  1. 将特征状态存储在数据库中,然后在每次访问/显示页面/菜单时,调用数据库请求是否隐藏页面/菜单项。
  2. 将功能状态存储在数据库中并在应用程序启动时访问它们,将它们存储在应用程序范围内,然后可以随时访问它们。
  3. 将功能状态放入网络配置中,这样我们就不需要每次都查询数据库或具有全局可访问的属性。

我想请您就哪种方法最好提出建议,或者如果有更好的方法可用,我将不胜感激。我不想多次访问数据库,或者像这样的简单检查不会太昂贵?我也不确定网络配置是否足够安全以管理活动站点功能。

问候,

【问题讨论】:

    标签: asp.net entity-framework web-config generic-programming n-tier-architecture


    【解决方案1】:

    我认为将配置放入配置文件(web.config)会是更好的选择。因为在每次显示页面/加载菜单时都会转到数据库以查看它是否应该停用/激活,因此需要进行数据库访问,这是开销。

    如果配置存储在 web.config 中,管理员可以轻松访问它,并且无需编译或更改任何内容即可轻松修改。

    因此,在我看来,最好的选择是将配置存储在 web.config 中。除此之外,您还可以制作管理页面,该页面将更改配置设置并应反映在配置文件中。

    【讨论】:

    • 我不需要使用其他 2 种方法进行编译。而且我需要改变一些东西,改变和其他方法一样多。
    • 是否可以通过管理页面更改 web.config 中的值?
    【解决方案2】:

    我建议第二种方法 - 将设置存储在数据库中,然后在启动时检索它们并存储在应用程序范围的容器中。

    与web.config 相比,这种方法的优势在于您可以轻松获取客户端数据库并立即在您的开发环境中运行它以进行测试/调试。另一方面,如果某些设置存储在数据库之外,则克隆站点意味着您不仅需要克隆数据库,还需要克隆来自各种其他资源(如web.config)的所有设置。

    【讨论】:

    • 首先,非常感谢您的回答。尽管我必须以任何一种方式克隆 web.config(其中包含连接字符串)。
    【解决方案3】:

    答案取决于您更改功能状态的频率。

    如果您打算在克隆站点时只设置一次状态并且永远不会再触摸它,请使用选项 #2(在应用程序启动时加载)。

    如果您将来可能需要更改功能的状态,请使用选项 #1(在每个页面加载时获取状态)。读取数据库的简单数据读取器不会影响您网站的速度。 db 是你的朋友,记住这就是它的用途。此外,如果您需要在站点启动并运行时更改状态,此方法允许您在不重新启动整个应用程序的情况下执行此操作。

    无论您最终决定实施哪种方法,请确保您存储设置的“应用程序范围” 位置已准备好多线程。请记住,每个页面请求都将在单独的线程上运行,并且它们都将访问相同的资源。

    我的建议来自 MS (multi-thread safe Singleton Pattern):

    using System;
    
    public sealed class Singleton
    {
       private static volatile Singleton instance;
       private static object syncRoot = new Object();
    
       private Singleton() {}
    
       public static Singleton Instance
       {
          get 
          {
             if (instance == null) 
             {
                lock (syncRoot) 
                {
                   if (instance == null) 
                      instance = new Singleton();
                }
             }
    
             return instance;
          }
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-14
      • 1970-01-01
      • 2018-01-21
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多