解决方案的单个配置文件

时间:2013-03-19 09:42:16

标签: c# web-config projects-and-solutions

现在我以不同的方式在SO上看过这个问题,但令人惊讶的是不是这种形式:

我有一个需要互相交流的多个Web服务(项目)的解决方案。发布后,这些Web服务中的每一个都可能最终位于具有不同数据库的不同计算机上。为了告诉每个Web服务所有其他Web服务的位置,我想在开发期间维护一个配置文件。

我希望在发布配置后出现在每个已发布的项目中。我希望配置文件在发布后可以编辑,这样我就可以快速迁移某个Web服务,然后只编辑其他Web服务的所有配置文件。

我不想在数据库中这样做,对于配置文件,它自己也应该保持对数据库的连接设置。

我遇到了以下想法/想法/问题:

  • 我有一个名为'common'的dll项目,由其他项目引用。让我们给它一个shared.config并在该项目中构建一个类,可以通过执行System.Configuration.ConfigurationManager.OpenExeConfiguration("shared.config")来读出shared.config。只需要确保shared.config将与DLL一起发布。

我赞成这个解决方案,因为它还允许我在每个项目中保留web.config,只有项目特定的设置。并让shared.config具有共享设置。但是,我在读到这一点时,不应该轻易考虑这一点,并且可能会产生一些不必要的副作用,例如文件访问问题;虽然我想知道这是否适用于我的情况。此外,我想请求您的帮助,如何实际实现这一点,因为我认为Visual Studio不支持开箱即用的DLL项目的app.config。

  • 我还考虑过在解决方案项目中创建一个shared.config文件。然后在每个项目中链接该文件。在每个项目的Web.config中,添加:<appSettings configSource="shared.config" />指向该项目中的链接文件。

虽然我找不到任何理由不这样做,但第一次实施失败了。看来(至少在开发期间),c#无法找到链接的shared.config文件。我猜测创建链接文件后链接文件不会立即完成,也不会维护,但文件只会在我发布时复制到项目中。因此在开发期间丢失文件。这是对的吗?

3 个答案:

答案 0 :(得分:6)

配置文件是特定于应用的。这意味着您可以将配置文件添加到类库中,但该文件将由引用该库的应用程序(Windows服务,Web服务等)使用。

外部configSource也是如此,这也是应用程序特定的,需要包含在使用它的项目中。 因此,如果您的解决方案由2个项目组成,那么您需要2个配置文件。每个项目一个。

对于基于Windows的应用程序(服务,winforms),配置文件的预期文件夹是bin目录,对于基于Web的项目,这将是目录是虚拟目录的根文件夹。

这就是说,使用共享配置文件看起来更容易解决(并且您不必为每个项目从类库中复制app.config)。以下是步骤:

  • 创建解决方案文件夹。
  • 将配置文件添加到其中。
  • 将文件添加为需要它的每个项目的参考。右键单击该项目,然后 添加现有项 - &gt;选择文件并 添加为链接
  • 通过使用Copy Always。
  • 设置复制选项(文件属性),确保始终复制文件

此时,每次编译解决方案时都应该将配置文件部署到项目目录中。

编辑:

  • 我会避免在网络应用程序中查找bin中的配置文件 约定是该文件应该在根目录中,所以我会避免使用 第一个选择。
  • 链接文件在构建项目后最终在bin中。尝试使用相同的步骤导入文件,但这次只需添加它(不作为链接),它将作为内容部署在您网站的根目录中,因此它始终可用。

答案 1 :(得分:0)

如果您在IIS中托管,则可以在根站点级别拥有一个web.config文件,但Giorgio是正确的,因为app.config文件是特定于应用程序的。可以使用自定义构建步骤在多个项目中自动复制配置文件,所以我个人会这样做。

答案 2 :(得分:0)

这实际上让我有点疯狂。最后我修理了这个:

  • 在dll项目'common'中创建了一个Shared.config文件,其内容看起来像普通的web.config / app.config。
  • 将文件设置为内​​容并始终复制,因此肯定会将其复制到引用项目常用项的所有项目中。 (虽然配置文件确实会在bin文件夹中结束。
  • 在公共项目中创建了类SharedConfiguration。真正棘手的部分是必须使用Open Mapped ExeConfiguration(),并获取可执行目录的路径(包括bin,并且前面没有file://)。
  • 现在,当我想从共享设置中访问设置时,我会SharedConfiguration.instance.AppSettings.Settings["CubilisEntryPointUrl"].Value

(由于this issue

,我无法直接使用SharedConfiguration.instance.AppSettings["CubilisEntryPointUrl"]

public static class SharedConfiguration
{
    public static readonly Configuration instance = GetConfiguration("Shared.config");
    private static Configuration GetConfiguration(string configFileName)
    {
        ExeConfigurationFileMap exeConfigurationFileMap = new ExeConfigurationFileMap();
        Uri uri = new Uri(Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase));
        exeConfigurationFileMap.ExeConfigFilename = Path.Combine(uri.LocalPath, configFileName);
        return ConfigurationManager.OpenMappedExeConfiguration(exeConfigurationFileMap, ConfigurationUserLevel.None);
    }
}