我正在用 java、swt 和 osgi 编写一个图形应用程序。包 A 包含应用程序主窗口。根据用户的选择,必须加载不同的用户界面。也就是说,不同的 GUI 位于不同的包中。所以主bundle A调用bundle B来绘制新的图形界面。包 B 包含许多类、扩展 Composite 类的 SWT 控件。这个控件需要一个父级来绘制。这里的问题是,包 B 需要在包 A 上绘制。我试图将包含新接口的父复合从 A 发送到 B,但是当 B 创建新控件时,它崩溃了。
任何想法?如何解决这个问题呢?
听起来您正在尝试设置一些效果不佳的复杂交叉依赖项。
你知道白板模式吗?你可以在这里阅读更多: http ://www.osgi.org/wiki/uploads/Links/whiteboard.pdf
因此,基于该模式,假设 A 是加载主 UI 的“主”包。为简单起见,假设包 A 还导出以下接口:
public interface UIExtensionService {
Control createExtension(Composite parent);
}
Bundle B(和 C、D、E、F 等)然后注册此接口的适当实现。您可以在注册服务时使用属性来帮助您的主包缩小特定实现的范围,例如,如果您想根据给定的用户输入显示特定的内容。
然后,Bundle A 使用 BundleContext 找到 UIExtensionService 的适当实现,并调用传入要使用的父级的 createExtension 方法。
希望有帮助。