Car*_*ger 5 vb.net wcf reference visual-studio
我有一个有三层的解决方案:常见,数据和业务
公共图层定义了其他图层引用和使用的对象.数据层包含数据访问代码,业务层包含业务逻辑.每个图层包含多个项目.
数据和业务层公开WCF服务,该服务将公共层中的对象作为参数.数据层和业务层都通过项目引用直接引用公共层.
业务层通过服务引用引用数据层.服务引用设置为"在引用的程序集中重用类型",因为在单个业务层项目中有多个对数据层服务的引用,并且每个数据层服务使用公共层中的相同对象.
我正在为业务层编写单元测试,我不断得到这样的错误:Common.ClassName类型的值不能转换为Common.ClassName.类型不匹配可能是由于文件引用与程序集Common的项目引用混合造成的.尝试使用项目引用替换文件引用.
它不是文件引用,它绝对是项目引用.看这里我看到这个项目
若要访问在另一个程序集中定义的类型,Visual Basic编译器必须具有对该程序集的引用.这必须是一个单一的,明确的引用,不会导致项目之间的循环引用.
据我所知,我没有任何循环引用,所以其他问题可能导致此错误消息和/或我如何防止这种浪费我的时间太多,我点击更新服务参考,并希望这次它将工作?
请注意,我无法选择此架构,它是由我们的软件架构师强加的.
环境是带有Visual Studio 2012的Windows 8.
小智 0
因为您的业务层通过服务引用引用数据层,并且数据层具有对公共层的引用,所以实际上您确实有一个循环引用。当您生成 wcf 引用时,这是由后台的代码生成完成的。
程序员在创建 wcf 服务(第一次)时遇到这种情况是很常见的。您的情况的解决方案是确保通过 WCF 通过线路发送的任何对象(类、数据契约类等)应与 wcf 接口文件位于同一程序集中。换句话说,如果您的 WCF 服务函数调用或子例程接受或返回一个对象,则该对象应该位于同一个程序集中(或位于服务下游未引用的程序集中)。
如果将它们分开,则会在没有意识到的情况下创建循环引用,因为 WCF 会自动创建服务器端数据协定的客户端版本。您也许可以关闭此行为,但我不知道具体如何操作,因此我建议您使用谷歌搜索。如果这些服务器端数据契约文件实际上位于公共类中,那么很快就会出现循环引用,因为您的业务层具有这些文件的代码生成版本以及对公共程序集的引用。
有关这方面的更多信息,请深入研究服务参考中生成的代码。为此,您需要在 Visual Studio 解决方案资源管理器中打开“查看所有文件”功能,然后开始深入研究在创建该服务引用时为您生成的代码。