2012-01-13 129 views
1

新到谷歌吉斯注射器。我想用它来处理所有IOC和AOP方法拦截的三个组成部分,我发展:吉斯:创建共享库

  • WidgetClient - 一个Swing应用程序
  • WidgetServer - 一个小EAR客户端将连接到/沟通
  • WidgetShared - 包含由客户端和服务器

随着Swing应用程序使用的普通班“公地” JAR,什么地方我会做出一个明确的调用可能看起来像:

public static void main(String[] args) { 
    initGuiceInjectors(); 
} 

private static initGuiceInjectors() { 
    Guice.createInjector(mySwingAppModule); 
} 

mySwingAppModule将定义Swing应用程序相关性的所有绑定。我将在服务器EAR中做一些非常类似的事情。

当谈到WidgetShared库时,我很窒息,因为lib没有一个入口点:它只是一大堆客户端和服务器将会使用的包,类,接口和枚举这个地方。

所以我的第一个问题:我在哪里调用Guice.createInjector()WidgetShared JAR?

这个问题强调了一个SEGUE到第二(类似)的问题,这就是为什么我选择在这里组为好。

我仔细阅读了Guice的“最佳实践”,并且压倒性的共识似乎是(如适用的话),在包级别保留Module的实现。因此,对于每个包,将有该包内的所有类型的一个Module结石定义绑定。这是针对整个应用定义绑定的单个单块Module的改进。

因此,上面的代码片段(Guice.createInjector(mySwingAppModule))实际上是而不是我的代码最终会看起来像什么(对不起,我说谎!)。

我的第二个问题是:什么是“最佳实践”为创建多个注射器?

我看到createInjector(Module... modules)可以采取可变参数Module参数。所以,对我来说好像如果我要拥抱这个“1模块每包”最佳实践,在某些时候,我必须有代码,要么是这样的:

Guice.creatorInjector(package1Module, package2Module, package3Module, 
    package4Module, package5Module, package6Module, ..., packageNModule); 

,或者像这样:

Guice.createInjector(package1Module); 
Guice.createInjector(package2Module); 
Guice.createInjector(package3Module); 

... 

Guice.createInjector(packageNModule); 

这两个看起来真的很讨厌!有没有更好的方法来完成这个?!?

在此先感谢!

回答

4

亚当,

有两个元素,你的问题,但显然二者相关。我会倒退,首先从第二个元素开始。

每包一个模块的组织是非常重要的,因为它给出了where绑定应放置可预测的惯例,并作为奖励,它可以让你打包进行相应的保护你的类。还有创建充当主要安装每个包模块的集合,以作为需要被安装到添加绑定库的给定配置的单个模块的复合模块的流行的概念。安装这个单一模块成为库和使用它的服务器/应用程序之间的主要集成点。

退回给你的第一个点,它不建议在每个应用程序的多个注射器。更好的是让一个注入器安装它需要的模块以满足应用程序中使用的所有绑定。

最后,你会碰到这样的:

public WidgetSharedLibraryModule extends AbstractModule { 
    @Override protected void configure() { 
    install(new WidgetSublibraryModule1()); 
    install(new WidgetSublibraryModule2()); 
    ... 
    } 
} 

而且你的主要方法如下所示:

public static void main(String[] args) { 
    Injector injector = Guice.createInjector(
     new WidgetSharedLibrary(), 
     new WidgetSwingAppModule()); 
    WidgetSwingApp app = injector.getInstance(WidgetSwingApp.class); 
    app.run(); 
} 
+0

但是,如果我们已经一个注射器那么我们如何把它传递到子模块?换句话说,'submodule1'可能想要'submodule2'中的类的getInstance。 – DilTeam 2015-10-21 06:12:08