解决方案的单个配置文件

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 创建解决方案文件夹。
  • 添加配置文件。
  • 添加文件作为每个需要它的项目的参考。 右键单击项目并添加现有项 – >选择文件并添加为链接
  • 通过使用“始终复制”设置复制选项(文件的属性),确保始终复制文件。

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

编辑:

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

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

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

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

(我不能直接使用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); } }