Example #1
0
        /// <summary>
        /// 卸载指定插件树节点对应的自定义对象。
        /// </summary>
        /// <param name="node">指定要卸载对象的挂靠节点。</param>
        /// <returns>如果成功卸载则返回被卸载的对象,否则返回空(null)。</returns>
        /// <exception cref="System.ArgumentNullException">当<paramref name="node"/>参数为空(null)。</exception>
        /// <exception cref="System.ArgumentException">当<paramref name="node"/>参数的<see cref="Zongsoft.Plugins.PluginTreeNode.Tree"/>属性与当前插件树对象不是同一个引用。</exception>
        /// <remarks>
        ///		<para>注意:当前该方法的实现是不完备的,请谨慎使用!</para>
        ///		<para>将<paramref name="node"/>参数指定的节点对象的Value属性置空,导致该节点类型成为路径节点(即空节点)。</para>
        ///		<para>如果<paramref name="node"/>参数指定的节点对象没有子节点了,则将该节点从插件树中删除,否则保留。</para>
        /// </remarks>
        public object Unmount(PluginTreeNode node)
        {
            if (node == null)
            {
                return(null);
            }

            if (!object.ReferenceEquals(node.Tree, this))
            {
                throw new ArgumentException();
            }

            //以永不构建的方式获取当前节点的目标对象
            var value = node.UnwrapValue(ObtainMode.Never, null);

            //将当前节点置空
            node.Value = null;

            //判断当前节点是否为叶子节点,如果是则将其删除
            if (node.Children.Count == 0)
            {
                node.Remove();
            }

            //返回被卸载的目标对象
            return(value);
        }
Example #2
0
        public object GetValue(Type valueType, object defaultValue)
        {
            if (_valueNode == null)
            {
                return(PluginUtility.ResolveValue(_owner, _rawValue, _name, valueType, defaultValue));
            }

            var result = _valueNode.UnwrapValue(ObtainMode.Auto, _owner);

            if (valueType != null)
            {
                result = Zongsoft.Common.Convert.ConvertValue(result, valueType, defaultValue);
            }

            return(result);
        }
Example #3
0
        private void StopWorkers(PluginTreeNode node)
        {
            if (node == null)
            {
                return;
            }

            foreach (PluginTreeNode child in node.Children)
            {
                this.StopWorkers(child);
            }

            object target = node.UnwrapValue(ObtainMode.Never);

            if (target is IWorker worker)
            {
                worker.Stop();
            }
        }
Example #4
0
        private void StartWorkers(PluginTreeNode node, string[] args)
        {
            if (node == null)
            {
                return;
            }

            object target = node.UnwrapValue(ObtainMode.Auto);

            if (target is IWorker worker && worker.Enabled)
            {
                worker.Start(args);
            }

            foreach (PluginTreeNode child in node.Children)
            {
                this.StartWorkers(child, args);
            }
        }