代码之家  ›  专栏  ›  技术社区  ›  sebastiangeiger

两个Eclipse项目的循环依赖性

  •  1
  • sebastiangeiger  · 技术社区  · 16 年前

    我试图在Java中实现某种MVC。实际上,这更像是MVP,但这对我来说并不重要。

    以下情况: 我有一个用NetBeans制作的GUI(因为更好的GUI编辑器),它经常被更新和更改。

    由于我的主项目在Eclipse中易于维护,我选择将NetBeans项目作为单独的项目导入Eclipse。所以我有一个项目” App “包含控制器、模型包和项目” GUI “包含视图包。 问题是我所遵循的模式在视图和控制器之间具有循环依赖性。每当视图更改时,控制器会收到通知,决定从模型中获取哪些数据,然后对视图进行更改。

    当我添加 应用程序 到的构建路径 GUI 另一方面,我将以错误消息“在项目“gui”的构建路径中检测到循环”结束。 我的意思是这是真的,这个循环已经在我的设计中了。

    当前在启动时,我以以下方式向其控制器注册视图(这不是真正的代码,我正在尝试缩短它)

    package view;
    import controller.*;
    class viewA{
       ...
       public viewA() {
           controllerA.register(this);
       }
       ...  
    }
    
    package controller;
    import view.*;
    class controllerA implements SomeListener{
       ...
       protected viewA[] registeredViews;
       public static register(viewA interestedView){
           arrayPush(registeredViews,interestedView);
           interestedView.addSomeListener(this)    
       }
       ...
    }
    

    因此,您可以看到连接是通过将引用传递给控制器,然后在此视图上注册一个侦听器来实现的。问题是:如果我没有 GUI 项目在 应用程序 无法解析导入的buildPath,如果没有 应用程序 在里面 GUI 构建路径。

    我想保留这个项目结构,并坚持我的MVC架构。我该怎么解决呢?你有什么建议?

    4 回复  |  直到 11 年前
        1
  •  7
  •   Michael Borgwardt    16 年前

    你让你的听众和平常的方式背道而驰——通常情况下,控制者有主动权。它创建视图对象并将自己注册为视图事件的侦听器。

    此外,侦听器类型应该是在视图项目中定义的接口。然后,控制器实现该接口,视图不必知道具体的控制器类。循环已解决。当然,您也可以在“反向”设置中执行此操作。

        2
  •  4
  •   KarlP    11 年前

    类之间的循环依赖本身不是问题(它是一个特性)。 但是,您应该检查您的设计并证明依赖性是正确的。

    Eclipse项目可能有点使用过度。不幸的是,Eclipse并不能真正处理多个(10+或更多)项目,而另一个非常优秀的部分编译器会变慢,编译过程可能会变得更麻烦。

    在我参与的几个开发项目中,合并和减少项目数量导致了更短的构建时间和更少的构建问题。

    在内部应用程序中,无论大小,如果代码的每个人都可以访问所有代码,那么在项目之间划分代码实际上没有什么意义。

    如果您担心跟踪依赖关系,那么可以对包之间的依赖关系强制执行规则。

    对于大型应用程序中的每个“模块”,拥有一个“业务层”项目、“数据”层项目和一个GUI项目是很常见的,如果不创建人工的“接口项目”等,那么最终必然会产生一些循环依赖项。

    在进行大量删除依赖项之前,请考虑这些依赖项实际上是否是真实的,并且项目可能应该合并。

    记住,“模块”或“层”这样的抽象概念并不一定意味着你必须有匹配的项目或文件夹(或任何东西)。Eclipse项目是你工作的一组文件,基本上没有。

    你可能想看看 the-mythical-business-layer .

        3
  •  2
  •   Uri    16 年前

    首先,您可能希望使用接口而不是实际的类来相互表示控制器和视图。

    这类问题相当普遍,不幸的是,我认为没有真正的好解决方案,因为项目不应该在Eclipse中创建周期(允许在NetBeans中创建周期吗?我觉得很惊讶)。

    您能做的最多的就是彼此独立地开发,并使用一个具有系统每个部分所依赖的共享接口的公共项目。在某些设计中可以发挥作用。然后,您可以拥有另一个驱动程序项目,该项目了解这两个部分并执行实际的初始化。

    如果您真的想避免这种情况,您可能需要像Spring一样使用依赖注入。

        4
  •  1
  •   Larry Watanabe    13 年前

    您也可以将两个项目之一的.jar文件添加到另一个项目中,而不是使其依赖于项目本身。只要记住在必要时更新jar。