【问题标题】:Accessing the settings (app.config) of the calling application访问调用应用程序的设置 (app.config)
【发布时间】:2010-11-07 10:02:27
【问题描述】:

我有一个 WinForms 应用程序(“WF”)和一个由该 WinForms 应用程序调用的库(“LIB”)

WF 具有 Settings.settings(Visual Studio 设计器)和 app.config 组合。我收集的设计器是自动生成 app.config 文件的前端。要在 WF 中使用这些设置,我使用它自动生成的类的强类型属性(即 WF.Settings.MyTimeOutSetting)。

当 WF 调用 LIB 中的方法时,我想使用 lib 中的 WF 设置之一。如何在被调用者 (LIB) 代码中从调用者 (WF) app.config 中检索设置?

【问题讨论】:

    标签: .net visual-studio settings app-config


    【解决方案1】:

    与在 Windows 窗体中的方式相同。它将首先原子地查看调用应用程序的 app.config

    【讨论】:

    • LIB 不引用 WF。所以它不知道自动生成的 WF.Settings 类。
    • 您可能需要将 app.config 文件添加到您的 bizlayer 以进行编译/智能感知,但它不会在运行时使用它。你对 SubSonic 或 EntityFramework 之类的东西做同样的事情
    • 这是另一个类似问题的链接,但它可能不是您所需要的 stackoverflow.com/questions/685259/…
    【解决方案2】:

    在您的项目中添加对 System.Configuration 的引用。

    然后在您希望引用配置文件的特定 .cs 或 .vb(或其他)文件中添加以下内容:

    C#:使用 System.Configuration; VB:导入 System.Configuration

    然后您可以使用以下方式访问网络配置:

    C#: System.Configuration.CONfigurationManager.AppSettings["THE_SETTING_U_WANT"] ;

    VB: System.Configuration.CONfigurationManager.AppSettings("THE_SETTING_U_WANT")

    如果您想要一个完整的部分,我认为该类中也有方法可以做到这一点。

    【讨论】:

    • 看起来应该可以,但是 AppSettings 的 Count=0 并且索引器返回 null
    • 这对我来说总是很有效...但这取决于您要检索的信息。你想从你的 app.config 中检索什么设置?如果它在 部分中,则上述内容将不起作用。您也可以使用 GetSection() 或者您可以将要检索的信息移动到 部分,假设它符合键/值范式。即 - 另外,如果您尝试检索连接字符串,您可以尝试:ConfigurationManager.ConnectionStrings["NameOfConnStirng"];
    • 这可能会对你有所帮助:msdn.microsoft.com/en-us/library/…
    • "如果它在 部分中,则上述内容将不起作用" 应改为 - "将起作用"
    • 它在“”中——我会研究那个类。谢谢。
    【解决方案3】:

    答案是:不要这样做。

    让调用应用程序在调用中或在构造函数中向您传递您需要知道的任何信息。被调用的组件不需要调用者的知识。

    【讨论】:

    • 这不是必需的——它只是有用的。我敢打赌,有一种公认的方法可以做到这一点。
    • 公认的方法是不这样做。关注点分离,基于组件的开发;这些事情意味着调用者应该向被调用者提供它所需要的东西。这样,它可以在不同的上下文中调用。
    • 据我所知,app.config中的应用代表AppDomain,它们在同一个AppDomain中。正如我所说,该设置不是必需的,它只是用作提示。
    • 我想我不是很清楚。我的意思是,如果设置属于调用者,那么调用者应该将它传递给你。库应该对调用者一无所知,或者调用者正在使用什么设置。这允许不同的调用者使用完全不同的设置或完全不同的设置机制来调用同一个库。
    • 在调用者传递信息之前,他应该仍然能够使用这些信息。此外,仅仅因为您认为关注点分离是最好的方法,它可能不是。如果这是一个初学者项目或一个快速而肮脏的程序,那么关注点分离并不真正关心 (NPI) OP。
    【解决方案4】:

    就像约翰说的,这是个坏主意。调用者(在本例中为 exe)应将所需信息传递给 DLL。这样您就可以稍后在其他地方重新使用 DLL,并且不会对 app.config 设置产生一些“不可见”的依赖。

    试试这个:

    Dim oConfiguration As System.Configuration.Configuration
    oConfiguration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
    Dim sValue As String = oConfiguration.AppSettings.Settings("setting").Value
    

    【讨论】:

    • 是的,这也让我很恼火!
    • 我没有回答,因为我认为他很快就会找到错误的做法。我在问完问题六分钟后回答,那时他可能还认为这是个好主意。既然他决定不关心重复使用,他没有理由不知道如何去做。
    • 伙计们,您宁愿立即回答一些会导致进一步麻烦的问题,还是确保提问者知道他在问什么?他没有表示他永远不会从其他调用者那里调用此代码,并使用了“库”一词,这意味着重用。这个答案回答了他的问题,但限制了重用。此外,其他人会阅读这篇文章,我想确保他们知道为什么不阅读。
    • 他现在说它永远不会被重复使用。在那种情况下,我可以毫无问题地向他展示如何做到这一点。我会质疑为什么有一个单独的程序集,但可能调用者是一个网站,它会回答这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 2010-09-05
    • 2016-11-21
    • 1970-01-01
    • 2012-03-28
    • 2014-11-23
    相关资源
    最近更新 更多