在服务之间使用相同的DataContract

时间:2009-06-04 01:49:10

标签: wcf entity-framework

我正在编写一些WCF服务来公开从实体框架中检索的数据,并且在以下域驱动设计模式中,每个聚合都有一个存储库。具体的例子是问题和答案的集合。有一个QuestionRepository和一个AnswerRepository。

当我想将项目从QuestionRepository传递到AnswerRepository时,我遇到了问题。由于两个服务都由相同的数据模型支持,因此它们使用相同的逻辑项,但svcutil将它们放在两个不同的名称空间中,并将它们视为完全不同的服务。

有没有办法解决这个问题?是否可以在同一服务中托管两个ServiceContracts?是否可以让WCF重用从另一个服务生成的数据协定?

谢谢, 罗伊

2 个答案:

答案 0 :(得分:2)

您绝对应该能够使用两个独立服务IQuestionService和IAnswerService使用的公共DataContract。

你是否拥有电线的两端,例如客户端和服务器? .NET / WCF?在这种情况下,您可以例如将您的DataContract和所有常用接口放入一个单独的程序集中,并在服务器和客户端上的两个服务之间共享该程序集。

在客户端上,如果你运行svcutil,你可以告诉它使用来自给定公共程序集的类型,例如:告诉它 NOT 重新创建QuestionAnswer数据类型,但要使用程序集中的数据类型。查看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。