跨解决方案中的多个项目访问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.getDBServer
、DBConfiguration.getDBUser
等,但它返回null。如果我将相同的appSettings复制到UT app.config中,我会得到结果。我有点困惑这是怎么回事。由于DBConfiguration位于启动中,对DBConfiguration的调用不应该也引用启动中的app.config吗?
此外,我已经添加了对System.Configuration
的引用。
您所看到的是经过设计的。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/沙盒数据库。这种方法也有一些折衷,但通常不会有什么大不了的。
但请记住,这只是一种方法,还有很多其他方法会让人们尖叫致死,这是最好的方法。我只想指出,有多种方法可以让多个开发人员针对数据库进行测试。我很想看看你的方法最终会是什么,并展示你为什么走这条路。