2010-08-25 18 views
1

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

回答

2

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

6

一般来说,你会被告知这不能完成。但是,您肯定可以使用System.Configuration.ConfigurationManager.OpenExeConfiguration方法加载配置文件。您可以将文件路径传递到您的程序集(尽管有方法名称,它不一定是可执行文件)。

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

下面是一个“Settings”类的简单示例,它为它所属的程序集加载一个.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组件仍然希望从可执行文件的配置文件中加载设置。

相关问题