服务端的TigerApi 框架,基于.NET6 2024 版本
YangYuGang
2 天以前 6b821f97b2a82c199113d68054b3e3c93f3443aa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
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
{
    /// <summary>
    /// 上下文
    /// </summary>
    public class BizContext : IBizContext
    {
        //查看类全名
        public static string _fullname = typeof(MySqlConnection).FullName;
 
        /// <summary>
        /// 当前项目
        /// </summary>
        public static string CurrentProject => BizConfig.Configuration["CurrentProject"];
        public string GetCurrentProject() => CurrentProject;
        /// <summary>
        /// 服务器机器码
        /// </summary>
        public static string MachineCode = $"{Base.Hardware.CPU_ID}";//-{Base.Hardware.HDD_SN}";
        public string GetMachineCode() => MachineCode;
        /// <summary>
        /// Tiger 项目激活实体
        /// </summary>
        public static TigerActive TigerActive = new();
        public ITigerActive GetTigerActive() => TigerActive;
        /// <summary>
        /// 接口任务服务
        /// </summary>
        public static IInterfaceService InterfaceService;
        public IInterfaceService GetInterfaceService() => InterfaceService;
 
        /// <summary>
        /// DI Container
        /// </summary>
        public static IContainer Container;
 
        #region 事务管理
 
        /// <summary>
        /// WMS事务字典
        /// </summary>
        public static Dictionary<string, ITransaction> TransactionDic = new Dictionary<string, ITransaction>();
 
        /// <summary>
        /// 创建一个新事务,并加到事务列表
        /// </summary>
        /// <param name="context">请求的HttpContext</param>
        /// <param name="trans">新的事务</param>
        /// <param name="IsUniqueInSameClient">相同客户端是否只允许开启一个同类型事务</param>
        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 事务管理
    }
 
    /// <summary>
    /// DI公用方法
    /// </summary>
    public static class DI
    {
        public static T Resolve<T>() where T : notnull
        {
            return BizContext.Container.Resolve<T>();
        }
 
        public static dynamic Resolve(string typeFullName)
        {
            return BizContext.Container.Resolve(System.Type.GetType(typeFullName, true));
        }
    }
}