【问题标题】:Accessing keys in appSettings in App.config across multiple projects in solution在解决方案中跨多个项目访问 App.config 中的 appSettings 中的键
【发布时间】:2021-05-05 14:48:07
【问题描述】:

我有大约 7 个不同项目的 C# 解决方案,每个项目都有自己的类来访问我们的数据库。现在我将数据库服务器、用户名和密码存储在启动项目的 app.config 文件的 AppSettings 中。

App.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key ="dbServer" value="localhost"/>
    <add key ="dbUser" value ="admin"/>
    <add key ="dbPassword" value ="pw"/>
  </appSettings>
 ...
</configuration>

在同一个启动项目中,我创建了一个类来查询这些值:

public static class DBConfiguration
{
    public static String getDBServer
    {
        get { return ConfigurationManager.AppSettings["dbServer"]; }
    }

    public static String getDBUser
    {
        get { return ConfigurationManager.AppSettings["dbUser"]; }
    }

    public static String getDBPassword
    {
        get { return ConfigurationManager.AppSettings["dbPassword"]; }
    }
}

现在,当我在我的单元测试项目中时,我正在尝试调用 DBConfiguration.getDBServerDBConfiguration.getDBUser 等,它返回 null。如果我将相同的 appSettings 复制到 UT app.config 中,我会得到结果。我有点困惑这是如何工作的。由于 DBConfiguration 位于启动时 - 对 DBConfiguration 的调用不应该在启动时引用 app.config 吗?

另外,我已经添加了对System.Configuration的引用。

【问题讨论】:

  • 查看编辑。我想更多地了解你们面临的需要差异的场景

标签: c# app-config appsettings


【解决方案1】:

您所看到的是设计使然。 ConfigurationManager 将从当前正在执行的程序集中提取设置。因此,如果您的单元测试是当前正在执行的程序集,ConfigurationManager 将从该 app.config 中获取其设置。这对于您连接到不同数据库以进行测试的场景非常有用(您应该这样做)

编辑

好吧,根据你刚才提到的关于你是如何设置的,我觉得有必要问你为什么要这样设置,为什么要检查你是否在生产中。当然,这有正当的理由,但我认为 99% 的情况下,只要有一点远见,就可以避免这种情况。但是,由于您的帖子更多地是关于 app.config 文件,所以我会坚持下去。当您有相同的开发人员都需要测试与数据库的某些交互时,可以采用几种方法。一种方法(也是我最熟悉的一种方法)是使用存储库模式,其中您有一个根据类返回或设置事物的接口。典型的样板代码类似于以下内容:

public interface IRobotRepository()
{
    IEnumerable<Robot> GetAllRobots();
    Robot GetRobot(RobotParameters parameters);
    void DeleteRobots();
    void DeleteRobot(Robot robotToDelete);
}

授予存储库不必同时具有 getter 和 setter,关键是它是一种说明您想要从存储库(例如数据库)中获得什么的意图的方式。这很简单,这就是我要表达的意思。有了它,您可以轻松地对其进行模拟并测试专门依赖于该数据的功能。不需要特定的配置,只需要内存中的所有东西。然后对于集成测试,您可以测试存储库是否按预期工作。尽管您可以在每个开发人员的计算机上都说存储库(例如使用 SqlLocalDb 或 Sqlite 的内存数据库),但需要更多的工作来使其与生产同步。只是要平衡成本。另一种选择是拥有一个共享的公共 QA/Dev/Sandbox 数据库。这种方法也需要权衡取舍,但通常没什么大不了的。

请记住,这只是一种方法,还有很多其他方法会让人们尖叫到死是最好的方法。我只想指出,有多种方法可以让多个开发人员针对数据库进行测试。我很想看看你的方法最终是什么,并说明你为什么走这条路。

【讨论】:

  • 我们实际上有 2 个数据库,一个作为沙箱,一个用于生产。我有代码来区分它们,但我们使用的默认数据库连接是 localhost,以便开发人员也可以在他们自己的机器上使用它。有没有办法在整个解决方案中使这些变量中的任何一个永久存在?我们遇到的这个问题是声明这些变量的位置有多个,我正在尝试设置一个 DB: production、sandbox、local 声明一次并在整个解决方案中使用。
猜你喜欢
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多