实现 BaseDao 的多个 Daos 的存储库类委托 - 可能吗?

Posted

技术标签:

【中文标题】实现 BaseDao 的多个 Daos 的存储库类委托 - 可能吗?【英文标题】:Repository Class Delegation to Multiple Daos that implement BaseDao - Possible? 【发布时间】:2019-10-12 05:48:49 【问题描述】:

我的 android 应用程序有一个 Room 数据库。我的 FooDao 和 BarDao 都实现了 BaseDao:

interface BaseDao<T> 
    @Insert
    fun insert(obj: T): Long
    @Update
    fun update(obj: T)


@Dao
interface FooDao: BaseDao<FooEntity> 
    @Query("some query")
    fun doSomethingWithFoo()


@Dao
interface BarDao: BaseDao<BaseEntity> 
    @Query("some other query")
    fun doSomethingWithBar()

我也有一个存储库类:

class MyRepo(private val fooDao: FooDao, private val barDao: BarDao) 
    fun doSomethingWithFoo() = fooDao.doSomethingWithFoo()
    fun doSomethingWithBar() = barDao.doSomethingWithBar()

但想象一下,FooDao、BarDao 和 MyRepo 的功能远不止这两个功能。

我了解了类委托以启用组合继承。因此,我试图通过委托简单的函数来减少 MyRepo 中的样板,这些函数只调用 dao 的函数并返回 dao 的返回值。我应该这样做是有道理的:

class MyRepo(...): FooDao by fooDao, BarDao by barDao 
    //fun doSomethingWithFoo no longer necessary
    //fun doSomethingWithBar no longer necessary

但是,Android Studio 给了我一个红色波浪状的字样 Type parameter T of BaseDao has inconsistent values: FooEntity, BarEntity

这是否意味着减少像MyRepo.doSomethingWithFoo = fooDao.doSomethignWithFoo 这样的样板文件的所有希望都消失了?或者有没有办法做到这一点?

我试图实际覆盖 MyRepo 中的 BaseDao 函数,认为它会停止抱怨 FooEntity 和 BarEntity:

class MyRepo(...): BaseDao<Any>, SetDao by setDao, ... 
    override fun insert(t: Any): Long = 0L

但这只是在不一致的类型消息中添加“任何”。

【问题讨论】:

【参考方案1】:

我遇到了同样的问题,并用注释替换了泛型类。

我们最近发布了我们的库LivingRoom

您只需使用适当的注释(@Insertable、@Deletable、@Updatable、@Selectable ...)标记您的实体类

【讨论】:

以上是关于实现 BaseDao 的多个 Daos 的存储库类委托 - 可能吗?的主要内容,如果未能解决你的问题,请参考以下文章

Spring依赖注入无法继承

如何在存储库类中使用 IAsyncEnumerable

您会将啥放入存储库类(数据访问层)的单元测试中?

用spring对hibernate daos进行单元测试

存储库类内部的协程作用域

如何从 ASP.NET Core 3.1 中的存储库类创建确认电子邮件回调