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