引用程序集的Visual C#app.config文件

时间:2010-08-25 19:05:09

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

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

2 个答案:

答案 0 :(得分:6)

一般来说,你会被告知不能这样做。但是,您当然可以使用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文件复制到解决方案级别的“Configurations”文件夹,然后为可执行项目创建一个后构建步骤,以复制“配置“文件夹到输出文件夹。我不确定这实际上是否能正常工作,但如果确实如此,那么在构建后的步骤中你不会在项目之间创建额外的依赖关系(这可能会使维护变得困难)。

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

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

答案 1 :(得分:2)

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