我试图在构造函数中传递一些参数时注入一些类。为了实现这一点,我发现这个问题(1、2 )说这可以通过使用工厂辅助注射来实现。这就是我的代码的样子,遵循提供的示例和阅读相关文档后的一些修改。
梯度脚本
dependencies {
compile 'org.roboguice:roboguice:3.+'
provided 'org.roboguice:roboblender:3.+'
compile 'com.google.inject.extensions:guice-assistedinject:3.+'
}
带有接受参数的 create 方法的工厂接口
public interface ICustomObjectFactory {
ICustomObject create(Callback callback);
}
实现接口的类
public class CustomObject implements ICustomObject {
protected String name;
@AssistedInject
public CustomObject(@Assisted Callback callback){
this.callback = callback;
}
}
从应用程序类使用和调用的模块
public class SomeModule extends Module {
@Override
protected void configure() {
install(new FactoryModuleBuilder()
.implement(ICustomObject.class, CustomObject.class)
.build(ICustomObjectFactory.class));
}
}
从 Application 类注册的注入模块
@Override
public void onCreate() {
super.onCreate();
RoboGuice.getOrCreateBaseApplicationInjector(this, RoboGuice.DEFAULT_STAGE,
RoboGuice.newDefaultRoboModule(this), new SomeModule(this));
}
使用工厂
public class SomeClass implements Callback {
@Inject ICustomObjectFactory factory;
public SomeClass () {
ICustomObject first = this.factory.create(this);
}
}
有了这样的一切,当我尝试使用工厂时出现此错误,因为它已用于SomeClass
java.lang.IllegalStateException: Factories.create() factories cannot be used until they're initialized by Guice.
at com.google.inject.internal.util.$Preconditions.checkState(Preconditions.java:142)
at com.google.inject.assistedinject.FactoryProvider2.getBindingFromNewInjector(FactoryProvider2.java:564)
at com.google.inject.assistedinject.FactoryProvider2.invoke(FactoryProvider2.java:625)
at java.lang.reflect.Proxy.invoke(Proxy.java:397)
at $Proxy12.create(Unknown Source)
有人知道为什么工厂没有初始化吗?我知道应该由模块初始化,并且我确定它被调用的模块。
我的代码与链接问题中的代码之间最显着的区别是,在问题中,构造函数被注释为@Inject
,而不是@AssistedInject
。在此修改之前,我在编译应用程序时遇到此错误。
错误:任务“:app:compileDebugJavaWithJavac”执行失败。java.lang.ClassCastException: com.sun.tools.javac.code.Type cannot be cast to javax.lang.model.type.DeclaredType dle的依赖缓存可能已损坏(有时会在网络连接超时后发生。)重新下载依赖项和同步项目(需要网络)
Gradle 构建过程(守护进程)的状态可能已损坏。停止所有 Gradle 守护程序可能会解决此问题。停止 Gradle 构建过程(需要重新启动) 您的项目可能正在使用与项目中的其他插件或项目请求的 Gradle 版本不兼容的第三方插件。 在 Gradle 进程损坏的情况下,您还可以尝试关闭 IDE,然后杀死所有 Java 进程。
也许这不是实现我需要的最佳方法。如果不是,有人可以指出正确的方向吗?
谢谢大家的帮助