/// <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); }