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);
}
}
}