여기 내 기본적인 시나리오가 있습니다. 세 가지 서비스가 있습니다. 하나는 자급 자족하고 대부분 문제를 일으키지 않습니다. 다른 두 서비스는 동일한 프로젝트에서 호스팅되며 거의 모든 동일한 DataContracts를 공유합니다. 즉, 같은 프로젝트에 포함되면 충돌이 많이 발생합니다.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"
는 파일을 대체하고 새로운 파일과 프로젝트를 작성합니다. 이 파트는 파일에 대한 모든 출력이 어셈블리에서 표시된다는 점에서 올바르게 작동합니다.
다음 부분은 나를 괴롭 히고 있습니다. 이 프로젝트를 주 프로젝트의 사전 빌드 이벤트에 추가했습니다.
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"
이 과정은 성공하지만, 내가 MyProject.DataContracts.dll를 포함 한 사실에도 불구하고, 다시를 DataContract 유형을 생성합니다. 이 후, 필자는 Project에서 3 세트의 DataContracts, Foo.svc의 것, Bar.svc의 DataContracts 및 DataContract 파일의 DataContracts를 가져옵니다.
clr 네임 스페이스를 DataContract 네임 스페이스와 동일하게 변경하려고 시도했지만 작동하지 않습니다. 그것은 내 방법 서명을 변경하고 나에게 정말 엄청난 양의 오류를 준다.
TL; 중복 된 DataContract 형식을 얻지 않도록 서비스에 대한 일반적인 DataContract 파일이 필요합니다. 내 DataContract dll을 svc에 제대로 가져올 수 없어서 새로운 DataContracts를 각 서비스에 대해 두 번 생성하고 한 번 더 원래 dll에서 다시 한 번 생성합니다.
불명확 한 점이 있으면 알려 주시기 바랍니다. 가능한 한 서술적으로 작성하려고 노력했습니다.