You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

165 lines
6.0 KiB

  1. 
  2. namespace EnterprizeV4.Models
  3. {
  4. using CounsellorBL;
  5. using CounsellorBL.BLStructure;
  6. using CounsellorBL.Helper;
  7. using DefenseWeb.Models;
  8. using MonumentDefine;
  9. using OT.COM.LogisticsUtil;
  10. using OT.COM.SignalerMessage;
  11. using System;
  12. using System.Collections.Concurrent;
  13. using System.Collections.Generic;
  14. using System.Linq;
  15. using System.Reflection;
  16. public class CmdService : AApiServiceBase
  17. {
  18. static readonly ConcurrentDictionary<string, Type> _dicTypeMapping = new ConcurrentDictionary<string, Type>();
  19. public CResponsePack GetData(CReqestPack i_crpRequest, ControllDataPack i_cdp)
  20. {
  21. List<CResponseMessage> lcrmr = new List<CResponseMessage>();
  22. foreach (CReqestItem cri in i_crpRequest.reqs)
  23. {
  24. CRequestMessage crm = cri.req;
  25. crm.token = i_crpRequest.token;
  26. try
  27. {
  28. crm.clientip = i_cdp.GetIP;
  29. crm.system_param.Add(typeof(ControllDataPack).Name, i_cdp);
  30. CResponseMessage crp = HandleRequest(crm);
  31. #if DEBUG
  32. if (!string.IsNullOrEmpty(crp.msg))
  33. {
  34. System.Diagnostics.Debug.WriteLine($"***************** {nameof(GetData)} module={crm.module} method={crm.method} Fail!! msg={crp.msg}");
  35. }
  36. #endif
  37. lcrmr.Add(crp);
  38. }
  39. catch (Exception ex)
  40. {
  41. lcrmr.Add(new CErrorResponseMessage(Util.GetLastExceptionMsg(ex)));
  42. }
  43. }
  44. return new CResponsePack() { reps = lcrmr };
  45. }
  46. protected override CResponseMessage HandleRequest(CRequestMessage i_joRequest)
  47. {
  48. CResponseMessage crmRes;
  49. try
  50. {
  51. do
  52. {
  53. if (i_joRequest == null || string.IsNullOrEmpty(i_joRequest.method) || string.IsNullOrEmpty(i_joRequest.module))
  54. {
  55. crmRes = new CErrorResponseMessage(MessageWording.MTHOD_MISS, i_joRequest);
  56. break;
  57. }
  58. string sModuleName = null;
  59. string[] saModule = i_joRequest.module.Split(".".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
  60. Type tCur = null;
  61. const string SERVICE = "Service";
  62. sModuleName = saModule[^1];
  63. if(!sModuleName.EndsWith(SERVICE))
  64. {
  65. sModuleName += SERVICE;
  66. }
  67. if (_dicTypeMapping.ContainsKey(sModuleName) )
  68. {
  69. tCur = _dicTypeMapping[sModuleName];
  70. }
  71. else
  72. {
  73. Logger.Debug("Not in _dicTypeMapping");
  74. tCur = GetCustomTypeByTypeName(sModuleName, typeof(ServiceBase));
  75. if (tCur == null)
  76. {
  77. AssemblyHelper.Load(Assembly.GetExecutingAssembly(), "CounsellorBL.*.dll");
  78. tCur = GetCustomTypeByTypeName(sModuleName, typeof(ServiceBase));
  79. }
  80. if (tCur != null)
  81. {
  82. Logger.Debug("Load assembly success and add to _dicTypeMapping");
  83. _dicTypeMapping.TryAdd(sModuleName, tCur);
  84. }
  85. else
  86. {
  87. Logger.Debug("Load assembly fail.");
  88. crmRes = new CErrorResponseMessage("Find Type fail", i_joRequest);
  89. break;
  90. }
  91. }
  92. object oModule = ClassHelper.GetInstByType(tCur);
  93. if (oModule == null)
  94. {
  95. crmRes = new CErrorResponseMessage("Create service fail", i_joRequest);
  96. break;
  97. }
  98. if (!(oModule is ServiceBase bls))
  99. {
  100. crmRes = new CErrorResponseMessage(BLWording.COVERT_FAIL, i_joRequest);
  101. break;
  102. }
  103. bls.OriRequest = i_joRequest;
  104. crmRes = bls.Entry(i_joRequest);
  105. }
  106. while (false);
  107. }
  108. catch (Exception ex)
  109. {
  110. crmRes = new CErrorResponseMessage(Util.GetLastExceptionMsg(ex), i_joRequest);
  111. }
  112. return crmRes;
  113. }
  114. public Type GetCustomTypeByTypeName(string i_sTypeName, Type i_tBaseClass = null)
  115. {
  116. Type type = null;
  117. string codeBase = Assembly.GetExecutingAssembly().GetName().CodeBase;
  118. codeBase = codeBase.Substring(0, codeBase.LastIndexOf("/"));
  119. Assembly[] assemblyArray = (from f in AppDomain.CurrentDomain.GetAssemblies()
  120. where !f.IsDynamic
  121. && f.FullName.IndexOf("CounsellorBL", StringComparison.OrdinalIgnoreCase) != -1
  122. && f.CodeBase != null
  123. && f.CodeBase.StartsWith(codeBase, StringComparison.OrdinalIgnoreCase)
  124. select f).ToArray<Assembly>();
  125. foreach (Assembly assembly2 in assemblyArray)
  126. {
  127. type = i_tBaseClass != null ?
  128. assembly2.GetTypes().FirstOrDefault(x => x.IsClass && x.IsSubclassOf(i_tBaseClass) && x.Name == i_sTypeName) :
  129. assembly2.GetTypes().FirstOrDefault(x => x.IsClass && x.Name == i_sTypeName);
  130. if (type != null)
  131. {
  132. break;
  133. }
  134. }
  135. return type;
  136. }
  137. }
  138. }