You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
14 KiB
14 KiB
修改记录
2024年修改记录
CellularNetworkService.StartNetworkAsync 方法添加协议客户端配置创建
修改时间: 2024年 修改文件:
CoreAgent.Infrastructure/Services/Network/CellularNetworkService.cs
修改内容:
-
调整执行步骤顺序
- 将原来的第5.5步改为第6步(创建协议客户端配置)
- 将WebSocket传输连接移到第7步(在网络配置启动之前)
- 重新编号后续步骤(8-11步)
- 优化执行顺序:确保WebSocket连接在网络配置启动之前完成
-
添加第7步WebSocket传输连接
- 在
StartNetworkAsync
方法的第6步(创建协议客户端配置)之后添加第7步 - 注入
IWebSocketTransport
依赖 - 创建独立的
StartWebSocketTransportAsync()
方法处理连接逻辑 - 返回
bool
值表示连接是否成功 - 添加连接状态检查和错误处理
- 严格检查:WebSocket连接失败时立即返回失败结果,提示服务端可能未启动
- 在
-
修复Logger类型问题
- 添加
ILoggerFactory
依赖注入到构造函数 - 使用
_loggerFactory.CreateLogger<ProtocolClientConfigFactory>()
创建正确类型的Logger - 确保
ProtocolClientConfigFactory
获得正确的Logger实例
- 添加
-
具体实现:
// 6. 创建协议客户端配置 var protocolConfigFactory = new ProtocolClientConfigFactory(_loggerFactory.CreateLogger<ProtocolClientConfigFactory>(), _context); var configCreated = protocolConfigFactory.CreateFromEntities(); if (configCreated) { _logger.LogInformation("协议客户端配置创建成功,共创建 {ConfigCount} 个配置", protocolConfigFactory.ConfigCount); } else { _logger.LogWarning("协议客户端配置创建失败"); return CellularNetworkOperationResult.Failure("协议客户端配置创建失败"); } // 7. 启动 WebSocket 传输连接 var webSocketConnected = await StartWebSocketTransportAsync(); if (!webSocketConnected) { _logger.LogError("WebSocket 传输连接启动失败,服务端可能未启动"); return CellularNetworkOperationResult.Failure("WebSocket 传输连接启动失败,服务端可能未启动"); } _logger.LogInformation("WebSocket 传输连接启动成功");
-
添加必要的依赖注入
- 添加
ILoggerFactory loggerFactory
参数到构造函数 - 添加
IWebSocketTransport webSocketTransport
参数到构造函数 - 添加
using CoreAgent.Infrastructure.Services.Network;
以支持ProtocolClientConfigFactory
- 添加
using CoreAgent.WebSocketTransport.Interfaces;
以支持IWebSocketTransport
- 添加
-
设计优势:
- 在IP端点信息准备完成后立即创建协议客户端配置
- 不依赖网络启动结果,确保配置创建的独立性
- 在网络配置启动之前启动WebSocket传输连接
- 提供详细的日志记录便于调试
- 保持代码的简洁性和可维护性
- 正确处理Logger类型,避免类型不匹配问题
- 优化执行顺序,提高错误隔离能力
- 完善的错误处理机制,确保配置创建失败时及时停止
- 严格检查机制,WebSocket连接失败时立即停止网络启动流程
- 方法职责单一,WebSocket连接逻辑独立封装
影响范围:
- 蜂窝网络启动流程
- 协议客户端配置管理
- WebSocket传输服务集成
- 网络状态监控
- 依赖注入配置(需要更新服务注册)
CellularNetworkService构造函数添加IProtocolLogObserver依赖
修改时间: 2024年 修改文件:
CoreAgent.Infrastructure/Services/Network/CellularNetworkService.cs
修改内容:
-
添加IProtocolLogObserver依赖注入
- 在构造函数中添加
IProtocolLogObserver protocolLogObserver
参数 - 添加私有字段
_protocolLogObserver
存储依赖 - 添加空值检查和异常抛出
- 在构造函数中添加
-
添加必要的using语句
- 添加
using CoreAgent.ProtocolClient.ProtocolEngineCore;
以支持IProtocolLogObserver
- 添加
-
具体实现:
// 构造函数参数 public CellularNetworkService( // ... 其他参数 IWebSocketTransport webSocketTransport, IProtocolLogObserver protocolLogObserver) // 私有字段 private readonly IProtocolLogObserver _protocolLogObserver; // 构造函数初始化 _protocolLogObserver = protocolLogObserver ?? throw new ArgumentNullException(nameof(protocolLogObserver));
-
设计优势:
- 为后续协议客户端管理提供必要的依赖
- 保持依赖注入的一致性
- 提供空值检查确保服务稳定性
- 为协议日志观察者模式提供支持
影响范围:
- 蜂窝网络服务依赖注入配置
- 协议客户端日志观察者集成
- 服务注册配置更新
StartNetworkAsync方法添加时间跟踪记录
修改时间: 2024年 修改文件:
CoreAgent.Infrastructure/Services/Network/CellularNetworkService.cs
修改内容:
-
添加整体时间跟踪
- 在方法开始时记录开始时间
- 在方法结束时计算总耗时并记录
- 使用UTC时间确保时间一致性
-
为每个步骤添加详细时间跟踪
- 为11个步骤中的每个步骤添加开始和结束时间记录
- 使用
LogDebug
级别记录每个步骤的耗时 - 保持原有的
LogInformation
和LogError
级别日志不变
-
具体实现:
// 方法开始时间跟踪 var startTime = DateTime.UtcNow; _logger.LogInformation("开始启动网络配置 {ConfigKey},开始时间: {StartTime}", key, startTime.ToString("yyyy-MM-dd HH:mm:ss.fff")); // 每个步骤的时间跟踪 var stepXStart = DateTime.UtcNow; _logger.LogDebug("步骤X开始:[步骤描述]"); // 步骤执行逻辑... var stepXDuration = (DateTime.UtcNow - stepXStart).TotalMilliseconds; _logger.LogDebug("步骤X完成:[步骤描述],耗时: {Duration}ms", stepXDuration.ToString("F2")); // 方法结束时间跟踪 var endTime = DateTime.UtcNow; var duration = endTime - startTime; _logger.LogInformation("蜂窝网络配置 {ConfigKey} 启动成功,当前状态: {Status},总耗时: {Duration}ms", key, state.CurrentStatus, duration.TotalMilliseconds.ToString("F2"));
-
设计优势:
- 性能监控:可以识别网络启动过程中的性能瓶颈
- 调试支持:详细的时间信息有助于问题定位和性能优化
- 日志分级:使用Debug级别避免生产环境日志过多
- 时间精度:使用毫秒级精度提供准确的性能数据
- UTC时间:确保时间记录的一致性和准确性
- 非侵入性:不影响原有的业务逻辑和错误处理
-
跟踪的步骤:
- 步骤1:获取并验证网络配置
- 步骤2:执行网络接口初始化命令
- 步骤3:复制配置值到临时目录
- 步骤4:获取并验证 IP 端点信息
- 步骤5:更新 IP 端点管理器
- 步骤6:创建协议客户端配置
- 步骤7:启动 WebSocket 传输连接
- 步骤8:启动网络配置
- 步骤9:更新网络配置类型
- 步骤10:检查网络端点连接状态
- 步骤11:更新网络状态
影响范围:
- 网络启动性能监控
- 调试和问题定位
- 日志记录详细程度
- 性能优化分析
ProtocolWsClientManager方法参数优化
修改时间: 2024年 修改文件:
CoreAgent.Infrastructure/Services/Network/ProtocolWsClientManager.cs
修改内容:
-
简化构造函数
- 移除
ProtocolClientConfig[] configs
参数 - 构造函数只保留必要的依赖:
ILogger
、IProtocolLogObserver
、ILoggerFactory
- 移除私有字段
_configs
,不再在构造函数中存储配置
- 移除
-
修改StartAllClients方法签名
- 添加
ProtocolClientConfig[] configs
参数 - 方法接收配置数组作为参数,而不是依赖构造函数中的配置
- 添加参数验证,检查
configs
是否为 null 或空数组
- 添加
-
优化方法逻辑
- 将配置验证移到方法开始处
- 使用传入的
configs
参数替代私有字段 - 保持原有的客户端创建和启动逻辑不变
-
具体实现:
// 构造函数简化 public ProtocolWsClientManager( ILogger<ProtocolWsClientManager> logger, IProtocolLogObserver protocolLogObserver, ILoggerFactory loggerFactory) // 移除 configs 参数 // StartAllClients方法修改 public void StartAllClients(ProtocolClientConfig[] configs) // 添加参数 { if (configs == null || configs.Length == 0) // 参数验证 { _logger.LogWarning("没有可用的协议客户端配置"); return; } // 使用传入的 configs 参数 _logger.LogInformation("开始启动所有协议客户端,配置数量: {ConfigCount}", configs.Length); foreach (var config in configs) // 遍历传入的配置
-
设计优势:
- 更灵活的使用方式:可以在不同时间传入不同的配置
- 减少内存占用:不需要在构造函数中存储配置数组
- 简化构造函数:降低构造函数的复杂度
- 更好的测试性:可以更容易地测试不同的配置组合
- 符合单一职责原则:构造函数只负责初始化,方法负责执行具体操作
影响范围:
- 协议客户端管理器使用方式
- 配置传递方式
- 调用方代码适配
- 测试用例更新
ProtocolWsClientManager采用面向接口编程
修改时间: 2024年 修改文件:
CoreAgent.ProtocolClient/Interfaces/IProtocolWsClientManager.cs
(新建)CoreAgent.Infrastructure/Services/Network/ProtocolWsClientManager.cs
修改内容:
-
创建IProtocolWsClientManager接口
- 在CoreAgent.ProtocolClient项目中定义接口契约
- 继承
IDisposable
接口 - 定义
StartAllClients
和StopAllClients
方法 - 使用
ProtocolClientConfig[]
作为参数类型
-
修改ProtocolWsClientManager实现类
- 实现
IProtocolWsClientManager
接口 - 添加
using CoreAgent.ProtocolClient.Interfaces;
引用 - 保持原有的实现逻辑不变
- 实现
-
具体实现:
// 接口定义 public interface IProtocolWsClientManager : IDisposable { void StartAllClients(ProtocolClientConfig[] configs); void StopAllClients(); } // 实现类 public class ProtocolWsClientManager : IProtocolWsClientManager { // 原有实现保持不变 }
-
设计优势:
- 依赖倒置:高层模块依赖抽象,不依赖具体实现
- 易于测试:可以轻松创建Mock实现进行单元测试
- 松耦合:降低组件间的耦合度
- 可扩展性:可以轻松添加新的实现类
- 符合SOLID原则:遵循依赖倒置原则和开闭原则
- 便于依赖注入:可以注册接口而不是具体实现
-
接口设计原则:
- 单一职责:接口只定义协议客户端管理的核心功能
- 简洁明了:只包含必要的方法定义
- 易于理解:方法名称和参数清晰明确
- 向后兼容:保持与原有API的兼容性
影响范围:
- 依赖注入配置更新
- 服务注册方式调整
- 单元测试Mock创建
- 调用方代码适配(使用接口类型)
- 项目引用关系调整(CoreAgent.ProtocolClient项目包含接口定义)
CellularNetworkService集成IProtocolWsClientManager
修改时间: 2024年 修改文件:
CoreAgent.Infrastructure/Services/Network/CellularNetworkService.cs
修改内容:
-
添加IProtocolWsClientManager依赖注入
- 在构造函数中添加
IProtocolWsClientManager protocolWsClientManager
参数 - 添加私有字段
_protocolWsClientManager
存储依赖 - 添加空值检查和异常抛出
- 在构造函数中添加
-
StartNetworkAsync方法添加第12步
- 在步骤11(更新网络状态)之后添加第12步
- 调用
protocolConfigFactory.GetAllConfigs()
获取配置数组 - 调用
_protocolWsClientManager.StartAllClients(protocolConfigs)
启动所有协议客户端 - 添加时间跟踪和错误处理
- 如果启动失败,立即返回失败结果
-
StopAsync方法集成协议客户端停止
- 在步骤4(禁用网络配置)之后添加步骤5(停止所有协议客户端)
- 调用
_protocolWsClientManager.StopAllClients()
停止所有协议客户端 - 添加错误处理,但不中断停止流程
- 重新编号后续步骤(6-9步)
-
修复StopWebSocketTransportAsync方法
- 修正方法实现,使用
CloseAsync()
而不是DisconnectAsync()
- 修正日志信息和返回值逻辑
- 确保方法名称和实现一致
- 修正方法实现,使用
-
具体实现:
// 构造函数添加依赖 public CellularNetworkService( // ... 其他参数 IProtocolWsClientManager protocolWsClientManager) // StartNetworkAsync第12步 // 12. 启动所有协议客户端 var protocolConfigs = protocolConfigFactory.GetAllConfigs(); _protocolWsClientManager.StartAllClients(protocolConfigs); // StopAsync步骤5 // 5. 停止所有协议客户端 _protocolWsClientManager.StopAllClients();
-
设计优势:
- 完整的生命周期管理:启动和停止时都正确处理协议客户端
- 错误隔离:启动失败时立即停止,停止失败时继续执行
- 时间跟踪:为协议客户端操作添加详细的时间记录
- 依赖注入:使用接口编程,便于测试和扩展
- 日志完整:提供详细的启动和停止日志记录
影响范围:
- 蜂窝网络服务依赖注入配置
- 协议客户端生命周期管理
- 网络启动和停止流程
- 服务注册配置更新
LogLayerHelp类名规范化
修改时间: 2024年 修改文件:
- `