2015-11-05 53 views
0

我有一个关于7个不同项目的C#解决方案,每个项目都有自己的类来访问我们的数据库。现在,我将数据库服务器,用户名和密码存储在启动项目的app.config文件的AppSettings中。在解决方案中的多个项目中的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的引用。

+0

请参阅编辑。我希望看到更多关于你们所面临的需要改变的情景 –

回答

0

你看到的是设计。 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数据库。这种方法也存在权衡,但通常不是什么大问题。

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

+0

我们实际上有2个数据库,一个是沙箱,一个是生产。我有代码来区分它们,但我们使用的默认数据库连接是localhost,因此开发人员可以在自己的机器上使用它。无论如何要在整个解决方案中延续这些变量吗?我们遇到的这个问题是有多个位置声明了这些变量,并且我试图设置DB:生产,沙箱,本地声明一次,并在整个解决方案中使用。 – user2936644