Esempio n. 1
0
        /// <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());
        }
Esempio n. 2
0
        /// <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);
            }
        }