【问题标题】:Mixing Service and Project References混合服务和项目参考
【发布时间】:2013-06-09 12:35:38
【问题描述】:

我有一个解决方案,它包含三层:通用、数据和业务

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

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

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

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

这不是文件参考,它绝对是项目参考。 Looking here I see this item

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

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

请注意,我无法选择此架构,它是由我们的软件架构师强加的。

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

【问题讨论】:

  • 只是为了确保您没有任何循环引用。您的 DLL 的 Assembly(A) 没有对 Assembly(B) 的引用,这取决于正在编译的 Assembly(C),但 Assembly(C) 对 Assembly(A) 的引用......
  • 我已经检查了几次循环引用。我很确定这不是问题。

标签: vb.net wcf visual-studio reference


【解决方案1】:

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

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

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

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

【讨论】:

  • 你描述的不是循环引用,A>B>C>A,而是一棵树 A>B>C & B>C
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-24
  • 2011-01-10
  • 2014-07-19
相关资源
最近更新 更多