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

abe*_*t80 3 eclipse eclipse-rcp

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

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

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

los*_*and 5

你在这里面临的问题是我认为不与RCP有关.它更像是一个建筑问题.您的观点与业务逻辑相关!解决方案可以通过两种(常见的)设计模式完成:

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

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

您将需要创建多个项目.一个当然是RCP插件,我们称之为rcp.view.现在你创建了另一个,它没有做出贡献(只有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()并在演示者中执行此操作可能就像这样

码:

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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

您可能想看看我在这个问题上的第二篇文章,以了解如何构建插件.

  • 还有一件事.上面的模式实际上是MVC,因为视图知道模型.为了拥有一个普通的MVP,视图不应该知道关于模型的任何信息,你可以通过使用JFace-Databinding实现这一点......我才意识到这一点.但是你可以按照描述开始并稍后介绍Bindings.我找到了一个很好的例子:http://rcpquickstart.com/2007/11/08/mvp-example-code/ (2认同)