🧬 CoreUnify 基类
命名空间: Snet.Core | 类: CoreUnify<O, D> | 泛型参数: O(操作类型),D(数据/基础配置类型)
CoreUnify<O, D> 是所有 Snet 操作组件(协议驱动和中间件)的基础基类。它提供单例生命周期管理、统一的事件系统、计时仪表、日志记录、多语言支持等功能。
类型参数
| 参数 | 描述 | 示例 |
|---|---|---|
O |
具体的操作类型(自引用) | ModbusOperate |
D |
数据/基础配置类型 | ModbusData.Basics |
单例管理
每个 CoreUnify 子类被注册为单例,最多支持 255 个实例:
// 创建实例 -- 按类型进行单例管理
var op = new ModbusOperate(new ModbusData.Basics
{
IpAddress = "192.168.1.100",
Port = 502,
Station = 1
});
// 每种唯一的操作类型最多可以有 255 个实例
// 实例 ID 自动分配(1-255)
事件系统
CoreUnify 通过 IEvent 提供 3 对事件(共 6 个事件):
| 同步 | 异步 | 描述 |
|---|---|---|
OnDataEvent |
OnDataEventAsync |
当接收到数据时触发 |
OnInfoEvent |
OnInfoEventAsync |
当状态、信息和诊断消息时触发 |
OnLanguageEvent |
OnLanguageEventAsync |
当语言/区域设置变更时触发 |
// 注册处理器
op.OnDataEventAsync += async result =>
{
Console.WriteLine($"数据: {result.Message}");
};
op.OnInfoEventAsync += async result =>
{
Console.WriteLine($"信息: {result.Message}");
};
op.OnLanguageEventAsync += async result =>
{
Console.WriteLine($"语言已更改: {result.Message}");
};
计时仪表
CoreUnify 通过 BegOperate 和 EndOperate 提供内置的操作计时:
// 计时是自动的 -- 每个操作都跟踪执行时间
var result = await op.ReadAsync("40001");
Console.WriteLine($"操作耗时 {result.RunTime} ms");
// RunTime 由 BegOperate/EndOperate 计时机制自动填充
日志记录
CoreUnify 使用 Serilog 进行日志记录,日志级别由 Serilog.Events.LogEventLevel 枚举定义。标准 Serilog 级别包括:Verbose、Debug、Information、Warning、Error 和 Fatal。
多语言支持
// 设置语言为中文
await op.SetLanguageAsync(LanguageType.zh);
// 设置语言为英文
await op.SetLanguageAsync(LanguageType.en);
ICreateInstance
创建具有修改参数的新组件副本:
// 使用新设置克隆操作实例
var newOp = await op.CreateInstanceAsync(new ModbusData.Basics
{
IpAddress = "192.168.1.101",
Port = 502,
Station = 2
});
GetParam
获取当前的参数/配置:
// 获取当前的基础配置
var basics = await op.GetParamAsync();
Console.WriteLine($"已连接到: {basics.IpAddress}:{basics.Port}");
继承链
CoreUnify<O, D> -- 单例、事件、计时、日志、语言
└── DaqAbstract<O, D> -- 读/写/订阅(用于协议驱动)
└── MqAbstract<O, D> -- 发布/消费(用于中间件)
└── ModbusOperate -- 具体协议实现
└── SiemensOperate -- 具体协议实现
└── MqttClientOperate -- 具体中间件实现
└── KafkaOperate -- 具体中间件实现
└── ... -- 等等
关键设计要点
- 单例模式 确保每个配置在 255 个实例限制内只有一个逻辑实例
- 所有方法都是异步的 -- 始终使用
await进行操作调用 - 事件同时使用同步和异步委托 -- 异步处理器顺序执行,同步处理器并行执行
- 计时是自动的 -- 每个操作结果都包含由
BegOperate/EndOperate测量的RunTime
