ASP.NET MVC:如何避免2个项目之间的循环引用

时间:2010-06-20 21:50:15

标签: asp.net-mvc visual-studio-2008

我的应用程序至少有2个项目,即OrganizationMangement和ContactManagement。以前,我引用了ContactManagement,因为我需要使用位于OrganizationManagement中的类。现在我需要反过来但是我收到以下错误“无法引用OrganizationManagement ...以避免循环引用。

我猜这个错误是有道理的。但是,我怎么能避免这种情况呢?我的意思是我需要这些类只是为了将数据从一个项目转移到另一个项目。

要解决此问题,我将该类复制到位于另一个项目中的文件夹并尝试了此

var contact = (Contact)TempData["contact"];

现在,我收到此错误:无法隐式将 ContactManagement.Contact 转换为 OrganizationManagement.Contact ... 存在显式转换......

感谢您的帮助

3 个答案:

答案 0 :(得分:3)

它可能没有您想象的那么糟糕 - 项目总是可以引用自己的类而无需明确的引用。

然而,当这种结构性问题突然出现时,它通常会告诉你整体设计存在缺陷。

我猜你还有一个隐含的第三个项目尚未定义,你的组织和联系人项目都需要参考。一旦您将有问题的课程移动到新项目中,请在每个现有项目中创建对它的引用,然后您就可以全部设置。

当然,这可能需要进行其他结构性改变 - 解决这类问题可能会成为真正的蠕虫病毒。

底线:循环引用通常表明需要更多的思考来确定对象模型中的依赖关系到底是什么。

答案 1 :(得分:2)

也许你应该将所有常见的域相关类重构为他们自己的新项目,然后可以被其他项目引用。

另一方面,我可以通过定义仅在名称上不同的结构相同的类之间的显式转换来为您遇到的错误建议一个非常糟糕的解决方法。但请不要这样做。将所有域名(即联系人,人员,组织,客户等与权利相关的类)放入其自己的项目中,并从需要这些类的项目中引用它。

答案 2 :(得分:1)

编译两个项目并将程序集复制到文件夹“libs”。不要引用项目,而是引用已编译的程序集。

这对我有用。我有一个项目商店与后端ShopBackend。然后我有一个带有后端MarketPlaceBackend的项目MarketPlace。两个主要项目都没有太多共同之处。 Markeplace是一个非常小的应用程序。

ShopBackend有一个访问ShopDatabase的类Order。在MarketPlace中,我使用Assembly ShopBackend获取订单列表。

另一方面,在Shop中,我需要一份MarketPlace的参与者列表。这就是为什么我在那里调用MarketPlace程序集。

是的,这个设计有时会受到伤害:如果方法的签名发生变化,很难让版本正确。但在我看来,应用程序真的是分开的,它们有不同的数据库。

我想说的是:循环引用很容易成为一个设计问题,但它并非必须如此。想象一下,这两个应用程序都来自不同的公司。我认为如果Microsoft.dll使用google.dll以外的一些方法并且google.dll使用microsoft.dll的方法,那就没关系了。