【问题标题】:Where to store "global" data in Eclipse RCP Application?在 Eclipse RCP 应用程序中存储“全局”数据的位置?
【发布时间】:2010-11-17 18:22:36
【问题描述】:

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

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

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

【问题讨论】:

标签: eclipse eclipse-rcp


【解决方案1】:

在我看来,您在这里面临的问题与 RCP 无关。它更多的是一个架构问题。您的视图与业务逻辑和! 该解决方案可以通过两种(常见的)设计模式来完成:

  1. 模型-视图-控制器 (MVC)
  2. 模型-视图-演示者 (MVP)

您可以在网络上找到大量有关此的信息。我将使用 MVP 为您的特定问题指出一个可能的解决方案。

您将需要创建多个项目。一个当然是 RCP 插件,我们称之为 rcp.view。现在您创建另一个,它不会对 UI 做出贡献(仅 org.eclipse.core.runtime 开始)并将其命名为 rcp.presenter。为简化起见,这个插件也将是现在的模型。

接下来的步骤:

  1. 将 rcp.presenter 添加到 rcp.view 的依赖项(它的 重要的是演示者没有 参考视图)
  2. 导出你所有的包 将在 rcp.presenter 中创建 所以它们是可见的
  3. 在 rcp.presenter 创建一个接口 IPerspective 有一些方法 像 (showLogiDialog(), showAdministratorViews(User user), showStandardViews(User user))
  4. 创建一个类 PerspectivePresenter,该类在构造函数中采用 IPerspective 并将其保存在属性中
  5. 在 rcp.view 中转到您的 Perspective,实现您的接口 IPerspective,并在构造函数中创建一个新引用 presenter = new PerspectivePresenter(this)
  6. 调用 presenter.load() 并实现 演示者中的 this 可能是这样的

代码:

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。

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

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

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

【讨论】:

  • 非常感谢您花时间输入答案!我会试一试,看看我是否可以“得到”它。谢谢指点。
  • 还有一件事。上面的模式实际上是 MVC,因为视图知道模型。为了有一个简单的 MVP,视图不应该对模型有任何了解,您可以通过使用 JFace-Databinding 来实现这一点……我刚刚意识到这一点。但是您可以按照描述开始,稍后再介绍 Bindings。我找到了一个很好的例子:rcpquickstart.com/2007/11/08/mvp-example-code
猜你喜欢
  • 2011-08-09
  • 2011-01-27
  • 2016-12-10
  • 2012-03-13
  • 2014-02-03
  • 2011-02-09
  • 1970-01-01
  • 2011-01-28
  • 1970-01-01
相关资源
最近更新 更多