C# 适用于所有项目的应用程序范围设置

C# 适用于所有项目的应用程序范围设置,c#,settings,C#,Settings,我有一个3个项目的解决方案,每个项目需要访问特定的设置。我正在寻找一种方法,使这些设置值可用于来自不同来源的任何项目。我不能使用.Config文件,因为它与特定项目相关 我可以使用数据库,但有人告诉我这不是好的做法(没有理由) 有什么想法吗?你可以这样做: 在解决方案文件夹中创建solution.config 在每个项目的app.config中,将其添加到节点: <appSettings file="solution.config"> .... </appSettings

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

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

有什么想法吗?

你可以这样做:

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

    <appSettings file="solution.config">
      ....
    </appSettings>
    
    
    ....
    
您必须在每个项目文件夹中放置指向通用
solution.config
的符号链接,但您可以在项目之间共享一个物理文件

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


另一方面,是的,当然,你可以使用数据库。在我们的大多数项目中,我们也这样做,因为我们通常可以访问数据库,但不能访问客户端服务器机器中的文件系统。我不明白为什么这一定是一件坏事——我们在一个表中有DEV、TEST和PROD的设置——所以您将所有设置放在一个地方——我们在需要时选择这些设置。工作正常-当然,一些设置,如数据库的连接字符串,不能存储在那里-但我们的配置信息的大部分是。再次声明:我真的看不出这本身是一个错误选择的任何原因-因此,除非您的源代码可以用一些事实和理由支持他/她的声明,否则我将忽略它。

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

当然,您也可以使用DB,但这可能涉及到开发某种配置控制台,因为将配置属性直接管理到DB中不是一种好的做法


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

您可以在每个projects.config文件中添加一个指向全局配置的条目。不过,你需要在三个地方读到这一点


另一个让人想到的解决方案是将您的公共设置与自己的.config文件一起放入它们自己的程序集中。然后将该程序集包括在每个项目中。.config文件在程序集中读取,您可以读取所需的值。

什么类型的设置

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

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

如果您有权访问注册表,则可以使用它。然后,您只需要一个类来读取它们(可能还有一个类将它们放入),每个项目都可以使用该类来读取它们


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

我创建了一个类,使用单例模式或全局实例(以您喜欢的为准)保存系统范围的设置

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


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

我们这里说的是WinForms/desktop还是ASP.Net?我总是将设置存储在数据库中,除了连接到数据库所需的设置,或特定于工作站的设置。数据库稳健且集中,旨在存储数据;设置是数据!我发现,如果您将该设置添加到另一个程序集的.config中,然后使用该程序集中的某个函数来读取该设置,它将使用本地project@Pino-我肯定我以前做过,但那是在一家老公司,所以我没有来源来再次检查。我现在要调查了。哦,天哪,登记处,那是1990年代。。。。。这真是一种过时的技术——克服它吧。使用比注册表更易于管理的工具。。。。。