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

Eclipse RCP应用程序中的“全局”数据存储在哪里?

  •  3
  • aberrant80  · 技术社区  · 16 年前

    我是EclipseRCP的初学者,我正在尝试为自己构建一个应用程序来试一试。我对如何处理模型对象感到困惑。我所能找到的例子中没有一个能解决我所遇到的问题,所以我怀疑我走错了方向。

    假设我需要用一个保存经过身份验证的用户信息的类初始化应用程序。我用我的 WorkbenchWindowAdvisor (错误的位置?)执行一些初始化(例如身份验证),以决定要显示的视图。完成后,将显示一个视图。现在,这个观点 而且 需要访问我先前检索/生成的用户信息。

    plugin.xml . 我看不出有任何方法可以将数据提供给视图。所以我假设视图必须以某种方式检索它。但是什么地方才是取回它的合适地方呢?我想把静态变量放在 IApplication

    1 回复  |  直到 16 年前
        1
  •  5
  •   Community Mohan Dere    9 年前

    我认为你在这里面临的问题与RCP无关。这更多的是一个架构问题。您的视图与业务逻辑连接在一起! 该解决方案可以通过两种(通用)设计模式完成:

    1. 模型视图演示者(MVP)

    您将需要创建几个项目。一个当然是RCP插件,我们称之为 . 现在您创建了另一个,它不提供UI贡献(仅从org.eclipse.core.runtime开始)并调用它 主持人 . 为了简化事情,这个插件现在也将是模型。

    下一步:

    1. 将rcp.presenter添加到 rcp.view(its)的 参考视图)
    2. 出口 所有你想要的包裹 将在rcp.presenter中创建 所以它们是可见的
    3. 在rcp.presenter中创建一个接口 我的观点 这有一些方法 像( showLogiDialog()、ShowAdministratorView(用户用户)、ShowStandardView(用户用户) )
    4. 创建一个类 我的观点 并将其保存在属性中
    5. 实现您的接口IPerspective ,并在构造函数中创建一个新引用 演示者=新透视演示者(此)
    6. presenter.load() 和恳求 演示者中的这个可能是这样的

    代码:

    public void load()
    {
      User user = view.showLoginDialog(); // returns a user with the provided name/pw
      user.login(); // login to system/database
      if(user.isAdministrator())
        view.showAdministratorViews(user);
      else
        view.showStandardViews(user);
    }
    

    如您所见,视图只创建了对演示者的引用,演示者负责所有业务逻辑,并且演示者告诉视图要显示什么。因此,在您的透视图中,您可以实现这些接口函数,并且在每个接口函数中,您可以以不同的方式设置透视图。

    对于每个视图,它以相同的方式运行,您将需要一个视图的演示者,该演示者执行操作并告诉视图(使用界面)显示什么并传递最终数据。这个观点并不关心逻辑。这在使用JFace数据绑定时也非常有用(这样,只有绑定的数据才会传递给视图)。 例如,WorkbenchWindowWadisor将只创建应用程序中所需的所有内容。然后,其他视图、透视图可以启用/禁用菜单等,具体取决于它们获得的数据(例如,当isAdministrator时,您可能希望启用特殊的adminMenu)。

    我知道这是一个相当繁重的方法,但是EclipseRCP是为大型(正如名字所说的rich)应用程序设计的。因此,您应该在正确的体系结构中花费一些时间。我的第一个RCP应用程序就像你描述的那样……我从来不知道在哪里存储东西以及如何处理所有引用。在工作中我学到了MVP(我还在学习)。理解这个概念需要一段时间,但它是值得的。

    你可能想看看 my second post at this question 获取关于如何构建插件的另一个想法。