/// <summary> /// 插件数据完整性解析 /// </summary> /// <param name="bundles"></param> /// <returns></returns> public bool ResolveForValidation(IList <AbstractBundle> bundles) { // 检查数据不完整的插件 IList <AbstractBundle> removalPendings = new List <AbstractBundle>(); foreach (AbstractBundle bundle in bundles) { // 基础性数据完整性解析 if (!BasicResolveForValidation(bundle)) { bundle.ResolveState = ResolveState.Resolved | ResolveState.Fault; removalPendings.Add(bundle); continue; } // 宿主数据完整性解析 if (bundle.BundleData.BundleType == BundleType.Host && !ResolveHostForValidation(bundle)) { bundle.ResolveState = ResolveState.Resolved | ResolveState.Fault; removalPendings.Add(bundle); } else if (!ResolveFragmentForValidation(bundle)) { bundle.ResolveState = ResolveState.Resolved | ResolveState.Fault; removalPendings.Add(bundle); } } // 将解析失败的插件从当前待解析插件列表中移除 BundleUtil.Remove <AbstractBundle>(bundles, removalPendings); return(bundles.Count != 0); }
/// <summary> /// 宿主、片段插件关系解析 /// </summary> /// <param name="bundles"></param> protected override void ResolveRelation(IList <AbstractBundle> bundles) { // 检查数据不完整的插件 IList <AbstractBundle> removalPendings = new List <AbstractBundle>(); foreach (AbstractBundle bundle in bundles) { // 检查当前插件是否为宿主插件,如果是宿主插件直接跳过 if (!bundle.IsFragment) { continue; } // 获取当前片段插件依赖的宿主插件的唯一标识名和版本号 string hostSymbolicName = bundle.BundleData.HostBundleSymbolicName; Version version = bundle.BundleData.HostBundleVersion; // 获取宿主插件 AbstractBundle hostBundle = framework.Bundles.GetBundle(hostSymbolicName, version); // 验证宿主插件,以下情况标识片段插件无法附加并解析失败 // 1. 未找到宿主插件,无法附加,解析失败 // 2. 找到插件是片段插件,无法附加,解析失败 // 3. 找到的插件,在数据有效性解析过程中,解析失败,无法附加 if (hostBundle == null || hostBundle.IsFragment || hostBundle.ResolveState == (ResolveState.Resolved | ResolveState.Fault)) { bundle.ResolveState = ResolveState.Resolved | ResolveState.Fault; removalPendings.Add(bundle); } else { // 将片段插件附加到宿主插件中 ((BundleFragment)bundle).AddHost(hostBundle as BundleHost); removalPendings.Add(bundle); } } // 将片段插件从当前待解析插件列表中移除 BundleUtil.Remove <AbstractBundle>(bundles, removalPendings); }