/// <summary>
        /// 从配置文件读取配置
        /// </summary>
        /// <param name="sectionNodePath">配置节点的路径</param>
        /// <returns></returns>
        public static PermissionValidateConfig GetConfig(string sectionNodePath = "")
        {
            if (config != null)
            {
                return config;
            }
            else
            {
                if (string.IsNullOrWhiteSpace(sectionNodePath) == false)
                {
                    config = (PermissionValidateConfig)ConfigurationManager.GetSection(sectionNodePath);
                }
                else
                {
                    config = (PermissionValidateConfig)ConfigurationManager.GetSection("generalValidate");
                    if (config == null)
                    {
                        config = (PermissionValidateConfig)ConfigurationManager.GetSection("permissionValidate/generalValidate");
                    }
                }

                return config;
            }
        }
        /// <summary>
        ///  从配置文件自动构建权限配置对象
        /// </summary>
        /// <param name="parent"></param>
        /// <param name="configContext"></param>
        /// <param name="section"></param>
        /// <returns></returns>
        public object Create(object parent, object configContext, XmlNode section)
        {
            PermissionValidateConfig config = new PermissionValidateConfig();

            foreach (XmlNode applicationNode in section.ChildNodes)
            {
                PermissionValidateApplication application = new PermissionValidateApplication();
                application.Name = applicationNode.Attributes["name"].Value;
                application.Guid = new Guid(applicationNode.Attributes["guid"].Value);
                application.IsVisible = XmlHelper.GetNodeValue<bool>(applicationNode,string.Empty,"isVisible",true);

                foreach (XmlNode moduleNode in applicationNode.ChildNodes)
                {
                    PermissionValidateModule module = new PermissionValidateModule();
                    module.Name = moduleNode.Attributes["name"].Value;
                    module.Guid = new Guid(moduleNode.Attributes["guid"].Value);
                    module.IsVisible = XmlHelper.GetNodeValue<bool>(moduleNode, string.Empty, "isVisible", true);

                    foreach (XmlNode subModuleNode in moduleNode.ChildNodes)
                    {
                        PermissionValidateSubModule subModule = new PermissionValidateSubModule();
                        subModule.Name = subModuleNode.Attributes["name"].Value;
                        subModule.Guid = new Guid(subModuleNode.Attributes["guid"].Value);
                        subModule.IsVisible = XmlHelper.GetNodeValue<bool>(subModuleNode, string.Empty, "isVisible", true);

                        XmlNodeList operationNodeList = subModuleNode.SelectNodes("operation");
                        foreach (XmlNode operationNode in operationNodeList)
                        {
                            int actionValue = 0;
                            bool isOkValue = int.TryParse(operationNode.Attributes["value"].Value, out actionValue);
                            if (isOkValue == true)
                            {
                                string operationName = operationNode.Attributes["name"].Value;
                                string operationText = operationName;
                                XmlAttribute actionTextAttribute = operationNode.Attributes["text"];
                                if (actionTextAttribute != null)
                                {
                                    operationText = actionTextAttribute.Value;
                                }

                                string operationArea = operationNode.GetNodeValue(string.Empty,"area");
                                string operationController = operationNode.GetNodeValue(string.Empty, "controller");
                                string operationAction = operationNode.GetNodeValue(string.Empty, "action");
                                bool isVisible = operationNode.GetNodeValue<bool>(string.Empty, "isVisible", true);

                                PermissionValidateOperation operation = new PermissionValidateOperation(operationName, operationText, actionValue, operationController, operationAction, operationArea, isVisible);
                                subModule.Operations.Add(operationName, operation);
                            }
                        }

                        module.SubModules.Add(subModule.Guid, subModule);
                    }

                    application.Modules.Add(module.Guid, module);
                }

                config.Applications.Add(application.Guid, application);
            }

            config.OptimizeStrcture();

            return config;
        }
        /// <summary>
        /// 获取ACA对应的资源所需要的权限值
        /// </summary>
        /// <param name="config"></param>
        /// <param name="areaName"></param>
        /// <param name="controllerName"></param>
        /// <param name="actionName"></param>
        /// <returns></returns>
        /// <remarks>
        /// 通过areaName, controllerName, actionName获取其对应的子模块guid以及当前权限项的值 KVP对,如果没有匹配到合适的值,返回null
        /// </remarks>
        private static KeyValuePair<Guid, int>? GetPermissionInfo(PermissionValidateConfig config, string areaName, string controllerName, string actionName)
        {
            Dictionary<Guid, PermissionValidateSubModule> allSubModelDic = config.AllSubModuleDic;
            foreach (KeyValuePair<Guid, PermissionValidateSubModule> subModule in allSubModelDic)
            {
                Dictionary<string, PermissionValidateOperation> operations = subModule.Value.Operations;
                foreach (KeyValuePair<string, PermissionValidateOperation> operateKVP in operations)
                {
                    PermissionValidateOperation operation = operateKVP.Value;

                    if (operation.Action.ToLower() == actionName.ToLower() &&
                        operation.Controller.ToLower() == controllerName.ToLower() &&
                        operation.Area.ToLower() == areaName.ToLower())
                    {
                        return new KeyValuePair<Guid, int>( subModule.Key,operation.Value);
                    }
                }
            }

            return null;
        }