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
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. 进一步优化建议
- 日志解析分离:考虑将日志解析逻辑提取到专门的
LogParser
类中 - 状态管理:考虑使用状态模式管理客户端的不同状态
- 事件驱动:使用事件机制通知日志状态变化
- 配置管理:将正则表达式等配置提取到配置文件中
优势
- 代码复用:消除了字符串ID管理的重复代码
- 一致性:确保字符串ID在整个应用中的一致性
- 可测试性:通过依赖注入更容易进行单元测试
- 可维护性:职责分离使代码更容易维护和扩展
- 性能优化:统一的字符串ID缓存减少了内存使用
注意事项
- 向后兼容:保持了原有的公共接口,不会影响现有代码
- 全局状态:
LogsManager
的字符串ID缓存是全局的,在应用重启前不会重置 - 线程安全:需要注意多线程环境下的字符串ID管理