2015-01-16 12 views
1

여기 내 기본적인 시나리오가 있습니다. 세 가지 서비스가 있습니다. 하나는 자급 자족하고 대부분 문제를 일으키지 않습니다. 다른 두 서비스는 동일한 프로젝트에서 호스팅되며 거의 모든 동일한 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에서 다시 한 번 생성합니다.

불명확 한 점이 있으면 알려 주시기 바랍니다. 가능한 한 서술적으로 작성하려고 노력했습니다.

답변

0

나는 이것을 알아 냈다.

계약 파일의 serializer를 DataContractSerializer에 설정했습니다. 어떤 이유로 XmlSerializer가 기본값이므로 DataContracts를 생성하고 있던 형식과 동등한 것으로 인식하지 못합니다.

단순히 '/ serializer : DataContractSerializer'옵션을 DataContracts를 만드는 두 번째 빌드 이벤트에 추가했습니다.

그러나 이제 다른 문제가 발생합니다. 내 계약 중 두 가지는 그들의 방법에 대한 논쟁을 생성하지 않습니다.