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.
 
 
 

3.3 KiB

LTEClient 重构说明

重构原因

1. 职责分离问题

原始问题:

  • LTEClient 承担了过多职责,包括日志解析、存储、字符串ID管理、正则表达式处理等
  • LogsManager 存在功能重复,违反了单一职责原则

重构后:

  • LTEClient 专注于客户端状态管理和日志解析
  • LogsManager 负责全局日志管理和字符串ID管理

2. 重复功能消除

原始重复功能:

// LTEClient 中的重复实现
private readonly Dictionary<string, int> _stringToIdCache = new();
private readonly Dictionary<int, string> _idToStringCache = new();
private int _stringIdCounter = 0;

public int StringToId(string str) { ... }
public string IdToString(int id) { ... }

重构后:

// 委托给 LogsManager
public int StringToId(string str) => _logsManager.String2Id(str);
public string IdToString(int id) => _logsManager.Id2String(id);

3. 依赖注入改进

原始问题:

  • LTEClient 独立管理字符串ID缓存
  • 多个客户端实例可能产生不一致的ID映射

重构后:

  • 通过依赖注入使用统一的 LogsManager
  • 确保字符串ID在整个应用中的一致性

重构内容

1. 构造函数修改

// 原始构造函数
public LTEClient(ClientConfig config)
public LTEClient(string name)

// 重构后构造函数
public LTEClient(ClientConfig config, LogsManager logsManager)
public LTEClient(string name, LogsManager logsManager)

2. 移除重复字段

  • 移除了 _stringToIdCache_idToStringCache_stringIdCounter 等重复字段
  • 添加了 _logsManager 依赖字段

3. 方法委托

  • StringToId()IdToString() 方法现在委托给 LogsManager
  • 保持了原有的公共接口不变

使用建议

1. 创建客户端实例

// 在服务中创建客户端
var logsManager = new LogsManager();
var clientConfig = new ClientConfig { Name = "TestClient" };
var client = new LTEClient(clientConfig, logsManager);

2. 依赖注入配置

// 在 Startup.cs 或 Program.cs 中配置
services.AddSingleton<LogsManager>();
services.AddTransient<LTEClient>(provider => 
{
    var logsManager = provider.GetService<LogsManager>();
    var config = new ClientConfig { Name = "DefaultClient" };
    return new LTEClient(config, logsManager);
});

3. 进一步优化建议

  1. 日志解析分离:考虑将日志解析逻辑提取到专门的 LogParser 类中
  2. 状态管理:考虑使用状态模式管理客户端的不同状态
  3. 事件驱动:使用事件机制通知日志状态变化
  4. 配置管理:将正则表达式等配置提取到配置文件中

优势

  1. 代码复用:消除了字符串ID管理的重复代码
  2. 一致性:确保字符串ID在整个应用中的一致性
  3. 可测试性:通过依赖注入更容易进行单元测试
  4. 可维护性:职责分离使代码更容易维护和扩展
  5. 性能优化:统一的字符串ID缓存减少了内存使用

注意事项

  1. 向后兼容:保持了原有的公共接口,不会影响现有代码
  2. 全局状态LogsManager 的字符串ID缓存是全局的,在应用重启前不会重置
  3. 线程安全:需要注意多线程环境下的字符串ID管理