是否可以访问以前创建的Guice注射器?

问题描述 投票:0回答:1

[查看Guice(和Dagger)的新项目。到目前为止,我看过的每本Guice教程都显示了在开发人员需要DI来创建对象实例时正在创建的注射器。

在网络上看到的典型示例:

public static void main(String[] args) {
    Injector injector = Guice.createInjector(new BasicModule());
    Communication comms = injector.getInstance(Communication.class);
}

对我来说,这违背了DI的目的-在需要实例的任何地方,您都将实例绑定到定义如何构建实例的模块上。

是否有一种方法可以要求Guice创建一个类的实例,该类的模块(依赖关系图)先前已定义给Guice(例如,在应用程序启动时?)。

我正在使用Dropwizard.io框架,因此在某些情况下,我无法完全控制类的构造方式,但希望能够模拟出我在该类中引用的依赖项。

对Dagger也是一样,我很欣赏其中的一个例子。

编辑:多年来,我已经在.NET中使用了多个DI框架,因此,我将基于其中之一来举例说明我要尝试执行的操作。

例如,在ASP.NET Core DI的实现中,在服务启动时,定义了您希望DI能够创建的服务。通常,您会要求DI给您一个实例,该实例是接口的实现。因此,在启动时:

protected override void ConfigureAdditionalServices(IServiceCollection services)
{
    services.AddScoped<ITransactionService, TransactionService>();
}

其中IServiceCollection是为DI定义的服务的集合。

因为DI与ASP.NET框架集成在一起,所以从这一点开始,您通常可以定义一个采用ITransactionService的构造函数,DI会为您提供。

但是,如果您在不了解它的框架中使用DI,则需要访问当前的ServiceProvider实例,然后您可以要求DI这样创建对象:

var transactionService = ServiceProvider.GetService<ITransactionService>();

[我意识到这实现了Service Locator anti-pattern,但它仍然具有将代码与具体的类实现分离的优点,并允许我在应用程序启动时对其进行模拟以进行测试。

回到问题所在>>因此,要根据这种情况重述我的问题,我该如何在代码中的某个随机点向Guice请求一个类?

我需要在此代码中进行哪些更改才能使其正常工作?

public class TransactionModule extends AbstractModule {
  @Override 
  protected void configure() {
    bind(TransactionServiceBase.class).to(TransactionService.class);
  }
}

// At startup
Injector injector = Guice.createInjector(new TransactionModule());


// Then, somewhere in the application, to get an instance of TransactionService
TransactionServiceBase transactionService = (TransactionServiceBase)Guice.getInstance(TransactionServiceBase.class);

[查看Guice(和Dagger)的新项目。到目前为止,我看过的每本Guice教程都显示了在开发人员需要DI来创建对象的时候正在创建的注射器...

java dependency-injection guice dagger-2
1个回答
0
投票

[我认为您可能会误解Injector.getInstance-就像您的示例使用public static方法来开始操作一样,即使您通常不使用所有公共静态方法编写应用程序的其余部分(我希望),您也不要呼叫Injector.getInstance,除非在少数情况下。

© www.soinside.com 2019 - 2024. All rights reserved.