简介
ORM模块支持对自发现对象等进行封装,以任务驱动的方式进行对象操作,实现与数据库的对接,使用面向对象的方式操作数据库。
目录
1. ORM对象类
object
ORM定义了一个c_object对象类,用于创建和管理数据库中的对象。该模块通过继承和元表机制,提供了对数据库对象的增删改查操作,同时支持信号机制来处理对象状态变化事件。
1.1 创建业务类对象
通过require ORM模块下的object类,创建一个业务的类对象,如下所示:
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数据库操作说明》文档:
示例:
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)
endCreateNetworkBridge方法为自动生成代码,由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来绑定信号和触发回调,如下示例:
-- 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)如果想在别的类里面监听某个对象,则可以使用以下实现,两者效果一致:
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方法注册,并初始化数据库:
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方法,用于清理资源:
- 重置所有已注册的类(调用
__reset) - 断开所有信号连接(
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机制》文档。