跨解决方案中的多个项目访问App.config中appSettings中的键

本文关键字:App config appSettings 访问 解决方案 项目 | 更新日期: 2023-09-27 18:20:40

我有一个由大约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的引用。

跨解决方案中的多个项目访问App.config中appSettings中的键

您所看到的是经过设计的。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/QC/沙盒数据库。这种方法也有一些折衷,但通常不会有什么大不了的。

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