/// <summary> /// 获取节点的子插件实例。 /// </summary> /// <param name="node">节点。</param> /// <returns>子节点列表。</returns> private IAddin[] GetChildsImpl(AddinTreeNode node) { ReadOnlyCollection <AddinTreeNode> items = null; if (node.IsVirtual || node.Exposes == null) { return(new IAddin[0]); } IList <IAddin> addins = new List <IAddin>(); Lazy <AddinDescriptor> temp = null; foreach (String expose in node.Exposes) { items = node.GetChilds(expose); if (items == null) { continue; } foreach (AddinTreeNode item in items) { if (item.IsVirtual) { continue; } temp = ((AddinNode)item).Descriptor; if (temp.IsValueCreated && temp.Value.BuildState == AddinBuildState.Build) { addins.Add(temp.Value.Addin); } } } return(addins.ToArray()); }
/// <summary> /// 构建节点的插件实例。 /// </summary> /// <param name="node">节点。</param> /// <param name="addins">构建完成的插件。</param> private void BuildImpl(AddinTreeNode node, ref IList <IAddin> addins) { ReadOnlyCollection <AddinTreeNode> items = null; if (node.Exposes == null) { return; } foreach (String expose in node.Exposes) { items = node.GetChilds(expose); if (items == null) { continue; } foreach (AddinTreeNode item in items) { if (item.IsVirtual) { BuildImpl(item, ref addins); } else { try { addins.Add(((AddinNode)item).Buid()); } catch (Exception ex) { } } } } }
/// <summary> /// 将子节点添加到指定的挂载点下。 /// </summary> /// <param name="expose">挂载点。</param> /// <param name="child">子节点。</param> internal void SetChild(AddinTreeNode child, String expose = null) { String mount; if (TryGetMount(out mount, expose)) { Collection <AddinTreeNode> c = GetOrAddCollection(mount); c.Add(child); } }
/// <summary> /// 初始化类型 Tumbler.Addin.Core.AddinDescriptor 实例。 /// </summary> /// <param name="type">实现了IAddin接口的类型名称。</param> /// <param name="owner">拥有此描述符的插件节点。</param> /// <param name="references"></param> /// <param name="depedencies"></param> private AddinDescriptor(String type, AddinNode owner, String[] references, String[] depedencies) { if (String.IsNullOrWhiteSpace(type)) { throw new ArgumentNullException("type"); } if (owner == null) { throw new ArgumentNullException("owner"); } Owner = owner; Type = type; References = references; if (depedencies != null) { Dependencies = depedencies.Select(x => AddinTreeNode.CompletePath(x)).ToArray(); } }
/// <summary> /// 创建插件树节点列表。 /// </summary> /// <param name="initExposes">初始化挂载点。</param> private void CreateAddinTreeNodes(Tuple <String, String, String[]>[] initExposes) { XElement xml = XElement.Load(ConfigFile); if (xml == null) { throw new FileLoadException("Invalid addin manager config file"); } AddinTreeNode node = null; if (initExposes != null && initExposes.Length != 0) { foreach (Tuple <String, String, String[]> point in initExposes) { node = new VirtualNode(point.Item1, AddinTreeNode.DefaultExposePoint, point.Item2, point.Item3); _nodes.Add(node.FullPath, node); } } Func <XElement, Boolean> filter = Filter; IEnumerable <XElement> loadList = null; if (filter != null) { loadList = xml.Elements("Addin").Where(filter); } else { loadList = xml.Elements("Addin"); } foreach (XElement element in loadList) { node = GetAddinTreeNode(element); if (node != null && !_nodes.ContainsKey(node.FullPath)) { _nodes.Add(node.FullPath, node); } } }
/// <summary> /// 初始化插件管理器。 /// </summary> /// <param name="configFile">配置文件。</param> /// <param name="initExposes">初始化挂载点。</param> public void Initialize(String configFile, Tuple <String, String, String[]>[] initExposes = null) { if (_isInit) { return; } if (String.IsNullOrWhiteSpace(configFile)) { throw new ArgumentNullException("configFile"); } configFile = AddinManager.GetFileFullPath(configFile); if (!File.Exists(configFile)) { throw new FileNotFoundException(configFile); } ConfigFile = configFile; _root = new RootNode(); _nodes.Add(_root.FullPath, _root); _nodes.Add(_root.GetChilds()[0].FullPath, _root.GetChilds()[0]); _nodes.Add(_root.GetChilds()[1].FullPath, _root.GetChilds()[1]); CreateAddinTreeNodes(initExposes); GenerateAddinTree(); _isInit = true; }
/// <summary> /// 获取指定路径的插件树节点。 /// </summary> /// <param name="fullPath">路径。如果为“*”表示所有插件。</param> /// <returns>插件树节点。</returns> public IEnumerable <AddinTreeNode> GetNode(String fullPath) { if (!_isInit) { throw new InvalidOperationException("Need initialize"); } if (String.IsNullOrWhiteSpace(fullPath)) { return(null); } if (fullPath == "*") { return(_nodes.Values); } else { fullPath = AddinTreeNode.CompletePath(fullPath); if (_nodes.ContainsKey(fullPath)) { return(new AddinTreeNode[] { _nodes[fullPath] }); } } return(null); }