【问题标题】:Visual C# app.config file for a referenced assembly引用程序集的 Visual C# app.config 文件
【发布时间】:2011-04-03 22:00:21
【问题描述】:

我们有一个 Visual Studio 2010 解决方案,其中包含多个符合 Jeffery Palermo 的洋葱架构模式 (http://jeffreypalermo.com/blog/the-onion-architecture-part-1/) 的 C# 项目。我们有一个 UI 项目,它是一个 ASP.Net MVC 项目,我们有一个名为 Infrastructure 的 C# 类库项目,它被 UI 项目引用。在我们的基础设施项目中,我们添加了一个 app.config 文件来包含特定于基础设施项目的设置。在运行时,app.config 文件似乎对 Infrastructure 项目不可用,只有 UI 项目中包含的 web.config 文件可用。我们不想将与 Infrastructure 项目相关的设置放入 UI 项目的 web.config 文件中,UI 不需要这些设置。我们如何使基础设施的 app.config 文件在运行时可用?我们在想也许我们应该在构建应用程序时放置一个 Post Build Copy 以将 app.config 复制到 UI 目录 - 这是正确的方法,还是有更好的方法?

【问题讨论】:

    标签: c# visual-studio-2010 reference app-config


    【解决方案1】:

    通常,您会被告知无法执行此操作。但是,您当然可以使用 System.Configuration.ConfigurationManager.OpenExeConfiguration 方法加载配置文件。您可以将文件路径传递给您的程序集(它不必是可执行文件,尽管有方法名称)。

    当然,这不会将程序集的配置设置合并到正在执行的应用程序的配置设置中,我认为不应该这样做。您的程序集只需知道它需要通过与 System.Configuration.ConfigurationManager.GetSection 函数或该类的静态 AppSettings 属性不同的机制来检索其设置。

    以下是“设置”类的一个非常简单的示例,该类为它所属的程序集加载 .config 文件。

    public static class Settings
    {
        public static System.Configuration.Configuration Configuration { get; private set; }
    
        static Settings()
        {
            // load a .config file for this assembly
            var assembly = typeof(Settings).Assembly;
            Configuration = System.Configuration.ConfigurationManager.OpenExeConfiguration(assembly.Location);
    
            if (Configuration == null)
                throw new System.Configuration.ConfigurationErrorsException(string.Format("Unable to load application configuration file for the assembly {0} at location {1}.", assembly.FullName, assembly.Location));
        }
    
        // This function is only provided to simplify access to appSettings in the config file, similar to the static System.Configuration.ConfigurationManager.AppSettings property
        public static string GetAppSettingValue(string key)
        {
            // attempt to retrieve an appSetting value from this assembly's config file
            var setting = Configuration.AppSettings.Settings[key];
            if (setting != null)
                return setting.Value;
            else
                return null;
        }
    }
    

    还有用法……

    public class UsageExample
    {
        void Usage()
        {
            string mySetting = Settings.GetAppSettingValue("MySetting");
    
            var section = Settings.Configuration.GetSection("MySection");
        }
    }
    

    现在,您仍然需要解决构建问题。将“应用程序配置文件”(App.config) 项添加到类库程序集确实会导致 Visual Studio 将其作为 .dll.config 复制到该程序集的输出文件夹,但不会自动复制到任何可执行应用程序的输出文件夹那个引用那个项目。因此,您需要添加一个构建后步骤以将文件复制到适当的位置,如您所述。

    我会考虑在类库上进行构建后步骤,将 .config 文件复制到解决方案级别的“配置”文件夹,然后对可执行项目进行构建后步骤,以从“配置”文件夹到输出文件夹。我不确定这是否真的有效,但如果有效,那么您就不会在构建后步骤中在项目之间创建额外的依赖关系(这可能会使维护变得困难)。

    编辑:最终,您应该考虑这是否真的是您想要做的。这不是正常的方法,通常使用 configSource 属性提到的这个问题的其他答案可能会更好地为您服务。

    这种方法的缺点可能并不明显,即您无法将第三方组件的设置放入类库的配置文件并期望它们被使用。例如,如果您的类库使用 log4net,则不能将 log4net 的设置放在类库的配置文件中,因为 log4net 组件仍然希望从可执行文件的配置文件中加载设置。

    【讨论】:

      【解决方案2】:

      即使您在构建后复制 app.config,它也无法解决您的问题。该应用程序仍然是一个 Web 应用程序,因此配置系统将使用 web.config 文件。设置将需要以一种或另一种方式进入那里。使这些设置保持独立的一种方法是将它们放入自定义配置部分,然后将此部分的设置放入单独的文件中。它仍然需要从 web.config 中引用(使用 configSource 属性)。

      【讨论】:

        猜你喜欢
        • 2015-05-28
        • 2013-06-21
        • 2012-07-16
        • 2011-12-13
        • 1970-01-01
        • 2012-04-21
        • 2013-06-01
        • 1970-01-01
        • 2014-06-22
        相关资源
        最近更新 更多