ORM对象关系映射模块
更新时间:2025/10/15
在Gitcode上查看源码

简介

ORM模块支持对自发现对象等进行封装,以任务驱动的方式进行对象操作,实现与数据库的对接,使用面向对象的方式操作数据库。

目录

1. ORM对象类

object

ORM定义了一个c_object对象类,用于创建和管理数据库中的对象。该模块通过继承和元表机制,提供了对数据库对象的增删改查操作,同时支持信号机制来处理对象状态变化事件。

1.1 创建业务类对象

通过require ORM模块下的object类,创建一个业务的类对象,如下所示:

lua
local c_object = require 'mc.orm.object'
local c_network_port = c_object('NetworkPort')

1.2 实现create_mdb_object方法

重要: 业务在通过ORM创建对象时,必须实现create_mdb_object方法。

这是因为往数据库插入数据时,理论上需要调用create_mdb_object创建一个对象,否则MDS模型无法看护。如果直接操作数据库插入数据,需要实现create_mdb_object方法。

参考《ORM数据库操作说明》文档:

lua
示例:
function c_network_bridge.create_mdb_object(value)
    local app = c_object_manage.get_instance().app
    return app:CreateNetworkBridge(1, value.Id, function (obj)
        obj.Id = value.Id
        obj.Name = value.Name
        obj.Ports = value.Ports
    end)
end

CreateNetworkBridge方法为自动生成代码,由service.lua根据model.json定义自动生成。

1.3 业务方法实现

c_object封装了class_mgnt的方法(如设置属性),同时,业务在创建其业务类时,也可以自行实现业务对象的方法。

ORM对象类主要提供了以下几种信号触发:

  • on_add_object
  • on_add_object_complete
  • on_delete_object
  • on_delete_object_complete

业务可以通过self:connect_signal来绑定信号和触发回调,如下示例:

lua
-- on_add_object 当收到添加对象信号时,业务进行处理
-- 先创建一个业务的c_object类对象
local c_network_port = c_object('NetworkPort')

-- 业务的方法
function c_network_port:register_npu_changed_callback()
end

-- 注册添加对象回调
self:connect_signal(self.on_add_object_complete, function()
    self:register_npu_changed_callback()
end)

如果想在别的类里面监听某个对象,则可以使用以下实现,两者效果一致:

lua
local c_optical_module = c_object('OpticalModule')

-- 业务的方法
function self:match_resource(object, path_prefix)
end

-- 注册添加对象回调
c_optical_module.on_add_object:on(function(object)
    self:match_resource(object)
end)

注意事项: 如果将这种实现放在init初始化方法中,每次创建对象后都会挂一个钩子监听信号。如果希望对于一类对象做统一处理,则只需要把on_add_object等方法放在init方法外侧,在类对象第一次初始化时只挂一次钩子。

2. ORM对象工厂

factory

通过c_basic_object定义的类,最终会向c_factory注册,同时作为工厂的一个实例化对象。

c_basic_object通过调用register方法注册,并初始化数据库:

lua
function c_factory:register(class_name, c_basic_object)
    self.factory = self.factory or {}
    self.factory[class_name] = c_basic_object
    if self.db then
        c_basic_object.__init_db(self.db)
    end
end

其中,self.db是通过db.lua创建的,db.lua是自动生成代码,依据MDS中组件的持久化属性定义自动生成。

2.1 信号绑定

c_factory通过install_mc_signal,将ORM对象回调函数与特定的触发信号相绑定。

接收到以下信号时,特定的函数就会开始执行:

  • signal: on_add_object → function: create_object
  • signal: on_delete_object → function: del_object
  • signal: on_add_object_complete → function: add_object_complete
  • signal: on_delete_object_complete → function: del_object_complete
  • signal: on_before_add_object → function: before_add_object

2.2 资源清理

c_factory提供了reset方法,用于清理资源:

  1. 重置所有已注册的类(调用__reset
  2. 断开所有信号连接(slot:disconnect()

2.3 获取类对象

c_factory提供了get_class(class_name)方法,用于获取已注册的类对象。

如果没有注册,则会返回nil。

3. ORM对象回调

object_manage

c_mc_object_managet提供了收到自发现对象信号的5个回调的实现,这几个回调函数执行完后,会向factory发送信号以执行factory的回调函数。

对于on_before_add_object信号而言相对特殊。框架会检查所有的对象回调函数,在初始化该模块时,会先标记当前处于is_on_prepare = false阶段,此时会将接收到的信号存入signals_cache中。

在组件调用start方法后,c_mc_object_managet会把is_on_prepare设置为true,使得add_object等回调可以触发指定信号。同时c_mc_object_managet会遍历缓存的signals_cache内的信号,并依次触发。

4. ORM对象集合管理

object_collection

5. task任务机制

参考《ORM提供的task机制》文档。