using Autofac;
using Microsoft.AspNetCore.Http;
using MySqlConnector;
using Rhea.Common;
using Rhea.Common.Authorization;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Tiger.IBusiness;
namespace Tiger.Business
{
///
/// 上下文
///
public class BizContext : IBizContext
{
//查看类全名
public static string _fullname = typeof(MySqlConnection).FullName;
///
/// 当前项目
///
public static string CurrentProject => BizConfig.Configuration["CurrentProject"];
public string GetCurrentProject() => CurrentProject;
///
/// 服务器机器码
///
public static string MachineCode = $"{Base.Hardware.CPU_ID}";//-{Base.Hardware.HDD_SN}";
public string GetMachineCode() => MachineCode;
///
/// Tiger 项目激活实体
///
public static TigerActive TigerActive = new();
public ITigerActive GetTigerActive() => TigerActive;
///
/// 接口任务服务
///
public static IInterfaceService InterfaceService;
public IInterfaceService GetInterfaceService() => InterfaceService;
///
/// DI Container
///
public static IContainer Container;
#region 事务管理
///
/// WMS事务字典
///
public static Dictionary TransactionDic = new Dictionary();
///
/// 创建一个新事务,并加到事务列表
///
/// 请求的HttpContext
/// 新的事务
/// 相同客户端是否只允许开启一个同类型事务
public static void NewTransaction(HttpContext context, ITransaction trans, bool IsUniqueInSameClient = true)
{
trans.RemoteAddress = $"[{context.Connection.RemoteIpAddress}]:{context.Connection.RemotePort}";
trans.ApiHost = context.Request.Host.ToString();
if (IsUniqueInSameClient)
{
//查找有没有相同客户端开启的同类型事务,有的话都关闭掉
var sameTrans = TransactionDic.Where(q => !q.Value.IsFinished && q.Value.GetType() == trans.GetType() && q.Value.RemoteAddress == trans.RemoteAddress);
foreach (var item in sameTrans)
{
try
{
TransactionDic[item.Key].Close();
}
catch (System.Exception ex)
{
Logger.Console.Fatal(ex, $"删除同客户端同类型事务Transaction[{item.Key}]({TransactionDic[item.Key].GetType().FullName})异常");
}
}
}
TransactionDic.Add(trans.TransID, trans);
}
#endregion 事务管理
}
///
/// DI公用方法
///
public static class DI
{
public static T Resolve() where T : notnull
{
return BizContext.Container.Resolve();
}
}
}