我从这个项目开始尝试学习 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。请参阅此帖子以获取更多参考。