1

我从这个项目开始尝试学习 CQRS 并编写可维护的 WCF 服务。但是,我有一些关于 WCF 的一般性问题。每次添加命令/查询处理程序合同和处理程序时,我都会构建项目,然后在 Visual Studio 中右键单击客户端上的服务引用并选择“更新服务引用”。这通常使我可以毫无问题地使用新命令/查询。

但是,我不得不实际删除整个服务引用,然后再将其添加回来,这比我想的更频繁。这是我可以解决此错误的唯一方法:

尝试序列化参数 http://tempuri.org/:query时出错。InnerException 消息是 'Type 'Contract.Queries.Countries.GetCountriesStartingWithLetterQuery' 与数据合同名称 'GetCountriesStartingWithLetterQuery: http://schemas.datacontract.org/2004/07/Contract.Queries.Countries ' 不是预期的。考虑使用 DataContractResolver 或将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用 KnownTypeAttribute 属性或将它们添加到传递给 DataContractSerializer 的已知类型列表中。有关更多详细信息,请参阅 InnerException。

然后有时,即使我删除服务引用并重新添加它,我也永远无法让新命令/查询工作。如果我尝试在注册已知类型的 WCF 服务代码中添加断点,它永远不会被命中。似乎服务引用失败,因为新命令/查询未注册为已知类型。

在此 CQRS WCF 模型中刷新服务的正确方法是什么?谢谢。


更新 1:我所有的麻烦都来自 EF 生成代理对象并尝试通过 WCF 服务发送它们。该服务不知道代理,只知道 POCO。

@Peter - 我使用的是 EF 5 Code First。我所有的 POCO 都在一个单独的项目中。我使用存储库模式从数据库中检索实体。当我说 countryRepository.GetById(myId) 时,检索的是代理对象,而不是 POCO。如果我禁用 ProxyCreation,则会返回一个 POCO,但导航属性始终为空,同时填充了它们各自的外键 ID。从存储库中获取某些内容时,也许我只需要使用 .Include 作为导航属性?我明天必须检查,因为我现在无法访问代码。

或者,我已经阅读了很多关于 AutoMapper 的内容。这可以用来将我的代理对象映射到 POCO 吗?只是一个想法,但这似乎并不正确。


编辑 2:原来我可以使用 ValueInjector 很容易地将我的动态代理对象映射到 POCO。然后我可以毫无问题地通过网络发送 POCO。请参阅此帖子以获取更多参考。

4

3 回答 3

3

不要使用添加服务参考。您可以使用通道工厂并且没有服务参考。这假设您可以通过添加项目(或 dll)引用与客户端共享您的数据和服务合同。

添加对客户端的引用。然后建立一个渠道工厂。这是来自MSD How to: Use the ChannelFactory的简单文章

如果您无法分享您的参考资料,您可以查看如何实现通用合同解析器WCF 可扩展性 –来自 Carlos Figueira 的数据合同解析器。

编辑1:

您可以将POCO 模式与 EF一起使用来获取导航属性并将自己与 EF 细节分开。

于 2013-02-04T20:34:33.177 回答
0

您不应该通过网络发送实体。创建特定于服务方法的 DTO/消息对象,并将它们从/映射到服务内的实体。

于 2013-02-27T17:15:06.053 回答
0

该问题可能是由 Visual Studio 的编辑和继续功能引起的。Visual Studio 使用 WCF 服务启动 IIS Express 或 Cassini 实例,当第一次访问时,WCF 服务会初始化(这是创建容器和GetKnownTypes调用方法的时间)。

但是在添加新类型和重新编译时,Visual Studio 会更改 WCF 服务的程序集,但不会重新启动该 AppDomain,从而保持 Web 服务处于初始化状态(因为初始化只发生一次)但配置无效。

您可以通过在每次开始调试时终止 IIS Express 实例来解决此问题,但这当然很烦人。也许您可以自动执行此操作,但至少该问题在生产中永远不会存在,因为没有编辑和继续。

现在,我通常不再将我的命令和查询作为 WCF 合同的一部分公开。客户端和服务器现在只是来回发送 JSON 对象,而 WCF 服务所关心的只是一个字符串。事实证明,通过网络发送 JSON 对我非常有益,因为:

  • JSON.NET 的序列化器比 WCF 的 SoapSerializer 灵活得多(这简直太痛苦了)。JSON.NET 可以序列化/反序列化不可变对象、集合、字典,以及您所需要的一切。
  • 不公开命令和查询对象作为 WCF 合同的一部分完全消除了完整的编辑和继续问题。
于 2013-06-12T20:59:00.693 回答