コード例 #1
0
ファイル: ResolverTree.cs プロジェクト: zhaoyin/officeOBA
        /// <summary>
        /// 内部创建解析插件
        /// </summary>
        /// <param name="bundle"></param>
        private void InternalCreateResolverBundle(Tracker tracker, ResolverNode depencyProviderBy, AbstractBundle bundle)
        {
            // 检查当前插件是否已解析,并且解析失败
            if (bundle.ResolveState == (ResolveState.Resolved | ResolveState.Fault))
            {
                return;
            }
            // 检查缓存中是否存在,如果存在则说明出现了循环依赖
            if (tracker.Contains(depencyProviderBy))
            {
                LinkedListNode <ResolverNode> dependencyNode = tracker.Find(depencyProviderBy);
                if (dependencyNode.Next != null)
                {
                    return;
                }
            }
            // 将当前解析插件放入追踪链中
            tracker.AddLast(depencyProviderBy);
            // 获取所有依赖
            DependentBundle[] dependencies = bundle.BundleData.DependentBundles;
            bool isResolved = false;

            if (dependencies != null)
            {
                foreach (var dependency in dependencies)
                {
                    // 检查依赖插件唯一标示名是否为空,为空则视依赖项无效
                    if (string.IsNullOrEmpty(dependency.BundleSymbolicName))
                    {
                        continue;
                    }
                    // 获取插件
                    AbstractBundle dependencyBundle = framework.Bundles.GetBundle(dependency.BundleSymbolicName, dependency.BundleVersion);
                    if ((dependencyBundle == null || dependencyBundle.IsFragment) &&
                        dependency.Resolution == ResolutionMode.Mandatory)
                    {
                        // 设置解析状态
                        bundle.ResolveState = ResolveState.Resolved | ResolveState.Fault;
                        // 将当前解析插件从追踪器中移除
                        tracker.Remove(depencyProviderBy);
                        return;
                    }
                    // 构建解析插件对象
                    string       key            = dependencyBundle.ToString();
                    bool         exist          = trackCache.ContainsKey(key);
                    ResolverNode resolverBundle = !exist ? new ResolverNode(this, dependencyBundle, depencyProviderBy)
                        : trackCache[key] as ResolverNode;
                    if (exist)
                    {
                        resolverBundle.DepencyProvidersBy.Add(depencyProviderBy);
                    }
                    // 嵌套搜索解析
                    if (!exist)
                    {
                        InternalCreateResolverBundle(tracker, resolverBundle, dependencyBundle);
                    }
                    // 检查是否解析成功
                    isResolved = resolverBundle.Bundle.ResolveState == (ResolveState.Resolved | ResolveState.Success);
                    if (!isResolved && dependency.Resolution == ResolutionMode.Mandatory)
                    {
                        // 设置解析状态
                        bundle.ResolveState = ResolveState.Resolved | ResolveState.Fault;
                        // 将当前解析插件从追踪器中移除
                        tracker.Remove(depencyProviderBy);
                        return;
                    }
                    // 加入到依赖项中
                    depencyProviderBy.Dependencies.Add(resolverBundle);
                    // 调整逆向层级关系
                    int desLevel = resolverBundle.DesLevel + 1;
                    if (desLevel > depencyProviderBy.DesLevel)
                    {
                        depencyProviderBy.DesLevel = desLevel;
                    }
                }
            }
            // 未解析状态下,解析当前插件,并设置解析状态
            if (bundle.ResolveState == ResolveState.Unresolved)
            {
                if (!resolver.ResolvePackage(bundle))
                {
                    bundle.ResolveState = ResolveState.Resolved | ResolveState.Fault;
                }
                else
                {
                    bundle.ResolveState = ResolveState.Resolved | ResolveState.Success;
                    // 加入缓存
                    string key = bundle.ToString();
                    if (!trackCache.ContainsKey(key))
                    {
                        trackCache.Add(key, depencyProviderBy);
                    }
                    // 记录叶子节点
                    key = depencyProviderBy.Bundle.ToString();
                    if (leafResolverBundles.ContainsKey(key))
                    {
                        if (depencyProviderBy.Dependencies.Count > 0)
                        {
                            leafResolverBundles.Remove(key);
                        }
                    }
                    else if (depencyProviderBy.Dependencies.Count == 0)
                    {
                        leafResolverBundles.Add(key, depencyProviderBy);
                    }
                }
            }
            // 将当前解析插件从追踪器中移除
            tracker.Remove(depencyProviderBy);
        }