在两个Ginjector实例中使用@Singleton

时间:2012-01-25 15:16:51

标签: java gwt guice gin

我在GWT项目集中有循环依赖问题(“主项目”,“窗口小部件项目”,“服务适配器项目”)。主要参考小部件和服务适配器。窗口小部件引用服务适配器。这就是问题所在。注意,我想在任何地方使用EventBus。我应该在哪里放置我的Ginjector界面?

它必须可以从每个项目中使用,并且必须引用每个项目中的类,以便能够从不同的项目中注入类。这显然是无法编译的。

我想过为小工具使用单独的Ginjector,而只为EventBus使用一个。如果两个单独的Ginjectors使用两个单独的GinModules同时包含@Singleton EventBus个绑定,那么两个getter将返回相同的EventBus个实例?

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

GWT.create'的每个新的Ginjector都有自己的单例组,所以只创建一个单一的ginjector是很重要的。可以将该注入器注入代码库的其他部分,但如果你不这样做,通常会产生更易读的代码。

如果您需要将EventBus或其他任何内容的实例传递给非Gin创建的对象,则有几个选项。第一种是构建自己的Provider实例,并将其绑定到模块中(或者在用@Provides注释的模块中创建方法)。第二种是在ginjector中创建采用单个参数并返回void的方法 - Gin将能够为该声明的类型注入所有字段和setter。在下面的示例中,只会注入@Inject中注释为MyWidget的字段和setter及其超类 - 它也不会知道查找子类。

void injectMyWidget(MyWidget widget);