服务端的TigerApi 框架,基于.NET6 2024 版本
Rodney Chen
20 小时以前 7d67ebe9cdef145439b5d6f39cf03340fddb67bb
优化了一些已知问题
已修改1个文件
已添加1个文件
115 ■■■■■ 文件已修改
.gitignore 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Document/事务(Transaction)架构简介.md 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.gitignore
@@ -6,6 +6,7 @@
*.user
*.sln.docstates
.vs/
.vscode/
# Build results
[Dd]ebug/
Document/ÊÂÎñ(Transaction)¼Ü¹¹¼ò½é.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,114 @@
# Transaction结构分析
## 1. äº‹åŠ¡åŸºç¡€æž¶æž„
项目采用了分层的事务处理架构,主要包括以下几个层次:
### 1.1 åŸºç¡€æŽ¥å£å’Œç±»
- **ITransaction接口**:定义了所有事务的基本行为和属性,包括事务ID、锁机制、历史记录管理等。
- **TransactionBase抽象类**:实现了ITransaction接口,提供了事务的基础功能,如历史记录管理、事务关闭和资源释放等。
### 1.2 é¢†åŸŸç‰¹å®šäº‹åŠ¡æŽ¥å£å’ŒåŸºç±»
- **IMESTransaction/IWMSTransaction接口**:继承自ITransaction,为特定领域(MES/WMS)定义事务行为。
- **MESTransactionBase/WMSTransactionBaseç±»**:继承自TransactionBase,实现了领域特定的事务基础功能。
### 1.3 å…·ä½“业务事务类
- å„种具体的业务事务类(如InReceipt、OutSale、LoadingMaterial等):继承自领域特定的事务基类,实现具体业务逻辑。
## 2. äº‹åŠ¡ç®¡ç†æœºåˆ¶
### 2.1 äº‹åŠ¡åˆ›å»ºå’Œç®¡ç†
- **BizContext**:维护全局的事务字典(TransactionDic),管理所有活动的事务实例。
- **WMSContext/MESContext**:管理特定领域的事务,提供事务创建和查询功能。
### 2.2 äº‹åŠ¡ç”Ÿå‘½å‘¨æœŸ
1. **创建**:通过Controller调用相应的Init方法初始化事务,并通过Context.NewTransaction注册到事务字典中。
2. **使用**:通过事务ID从事务字典中获取事务实例,执行业务操作。
3. **关闭**:调用Close方法关闭事务,可选择是否保存历史记录。
4. **释放**:通过Dispose方法释放资源,并从事务字典中移除。
## 3. äº‹åŠ¡åŒæ­¥å’Œå¹¶å‘æŽ§åˆ¶
### 3.1 äº‹åС锁
- æ¯ä¸ªäº‹åŠ¡å®žä¾‹éƒ½æœ‰ä¸€ä¸ªTransLock对象,用于同步访问。
- åœ¨Controller中,非异步操作通过lock(trans.TransLock)确保事务操作的原子性。
### 3.2 å®¢æˆ·ç«¯å”¯ä¸€æ€§æŽ§åˆ¶
- åˆ›å»ºäº‹åŠ¡æ—¶å¯ä»¥æŒ‡å®šIsUniqueInSameClient参数,控制同一客户端是否只能有一个同类型的事务。
- å¦‚果设置为true,会关闭同一客户端已有的同类型事务。
## 4. äº‹åŠ¡åŽ†å²è®°å½•
### 4.1 åŽ†å²è®°å½•ç®¡ç†
- äº‹åŠ¡ä¼šè®°å½•æ‰€æœ‰API调用的历史,包括请求和响应信息。
- é€šè¿‡AddHistory方法添加历史记录,SaveHistory方法将历史保存到文件。
### 4.2 æ—¥å¿—记录
- äº‹åŠ¡æ“ä½œä¼šè®°å½•è¯¦ç»†çš„æ—¥å¿—ï¼ŒåŒ…æ‹¬åˆ›å»ºã€å…³é—­å’Œå¼‚å¸¸æƒ…å†µã€‚
- æ—¥å¿—文件保存在应用程序目录的Logs/Transaction文件夹中。
## 5. äº‹åŠ¡è¶…æ—¶å¤„ç†
- ç³»ç»Ÿé€šè¿‡é…ç½®æ–‡ä»¶è®¾ç½®äº‹åŠ¡è¶…æ—¶æ—¶é—´ï¼ˆTransaction:TimeoutHours)。
- äº‹åŠ¡è®°å½•æœ€åŽæ“ä½œæ—¶é—´ï¼ˆLastActionTime),可用于判断事务是否超时。
## 6. äº‹åŠ¡ä½¿ç”¨æ¨¡å¼
### 6.1 Controller中的事务使用模式
1. **获取/创建事务**:
   ```csharp
   if (iBiz.WMS.Context.GetTransDic().ContainsKey(action.ID))
   {
       trans = iBiz.WMS.Context.GetTransDic()[action.ID] as IInReceipt;
   }
   else
   {
       trans = AutoFacContainer.Instance.Resolve<IInReceipt>().Init(action.ID, action.Data?.USER_CODE, Request.Host.Value, action.Data?.ORG_CODE);
       iBiz.WMS.Context.NewTransaction(HttpContext, trans);
   }
   ```
2. **执行事务操作**:
   ```csharp
   if (action.IsAsync)
   {
       response = action.GetResponse(await trans.ScanItem(action.Data));
   }
   else
   {
       lock (trans.TransLock) { response = action.GetResponse(trans.ScanItem(action.Data).Result); }
   }
   ```
3. **记录历史并返回结果**:
   ```csharp
   trans?.AddHistory(Request, action);
   return Ok(response);
   ```
### 6.2 äº‹åŠ¡åˆå§‹åŒ–æ¨¡å¼
```csharp
public IInReceipt Init(string id, string userCode, string apiHost, string orgCode)
{
    TransID = id;
    UserCode = userCode;
    ApiHost = apiHost;
    OrgCode = orgCode;
    Logger.Console.Info($"Start {this.GetType().Name} Transaction[ID: {TransID}]");
    return this;
}
```
## 7. äº‹åŠ¡çš„ä¼˜åŠ¿å’Œç‰¹ç‚¹
1. **状态维护**:事务可以在多个请求之间维护状态,适合需要多步骤完成的业务流程。
2. **并发控制**:通过事务锁机制确保同一事务的操作不会并发执行,保证数据一致性。
3. **历史记录**:完整记录事务的所有操作,便于审计和问题排查。
4. **资源管理**:事务完成后自动释放资源,避免资源泄漏。
5. **领域分离**:通过不同的事务基类(MESTransactionBase/WMSTransactionBase)实现领域逻辑分离。
## 8. æ€»ç»“
项目的Transaction结构采用了面向对象的设计模式,通过接口和抽象类构建了灵活的事务处理框架。这种设计使得事务处理逻辑与业务逻辑分离,便于维护和扩展。同时,通过事务字典和锁机制,确保了事务操作的安全性和一致性。
这种事务模式特别适合需要跨多个请求维护状态的复杂业务流程,如仓库管理、生产管理等领域。通过事务机制,可以有效管理这些长时间运行的业务流程,确保数据的一致性和完整性。