如何在Guice Provider中使用Guice Injector?

5

我正在使用guice来注入依赖。

我有一个提供者:

public class RequestUrlRepository implements Provider<IRequestUrlRepository> {


    @Singleton
    @Override
    public IRequestUrlRepository get() {
        IRequestUrlRepository answer = null;
        if (System.getProperty("").equals(RouteOrCostRequest.cost.toString())){
            answer = new CostRequestUrlRepository(...);
        }
        else
        {
            answer = new RoutingRequestUrlRepository(...);
        }
          return answer;
    }
}

我该如何使用Guice注入器来填充new CostRequestUrlRepository(...);new RoutingRequestUrlRepository(...),当它们在提供程序中时?

如果不可能,那么我该如何初始化它们而不是手动创建所有构造函数参数?

1个回答

5

提供者可以接受使用 @Inject 注释的构造函数和字段,而 Guice 的内置绑定将允许您注入 Injector 和提供者(例如 Provider<CostRequestUrlRepository>)为其提供的所有键。

@Singleton
public class RequestUrlRepository implements Provider<IRequestUrlRepository> {

    @Inject Provider<CostRequestUrlRepository> costRepositoryProvider;
    @Inject Provider<RoutingRequestUrlRepository> routingRepositoryProvider;
    @Inject Injector injector;

    @Override public IRequestUrlRepository get() {
        IRequestUrlRepository answer = null;
        if (System.getProperty("").equals(RouteOrCostRequest.cost.toString())){
            return costRepositoryProvider.get();
        } else {
            return routingRepositoryProvider.get();
        }

        // Alternatively:
        return injector.getInstance(Class.forName(System.getProperty("")));
    }
}

请注意,@Singleton注解应该放在类上而不是方法上;根据Guice邮件列表的说法,“作用域注解适用于整个提供程序,用@Singleton注释get()方法是错误的并且会被忽略。”(链接)。
理想情况下,您应该注入每个提供程序而不是注入整个注入器;这样可以更容易地看到系统的依赖关系,然后您就可以更少地依赖Guice而更多地依赖通用的JSR330注解。但是,如果您必须根据变量中的名称或Class文字来实例化任意类,则注入Injector是正确的方法。

我建议初始化 costRepositoryroutingRepository 来填充接口 IRequestUrlRepository。我认为不需要为它们中的每一个编写提供程序。 - Elad Benda2
对于任何绑定到 XProvider<X>@Provides X 的情况,Guice 将自动创建 Provider,并自动调用 provider.get()。无需为存储库编写自己的 Providers。 - Jeff Bowman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接