1

我是 Guice 的新手,所以如果这是一个愚蠢的问题,请原谅,但我觉得这很令人沮丧。

在我的模块中,我构造了一个对象,它是我无法控制的框架的成员。然后我绑定该实例,以便以后可以使用 injector.getInstance(FrameworkClass.class); 访问它。

当我构造该对象时,我想使用我自己的对象之一,该对象本身被注释为由构造函数注入。

IE

public class MyClass { 
    OtherClass dependency;

    @Inject
    Public MyClass(OtherClass dependency) {
       ....
    }
}

public class AModule extends AbstractModule {

    protected void configure() {
        MyClass frameworkDependency = ???
        FrameworkClass fc = new FrameworkClass(frameworkDependency);
        bind(FrameworkClass.class).toInstance(fc);
    }
}

在此示例中,OtherClass 只是一个没有注释的简单类,但有一个默认的空构造函数,因此据我所知,Guice 应该只新建一个并将其提供给 MyClass 构造函数。

我的问题是如何在我的模块中访问 MyClass 的新实例,以便我可以将它提供给框架类?

以前我通过 Field Injection 注入了我自己的类,所以它看起来像这样:

public class MyClass { 

    @Inject
    OtherClass dependency;      
}

public class AModule extends AbstractModule {

    protected void configure() {
        MyClass frameworkDependency = new MyClass();
        requestInjection(frameworkDependency);
        FrameworkClass fc = new FrameworkClass(frameworkDependency);
        bind(FrameworkClass.class).toInstance(fc);
    }
}

如果可能的话,我宁愿将 MyClass 作为构造函数注入。

4

2 回答 2

2

如果您使用一种@Provides方法,就像您的答案一样,每个参数都将通过注入器解析 - 包括使用绑定注释的依赖项,并包括类型参数Provider<MyClass>而不仅仅是 MyClass。注入Providers 是在一个类中检索依赖项的多个实例的最佳方法。

@Provides FrameworkClass provideFrameworkClass(
    Dependency1 dep1, Provider<Dependency2> dep2Provider) {
  return new FrameworkClass(dep1, dep2Provider.get(), dep2Provider.get());
}

如果您的所有绑定都可以通过 Guice 找到,那么您可以或多或少地@Inject使用toConstructor绑定在外部标记构造函数。请注意,Guice 文档实际上更喜欢这种@Provides技术而不是这种技术,因为反射性地获取构造函数本质上比依赖编译器更脆弱。不过,如果您的参数列表很长,这可能是一个不错的选择。

最后,如果您的 @Provides 方法足够大(或具有足够复杂的逻辑)以值得拥有自己的类,您总是可以创建自己的实现Provider<FrameworkClass>--complete 使用尽可能多的@Inject离子 -- 并实现创建手动(通过bind(FrameworkClass.class).toProvider(FrameworkClassProvider.class).

于 2012-12-21T02:02:12.070 回答
0

所以我找到了我自己的问题的答案(以最简单的形式):

通过将框架对象的配置移动到提供方法中,我可以将 MyClass 对象作为参数传递给方法,并且 Guice 在该参数的实例化中处理,ala:

@Provides
@Singleton
FrameworkClass provideFrameworkClass(MyClass dependency) {
    return new FrameworkClass(frameworkDependency);
}

但这引出了一个问题,在更复杂的情况下会发生什么,如果我的框架没有采用单个依赖项,但其中有 n 个(比如说它是一个执行一系列操作的调度程序),我不能只扩展我的 provideFrameworkClass 方法取 n+ 个参数?

于 2012-12-20T12:09:28.767 回答