我有一个包含三层的解决方案:公共(public)层、数据层和业务层
公共(public)层定义了被其他层引用和使用的对象。数据层包含数据访问代码,业务层包含业务逻辑。每层包含多个项目。
数据层和业务层公开 WCF 服务,这些服务具有来自公共(public)层的对象作为参数。数据层和业务层都通过项目引用直接引用公共(public)层。
业务层通过服务引用引用数据层。服务引用设置为“在引用的程序集中重用类型”,因为在单个业务层项目中存在对数据层服务的多个引用,并且每个数据层服务都使用来自公共(public)层的相同对象。
我正在为业务层编写单元测试,并且不断收到如下错误:Common.ClassName 类型的值无法转换为 Common.ClassName。类型不匹配可能是由于混合了文件引用和对程序集 Common 的项目引用。尝试用项目引用替换文件引用。
它不是文件引用,绝对是项目引用。 Looking here I see this item
To access a type defined in another assembly, the Visual Basic compiler must have a reference to that assembly. This must be a single, unambiguous reference that does not cause circular references among projects.
据我所知,我没有任何循环引用,所以还有什么其他问题可能导致此错误消息和/或如何防止浪费我这么多时间单击更新服务引用并希望这次它会起作用?
请注意,我对这个架构没有选择权,它是由我们的软件架构师强加的。
环境是带有 Visual Studio 2012 的 Windows 8。
最佳答案
因为您的业务层通过服务引用引用了数据层,而数据层引用了您的公共(public)层,所以您实际上有一个循环引用。当您生成 wcf 引用时,这是由后台的代码生成完成的。
程序员在创建 wcf 服务时(第一次)遇到这种情况是很常见的。在您的情况下,解决方案是确保通过 WCF 通过线路发送的任何对象(类、数据契约(Contract)类等)都应该与 wcf 接口(interface)文件在同一个程序集中。换一种说法,如果您的 WCF 服务函数调用或子例程接收或返回一个对象,则该对象应该在同一个程序集中(或在服务下游未引用的程序集中)。
如果您将它们拆分,您会在没有意识到的情况下创建循环引用,因为 WCF 会自动创建服务器端数据协定的客户端版本。您也许可以关闭此行为,但我不知 Prop 体如何,所以我建议您使用谷歌搜索。如果这些服务器端数据契约(Contract)文件实际上是在公共(public)类中,那么您就有一个循环引用,因为您的业务层具有这些文件的代码生成版本以及对公共(public)程序集的引用。
有关这方面的更多信息,请深入研究服务引用中生成的代码。为此,您需要在 Visual Studio 解决方案资源管理器中打开查看所有文件功能,然后开始深入研究创建该服务引用时为您生成的代码。
关于vb.net - 混合服务和项目引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17081751/