簡體   English   中英

在解決方案中的多個項目中訪問App.config中appSettings中的鍵

[英]Accessing keys in appSettings in App.config across multiple projects in solution

我有一個大約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的引用。

您所看到的是設計使然。 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數據庫。 這種方法也存在一些折衷,但通常沒什么大不了的。

請記住,雖然這只是一種方法,但還有很多其他方法會讓人們尖叫到死亡,這是最好的方法。 我只想指出,有多種方法可以對數據庫進行多個開發人員測試。 我很想知道您的方法最終成為什么,並說明您為什么走這條路。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM