在研究依赖注入时,我发现了一些建议的方法注入一切 http://frogermcs.github.io/inject-everything-viewholder-and-dagger-2-example/和其他人说没有必要这样做 https://stackoverflow.com/a/37517764/6100078.
在我当前的项目中,我关于依赖注入的经验法则是“如果该类是我创建的,我将其设置为可注入“。换句话说,只有像这样的类SimpleDateFormat
, ArrayList
, HashMap
是我的项目中的新事物。我这样做的目的是我可以@Inject
任何地方的任何班级一次调用Injector.getApplicationComponent().inject(this)
in the Activity
。基本上我所有的类都有一个非参数构造函数@Inject
.
我最初使用 DI 是因为我认为一旦使用 DI 将会提高性能和内存使用率new
运算符仅由 Dagger 生成的类使用。但我读了一篇post https://stackoverflow.com/a/21544630/6100078Dagger 1 开发人员表示 DI 对性能没有影响,使用基本上是为了减少样板文件。
第一个问题是:
- Dagger 2在Android应用中没有任何性能优势吗?
我的项目运行没有问题,我认为“注入一切”的方法有助于更好地组织,尽管有一些缺点。
使用此方法的一个示例是以下类:
public class TimelineEntryAdapter {
@Inject
Provider<TwitterEntry> mTwitterProvider;
@Inject
Provider<InstagramEntry> mInstagramProvider;
@Inject
Provider<FacebookEntry> mFacebookProvider;
@Inject
TimelineEntryComparator mComparator;
@Inject
public TimelineEntryAdapter() {
}
第二个问题是:
- 在 Android 中注入所有内容是一种不好的做法吗?
如果第二个问题的答案是“否”,是否有更好的方法来处理非参数构造函数来创建类?因为当我创建一个非参数构造函数时@Inject
注释和类需要一些参数才能使用,我必须使用setters
:
public class SavelArtist {
private MusicBrainzArtist mMusicBrainzArtist;
private DiscogsArtist mDiscogsArtist;
private List<SavelTweet> mTweetList;
private SpotifyArtist mSpotifyArtist;
private List<SavelInstagram> mInstaTimeline;
private List<SavelFacebook> mFacebookTimeline;
private List<SavelRelease> mReleases;
@Inject
Provider<SavelRelease> mReleaseProvider;
@Inject
public SavelArtist() {
}
public void setMusicBrainzArtist(MusicBrainzArtist mbArtist) {
mMusicBrainzArtist = mbArtist;
}
public void setDiscogsArtist(DiscogsArtist discogsArtist) {
mDiscogsArtist = discogsArtist;
}
public void setTweetList(List<SavelTweet> tweetList) {
mTweetList = tweetList;
}
public void setSpotifyArtist(SpotifyArtist spotifyArtist) {
mSpotifyArtist = spotifyArtist;
}
public void setInstaTimeline(List<SavelInstagram> instaTimeline) {
mInstaTimeline = instaTimeline;
}
public void setFacebookTimeline(List<SavelFacebook> fbTimeline) {
mFacebookTimeline = fbTimeline;
}
一旦在流程中同时获取所有参数,就可以在构造函数上设置所有参数。