循环依赖

时间:2008-09-23 13:13:33

标签: c# asp.net-mvc dependencies

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


对于这个例子,我们将使用3个项目作为视图部分:

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

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

这意味着我们需要在客户项目中引用订单项目。 (1)

但是在订单详情表上还有一个指向客户的链接。单击时,应打开“客户详细信息”表单。

这意味着我们需要在订单项目中引用Customers Project。 (2)

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


如何避免这种情况?某种插件架构?该项目已经开发出来,最佳解决方案将尽可能少地改变代码。

4 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:2)

如果他们紧密耦合,也许他们不应该分开。

答案 2 :(得分:0)

提取接口并将它们放在单独的程序集中。既然你正在使用MVC架构,那应该不难。请查看Microsoft Composite UI Applications块以获取示例和良好实践。

答案 3 :(得分:0)

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

从技术角度来看,我不明白为什么你的观点应该意识到彼此的存在 - 这对我来说听起来有点奇怪。您不会拆分您的数据和业务逻辑,并且在一天结束时,GUID只是您可以使用不同方法轻松传递的刺痛。