如何处理依赖循环匕首 2
how to handle dependency cycle dagger 2
我有两个 classes PdfTicketStorage
和 OfflineHelper
他们都相互依赖。
OfflineHelper class 需要 PdfTicketStorage 将数据发送到 firebase
class OfflineHelper @Inject constructor(
private val app: App,
private val settings: Settings,
private val pdfTicketStorage: PdfTicketStorage,
) {
private fun postPrintedTicket(offlineData: OfflineData) {
//SENDS DATA TO FIREBASE
val offlinePrintedTicketInfo = gson.fromJson(offlineData.requestInfoJson, OfflinePrintedTicketInfo::class.java)
pdfTicketStorage.store(offlinePrintedTicketInfo.pdfTicketFilePath, offlinePrintedTicketInfo.pdfTicketContent)
}
fun saveOfflineDataWithPdf() {
//save data to database
}
}
PdfTicketStorage 需要 offlineHelper 将数据保存在数据库中
public class PdfTicketStorage {
private final String cloudStorageBucket;
private final OfflineHelper offlineHelper;
public PdfTicketStorage(String cloudStorageBucket, OfflineHelper offlineHelper) {
this.cloudStorageBucket = cloudStorageBucket;
this.offlineHelper = offlineHelper;
}
public Single<String> storeTest(final String filePath, final byte[] fileContents, final String fuelOrderId) {
offlineHelper.saveOfflineDataWithPdf();
return Single.just("");
}
}
由于两者相互依赖,如何解决依赖循环
我收到错误
[Dagger/DependencyCycle] Found a dependency cycle:
public interface AppComponent {
^
com.xx.xxx.clean.offline.OfflineHelper is injected at
com.xx.xxx.injection.modules.ServiceModule.providePdfTicketStorage(…, offlineHelper)
com.xx.xxx.printing.storage.PdfTicketStorage is injected at
com.xx.xxx.clean.offline.OfflineHelper(…, pdfTicketStorage, …)
com.xx.xxx.clean.offline.OfflineHelper is injected at
com.xx.xxx.activities.MainActivity.offlineHelper
com.xx.xxx.activities.MainActivity is injected at
com.xxx.xx.injection.components.ActivityComponent.inject(com.xx.xxx.activities.MainActivity) [com.xx.xxx.injection.components.AppComponent → com.xx.xxx.injection.components.ActivityComponent]
服务模块
@Provides @PerApp
public PdfTicketStorage providePdfTicketStorage(App app, OfflineHelper offlineHelper) {
return new PdfTicketStorage(app.getString(R.string.cloud_storage_bucket), offlineHelper);
}
你能建议任何替代方案来解决这个问题吗
谢谢
R
你应该使用Lazy
public class PdfTicketStorage {
private final String cloudStorageBucket;
private final Lazy<OfflineHelper> offlineHelper;
public PdfTicketStorage(String cloudStorageBucket, Lazy<OfflineHelper> offlineHelper) {
this.cloudStorageBucket = cloudStorageBucket;
this.offlineHelper = offlineHelper;
}
public Single<String> storeTest(final String filePath, final byte[] fileContents, final String fuelOrderId) {
offlineHelper.get().saveOfflineDataWithPdf();
return Single.just("");
}
}
不方便的是延迟注入直接影响你的构造函数的参数。
但如果它适合你,你可以使用它
我有两个 classes PdfTicketStorage
和 OfflineHelper
他们都相互依赖。
OfflineHelper class 需要 PdfTicketStorage 将数据发送到 firebase
class OfflineHelper @Inject constructor(
private val app: App,
private val settings: Settings,
private val pdfTicketStorage: PdfTicketStorage,
) {
private fun postPrintedTicket(offlineData: OfflineData) {
//SENDS DATA TO FIREBASE
val offlinePrintedTicketInfo = gson.fromJson(offlineData.requestInfoJson, OfflinePrintedTicketInfo::class.java)
pdfTicketStorage.store(offlinePrintedTicketInfo.pdfTicketFilePath, offlinePrintedTicketInfo.pdfTicketContent)
}
fun saveOfflineDataWithPdf() {
//save data to database
}
}
PdfTicketStorage 需要 offlineHelper 将数据保存在数据库中
public class PdfTicketStorage {
private final String cloudStorageBucket;
private final OfflineHelper offlineHelper;
public PdfTicketStorage(String cloudStorageBucket, OfflineHelper offlineHelper) {
this.cloudStorageBucket = cloudStorageBucket;
this.offlineHelper = offlineHelper;
}
public Single<String> storeTest(final String filePath, final byte[] fileContents, final String fuelOrderId) {
offlineHelper.saveOfflineDataWithPdf();
return Single.just("");
}
}
由于两者相互依赖,如何解决依赖循环
我收到错误
[Dagger/DependencyCycle] Found a dependency cycle:
public interface AppComponent {
^
com.xx.xxx.clean.offline.OfflineHelper is injected at
com.xx.xxx.injection.modules.ServiceModule.providePdfTicketStorage(…, offlineHelper)
com.xx.xxx.printing.storage.PdfTicketStorage is injected at
com.xx.xxx.clean.offline.OfflineHelper(…, pdfTicketStorage, …)
com.xx.xxx.clean.offline.OfflineHelper is injected at
com.xx.xxx.activities.MainActivity.offlineHelper
com.xx.xxx.activities.MainActivity is injected at
com.xxx.xx.injection.components.ActivityComponent.inject(com.xx.xxx.activities.MainActivity) [com.xx.xxx.injection.components.AppComponent → com.xx.xxx.injection.components.ActivityComponent]
服务模块
@Provides @PerApp
public PdfTicketStorage providePdfTicketStorage(App app, OfflineHelper offlineHelper) {
return new PdfTicketStorage(app.getString(R.string.cloud_storage_bucket), offlineHelper);
}
你能建议任何替代方案来解决这个问题吗
谢谢 R
你应该使用Lazy
public class PdfTicketStorage {
private final String cloudStorageBucket;
private final Lazy<OfflineHelper> offlineHelper;
public PdfTicketStorage(String cloudStorageBucket, Lazy<OfflineHelper> offlineHelper) {
this.cloudStorageBucket = cloudStorageBucket;
this.offlineHelper = offlineHelper;
}
public Single<String> storeTest(final String filePath, final byte[] fileContents, final String fuelOrderId) {
offlineHelper.get().saveOfflineDataWithPdf();
return Single.just("");
}
}
不方便的是延迟注入直接影响你的构造函数的参数。 但如果它适合你,你可以使用它