本地和远程数据源之间的Koin依赖注入切换

问题描述 投票:1回答:1

所以我正在用远程数据源编写此应用程序。我想添加本地数据库存储功能。我已经建立了一个具有接口DataSource的体系结构。 RemoteDataSourceLocalDataSource类实现该接口。 RemoteDataSource注入了ApiInterface改造,LocalDataSource注入了DAO。

[现在有此存储库接口和实现SomeDataRepositorySomeDataRepositoryImpl。如果我希望存储库能够从api提取数据并将其保存到数据库,该如何做?

[目前,我已经将RemoteDataSourceLocalDataSource类都注入了SomeDataRepositoryImpl,以访问来自不同数据源的方法。这样,我可以调用localDataSource.saveToDb()和/或remoteDatSource.fetchSomeData() int SomeRepositoryImpl类。但是我不知道将具体的实现传递给类是否可行。

但是如果我将单个DataSource接口传递给SomeDataRepository,我将必须在接口saveToDb()中定义一个DataSource函数,然后我也必须在RemoteDataSource中实现该函数这不是那么好。

任何人都可以通过最佳解决方案指导我。

而且在我这样做的时候,直接在api接口中使用LiveData包装类包装数据是否有好处?因为我不认为在存储库上调用方法时,我想在存储库中观察它,然后访问数据以将其放入本地数据库。

android dependency-injection local-storage repository-pattern koin
1个回答
0
投票

由于要使本地数据源充当远程数据源的后备,因此可以创建另一个数据源实现,该实现是本地和远程数据源的composition。该复合数据源可以包含回退逻辑,并根据需要处理到远程和本地数据源的delegation。完成此操作后,只需创建一个Koin模块来构造它们,然后将复合数据源绑定到数据源接口,就很简单了。

假设这是您的界面以及您已经拥有的两个数据源:

interface DataSource {
    fun getData(): Data
}

class RemoteDataSource : DataSource {
    // ...
}

class LocalDataSource : DataSource {
    // ...
}

然后您可以创建第三个类似的实现:

class CompositeDataSource(
    val remote: RemoteDataSource, 
    val local: LocalDataSource
) : DataSource {
    override fun getData() : Data {
        return try {
            remote.getData()
        } catch (e: Exception) {
            local.getData()
        }
    }
}

要定义所有这些,您的koin模块将看起来像这样

module {
    single { RemoteDataSource() }
    single { LocalDataSource() }
    single<DataSource> { CompositeDataSource(remote = get(), local = get()) }
}
© www.soinside.com 2019 - 2024. All rights reserved.