我是Guice的新手,如果这是一个愚蠢的问题,请原谅我,但我觉得这很令人沮丧。
在我的模块中,我构造了一个对象,它是我无法控制的框架的成员。然后我绑定该实例,以便稍后可以使用injector.getInstance(FrameworkClass.class)访问它;
当我构造那个对象时,我想使用我自己的一个对象,它本身被注释为由构造函数注入。
即
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作为构造函数注入。
答案 0 :(得分:2)
如果您使用@Provides
方法,就像在答案中一样,每个参数都将通过注入器解析 - 包括使用绑定注释的依赖项,并包括类型Provider<MyClass>
的参数而不仅仅是MyClass 。注入Provider
是在一个类中检索多个依赖项实例的最佳方法。
@Provides FrameworkClass provideFrameworkClass(
Dependency1 dep1, Provider<Dependency2> dep2Provider) {
return new FrameworkClass(dep1, dep2Provider.get(), dep2Provider.get());
}
如果可以通过Guice找到所有绑定,则可以使用toConstructor
binding或多或少通过@Inject
在@Provides
外部标记构造函数。请注意,Guice文档实际上更喜欢Provider<FrameworkClass>
技术而不是此技术,因为反过来获取构造函数本质上比依赖于编译器更脆弱。但是,如果您有一个长参数列表,这可能是一个不错的选择。
最后,如果你的@Provides方法足够大(或者具有足够复杂的逻辑)来表示它自己的类,你总是可以创建自己的@Inject
实现 - 尽可能多地完成bind(FrameworkClass.class).toProvider(FrameworkClassProvider.class)
你想要的离子 - 并手动实现创建(通过{{1}}绑定。
答案 1 :(得分:0)
所以我找到了答案我自己的问题(最简单的形式):
通过将Framework Object的配置移动到Provide方法中,我可以将MyClass对象作为参数传递给方法,Guice在该参数的实例化中处理,ala:
@Provides
@Singleton
FrameworkClass provideFrameworkClass(MyClass dependency) {
return new FrameworkClass(frameworkDependency);
}
但这引出了一个问题,即在更复杂的情况下发生了什么,如果我的框架没有采用单一的依赖,但是其中的n个(比如它是一个采取一系列行动的调度员),我不能只扩展我的provideFrameworkClass方法取n +参数?