就像一个例子,我创建了一个发送电子邮件的类库(Email.DLL)。要发送电子邮件,SmtpClient
需要凭据,这些凭据当前正在从app.config中读取。
所以现在我创建了一个发送电子邮件的独立控制台应用程序(SendStuff.exe),因此我添加了Email.dll作为参考。作为创建DLL和控制台应用程序的人,我知道我需要在app.config的控制台应用程序appSettings
中添加适当的密钥才能发送电子邮件。
现在,让我们说其他人使用DLL。他怎么知道他的应用程序需要包含适当的appSettings
以便我的Email.DLL可以发送电子邮件?
或者从类库中删除app.config并找到其他设置凭据的方法会更好吗?
答案 0 :(得分:4)
使用本地配置文件是一种完美的标准方法。通常,您会将此信息包含在库附带的文档中。通常,有一个入门或教程页面。
话虽如此,我还会实现 clear 和可操作的异常,这些异常会在缺少这些配置值时引发。类似的东西:
无法在App.config中找到SMTP凭据。有关详细信息,请参阅文档。
最后,如果您使用NuGet之类的内容分发库,则可以自动include default configurations在通过包管理器添加库时自动设置。
答案 1 :(得分: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
}
}
这将完全从配置细节中拆分库,并强制消费代码提供这些值。对于使用该库的开发人员来说,这更为明显。但是,它确实需要通过代码静态公开实现细节,因此它的抽象性较低。无论哪种方式都有利有弊。
答案 2 :(得分:0)
在我看来,最好不要从库中读取凭据。让调用者将凭证传递给smtp客户端。
e.g:
SmtpClient client = new SmptClient(string username, string password);
这使消费者明白他需要做什么才能使用该课程。消费者仍然可以决定将用户名/密码存储在app.config中,或者从其他地方(例如数据库)提取凭证。
我同意使用app.config并不罕见,但我只是建议如果数据无法从代码中轻松传递给组件。
即使数据结构很复杂(例如配置记录器),您仍然应该让消费者可以完全从代码中使用您的组件。所以例如log4net通常配置有配置文件,但是您始终可以使用Configure()方法来解决它。
log4net.Config.XmlConfigurator.Configure(XmlElement element)