我在GWT项目集中有循环依赖问题(“主项目”,“窗口小部件项目”,“服务适配器项目”)。主要参考小部件和服务适配器。窗口小部件引用服务适配器。这就是问题所在。注意,我想在任何地方使用EventBus
。我应该在哪里放置我的Ginjector界面?
它必须可以从每个项目中使用,并且必须引用每个项目中的类,以便能够从不同的项目中注入类。这显然是无法编译的。
我想过为小工具使用单独的Ginjector,而只为EventBus
使用一个。如果两个单独的Ginjectors使用两个单独的GinModules
同时包含@Singleton
EventBus
个绑定,那么两个getter将返回相同的EventBus
个实例?
注意:这是一个杜松子酒,而不是一个Guice问题。
答案 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);