一组 DataContracts 的两个服务。如何只生成服务和实现?

Two services for one set of DataContracts. How do I generate only the Service and Implementaiton?

这是我的基本场景。我有三个服务。一个是独立的,并且大多不会引起问题。其他两个服务托管在同一个项目中,几乎共享所有相同的 DataContracts。这意味着包含在同一个项目中,它们会引起很多冲突。

不幸的是,简单地删除重复的 类 不是一个选项,因为我的公司开始自动化我们的构建,这需要进入预构建事件并使用 svcutil.exe .

我首先尝试添加一个名为 MyProject.DataContracts 的程序集。然后,在 MyProject.DataContracts 的预构建中,我会 运行 这个:

mkdir "$(ProjectDir)SVC"
chdir "$(ProjectDir)SVC"
svcutil /t:metadata http://localhost/Cmpny.FirstHost.ServiceHost/Foo.svc http://localhost/Cmpny.FirstHost.ServiceHost/Bar.svc http://localhost/Cmpny.StandaloneService.ServiceHost/Service.svc /r:"D:\TFSMAP\AssemblyReferences\Microsoft.Practices.EnterpriseLibrary.Validation.Integration.WCF.dll" /collectionType:System.Collections.Generic.List`1
svcutil /t:code /language:VB Cmpny.FirstHost.DataContracts*.xsd /serializer:DataContractSerializer /dcOnly /out:Cmpny.FirstHost.DataContracts /n:*,Contracts
svcutil /t:code /language:VB Cmpny.StandaloneService.DataContracts*.xsd /serializer:DataContractSerializer /dcOnly /out:Cmpny.StandaloneService.DataContracts /n:*,Contracts
copy Cmpny.StandaloneService.DataContracts.vb "$(ProjectDir)Service References"
copy Cmpny.FirstHost.DataContracts.vb "$(ProjectDir)Service References"
chdir "$(ProjectDir)"
rmdir /S /Q "$(ProjectDir)SVC"

这 运行s,替换文件,并使用新文件构建项目。这部分工作正常,因为所有类型都输出到文件,并显示在程序集中。

接下来的部分给我带来了麻烦。我已将其添加到主项目的 Pre-Build 事件中。

mkdir "$(ProjectDir)SVC"
chdir "$(ProjectDir)SVC"
svcutil /t:code http://localhost/Cmpny.FirstHost.ServiceHost/BusinessDataService.svc?singleWsdl /r:"$(SolutionDir)MyProject.DataContracts\bin\Release\MyProject.DataContracts.dll" /r:"$(SolutionDir)MyProject.DataContracts\bin\Release\Microsoft.Practices.EnterpriseLibrary.Validation.Integration.WCF.dll" /language:VB /out:BusinessDataService /collectionType:System.Collections.Generic.List`1
svcutil /t:code http://localhost/Cmpny.FirstHost.ServiceHost/PremiumReportingService.svc?singleWsdl /r:"$(SolutionDir)MyProject.DataContracts\bin\Release\MyProject.DataContracts.dll" /r:"$(SolutionDir)MyProject.DataContracts\bin\Release\Microsoft.Practices.EnterpriseLibrary.Validation.Integration.WCF.dll" /language:VB /out:PremiumReportingService /collectionType:System.Collections.Generic.List`1
svcutil /t:code http://localhost/Cmpny.StandaloneService.ServiceHost/Service.svc?singleWsdl /r:"$(SolutionDir)MyProject.DataContracts\bin\Release\MyProject.DataContracts.dll" /r:"$(SolutionDir)MyProject.DataContracts\bin\Release\Microsoft.Practices.EnterpriseLibrary.Validation.Integration.WCF.dll" /language:VB /out:PaymentService /collectionType:System.Collections.Generic.List`1 /et:"$(SolutionDir)MyProject.DataContracts\bin\Release\MyProject.DataContracts.dll"
copy BusinessDataService.vb "$(ProjectDir)Service References"
copy PremiumReportingService.vb "$(ProjectDir)Service References"
copy PaymentService.vb "$(ProjectDir)Service References"
chdir "$(ProjectDir)"
rmdir  /S /Q "$(ProjectDir)SVC"

此过程成功,但是,它再次生成 DataContract 类型,尽管我已经包含了 MyProject.DataContracts.dll。在此之后,我的项目中有三组 DataContracts,来自 Foo.svc 的那些,来自 Bar.svc 的那些,以及它们应该在 DataContract 文件中的那些。

我试过将 clr 命名空间更改为与 DataContract 命名空间相同,但这不起作用。它也改变了我的方法签名,并给我带来了数量惊人的错误。

TL;DR;我需要一个服务的通用 DataContract 文件,这样我就不会得到重复的 DataContract 类型。我似乎无法将我的 DataContract dll 正确导入 svc,因此它会生成两次新的 DataContracts,一个用于每个服务,一次在原始 dll(它们应该在的位置)中。

如果有任何不清楚的地方,请告诉我,我已尽量描述清楚。

我想通了。

我将 Contract 文件上的序列化程序设置为 DataContractSerializer。出于某种原因,它默认为 XmlSerializer,因此无法将 DataContracts 识别为其创建的类型。

我只是将选项“/serializer:DataContractSerializer”添加到创建 DataContracts 的第二个构建事件中。

但是,现在我遇到了另一个问题。我的两个合约没有为其方法生成参数。