我有很多Android ViewModel类,它们往往有很多依赖项(大多数是Room中的DAO,每个SQLite表一个)。有些依赖项超过10个。
这很好,但Inject构造函数充满了参数,并且只包含样板代码,用于从构造函数参数设置注入的成员。
我想切换到“常规”注入成员,使用@Inject
注释单独标识,就像其他(哑)类一样。
这对于与Android相关的类(尽管ViewModel被宣传为非Android依赖,例如它们不使用Android框架)(例如活动和片段)失败。
解决方法是使用工厂,它是使用漂亮的HasActivityInjector
、HasServiceInjector
等接口从Application
类注入的。
Dagger不提供任何HasViewModelInjector,因此如果我坚持单独注入成员而不是注入构造函数,我得到的是:
错误:[dagger.android.AndroidInjector.inject(T)]如果没有@Inject构造函数或@Provides-anttated方法,则无法提供XXXViewModel。此类型支持成员注入,但不能隐式提供。
如果我创建了一个模块,该模块具有提供注释来创建ViewModel,那么它不会注入单个成员。
我错过了什么(我的最后一句话是我的问题中最重要的)还是根本不可能注入成员,我必须注入构造函数?
一点代码。
我想要的:
class MyViewModel extends ViewModel {
@Inject
MyDao myDao;
}
与我需要做的相比:
class MyViewModel extends ViewModel {
private final MyDao myDao;
@Inject
MyViewModel(MyDao myDao) {
this.myDao = myDao;
}
}
第一块代码(我想要的)需要在模块中使用此方法:
@Provides
MyViewModel provideMyViewModel() {
return new MyViewModel();
}
但在这种情况下,myDao字段为空。如何注入带注释的成员?
如果我需要注入大量成员,我想避免使用第二块代码,这往往会创建一个包含许多参数的庞大构造函数。
有多种注入方式,我想你指的是字段注入。与构造函数注入不同,字段注入必须手动触发。为此,请在组件中定义一个以视图模型为参数的方法。
void inject(ViewModel viewModel)
然后从视图模型构造函数调用这个方法。
class MyViewModel extends ViewModel {
private final MyDao myDao;
@Inject
MyDao myDao;
public MyViewModel() {
MyComponent mycomponent = DaggerMyComponent.....
myComponent.inject(this);
}
}
我试图了解DI在我们的代码库(Kotlin)中是如何使用的。我们正在使用googleguice进行依赖注入。 下面是一个示例类: 在模块类中: DepB类别: 据我所知,对于用< code>@Inject注释的变量,Google Guice会使用模块类来解决这些依赖关系。所以< code>DepA对象的注入方式是有意义的。 但是呢?我们如何能够在不指定任何位置的情况下注入DepB?
//模块 //组件 `//预登录Presenter //预物流活动` //在一次创建中 //错误日志 错误:(18,53)错误:找不到符号类DaggerPresentComponent错误:(19,53)错误:找不到符号类DaggerUserLoginComponent错误:(19,10)错误:gorick.gradesprojectandroid.MVP. Presenter. Presente
问题内容: 如果你看一下课堂上的代码,我有两个问题: 服务器启动时,如果我在此类的构造函数中放置一个断点,就像在构造函数中那样,它是由spring使用配置的bean 提供的。但是,构造函数上没有注释,那么,在这个世界中如何以正确的依赖关系调用该构造函数?应该是null。 这是Spring Boot的自动假设吗? Spring是否看到“私有字段+构造函数参数”,并且假定它应该寻找合适的bean? 是
问题内容: 我正在尝试在我的项目中实现dagger2,但遇到错误“ android.app.Application必须在没有@Inject构造函数或@Provides注释方法的情况下才能提供 ”。 这是我的代码: App.java di / AppModule.java di / AppComponent.java di / TestClassModule.java di / TestClassC
我有一个单例类定义为: 我有另一个类使用这个单例类,但这个类必须使用新操作符创建。因此,我不能使用构造函数注入或setter注入等。 我当然可以将此实例传递到MyClass的构造函数中,但从我的程序上下文来看,这不是一个很好的设计。 另一个解决方案是为MySingletonClass创建一个静态getInstance方法,这样我就可以从程序中的任何地方获取实例。但我想知道Guice是否支持类似的东
有人能帮助实现没有注释的Guice吗? pom。xml 我所尝试的: 我得到的错误是: 我理解这个错误。 但是我希望我可以“指向”Guice到正确的构造函数......而不是使用注释。 如您所见,使用默认/空构造函数不是一个好选择,因为这个示例很简单,但我想坚持使用基于构造函数的注入。 附加: 根据我在评论中从赫曼特·辛格那里得到的“暗示”,我想我离得更近了。 我创建了一个ProductionIn