SysPluginService.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. // 麻省理工学院许可证
  2. //
  3. // 版权所有 (c) 2021-2023 zuohuaijun,大名科技(天津)有限公司 联系电话/微信:18020030720 QQ:515096995
  4. //
  5. // 特此免费授予获得本软件的任何人以处理本软件的权利,但须遵守以下条件:在所有副本或重要部分的软件中必须包括上述版权声明和本许可声明。
  6. //
  7. // 软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于对适销性、适用性和非侵权的保证。
  8. // 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是因合同、侵权或其他方式引起的,与软件或其使用或其他交易有关。
  9. namespace Admin.NET.Core.Service;
  10. /// <summary>
  11. /// 系统动态插件服务
  12. /// </summary>
  13. [ApiDescriptionSettings(Order = 245)]
  14. public class SysPluginService : IDynamicApiController, ITransient
  15. {
  16. private readonly IDynamicApiRuntimeChangeProvider _provider;
  17. private readonly SqlSugarRepository<SysPlugin> _sysPluginRep;
  18. public SysPluginService(IDynamicApiRuntimeChangeProvider provider,
  19. SqlSugarRepository<SysPlugin> sysPluginRep)
  20. {
  21. _provider = provider;
  22. _sysPluginRep = sysPluginRep;
  23. }
  24. /// <summary>
  25. /// 获取动态插件列表
  26. /// </summary>
  27. /// <param name="input"></param>
  28. /// <returns></returns>
  29. [DisplayName("获取动态插件列表")]
  30. public async Task<SqlSugarPagedList<SysPlugin>> Page(PagePluginInput input)
  31. {
  32. return await _sysPluginRep.AsQueryable()
  33. .WhereIF(!string.IsNullOrWhiteSpace(input.Name), u => u.Name.Contains(input.Name))
  34. .OrderBy(u => u.OrderNo)
  35. .ToPagedListAsync(input.Page, input.PageSize);
  36. }
  37. /// <summary>
  38. /// 增加动态插件
  39. /// </summary>
  40. /// <param name="input"></param>
  41. /// <returns></returns>
  42. [ApiDescriptionSettings(Name = "Add"), HttpPost]
  43. [DisplayName("增加动态插件")]
  44. public async Task AddPlugin(AddPluginInput input)
  45. {
  46. var isExist = await _sysPluginRep.IsAnyAsync(u => u.Name == input.Name || u.AssemblyName == input.AssemblyName);
  47. if (isExist)
  48. throw Oops.Oh(ErrorCodeEnum.D1900);
  49. // 添加动态程序集/接口
  50. input.AssemblyName = CompileAssembly(input.CsharpCode, input.AssemblyName);
  51. await _sysPluginRep.InsertAsync(input.Adapt<SysPlugin>());
  52. }
  53. /// <summary>
  54. /// 更新动态插件
  55. /// </summary>
  56. /// <param name="input"></param>
  57. /// <returns></returns>
  58. [ApiDescriptionSettings(Name = "Update"), HttpPost]
  59. [DisplayName("更新动态插件")]
  60. public async Task UpdatePlugin(UpdatePluginInput input)
  61. {
  62. var isExist = await _sysPluginRep.IsAnyAsync(u => (u.Name == input.Name || u.AssemblyName == input.AssemblyName) && u.Id != input.Id);
  63. if (isExist)
  64. throw Oops.Oh(ErrorCodeEnum.D1900);
  65. // 先移除再添加动态程序集/接口
  66. RemoveAssembly(input.AssemblyName);
  67. input.AssemblyName = CompileAssembly(input.CsharpCode);
  68. await _sysPluginRep.AsUpdateable(input.Adapt<SysPlugin>()).IgnoreColumns(true).ExecuteCommandAsync();
  69. }
  70. /// <summary>
  71. /// 删除动态插件
  72. /// </summary>
  73. /// <param name="input"></param>
  74. /// <returns></returns>
  75. [ApiDescriptionSettings(Name = "Delete"), HttpPost]
  76. [DisplayName("删除动态插件")]
  77. public async Task DeletePlugin(DeletePluginInput input)
  78. {
  79. var plugin = await _sysPluginRep.GetByIdAsync(input.Id);
  80. if (plugin == null) return;
  81. // 移除动态程序集/接口
  82. RemoveAssembly(plugin.AssemblyName);
  83. await _sysPluginRep.DeleteAsync(u => u.Id == input.Id);
  84. }
  85. /// <summary>
  86. /// 添加动态程序集/接口
  87. /// </summary>
  88. /// <param name="csharpCode"></param>
  89. /// <param name="assemblyName">程序集名称</param>
  90. /// <returns></returns>
  91. [DisplayName("添加动态程序集/接口")]
  92. public string CompileAssembly([FromBody] string csharpCode, [FromQuery] string assemblyName = default)
  93. {
  94. // 编译 C# 代码并返回动态程序集
  95. var dynamicAssembly = App.CompileCSharpClassCode(csharpCode, assemblyName);
  96. // 将程序集添加进动态 WebAPI 应用部件
  97. _provider.AddAssembliesWithNotifyChanges(dynamicAssembly);
  98. // 返回动态程序集名称
  99. return dynamicAssembly.GetName().Name;
  100. }
  101. /// <summary>
  102. /// 移除动态程序集/接口
  103. /// </summary>
  104. [ApiDescriptionSettings(Name = "RemoveAssembly"), HttpPost]
  105. [DisplayName("移除动态程序集/接口")]
  106. public void RemoveAssembly(string assemblyName)
  107. {
  108. _provider.RemoveAssembliesWithNotifyChanges(assemblyName);
  109. }
  110. }