【问题标题】:how to handle dependency cycle dagger 2如何处理依赖循环匕首2
【发布时间】:2020-12-09 20:47:19
【问题描述】:

我有两个类 PdfTicketStorageOfflineHelper 它们都相互依赖。

OfflineHelper 类需要 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);
    }

您能否建议任何替代方法来解决此问题

谢谢 回复

【问题讨论】:

    标签: android dagger-2 dagger


    【解决方案1】:

    你应该使用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("");
          
        }
    }
    

    不方便的是 Lazy Injection 直接影响你的构造函数的参数。 但如果你觉得它没问题,你可以使用它

    【讨论】:

    • 我试过了,但还是和以前一样的错误
    • 这是完全相同的堆栈吗?不是另一个循环依赖?
    • 您能提供给我们应用构造函数吗?
    • app 没有任何构造函数。但这就是你在 App 中寻找的东西吗? public void createComponent() { appComponent = DaggerAppComponent.builder() .appModule(new AppModule(this)) .build(); appComponent.inject(this); } public AppComponent component() { return appComponent; }
    • 如果你在 OfflineHelpeer 上添加 PerApp Scope 呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 2011-07-26
    • 2015-01-04
    • 2014-07-29
    • 2018-10-05
    • 2014-08-02
    相关资源
    最近更新 更多