Open wangxuyang518 opened 7 years ago
dagger2也就是依赖注入框架的实现。意义在于帮助你管理对象。你不需要关心对象是如何创建,你只管在你用对象的地方加入@inject。你不在关心对象如何创建。因为有的对象创建很麻烦,比如构造参数有很多,或者这个对象里面有很多组件也要new。可能创建一个对象就需要十几行。这放在我们代码中,并不美观。当然这只是一个优点。接下来请后面的人开始你们的表演
依赖注解的核心思想是:只管使用,不管创建。这点在错综复杂的项目中,作用很明显。在有相同scope的component里面,整个component里面的对象采用集中式管理,对象之间的访问是直达的,不需要set、get、构造传参数等方式进行依赖注入。component能很好地管理对象的生命周期,你不需要写单例模式,更不需要关心你的单例是不是线程安全的,因为dagger2已经帮你管理得很好。
大神在吗,有个问题想请教大神,比如说有一个Activity是一个Subcomponent,里面有2个fragment也是Subcomponent,我想在activity中实例化好一个User对象提供给两个fragment使用。以前的我的做法是通过build activity的component时,new UserModule(user)把实例化好的user传进去,现在通过AndroidInjection.inject(this)改如何在Activity中把这个实例化好的user传递进去?
在activity的module里面用provide方法或Use构造函数本来就可以inject,然后在activity或者它的subcomponent 里面任意地方inject user,只要scope相同,这个user实例就是同一个
比较高效的dagger配置请参照example例子https://github.com/thepacific/android-architecture/tree/master/architecture/example
大神,我的意思是在2.11之前的版本,需要通过DaggerXXXComponent.builder().buid.inject来注入,那么在传入module实例时,可以传递一些参数进去。在2.11及之后,注入者对被注入者不可见,只需要一句AndroidInjection.inject(this),就可以实现注入,但是现在我想传递参数,这样就传递不了了。说的可能不是很清楚,不知道大神明白吗?
@zombiu 你非要用AndroidInjection.inject(this)的话,在Activity里面创建一个User实例,有一个getUser()方法。然后在ActivityModule里面提供providerUser方法
class YourActivityModule {
@Provides
fun provideUser(activity: YourActivity): User {
return activity.getUser()
}
}
又或者你可以在activity的component Builder里面通过@BindInstance把User传过去,然后在ActivityModule直接用
不知道是不是你要的?
大神,这种方法挺新颖的,activity没有直接从modeul传入实例,这个activity的实例是自动从AndroidInjection.inject(this)这里获取的activity实例吗?
@zombiu 嗯 嗯对的
@all 谢谢各位老哥的回答,谢谢!
Dagger2 大部分都是了解一点皮毛;只会一个注入。在项目中建立那么多类 接口。而且在类中还要写注入的代码。。做了一系列操作 仅仅是注入了一个adapter 或者present。。想问这样真的有意义吗