Dependency injection 如何避免在使用guice时让injector.createInstance()到处都是?

Dependency injection 如何避免在使用guice时让injector.createInstance()到处都是?,dependency-injection,guice,Dependency Injection,Guice,关于guice,有一点我并不了解:根据我目前所读的内容,我应该只在我的引导类中使用注入器(在独立应用程序中,这通常在main()方法中),如下面的示例(取自guice文档): 但如果不是所有我需要的对象都可以在启动时创建呢?也许我想在应用程序运行时响应一些用户交互?当我需要创建一个新对象时,我不需要把我的注入器放在某个地方(例如作为一个静态变量),然后调用injector.getInstance(SomeInterface.class)吗 当然,到处散布对Injector.getInstance

关于guice,有一点我并不了解:根据我目前所读的内容,我应该只在我的引导类中使用注入器(在独立应用程序中,这通常在main()方法中),如下面的示例(取自guice文档):

但如果不是所有我需要的对象都可以在启动时创建呢?也许我想在应用程序运行时响应一些用户交互?当我需要创建一个新对象时,我不需要把我的注入器放在某个地方(例如作为一个静态变量),然后调用injector.getInstance(SomeInterface.class)吗

当然,到处散布对Injector.getInstance()的调用似乎并不可取


我这里出了什么错

是的,您基本上只应该使用注入器为根对象创建和获取实例。应用程序的其余部分不应接触Guice容器。正如您所注意到的,您仍然需要在需要时创建一些对象。有不同的方法可以做到这一点,每种方法都适合不同的需要

注入提供者 是来自Guice的接口。它允许您请求对象的新实例。该对象将使用Guice创建。比如说

 class MyService{
     private Provider<Transaction> transactionProvider;
     public MainGui(Provider<Transaction> transactionProvider){
         this.transactionProvider = transactionProvider;
     }

     public void actionStarted(){
         Transaction transaction = transactionProvider.get();
     }
classmyservice{
私人提供商交易提供商;
公共MainGui(提供程序transactionProvider){
this.transactionProvider=transactionProvider;
}
public void actionStarted(){
Transaction=transactionProvider.get();
}
建立工厂 通常,您需要某种工厂。此工厂使用一些注入的服务和一些参数,并为您创建一个新对象。然后,您将此工厂用于新实例。然后,您注入该工厂并使用它。此外,还提供了-扩展的帮助


我认为,有了这两种可能性,您很少需要使用Guice注入器本身。但是,有时仍然适合使用注入器本身。然后您可以将注入器注入组件。

要扩展Gamlor发布的答案,您还需要区分您正在使用的对象类型


对于服务,注入是正确的解决方案,但是,不要总是尝试创建数据对象(通常是对象图中的叶子)可注入。在某些情况下,这可能是正确的解决方案,但注入
提供程序可能不是一个好主意。我的一位同事最终这样做了,过了一段时间,代码库变得非常混乱。我们刚刚把它全部清理完,Guice模块现在更加具体了。

抽象地说,我认为一般的想法是,如果响应用户事件是应用程序功能的一部分,那么

BillingService billingService = injector.getInstance(BillingService.class);
billingService.respondToUserEvent( event );

我想这可能有点抽象,但基本的想法是您可以从Guice获得顶级应用程序类。从您的问题判断,我猜BillingService可能不是您的顶级类?

是的,我完全同意这一点。
BillingService billingService = injector.getInstance(BillingService.class);
billingService.respondToUserEvent( event );