我有这三个项目的解决方案。
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。
因此有两个问题。
答案 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?
这里有几个选项,