Client/ServerService
头文件:<dlt698/service/service.hpp>,命名空间 dlt698::service。
ClientService
构造时抛 std::invalid_argument:会话为空。会话的连接和生命周期由应用管理——ClientService 不会替你 start() 或 close()。
单项 vs 列表
单项接口返回 ObjectValue(ObjectValue 是 DAR 或 Data 的 variant)、uint8_t DAR 或 ActionValue,业务代码更直接。列表接口返回完整响应,逐项结果和原顺序都由你处理。
列表的部分成功
async_set_list 和 async_action_list 按顺序独立执行每一项,部分成功不会回滚。响应里逐项的 DAR 才是结论,不要只看外层 Result。
超时或取消只说明本地没有得到确定响应,不能证明远端没有执行。因此这两个接口都不会自动重试。
记录查询
async_get_record 自动收齐应用层分块,回调拿到的是完整结果。async_get_record_list 保持逐项 DAR 和原顺序。
ServerService
构造时把对象目录接入服务器会话的 GET/SET/ACTION 分发。两个参数都不能为空,否则抛 std::invalid_argument。
ServerService 内部会把自己的处理器注册到会话上。捕获 ServerService 的 this 或其 shared_ptr 会形成引用环,导致会话和目录都无法释放。实现自己的包装层时注意别把 this 传进 lambda。
ServerService 持有目录的共享所有权,不捕获自身地址。目录和 provider 会话共享,因此 provider 的并发读取约定由你保证。
错误映射
选择同步还是异步
混用也可以——SyncClientService 和 ClientService 可以绑定同一个会话,只要注意单在途事务的限制。