C# 循环依赖

C# 循环依赖,c#,asp.net-mvc,dependencies,C#,Asp.net Mvc,Dependencies,考虑一个使用WinForms的基于MVC模式的普通客户订单应用程序。 视图部分增长过多(超过4000个文件),需要将其拆分为较小的文件 在本例中,我们将对视图零件使用3个项目: Main-与其他两个项目有依赖关系。用列表实例化表单 客户-有两个表单-客户列表和客户详细信息 订单有两种形式-订单列表和订单详细信息 在“客户详细信息”表单上,还有该客户的订单列表。该列表是从OrdersController接收的,因此获取它没有问题。当用户选择订单时,列表将获取其guid并将其作为订单详细信息

考虑一个使用WinForms的基于MVC模式的普通客户订单应用程序。 视图部分增长过多(超过4000个文件),需要将其拆分为较小的文件


在本例中,我们将对视图零件使用3个项目:

  • Main-与其他两个项目有依赖关系。用列表实例化表单
  • 客户-有两个表单-客户列表和客户详细信息
  • 订单有两种形式-订单列表和订单详细信息

在“客户详细信息”表单上,还有该客户的订单列表。该列表是从OrdersController接收的,因此获取它没有问题。当用户选择订单时,列表将获取其guid并将其作为订单详细信息表单的引用传递

这意味着我们需要在Customers项目中引用Orders项目(1)

但在订单详细信息表单上也有一个指向下订单的客户的链接。单击时,应打开客户详细信息表单

这意味着我们需要在Orders项目中引用Customers项目(2)

从(1)和(2)我们将在订单和客户项目之间建立循环依赖关系。



如何避免这种情况?某种插件架构?该项目已经开发,最好的解决方案将涉及尽可能少的代码更改。

如果它们紧密耦合,可能不应该拆分。

提取接口并将它们放在单独的程序集中。因为您使用的是MVC体系结构,所以应该不难。查看Microsoft复合UI应用程序块,了解示例和良好做法。

将至少一种类型更改为界面

例如,我们有一个ICCustomer接口和一个实现此接口的客户类型。现在,将ICustomer添加到orders项目中,并从customers项目中设置对orders项目的引用,以便您可以实现该接口。订单类型现在可以在不知道实际实现的情况下针对ICustomer类型工作

为了更好的解决方案:-)
创建ICustomer和IOrder接口,并将它们添加到第三个库项目中。参考其他两个项目,只使用接口,而不使用实现。

我认为您的主要问题不是应用程序的体系结构。您需要了解边界以及如何在它们之间划分功能。像您这样的划分是非常人为的,您尝试基于域对象来拆分应用程序。尝试使用用户角色或功能主题来解决这个问题,问题可能会消失


从技术角度来看,我不明白为什么你的观点应该意识到彼此的存在——这听起来有点奇怪。您不会分割数据和业务逻辑,到头来GUID只是一个可以使用不同方法轻松传递的陷阱。

项目之间如何交互?您如何解决这个问题:订单需要实例化客户,客户需要实例化订单?