/// <summary> /// 扫描并安装 /// </summary> /// <param name="xncfModuleDtos">现有已安装的模块</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_XncfModuleDto> xncfModuleDtos, IServiceProvider serviceProvider, Func <IXncfRegister, InstallOrUpdate, Task> afterInstalledOrUpdated = null, string justScanThisUid = null) { StringBuilder sb = new StringBuilder(); sb.AppendLine($"[{SystemTime.Now}] 开始扫描 XncfModules"); //先注册 var updatedCount = 0; var cache = CacheStrategyFactory.GetObjectCacheStrategyInstance(); using (await cache.BeginCacheLockAsync("Senparc.Ncf.XncfBase.Register", "Scan").ConfigureAwait(false)) { foreach (var register in RegisterList) { sb.AppendLine($"[{SystemTime.Now}] 扫描到 IXncfRegister:{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 xncfModuleStoredDto = xncfModuleDtos.FirstOrDefault(z => z.Uid == register.Uid); var xncfModuleAssemblyDto = new UpdateVersion_XncfModuleDto(register.Name, register.Uid, register.MenuName, register.Version, register.Description); //检查更新,并安装到数据库 var xncfModuleService = serviceProvider.GetService <XncfModuleService>(); var installOrUpdate = await xncfModuleService.CheckAndUpdateVersionAsync(xncfModuleStoredDto, xncfModuleAssemblyDto).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_XncfModuleDto storedDto, UpdateVersion_XncfModuleDto assemblyDto) { if (storedDto == null) { //新增模块 var xncfModule = new XncfModule(assemblyDto.Name, assemblyDto.Uid, assemblyDto.MenuName, assemblyDto.Version, assemblyDto.Description, "", true, "", Core.Enums.XncfModules_State.新增待审核); xncfModule.Create(); await base.SaveObjectAsync(xncfModule).ConfigureAwait(false); return(InstallOrUpdate.Install); } else { //检查更新 if (storedDto.Version != assemblyDto.Version) { var xncfModule = base.GetObject(z => z.Uid == storedDto.Uid); xncfModule.UpdateVersion(assemblyDto.Version, assemblyDto.MenuName, assemblyDto.Description); await base.SaveObjectAsync(xncfModule).ConfigureAwait(false); return(InstallOrUpdate.Update); } return(null); } }