1

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

  • 网络 API
  • 达尔
  • 领域

DAL 项目是一个具有 Web 引用的类库。因此,该项目中的 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>

我安装了慢速猎豹,并在这个 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. 为什么发布不使用引用类库中的 xdt 转换?
  2. 如果应用程序设置块必须在 Web API 项目的 web.config 中,这是否意味着我应该从 DAL 中删除 Web 引用并将其添加到 Web API 项目中?...或者我可以只留下参考并将相关的 applicationSettings 块复制到 web.config 吗?
4

1 回答 1

0

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

要回答你的第一个问题,

为什么发布不使用引用类库中的 xdt 转换?

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

 msbuild /p:PublishOnBuild WebApi.csproj

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

继续你的第二个问题

如果应用程序设置块必须在 Web API 项目的 web.config 中,这是否意味着我应该从 DAL 中删除 Web 引用并将其添加到 Web API 项目中?...或者我可以只留下参考并将相关的 applicationSettings 块复制到 web.config 吗?

你有几个选择,

  1. 像您提到的那样将 Web 引用移动到 Web API 项目并控制 web.config 中的 URI。这意味着您需要从 DAL 引用您的 Web API。
  2. 将应用设置块移动到 web.config,但将您的 Web 引用保留在 DAL 中。然后您可以在运行时设置服务的 URI。就像这里显示的
  3. [理想] 将 DAL 合并到 Web Api 中。我觉得这是理想的,因为除非您想跨项目共享 DAL,否则没有理由将其移至单独的项目中。实际上,您似乎正面临这个问题,因为您首先将其移出。因此,除非您有充分的理由这样做,否则这是最佳选择。
于 2016-05-31T10:49:45.760 回答