【问题标题】:How should I store my ASP.NET MVC site's settings?我应该如何存储我的 ASP.NET MVC 站点的设置?
【发布时间】:2010-02-09 07:41:13
【问题描述】:

我有一个 ASP.NET MVC 站点,它由一个解决方案中的 3 个项目组成:

DomainModel(类库 - 包含 LINQ 存储库)
DomainServices(类库 - 保存业务逻辑)
WebUI(ASP.NET MVC 站点)

我需要一个地方来存储我们网站的一系列设置,这些设置可以通过 XML 进行配置。

这应该进入哪个项目?有没有人举例说明他们如何在这些不同的项目中加载并访问他们的设置?

我是否在某个包含我所有设置的属性的 C# 类的构造函数中加载 XML 文件一次?

谁能给我一些关于将设置存储在 XML 文件中以用于多项目解决方案的示例和提示?

【问题讨论】:

    标签: c# .net asp.net-mvc xml


    【解决方案1】:

    设置通常存储在 web.config 中。所有程序集都可以访问这些设置。

    ConfigurationManager.AppSettings["key"]
    

    您需要添加对 System.configuration.dll 的引用

    【讨论】:

      【解决方案2】:

      与其使用 AppSettings,它只是键值对的集合,不如考虑使用 ConfigurationSection 或 IConfigurationSectionHandler 定义自己的配置结构

      这样您可以获得包装类的所有安全性,并且不会弄乱您的 AppSettings(并且在某个地方很好地定义了供您使用)。

      更好的是,定义您自己的 XML 架构,并使用 XmlSerialization/Deserialization 将此文件存储在 web.config 之外,监听其更改(将其绑定到缓存,等等)。

      如果你这样做,你不需要修改 web.config 来获取更改,因此不需要重新启动你的 web 应用程序在过程中丢失会话/缓存。

      写得好的无状态 Web 应用程序不应该关心丢失会话/缓存 - 但总有人... :)

      【讨论】:

        【解决方案3】:

        我同意 Mathias 使用框架提供的默认方式。但是,您仍然可以(应该,恕我直言)制作某种包装类,可能在一个接口后面,以便在单元测试中进行模拟,例如:

        class MyAppSettings
        {
            public int SomeSetting 
            { 
               get 
               {
                 return Convert.ToInt32(ConfigurationManager.AppSettings["SomeSetting"]); 
               } 
            }
        }
        

        【讨论】:

          【解决方案4】:

          我会将其存储在具有接口的新服务中。

          我所做的是让一个类具有所有属性/设置。它还将管理 XML 文件。

          控制反转容器允许您使用依赖注入将它们注入到您的其他类中。

          【讨论】:

          • 考虑到我认为不需要它的多个实例,我正在考虑将其设为静态类。不过不确定。
          • 一个合适的 IoC 容器默认只会构建一个。
          【解决方案5】:

          在您的类库中定义一个 Shared 属性来保存应用设置(Specialized.NameValueCollection 的一个实例)。然后在您的站点逻辑中,将此新属性从 global.asax 的 Application_Start 子中的 web.config 设置为您的 ASP.NET 设置。

          Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
              ' Code that runs on application startup
              DomainModel.Common.AppSettings = ConfigurationManager.AppSettings
          End Sub
          

          这样,您可以从类库项目中获取设置。

          【讨论】:

            猜你喜欢
            • 2017-05-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-10-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-08-27
            相关资源
            最近更新 更多