/// <summary> /// 扫描并安装 /// </summary> /// <param name="xscfModuleDtos">现有已安装的模块</param> /// <param name="serviceProvider">IServiceProvider</param> /// <param name="afterInstalledOrUpdated">安装或更新后执行</param> /// <param name="justScanThisUid">只扫描并更新特定的Uid</param> /// <returns></returns> public static async Task <string> ScanAndInstall(IList <CreateOrUpdate_XscfModuleDto> xscfModuleDtos, IServiceProvider serviceProvider, Func <IXscfRegister, InstallOrUpdate, Task> afterInstalledOrUpdated = null, string justScanThisUid = null) { StringBuilder sb = new StringBuilder(); sb.AppendLine($"[{SystemTime.Now}] 开始扫描 XscfModules"); //先注册 var updatedCount = 0; var cache = CacheStrategyFactory.GetObjectCacheStrategyInstance(); using (await cache.BeginCacheLockAsync("Senparc.Scf.XscfBase.Register", "Scan").ConfigureAwait(false)) { foreach (var register in RegisterList) { sb.AppendLine($"[{SystemTime.Now}] 扫描到 IXscfRegister:{register.GetType().FullName}"); if (register.IgnoreInstall) { sb.AppendLine($"[{SystemTime.Now}] 当前模块要求忽略安装 uid:[{justScanThisUid}],此模块跳过"); continue; } if (justScanThisUid != null && register.Uid != justScanThisUid) { sb.AppendLine($"[{SystemTime.Now}] 由于只要求更新 uid:[{justScanThisUid}],此模块跳过"); continue; } else { sb.AppendLine($"[{SystemTime.Now}] 符合尝试安装/更新要求,继续执行"); } var xscfModuleStoredDto = xscfModuleDtos.FirstOrDefault(z => z.Uid == register.Uid); var xscfModuleAssemblyDto = new UpdateVersion_XscfModuleDto(register.Name, register.Uid, register.MenuName, register.Version, register.Description); //检查更新,并安装到数据库 var xscfModuleService = serviceProvider.GetService <XscfModuleService>(); var installOrUpdate = await xscfModuleService.CheckAndUpdateVersionAsync(xscfModuleStoredDto, xscfModuleAssemblyDto).ConfigureAwait(false); sb.AppendLine($"[{SystemTime.Now}] 是否更新版本:{installOrUpdate?.ToString() ?? "未安装"}"); if (installOrUpdate.HasValue) { updatedCount++; //执行安装程序 await register.InstallOrUpdateAsync(serviceProvider, installOrUpdate.Value).ConfigureAwait(false); await afterInstalledOrUpdated?.Invoke(register, installOrUpdate.Value); } } } sb.AppendLine($"[{SystemTime.Now}] 扫描结束,共新增或更新 {updatedCount} 个程序集"); return(sb.ToString()); }
/// <summary> /// 检查并更新版本 /// </summary> /// <param name="storedDto"></param> /// <param name="assemblyDto"></param> /// <returns>返回是否需要新增或更新</returns> public async Task <InstallOrUpdate?> CheckAndUpdateVersionAsync(CreateOrUpdate_XscfModuleDto storedDto, UpdateVersion_XscfModuleDto assemblyDto) { if (storedDto == null) { //新增模块 var xscfModule = new XscfModule(assemblyDto.Name, assemblyDto.Uid, assemblyDto.MenuName, assemblyDto.Version, assemblyDto.Description, "", true, "", Core.Enums.XscfModules_State.新增待审核); xscfModule.Create(); await base.SaveObjectAsync(xscfModule).ConfigureAwait(false); return(InstallOrUpdate.Install); } else { //检查更新 if (storedDto.Version != assemblyDto.Version) { var xscfModule = base.GetObject(z => z.Uid == storedDto.Uid); xscfModule.UpdateVersion(assemblyDto.Version, assemblyDto.MenuName, assemblyDto.Description); await base.SaveObjectAsync(xscfModule).ConfigureAwait(false); return(InstallOrUpdate.Update); } return(null); } }