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