5

我有一个包含三层的解决方案:公共层、数据层和业务层

公共层定义了被其他层引用和使用的对象。数据层包含数据访问代码,业务层包含业务逻辑。每层包含多个项目。

数据层和业务层公开 WCF 服务,这些服务具有来自公共层的对象作为参数。数据层和业务层都通过项目引用直接引用公共层。

业务层通过服务引用引用数据层。服务引用设置为“在引用的程序集中重用类型”,因为在单个业务层项目中存在对数据层服务的多个引用,并且每个数据层服务都使用来自公共层的相同对象。

我正在为业务层编写单元测试,并且不断收到如下错误:Common.ClassName 类型的值无法转换为 Common.ClassName。类型不匹配可能是由于混合了文件引用和对程序集 Common 的项目引用。尝试用项目引用替换文件引用。

它不是文件参考,绝对是项目参考。看这里我看到这个项目

若要访问在另一个程序集中定义的类型,Visual Basic 编译器必须具有对该程序集的引用。这必须是一个单一的、明确的引用,不会导致项目之间的循环引用。

据我所知,我没有任何循环引用,所以还有什么其他问题可能导致此错误消息和/或如何防止浪费我这么多时间单击更新服务引用并希望这次它会起作用?

请注意,我对这个架构没有选择权,它是由我们的软件架构师强加的。

环境是带有 Visual Studio 2012 的 Windows 8。

4

1 回答 1

0

因为您的业务层通过服务引用引用了数据层,而数据层引用了您的公共层,所以您实际上有一个循环引用。当您生成 wcf 引用时,这是由后台的代码生成完成的。

程序员在创建 wcf 服务时(第一次)遇到这种情况是很常见的。在您的情况下,解决方案是确保通过 WCF 通过线路发送的任何对象(类、数据合同类等)都应与 wcf 接口文件位于同一程序集中。换一种说法,如果您的 WCF 服务函数调用或子例程接收或返回一个对象,则该对象应该在同一个程序集中(或在服务下游未引用的程序集中)。

如果您将它们拆分,您会在没有意识到的情况下创建循环引用,因为 WCF 会自动创建服务器端数据协定的客户端版本。您也许可以关闭此行为,但我不知道具体如何,所以我建议您使用谷歌搜索。如果这些服务器端数据合同文件实际上是在公共类中,那么您就有一个循环引用,因为您的业务层具有这些文件的代码生成版本以及对公共程序集的引用。

有关这方面的更多信息,请深入研究服务参考中生成的代码。为此,您需要在 Visual Studio 解决方案资源管理器中打开查看所有文件功能,然后开始深入研究创建该服务引用时为您生成的代码。

于 2014-04-02T15:36:05.637 回答