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.
112 lines
3.3 KiB
112 lines
3.3 KiB
1 month ago
|
# LTEClient 重构说明
|
||
|
|
||
|
## 重构原因
|
||
|
|
||
|
### 1. 职责分离问题
|
||
|
|
||
|
**原始问题:**
|
||
|
- `LTEClient` 承担了过多职责,包括日志解析、存储、字符串ID管理、正则表达式处理等
|
||
|
- 与 `LogsManager` 存在功能重复,违反了单一职责原则
|
||
|
|
||
|
**重构后:**
|
||
|
- `LTEClient` 专注于客户端状态管理和日志解析
|
||
|
- `LogsManager` 负责全局日志管理和字符串ID管理
|
||
|
|
||
|
### 2. 重复功能消除
|
||
|
|
||
|
**原始重复功能:**
|
||
|
```csharp
|
||
|
// 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) { ... }
|
||
|
```
|
||
|
|
||
|
**重构后:**
|
||
|
```csharp
|
||
|
// 委托给 LogsManager
|
||
|
public int StringToId(string str) => _logsManager.String2Id(str);
|
||
|
public string IdToString(int id) => _logsManager.Id2String(id);
|
||
|
```
|
||
|
|
||
|
### 3. 依赖注入改进
|
||
|
|
||
|
**原始问题:**
|
||
|
- `LTEClient` 独立管理字符串ID缓存
|
||
|
- 多个客户端实例可能产生不一致的ID映射
|
||
|
|
||
|
**重构后:**
|
||
|
- 通过依赖注入使用统一的 `LogsManager`
|
||
|
- 确保字符串ID在整个应用中的一致性
|
||
|
|
||
|
## 重构内容
|
||
|
|
||
|
### 1. 构造函数修改
|
||
|
|
||
|
```csharp
|
||
|
// 原始构造函数
|
||
|
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. 创建客户端实例
|
||
|
|
||
|
```csharp
|
||
|
// 在服务中创建客户端
|
||
|
var logsManager = new LogsManager();
|
||
|
var clientConfig = new ClientConfig { Name = "TestClient" };
|
||
|
var client = new LTEClient(clientConfig, logsManager);
|
||
|
```
|
||
|
|
||
|
### 2. 依赖注入配置
|
||
|
|
||
|
```csharp
|
||
|
// 在 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管理
|