如何在分离的模块上实现存储库模式?

时间:2019-04-04 07:00:17

标签: android

我正在Android上实现存储库模式。当尝试将SharedPreferences实现为存储库时,问题开始了。

我希望我的数据或存储库层没有特定于Android的类或组件。因此,我无法引用SharedPreferences对象,因为它需要一个Context

我的Android Studio项目中的模块总结如下:

|-> moduleApp       // an android-application module
|-> moduleViewModel // an android-library module
|-> moduleData      // a java-library module with no access to Context object

我的解决方案是在moduleData模块中创建一个接口,例如:

interface PreferencesRepository {
    fun retrievePreference() : String
}

然后,在moduleApp模块中实现以上接口。 moduleApp模块将类似于:

|-> moduleApp
|-----> com.app.ui   // classes related to UI (Fragment, Activity, etc)
|-----> com.app.di   // classes related to dependency injection
|-----> com.app.foo  // more classes specific to the app module
|-----> com.app.data // data package inside the app module
|---------> PreferencesRepositoryImpl.kt

因此,实现将是这样:

class PreferencesRepositoryImpl(prefs: SharedPreferences) {
    fun retrievePreference(): String {
        return prefs.getString(...)
    }
}

现在,每当我需要SharedPreferences存储库时,我都将通过依赖项注入来注入PreferencesRepository接口。

我认为这是分离模块的正确方法,它也不会违反依赖规则。但是似乎有更好的方法与如何依赖其他层的Android特定类有关。

有人用另一种方法解决了这个问题吗?

1 个答案:

答案 0 :(得分:0)

您可以有一个单独的缓存模块,将来如果要与其他交换点SharedPreferences进行交换,则可以处理来自SharedPreferences的数据并从中获取数据,而无需更改存储库实现中的任何代码而不是只更改缓存模块中的代码,这也将使代码更具可读性,您可以查看此项目以获取实施帮助

https://github.com/bufferapp/clean-architecture-components-boilerplate