依赖注入仅适用于服务类型对象和单例吗?(而不是gui?)

Igo*_*pov 5 java user-interface dependency-injection inversion-of-control guice

我目前正在试验谷歌的控制容器的反转.我以前只为我的应用程序使用的任何服务(数据库,活动目录)提供了单例.现在我重构了代码:所有依赖项都作为构造函数的参数给出.到现在为止还挺好.现在最困难的部分是图形用户界面.我遇到了这个问题:我有一个包装在ProductFrame中的产品表(JTable).我将依赖项作为参数(EditProductDialog).

@Inject
public ProductFrame(EditProductDialog editProductDialog) {
  // ...
}

// ...

@Inject
public EditProductDialog(DBProductController productController, Product product) {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

问题是guice无法知道我在表中选择了什么产品,因此无法知道EditProductDialog中要注入的内容.

依赖注入是非常病毒的(如果我修改一个类来使用依赖注入我也需要修改它与之交互的所有其他类)所以我的问题是我应该直接实例化EditProductDialog吗?但是我必须手动将DBProductController传递给EditProductDialog,我还需要将它传递给ProductFrame,所有这些归结为根本不使用依赖注入.

或者我的设计存在缺陷,因此我无法真正使该项目适应依赖性注射?

给我一些关于如何使用依赖注入和图形用户界面的示例.在因特网上找到的所有示例都是非常简单的示例,您可以使用一些具有依赖注入的服务(主要是数据库).

jfp*_*ret 1

从我在示例代码中看到的情况来看,我不确定传递ProductEditProductDialog是最好的设计,这意味着您不能为 2 个不同的产品重复使用相同的对话框。

一般来说,我宁愿添加一个setProduct(Product)toEditProductDialog以便:

  • 允许重复使用同一对话框
  • 允许构造函数注入对话框本身

此外,如果你想保留当前的构造函数参数,你也可以看看Guice Assisted Injection,它允许您将所有依赖项注入到构造函数中,同时仍然显式提供产品。

最后,您可能想看看Guts-GUI,这是一个用于使用 Guice 创建 Swing GUI 的开源框架(仍在工作中,但从今天起就可以使用)。它有一个示例应用程序,其中包含可重用对话框的示例。