簡體   English   中英

其他開發人員如何知道類庫正在使用app.config? 或者我應該消除app.config?

[英]How can other developer know that class library is using app.config? Or should I just eliminate app.config?

舉個例子,我創建了一個發送電子郵件的類庫(Email.DLL)。 為了發送電子郵件, SmtpClient需要憑據,這些憑據當前正在從app.config中讀取。

所以現在我創建了一個發送電子郵件的獨立控制台應用程序(SendStuff.exe),所以我添加了Email.dll作為參考。 作為創建DLL和控制台應用程序的人,我知道我需要在app.config的控制台應用程序appSettings中添加適當的密鑰才能發送電子郵件。

現在,讓我們說其他人使用DLL。 他怎么知道他的應用程序需要包含適當的appSettings以便我的Email.DLL可以發送電子郵件?

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

使用本地配置文件是一種完美的標准方法。 通常,您會將此信息包含在庫附帶的文檔中。 通常,有一個入門教程頁面。

話雖如此,我還將實現在缺少這些配置值時拋出的明確可操作的異常。 就像是:

無法在App.config中找到SMTP憑據。 有關更多信息,請參閱文檔

最后,如果您使用NuGet之類的東西分發庫,則可以自動包含在通過包管理器添加庫時將設置的默認配置

我可以想到兩個高級方法,取決於一個問題的答案......

  • 該庫是否從消費代碼中抽象出其實現細節?

如果“是”,那么我將向庫提供一個示例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
    }
}

這將庫完全與配置細節分離,並強制消費代碼提供這些值。 對於使用該庫的開發人員來說,這更為明顯。 但是,它確實需要通過代碼靜態公開實現細節,因此它的抽象性較低。 無論哪種方式有利有弊。

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

例如:

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

這使得消費者明白他需要做什么才能使用該課程。 消費者仍然可以決定將用戶名/密碼存儲在app.config中,或者從其他地方(例如數據庫)提取憑據。

我同意使用app.config並不罕見但我只建議如果數據無法從代碼中輕松傳遞給組件。

即使數據結構很復雜(例如配置記錄器),您仍然應該讓消費者可以完全從代碼中使用您的組件。 因此,例如log4net通常配置有配置文件,但是您始終可以使用Configure()方法來解決它。

log4net.Config.XmlConfigurator.Configure(XmlElement element)

暫無
暫無

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

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