Dagger是什么?
Dagger is a fully static, compile-time dependency injection framework for both Java and Android.
这是google官方文档的定义,简单来说Dagger就是一个用来依赖注入的框架,而Dagger2是Dagger1上的改进,原先的Dagger1是由square公司维护的,现在的Dagger2是由google公司维护的.这两个框架主要的区别在于Dagger不使用反射来实现注入,更多区别可以看这里.
Dagger的好处是?
关于使用Dagger到底有什么好处呢?网上一搜一大片,基本是说模块之间的解耦等等,我觉得是因人而异,根据项目需要.如果你这个类,只实例化几次,只用在几个地方,或者说是个单例,那用依赖注入就显得有点多余或者说麻烦,但如果你这个项目采用MVP结构,可能还用上了Clean Architecture,那你觉得Dagger非常方便,因为这些项目结构中,各个模块之间的耦合度都尽量减少到最低,这样带来的问题就是:连接各个模块之间的纽带会增加很多,而且涉及类实例传递比较频繁.举个例子,这是采用MVP+Clean的某个Presenter类所需要持有的类实例:
private WeatherRepository mWeatherRepository;//数据仓库,隐藏了数据源,对外开放获取数据源方法和回调通知
private WeatherContract.View mWeatherView;//MVP中的View模块,Presenter通过持有View实例来对视图进行操作
private WeatherUseCase mWeatherUseCase;//业务逻辑代码封装,在Clean Architecture中,业务逻辑属于最内层,是不依赖于外层代码,能独立运行的.有兴趣可以了解.
可以看到,如果不考虑Presenter的复用和其他优化,基本一个View就要对应一个Presenter.看到这里,你可能还是觉得不够有说服力,我们再看下WeatherRepository的代码:
private WeatherLocalDataSource mLocalDataSource;
private WeatherRemoteDataSource mRemoteDataSource;
//Repository由两个不同的数据源提供数据
public WeatherRepository(WeatherLocalDataSource localDataSource, WeatherRemoteDataSource remoteDataSource)
{
mLocalDataSource = localDataSource;
mRemoteDataSource = remoteDataSource;
}
在项目中,数据来源可能有多个,比如缓存数据来源SQlite或者就保存在内存中,网络数据可能用okhttp+retrofit等等,如果使用SQlite是不是要还有持有操作数据库的对象实例,获取网络数据,如果用okhttp+retrofit,是不是还要持有okhttpClient和retrofit实例呢,而且还要考虑okhttpClient的实例顺序要先于retrofit等等
如果某个类实例繁琐,依赖多个外部实例,而且使用频率又高,后期改动维护都是非常麻烦的.更多好处,可以看下官方文档
网友评论