Guice injector.getInstance() - Good Practice?

2022-09-02 03:53:16

假设我有两个应用程序共享同一个库。该库包含DAO,Utils等常见类。共享库中的所有内容都与 Guice 连接。我的两个应用程序依赖于此库,但不直接依赖于 Guice。

 ______    ______    ______
|      |  |      |  |      |
| APP1 |->| LIB  |<-| APP2 |
'------'  '------'  '------'

我目前使用类似这样的东西:

static <T> Utils.getInstanceOf (Class<T> type);

它只是一个包装器:

injector.getInstance (Class<T> type);

但是 guice 文档说:

如果可行,请避免使用此方法,而应让 Guice 提前注入依赖项。

那么,为这两个应用提供依赖关系注入而无需在 Guice 模块中手动绑定它们的最佳方法是什么?


答案 1

那么,为这两个应用提供依赖关系注入而无需在 Guice 模块中手动绑定它们的最佳方法是什么?

没有这样的方式。你要么完全接受 Guice,要么不使用它并显式传递你的依赖项。好吧,以这种方式构建代码,这样你就不会直接创建类依赖关系,而是通过构造函数传递它们,也可以称为“依赖注入”,但我相信这不是你的意思。如果您不想在应用程序中使用Guice,您将无法获得比 更好的东西,这很丑陋,特别是因为您使用的是静态包装器。getInstance()

理想情况下,您的库应该提供一个模块,您可以通过该模块安装在应用程序中,或者反过来,该库应该提供一个实例,您可以通过使用和提供特定于应用程序的模块在应用程序中使用该实例。对此方法的轻微修改是将特定于应用程序的模块传递到库,以便它们将用于创建 。我最近在自定义的类似servlet的接口上编写了基于Guice的API,该接口使用最后一种方法根本不支持任何类型的DI,并且它运行良好。Guice.createInjector()InjectorcreateChildInjector()Injector

在 servlet 或 Jersey 环境中使用 Guice 并不难。例如,后者与Guice具有开箱即用的集成(至少在1.x版本中)。Guice servlet扩展也非常好,很方便。试试吧,亲眼看看。


答案 2

static <T> Utils.getInstanceOf (Class<T> type);

您最终得到的是一个服务定位器

虽然在一些小情况下,这对于逃逸到其他创造对象中是可以接受的,但我不认为这是其中之一。您最终遇到了服务定位器的所有缺点,并且通过使用您已经在使用的工具可以获得所有优点。injector


推荐