模块化架构下 Room 数据库的使用设计

  • 无耦合、代码边界独立、复用性高;

缺点:

  • 开销大:Room 的官方文档中提示了,每个 database 的实例都是「非常昂贵」的;因此多模块都有 DB 的情况下,可能存在较大的资源开销问题;

expensive.png

我思考的方案


我们先把遇到的问题点或者说期望做到的点梳理一下:

  1. 低耦合、模块容易迁移;
  2. 代码边界清晰,每个模块只管自己的 Model 和 DAO;
  3. 尽可能小的开销:单例;

直接说方案:Database 单例放在主 module 中;各个子 module 维护自己的 Model 和 DAO; 由于主 module 也会依赖其他子 module,因此 Database 声明的时候是可以拿到各个子 module 的 Model 和 DAO;

那现在要解决的就是子 module DAO 的实例化问题了,Room 中 DAO 的实例化方式是通过 DataBase 的实例去获取的,因此,可以在 子 module 需要用到 DAO 的时候向主 module 索取即可;

大概关系图如下:

my-1.png

但是,从上图可以看出,AccountModule 和 NewsModule 中指向 App 的两条虚线这个依赖方向显然有问题;我们只能是壳 app 依赖子 module,不能反过来;

所以现在有个依赖方向要解决,子 module 不能依赖主 module,直接方式拿不到 DB 实例的,因此可以暴露一个接口出去,在主 module 中去实现这个接口,返回对应 DAO 的实例即可;

my-2.png

子 module 中:

AccountModule 的访问层 AccountRoomAccessor,定义了一个接口;NewsModule 类似;

object AccountModuleRoomAccessor {

var onGetDaoCallback: OnGetDaoCallback? = null

internal fun getUserDao(): UserDao {

if (onGetDaoCallback == null) {

throw IllegalArgumentException(“onGetDaoCallback must not be null!!”)

}

return onGetDaoCallback!!.onGetUserDao()

}

interface OnGetDaoCallback {

fun onGetUserDao(): UserDao

}

}

壳 App 中:

数据库初始化,声明子 module 的 DAO 和 model:

@Database(

entities = [

UserModel::class,

NewsDetailModel::class,

NewsSummaryModel::class

],

version = 1,

exportSchema = false

)

abstract class TestDataBase : RoomDatabase() {

abstract fun userDao(): UserDao

abstract fun newsSummaryDao(): NewsSummaryDAO

abstract fun newsDetailDao(): NewsDetailDAO

}

实现子 module 接口此接口,并将 DAO 实例返回:

class App: Application() {

… …

override fun onCreate() {

super.onCreate()

… …

AccountModuleRoomAccessor.onGetDaoCallback = object : AccountModuleRoomAccessor.OnGetDaoCallback {

override fun onGetUserDao(): UserDao {

为了做好运维面试路上的助攻手,特整理了上百道 【运维技术栈面试题集锦】 ,让你面试不慌心不跳,高薪offer怀里抱!

这次整理的面试题,小到shell、MySQL,大到K8s等云原生技术栈,不仅适合运维新人入行面试需要,还适用于想提升进阶跳槽加薪的运维朋友。

本份面试集锦涵盖了

  • 174 道运维工程师面试题
  • 128道k8s面试题
  • 108道shell脚本面试题
  • 200道Linux面试题
  • 51道docker面试题
  • 35道Jenkis面试题
  • 78道MongoDB面试题
  • 17道ansible面试题
  • 60道dubbo面试题
  • 53道kafka面试
  • 18道mysql面试题
  • 40道nginx面试题
  • 77道redis面试题
  • 28道zookeeper

总计 1000+ 道面试题, 内容 又全含金量又高

  • 174道运维工程师面试题

1、什么是运维?

2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?

3、现在给你三百台服务器,你怎么对他们进行管理?

4、简述raid0 raid1raid5二种工作模式的工作原理及特点

5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?

6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?

7、Tomcat和Resin有什么区别,工作中你怎么选择?

8、什么是中间件?什么是jdk?

9、讲述一下Tomcat8005、8009、8080三个端口的含义?

10、什么叫CDN?

11、什么叫网站灰度发布?

12、简述DNS进行域名解析的过程?

13、RabbitMQ是什么东西?

14、讲一下Keepalived的工作原理?

15、讲述一下LVS三种模式的工作过程?

16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?

9、讲述一下Tomcat8005、8009、8080三个端口的含义?

10、什么叫CDN?

11、什么叫网站灰度发布?

12、简述DNS进行域名解析的过程?

13、RabbitMQ是什么东西?

14、讲一下Keepalived的工作原理?

15、讲述一下LVS三种模式的工作过程?

16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?

17、如何重置mysql root密码?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值