【问题标题】:Application Wide Settings Available to All Projects适用于所有项目的应用程序范围设置
【发布时间】:2011-03-10 04:22:03
【问题描述】:

我有一个包含 3 个项目的解决方案,每个项目都需要访问某些设置。我正在寻找一种方法,让这些设置值可用于来自 1 个不同来源的任何项目。我不能使用 .Config 文件,因为它与该特定项目有关。

我可以使用数据库,但被告知这是不好的做法(没有理由)

有什么想法吗?

【问题讨论】:

  • 我们说的是 WinForms/desktop 还是 ASP.Net?
  • 始终将设置存储在数据库中,连接到数据库所需的设置或特定于工作站的设置除外。该数据库强大且集中,旨在存储数据;设置就是数据!

标签: c# settings


【解决方案1】:

你可以这样做:

  • 在您的解决方案文件夹中创建一个solution.config
  • 在每个项目的app.config 中,将此添加到您的<appSettings> 节点:

    <appSettings file="solution.config">
      ....
    </appSettings>
    

您必须在每个项目文件夹中放置指向公共solution.config 的符号链接 - 但您可以在项目之间共享一个物理文件。

&lt;appSettings&gt; 节点是唯一允许这种“累积”设置的节点 - 那些来自 file= 中指定的文件的设置将被添加到您的应用程序设置中,但可能会被您在您的应用程序中明确指定的任何内容覆盖app.config.

另一方面,是的,当然,您可以使用数据库。我们在大多数项目中也这样做,因为我们通常可以访问数据库,但不能访问客户端服务器机器中的文件系统。我不明白为什么这一定是一件坏事——我们在一张表中有 DEV、TEST 和 PROD 的设置——所以你将所有设置放在一个地方——我们会在需要时选择我们需要的设置。工作得很好——当然,像数据库的连接字符串这样的一些设置不能存储在那里——但是我们的大部分配置信息是。再说一遍:我真的不认为这本身应该是一个糟糕的选择 - 所以除非你的消息来源可以用一些事实和理由支持他/她的陈述,否则我会忽略它。

【讨论】:

    【解决方案2】:

    您可以在已定义的 configSection 中定义 configSource 属性,以引用从中加载属性的外部文件。 在这里你可以找到一个例子:

    Is there any way for an App.config file to reference another full config file? (.NET)

    当然,您也可以使用数据库,但这可能涉及开发某种配置控制台,因为将配置属性直接管理到数据库中并不是一个好习惯。

    否则,您可以创建配置文件(例如 xml 或 yaml)并创建自己的共享配置解析器。

    【讨论】:

      【解决方案3】:

      我创建了一个类来使用单例模式或全局实例(无论您喜欢哪个)来保存系统范围的设置。

      如果解决方案中有另一个项目,它可以看到类(添加引用时)。

      这也将设置的呈现与存储机制(数据库、配置文件、自定义 XML 文件等)分离,如果您针对界面进行设计,它也会使单元测试更加灵活。

      【讨论】:

        【解决方案4】:

        您可以在每个项目的 .config 文件中添加一个指向全局文件的条目。不过,您需要在三个地方阅读。

        另一个想到的解决方案是将常用设置放入它们自己的程序集中,并使用它自己的 .config 文件。然后,您将该程序集包含在您的每个项目中。 .config 文件在程序集中读取,您可以读出您需要的那些值。

        【讨论】:

        • 我发现如果将设置添加到另一个程序集的.config 中,然后使用调用该程序集中的函数来读取它,它会使用本地项目的配置
        • @Pino - 我确定我以前做过,但它是在一家老公司,所以我没有来源来仔细检查。我现在得调查一下。
        【解决方案5】:

        什么样的设置?

        您可以将系统范围的 machine.config 和 web.config 文件用于适用于整个计算机的设置。

        \Windows\Microsoft.NET\Framework[64]\[version]\config\machine.config
        \Windows\Microsoft.NET\Framework[64]\[version]\config\web.config
        

        【讨论】:

          【解决方案6】:

          如果您有权访问注册表,则可以使用它。那么你所需要的只是一个类来读出它们(并可能把它们放进去),每个项目都可以使用这个类来读取它们。

          但主要的缺点是您必须将设置添加到运行解决方案的每台计算机注册表中。

          【讨论】:

          • 哦,男孩 - 注册表 - 那是 1990 年代......这真的是死技术 - 克服它。使用比注册表更易于管理的东西.....
          猜你喜欢
          • 2012-04-26
          • 1970-01-01
          • 2012-09-18
          • 1970-01-01
          • 1970-01-01
          • 2020-03-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多