using Rhea.Common; using Tiger.Model; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.IO; using Newtonsoft.Json; using Tiger.IBusiness; namespace Tiger.Business { /// /// 事务基类 /// public abstract class TransactionBase : IDisposable, ITransaction { /// /// 事务基类 /// public TransactionBase() { } /// /// 事务ID /// public string TransID { get; set; } /// /// Api Host /// public string ApiHost { get; set; } /// /// Remote Address /// public string RemoteAddress { get; set; } /// /// 事务锁 /// public object TransLock { get; } = new object(); /// /// ApiAction历史记录 /// protected Dictionary ActionHistoryList = new Dictionary(); /// /// 最后操作的时间 /// public DateTime LastActionTime { get; set; } /// /// 事务是否完成 /// public bool IsFinished { get; set; } /// /// 添加一个ApiAction的历史记录 /// /// /// /// public virtual void AddHistory(Microsoft.AspNetCore.Http.HttpRequest request, ApiAction action) { try { ActionHistoryList.Add($"{request.HttpContext.TraceIdentifier} at {action.Timestamp:yyyy/MM/dd HH:mm:ss.fff}: {request.Path}", action.History()); } catch (System.Exception ex) { Logger.Default.Fatal(ex, "添加ApiAction历史记录异常"); } LastActionTime = DateTime.Now; } /// /// 保存ApiAction的历史记录到文件 /// public virtual void SaveHistory() { DirectoryInfo di = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory + "\\Logs\\Transaction"); if (!di.Exists) { di.Create(); } var log = new FileInfo(di.FullName + @$"\{this.TransID}.log"); File.AppendAllText(log.FullName, "{"); File.AppendAllText(log.FullName, "\"Transaction Data\":"); File.AppendAllText(log.FullName, JsonConvert.SerializeObject(this) + "\r\n"); File.AppendAllText(log.FullName, ",\"Transaction History\":"); File.AppendAllText(log.FullName, JsonConvert.SerializeObject(ActionHistoryList) + "\r\n"); File.AppendAllText(log.FullName, "}\r\n"); } /// /// 关闭事务 /// /// /// public virtual bool Close(bool needSaveHistoryLog = false) { if (needSaveHistoryLog) { SaveHistory(); } Dispose(); return true; } public virtual void Dispose() { BizContext.TransactionDic.Remove(TransID); } } }