引用的 class 库项目中的 Xdt 转换?

Xdt transformations in referenced class library project?

我有这三个项目的解决方案。

DAL 项目是一个具有 Web 引用的 class 库。因此,该项目中的 app.config 有一个这样的部分:

<applicationSettings>
    <Company.Project.Domain.Properties.Settings>
      <setting name="Company_Project_Domain_Some_Service" serializeAs="String">
        <value>http://my.server.local:8888/somePath/service.asmx</value>
      </setting>
    </Company.Project.Domain.Properties.Settings>
  </applicationSettings>

我已安装 slow cheetah 并在此 DAL 项目中使用配置转换。例如,我有一个 app.production.config 将上面的 Web 引用转换为指向生产 Web 引用,如下所示:

<applicationSettings>
    <Company.Project.Domain.Properties.Settings>
      <setting name="Company_Project_Domain_Some_Service" serializeAs="String">
        <value>http://my.PRODUCTIONSERVER.local:8888/somePath/service.asmx</value>
      </setting>
    </Company.Project.Domain.Properties.Settings>
</applicationSettings>

当我发布 API 时,web.config 不包含上面显示的任何应用程序设置。我可以使用反射器钻入 DAL.dll 并查看 service.asmx 路径。但是,它不进行转换,因此已发布的应用程序不使用 my.PRODUCTIONSERVER.local:8888.

所以两个问题。

  1. 为什么发布不使用引用的 class 库中的 xdt 转换?
  2. 如果应用程序设置块必须位于 Web API 项目的 web.config 中,这是否意味着我应该从 DAL 中删除 Web 引用并将其添加到 Web API 项目? ...或者我可以只留下参考并将相关的 applicationSettings 块复制到 web.config?

首先将 Web 引用添加到库中似乎不是一个好主意。因为库是可重用的代码片段,它们是自包含的,可以跨不同的项目使用。基于这种逻辑,我很想知道您为什么选择将 DAL 分离到一个项目中,而不是网络中的另一个文件夹 API。但我会把这个讨论留到以后再讨论。

回答你的第一个问题,

Why does publishing NOT use the xdt transform in the referenced class library?

发布只会转换您发布的 Web 应用程序内部的配置。我不确定你是如何发布你的应用程序的,但如果你使用命令行,你可能会做这样的事情。

 msbuild /p:PublishOnBuild WebApi.csproj

MsBuild 使用您的 .csproj 文件来构建和发布您的应用程序。 .csproj 中包含转换所需的信息。因此 MsBuild 不知道它需要从引用的库中转换 app.config,这就是为什么你的 DAL 配置没有被转换而只是被复制的原因。

继续你的第二个问题

If the application settings block MUST be in the web.config of the Web API project, does that mean I should remove the web reference from the DAL and add it to the Web API project? ...or can I just leave the reference alone and copy the relevant applicationSettings block to the web.config?

这里有几个选项,

  1. 像您提到的那样将 Web 引用移动到 Web API 项目并控制 web.config 中的 URI。这意味着您需要从 DAL 引用您的 Web API。
  2. 将应用程序设置块移动到 web.config,但将您的 Web 引用保留在 DAL 中。然后您可以在运行时设置服务的 URI。如图所示 here
  3. [理想] 将 DAL 合并到 Web Api。我觉得这是理想的,因为除非你想跨项目共享 DAL,否则没有理由将它移到一个单独的项目中。事实上,您似乎正面临这个问题,因为您首先将其移出。因此,除非您有充分的理由这样做,否则这是最佳选择。