【发布时间】:2017-05-18 11:31:52
【问题描述】:
在研究依赖注入时,我发现了一些建议 inject everything 的方法和其他建议 it's not necessary to do so 的方法。
在我当前的项目中,我关于依赖注入的经验法则是“如果该类是由我创建的,我将其设为可注入”。换句话说,只有像SimpleDateFormat、ArrayList、HashMap 这样的类在我的项目中是新的。我这样做的意图是,一旦在Activity 中调用Injector.getApplicationComponent().inject(this),我就可以在任何地方@Inject 任何类。基本上我所有的类都有一个带有@Inject的非参数构造函数。
我主要使用 DI,因为我认为一旦 new 运算符被 Dagger 生成的类独占使用,它会提高性能和内存使用率。但是我从 Dagger 1 的开发者那里读到了post 说 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 注解的非args 构造函数并且一个类需要一些参数才能使用时,我必须使用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;
}
所有参数都可以在构造函数上设置,一旦在流程中同时获取。
【问题讨论】:
-
您想提供您希望能够模拟的所有内容。您不必提供不需要模拟的内容(例如
LinearLayoutManager)。 -
就像 Epic 所说的,它用于轻松切换课程。它可能不是模拟的,它可能是“这个做日志记录,这个不做日志记录”。您可以在运行时进行热交换,或在编译时进行交换。请记住,如果您使用 Dagger,请确保您实际上是在“使用”它,通过在一个地方拥有多个课程。否则你只是无缘无故地添加了一个 DI 框架(我曾经接手过一个项目。增加了复杂性并没有真正的好处)
标签: java android dependency-injection dagger-2