namespace EnterprizeV4.Models { using CounsellorBL; using CounsellorBL.BLStructure; using CounsellorBL.Helper; using DefenseWeb.Models; using MonumentDefine; using OT.COM.LogisticsUtil; using OT.COM.SignalerMessage; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Reflection; public class CmdService : AApiServiceBase { static readonly ConcurrentDictionary _dicTypeMapping = new ConcurrentDictionary(); public CResponsePack GetData(CReqestPack i_crpRequest, ControllDataPack i_cdp) { List lcrmr = new List(); foreach (CReqestItem cri in i_crpRequest.reqs) { CRequestMessage crm = cri.req; crm.token = i_crpRequest.token; try { crm.clientip = i_cdp.GetIP; crm.system_param.Add(typeof(ControllDataPack).Name, i_cdp); CResponseMessage crp = HandleRequest(crm); #if DEBUG if (!string.IsNullOrEmpty(crp.msg)) { System.Diagnostics.Debug.WriteLine($"***************** {nameof(GetData)} module={crm.module} method={crm.method} Fail!! msg={crp.msg}"); } #endif lcrmr.Add(crp); } catch (Exception ex) { lcrmr.Add(new CErrorResponseMessage(Util.GetLastExceptionMsg(ex))); } } return new CResponsePack() { reps = lcrmr }; } protected override CResponseMessage HandleRequest(CRequestMessage i_joRequest) { CResponseMessage crmRes; try { do { if (i_joRequest == null || string.IsNullOrEmpty(i_joRequest.method) || string.IsNullOrEmpty(i_joRequest.module)) { crmRes = new CErrorResponseMessage(MessageWording.MTHOD_MISS, i_joRequest); break; } string sModuleName = null; string[] saModule = i_joRequest.module.Split(".".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); Type tCur = null; const string SERVICE = "Service"; sModuleName = saModule[^1]; if(!sModuleName.EndsWith(SERVICE)) { sModuleName += SERVICE; } if (_dicTypeMapping.ContainsKey(sModuleName) ) { tCur = _dicTypeMapping[sModuleName]; } else { Logger.Debug("Not in _dicTypeMapping"); tCur = GetCustomTypeByTypeName(sModuleName, typeof(ServiceBase)); if (tCur == null) { AssemblyHelper.Load(Assembly.GetExecutingAssembly(), "CounsellorBL.*.dll"); tCur = GetCustomTypeByTypeName(sModuleName, typeof(ServiceBase)); } if (tCur != null) { Logger.Debug("Load assembly success and add to _dicTypeMapping"); _dicTypeMapping.TryAdd(sModuleName, tCur); } else { Logger.Debug("Load assembly fail."); crmRes = new CErrorResponseMessage("Find Type fail", i_joRequest); break; } } object oModule = ClassHelper.GetInstByType(tCur); if (oModule == null) { crmRes = new CErrorResponseMessage("Create service fail", i_joRequest); break; } if (!(oModule is ServiceBase bls)) { crmRes = new CErrorResponseMessage(BLWording.COVERT_FAIL, i_joRequest); break; } bls.OriRequest = i_joRequest; crmRes = bls.Entry(i_joRequest); } while (false); } catch (Exception ex) { crmRes = new CErrorResponseMessage(Util.GetLastExceptionMsg(ex), i_joRequest); } return crmRes; } public Type GetCustomTypeByTypeName(string i_sTypeName, Type i_tBaseClass = null) { Type type = null; string codeBase = Assembly.GetExecutingAssembly().GetName().CodeBase; codeBase = codeBase.Substring(0, codeBase.LastIndexOf("/")); Assembly[] assemblyArray = (from f in AppDomain.CurrentDomain.GetAssemblies() where !f.IsDynamic && f.FullName.IndexOf("CounsellorBL", StringComparison.OrdinalIgnoreCase) != -1 && f.CodeBase != null && f.CodeBase.StartsWith(codeBase, StringComparison.OrdinalIgnoreCase) select f).ToArray(); foreach (Assembly assembly2 in assemblyArray) { type = i_tBaseClass != null ? assembly2.GetTypes().FirstOrDefault(x => x.IsClass && x.IsSubclassOf(i_tBaseClass) && x.Name == i_sTypeName) : assembly2.GetTypes().FirstOrDefault(x => x.IsClass && x.Name == i_sTypeName); if (type != null) { break; } } return type; } } }