2010-07-16 97 views
10

我刚刚开始使用Google Guice作为依赖注入框架,并试图将其改进为我最近编写的一个中小型项目。我了解Guice如何工作的基础知识,但对某些方法细节有些模糊。例如:与Google Guice握手

1)模块用于定义绑定,然后将其输入注入器。你倾向于把所有东西都放到一个模块中,还是倾向于把东西分解成许多更小的模块?

2)您是否在顶层注入了一个注入整个对象树的注入器,或者多个注入器点缀着哪个注入器,只注入那些您真正需要注入的依赖关系?我在这里想到了我自己的代码库,当然,它有很多依赖关系,但只有一小部分我需要在测试期间进行控制。

3)我稍微停留在使用仅测试环境模块而不是生产版本来获得我的系统/集成测试的最佳方式。这个问题可能是特定于实现的,但我很好奇人们使用什么方法。作为参考,我的应用程序是一个基于servlet的web应用程序。

其他指针?

回答

13

1)通常你会把事情分解成多个模块。 Guice的目标之一是帮助代码模块化,这就是模块的用途。你如何解决这个问题取决于你(显然,你并不是绝对必须的)。更细粒度模块的一个优点是,您可以在特定包中定义模块,并使实现接口包的专用类变为私有。由于该模块位于软件包中,因此可以绑定这些具体的类,并且可以将它们用于配置Injector(在另一个软件包中)。另外,当你改变某个模块的完成方式时,你可以使代码更加灵活,只需将一个模块换成另一个模块,而不必在单个单片模块中更改代码。

2)是的,顶层的一个注入器注入整个对象树是通常应该完成的事情。这回到模块的东西......使用它们将依赖关系分解到组并使用一个注入器。

3)使用配置注入器的不同入口级别。对于一个独立的应用程序,我有一个不同的main类...对于一个web应用程序,我想你可以做一个单独的GuiceServletContextListener进行测试。然后,您可以用模块替换整个模块进行测试,或使用Modules.override覆盖特定模块中的绑定等。

+0

啊,我想我现在开始看到差异了。我偶然发现了另一篇关于我的困惑的帖子。从本质上讲,整个代码中的多个注入器更类似于服务定位器模式,而不是依赖注入。还有更多的事情需要我去解决,但是谢谢你的回答,因为这给了我一个非常好的开始。 – 2010-07-19 10:28:36

0

看看书Dependency Injection - 它涵盖了Guice和Spring,所以非常适合从一个框架转换到另一个框架。如果您已经了解IoC背后的原理,那肯定很好。