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

时间:2009-08-07 16:51:48

标签: eclipse eclipse-rcp

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

假设我需要使用包含经过身份验证的用户信息的类初始化应用程序。我使用WorkbenchWindowAdvisor(错误的地方?)来执行一些初始化(例如身份验证)以决定要显示的视图。完成后,将显示一个视图。现在,该视图需要访问我之前检索/生成的用户信息。

问题是,该视图应如何获取该数据?该视图已在plugin.xml中连线。我没有看到任何方法可以将数据提供给视图。所以我认为视图必须以某种方式检索它。但是从它中检索它的适当位置是什么?我想过将静态变量放在IApplication实现中,但这感觉不对。任何建议或指示非常感谢。感谢。

1 个答案:

答案 0 :(得分:5)

您认为这里遇到的问题与RCP无关。它更像是一个建筑问题。您的观点与业务逻辑相关! 解决方案可以通过两种(常见的)设计模式来完成:

  1. 模型 - 视图 - 控制器(MVC)
  2. 模型 - 视图 - 演示者(MVP)
  3. 您可以在网上找到有关此内容的大量信息。我将使用MVP为您的特定问题指出一个可能的解决方案。

    您需要创建多个项目。一个当然是RCP插件,我们称之为 rcp.view 。现在你创建了另一个,它没有做出贡献(只有org.eclipse.core.runtime开始),并称之为 rcp.presenter 。为简化起见,此插件现在也将成为模型。

    后续步骤:

    1. 将rcp.presenter添加到 rcp.view的依赖(它的 重要的是主持人没有 参考视图)
    2. 导出您拥有的所有套餐 要在rcp.presenter中创建 所以它们是可见的
    3. 在rcp.presenter中创建一个接口 IPerspective 有一些方法 喜欢( showLogiDialog(),showAdministratorViews(用户用户),showStandardViews(用户用户)
    4. 创建一个 PerspectivePresenter 类,在构造函数中使用 IPerspective 并将其保存在属性中
    5. 在rcp.view中转到您的Perspective,实现您的界面IPerspective ,并在构造函数中创建一个新参考 presenter = new PerspectivePresenter(this)
    6. 调用 presenter.load()并执行 这个在演示者中可能就像这样
    7. 代码:

      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);
      }
      

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

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

      我知道这是一个非常繁重的方法,但Eclipse RCP是专为大型(名称为富)应用而设计的。所以你应该花一些时间在正确的架构上。我的第一个RCP应用程序就像你描述的那样...我从来不知道在哪里存储东西以及如何处理所有引用。在我的工作中,我学到了MVP(我还在学习)。理解这个概念需要一段时间,但它值得。

      您可能需要查看my second post at this question以了解如何构建插件。