ConstSelectorService.cs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. namespace Admin.NET.Core.Service;
  2. /// <summary>
  3. /// 常量下拉框服务
  4. /// </summary>
  5. [ApiDescriptionSettings(Name = "常量下拉框", Order = 189)]
  6. public class ConstSelectorService : IDynamicApiController, ITransient
  7. {
  8. private readonly IDistributedCache _cache;
  9. public ConstSelectorService(IDistributedCache cache)
  10. {
  11. _cache = cache;
  12. }
  13. /// <summary>
  14. /// 获取所有常量下拉框列表
  15. /// </summary>
  16. /// <returns></returns>
  17. [HttpGet("/constSelector/allConstSelector")]
  18. public async Task<dynamic> GetAllConstSelector()
  19. {
  20. var key = $"{CacheConst.KeyConstSelector}AllSelector";
  21. var json = await _cache.GetStringAsync(key);
  22. if (!string.IsNullOrWhiteSpace(json))
  23. {
  24. return json.ToObject<List<SelectorDto>>();
  25. }
  26. var typeList = await GetAllTypesAsync();
  27. var selectData = typeList.Select(x => new SelectorDto
  28. {
  29. Name = x.CustomAttributes.ToList().FirstOrDefault()?.ConstructorArguments.ToList().FirstOrDefault().Value?.ToString() ?? x.Name,
  30. Code = x.Name
  31. }).ToList();
  32. await _cache.SetStringAsync(key, selectData.ToJson());
  33. return selectData;
  34. }
  35. /// <summary>
  36. /// 根据类名获取下拉框数据
  37. /// </summary>
  38. /// <param name="typeName"></param>
  39. /// <returns></returns>
  40. [HttpGet("/constSelector/constSelector")]
  41. public async Task<dynamic> GetConstSelector(string typeName)
  42. {
  43. var key = $"{CacheConst.KeyConstSelector}{typeName.ToUpper()}";
  44. var json = await _cache.GetStringAsync(key);
  45. if (!string.IsNullOrWhiteSpace(json))
  46. {
  47. return json.ToObject<List<SelectorDto>>();
  48. }
  49. var typeList = await GetAllTypesAsync();
  50. var type = typeList.FirstOrDefault(x => x.Name == typeName);
  51. var isEnum = type.BaseType.Name == "Enum";
  52. var selectData = type.GetFields()?
  53. .Where(isEnum, x => x.FieldType.Name == typeName)
  54. .Select(x => new SelectorDto
  55. {
  56. Name = x.Name,
  57. Code = isEnum ? (int)x.GetValue(BindingFlags.Instance) : x.GetValue(BindingFlags.Instance)
  58. }).ToList();
  59. await _cache.SetStringAsync(key, selectData.ToJson());
  60. return selectData;
  61. }
  62. /// <summary>
  63. /// 获取所有常量
  64. /// </summary>
  65. /// <returns></returns>
  66. private async Task<List<Type>> GetAllTypesAsync()
  67. {
  68. return await Task.Run(() =>
  69. {
  70. var typeList = AppDomain.CurrentDomain.GetAssemblies()
  71. .SelectMany(x => x.GetTypes())
  72. .Where(x => x.CustomAttributes.Any(y => y.AttributeType == typeof(ConstSelectorAttribute)))
  73. .ToList();
  74. return typeList;
  75. });
  76. }
  77. }