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

时间:2016-02-09 15:27:32

标签: asp.net-web-api2 publishing slowcheetah xdt-transform

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

  • Web API
  • DAL

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>

我安装了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. 为什么发布NOT在引用的类库中使用xdt变换?
  2. 如果应用程序设置块必须位于Web API项目的web.config中,这是否意味着我应该从DAL中删除Web引用并将其添加到Web API项目中? ...或者我可以单独保留引用并将相关的applicationSettings块复制到web.config中吗?

1 个答案:

答案 0 :(得分:0)

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

回答你的第一个问题,

  

为什么发布NOT在引用的类库中使用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,但将您的网络引用保留在DAL中。然后,您可以在运行时设置服务的URI。如图所示here
  3. [理想]将DAL合并到Web Api中。我觉得这是理想的,因为除非您想跨项目共享DAL,否则没有理由将其移动到单独的项目中。事实上,你似乎面临着这个问题,因为你首先把它移出去了。所以除非你有充分的理由这样做,否则这是最好的选择。