我正在编写一些WCF服务来公开从实体框架中检索的数据,并且在以下域驱动设计模式中,每个聚合都有一个存储库。具体的例子是问题和答案的集合。有一个QuestionRepository和一个AnswerRepository。
当我想将项目从QuestionRepository传递到AnswerRepository时,我遇到了问题。由于两个服务都由相同的数据模型支持,因此它们使用相同的逻辑项,但svcutil将它们放在两个不同的名称空间中,并将它们视为完全不同的服务。
有没有办法解决这个问题?是否可以在同一服务中托管两个ServiceContracts?是否可以让WCF重用从另一个服务生成的数据协定?
谢谢, 罗伊
答案 0 :(得分:2)
您绝对应该能够使用两个独立服务IQuestionService和IAnswerService使用的公共DataContract。
你是否拥有电线的两端,例如客户端和服务器? .NET / WCF?在这种情况下,您可以例如将您的DataContract和所有常用接口放入一个单独的程序集中,并在服务器和客户端上的两个服务之间共享该程序集。
在客户端上,如果你运行svcutil,你可以告诉它使用来自给定公共程序集的类型,例如:告诉它 NOT 重新创建Question
和Answer
数据类型,但要使用程序集中的数据类型。查看svcutil的/reference
(或/r
)参数。
svcutil (your WSDL) /r (your common assembly here) ......
或者另一个选择是一起跳过svcutil并自己创建你的ChannelFactory等,并手动实例化你的客户端,没有服务参考等。
ChannelFactory<IQuestion> cFac =
new ChannelFactory<IQuestion>("ConfigName");
IQuestion proxy = cFac.CreateChannel();
然后使用proxy
对象,就像你现在由svcutil生成的对象一样。
当然,只有拥有电线的两端才能正常工作。
马克
答案 1 :(得分:0)
我相信可以帮助您的一件事是查看DataContractAttribute
类,它允许您指定序列化的名称和命名空间。
也就是说,如果您使用相同的逻辑项,那么它应该足以使它们跨服务兼容。
全部取决于MEX端点生成的WSDL。