2014-09-29 23 views
5

就像一個例子,我創建了一個發送電子郵件的類庫(Email.DLL)。爲了發送電子郵件,SmtpClient需要憑證,這些憑證當前正從app.config中讀取。其他開發人員如何知道類庫正在使用app.config?或者我應該消除app.config?

所以現在我創建了一個單獨的控制檯應用程序(SendStuff.exe)來發送電子郵件,所以我添加了Email.dll作爲參考。作爲創建DLL和控制檯應用程序的人員,我知道我需要在app.config的控制檯應用程序appSettings中添加相應的鍵以便發送電子郵件。

現在,假設有人使用該DLL。他如何知道他的應用程序需要包含合適的appSettings以便我的Email.DLL可以發送電子郵件?

或者從類庫中刪除app.config並找到其他方式來設置憑據會更好嗎?

+0

這個「別人」是否可以訪問代碼?這可能更好地在https://programmers.stackexchange.com/上提出,因爲這不是一個真正的編碼問題。 – user1666620 2014-09-29 16:42:28

+8

您應該將配置項目公開爲屬性,以便應用程序可以設置它們。應用程序獲取它們的位置完全取決於其他程序員。他是首先得到支持電話的人,所以他是需要保持控制的人。 – 2014-09-29 16:43:39

+1

我會拋出異常。什麼消除了app.config呢?他們必須來自某個地方,如果在某個地方找不到他們,你需要處理。我喜歡Hans的評論。 – Paparazzi 2014-09-29 16:45:06

回答

4

使用本地配置文件是一個完美的標準方法。通常情況下,您需要將這些信息包含在隨附的文檔中。通常,有一個入門教程頁面。

雖這麼說,我也想實現明確可操作例外是當這些配置值丟失拋出。例如:

在App.config中找不到SMTP憑據。查看文檔以獲取更多信息。

最後,如果你的東西分發您的圖書館一樣NuGet,可以自動include default configurations當庫通過封裝經理補充說,將被設置。

+0

請注意,程序集(類庫)不使用它們自己的app.config,您將依賴應用程序/站點的作者將值複製到它自己的應用程序配置中。 – 2014-09-29 16:50:10

+0

+1:用於「標準方法」。當決定使用它時,看看你是否打算爲你的庫編寫單元測試 - 依賴於.config而沒有中間的「配置」對象將會使得測試變得困難......並且當你使用「配置」對象方法時,你可以讓用戶選擇任何他們想要填充你的配置對象... – 2014-09-29 16:52:44

+0

我真的很喜歡像* NHibernate *這樣的庫,它可以讓你流利地配置框架或者通過配置文件。這是我會採取的方法。 – 2014-09-29 16:53:47

2

我能想到的兩個高層次的方法,根據不同的回答一個問題...

  • 是否從消費代碼這個庫抽象及其實施細則?

如果「是」,那麼我會向庫提供樣本app.config以演示如何配置它。當該庫加載時,它可以檢查配置值並在它們不可用時拋出異常。這可能是在的情況下非常有用,例如,通用消息界面,耗時代碼並不需要知道它的電子郵件:

public class Messenger : IMessenger 
{ 
    public Messenger() 
    { 
     // maybe confirm config values here 
    } 

    public void Send(string message, User recipient) 
    { 
     // implementation details 
    } 
} 

讓異常很明確,從而很明顯的問題是什麼。

另一方面,如果答案是「否」並且庫的「SMTP-ness」不需要位於更抽象的接口之後,那麼庫可以輕鬆地在需要配置時你使用它:

public class Messenger 
{ 
    public Messenger(string smtpServer, int port) 
    { 
     // set the local class values from the supplied values 
    } 

    public void Send(string message, string recipientEmail) 
    { 
     // implementation details 
    } 
} 

這會從配置細節中完全取消耦合庫並強制消耗代碼提供這些值。對於使用該庫的開發人員來說,這更加明顯。但是,它確實要求代碼靜態地公開實現細節,所以它不那麼抽象。優點和缺點。

0

在我看來,最好不要從你的庫中讀取證書。讓調用者將證書傳遞給smtp客戶端。

例如爲:

SmtpClient client = new SmptClient(string username, string password); 

這使得明顯他需要做的,這樣他可以使用什麼類消費者。用戶仍然可以決定將用戶名/密碼存儲在app.config中,或從其他位置(例如數據庫)提取憑證。

我同意使用app.config並不少見,但我只會建議如果數據不能輕易地從代碼內傳遞到組件。

即使數據結構很複雜(例如配置記錄器),您仍應該給消費者純粹使用代碼的可能性。所以例如log4net通常使用配置文件進行配置,但您始終可以使用Configure()方法來解決它。

log4net.Config.XmlConfigurator.Configure(XmlElement element) 
相關問題