2

我在 GWT 项目集(“主项目”、“小部件项目”、“服务适配器项目”)中有循环依赖问题。主要参考小部件和服务适配器。小部件引用服务适配器。问题来了。我想EventBus几乎在任何地方都使用注入。我应该把我的 Ginjector 接口放在哪里?

它必须在每个项目中都可用,并且还必须引用每个项目中的类,以便能够注入来自不同项目的类。这显然是不可编译的。

我想为小部件使用一个单独的 Ginjector,一个仅用于EventBus. 如果两个单独的 Ginjector 使用两个单独GinModules的都包含@Singleton EventBus绑定,那么这两个 getter 是否会返回相同的EventBus实例?

注意:这是杜松子酒,而不是 Guice 问题。

4

2 回答 2

3

我能想到的最简单的方法是EventBus在单独的注入器中创建单例(或在某个类中使其成为静态最终字段),然后@Provides在其他注入器中使用以访问该特定EventBus实例。

于 2012-01-25T17:08:02.360 回答
1

我为每个逻辑部分创建一个模块(每个项目通常一个或多个),然后从入口点提供一个单一的 ginjector,引用它需要的所有模块。然后所有(几乎)通过入口点的东西都由 Gin 创建,因此它将能够注入字段。

每个新的 GinjectorGWT.create都会有自己的一组单例,所以只创建一个根 ginjector 很重要。可以将该注入器注入代码库的其他部分,但如果您不这样做,通常会使代码更具可读性。

如果您需要将实例EventBus或其他任何东西传递给不是由 Gin 创建的对象,有几个选项。第一种是构建自己的 Provider 实例,并将其绑定到模块中(或在模块中创建带有 注释的方法@Provides)。第二个是在 ginjector 中创建接受单个参数并返回 void 的方法 - Gin 将能够注入该声明类型的所有字段和设置器。在下面的示例中,只有用@Injectin注释的字段和 setterMyWidget及其超类将被注入 - 它也不知道查找子类。

void injectMyWidget(MyWidget widget);
于 2012-01-25T22:00:10.513 回答