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