private static WfGlobalParameters LoadFromDB(string key)
        {
            string sql = string.Format("SELECT [PROPERTIES] FROM WF.GLOBAL_PARAMETERS WHERE {0}",
                                       GetWhereSqlClauseBuilder(key).ToSqlString(TSqlBuilder.Instance));

            WfGlobalParameters result = null;

            string properties = (string)DbHelper.RunSqlReturnScalar(sql, WorkflowSettings.GetConfig().ConnectionName);

            if (properties.IsNotEmpty())
            {
                XElementFormatter formatter = new XElementFormatter();

                formatter.OutputShortType = WorkflowSettings.GetConfig().OutputShortType;

                XElement root = XElement.Parse(properties);

                object deserializedData = formatter.Deserialize(root);

                if (deserializedData is PropertyValueCollection)
                {
                    result             = new WfGlobalParameters();
                    result.Key         = key;
                    result._Properties = (PropertyValueCollection)deserializedData;
                }
                else
                {
                    result = (WfGlobalParameters)deserializedData;
                }
            }

            return(result);
        }
        public static WfGlobalParameters GetProperties(string propsKey)
        {
            propsKey.CheckStringIsNullOrEmpty("propsKey");
            string cacheKey = CalculateCacheKey(propsKey);

            WfGlobalParameters parameters = WfGlobalParametersCache.Instance.GetOrAddNewValue(cacheKey, (cache, key) =>
            {
                WfGlobalParameters ps = LoadProperties(propsKey);

                MixedDependency dependency = new MixedDependency(new UdpNotifierCacheDependency(), new MemoryMappedFileNotifierCacheDependency());

                cache.Add(key, ps, dependency);

                return(ps);
            });

            return(parameters);
        }
        public static WfGlobalParameters LoadProperties(string key)
        {
            key.CheckStringIsNullOrEmpty("key");

            WfGlobalParameters parameters = LoadFromDB(key);

            if (parameters == null)
            {
                parameters = new WfGlobalParameters()
                {
                    Key = key
                }
            }
            ;

            PropertyDefineCollection definedProperties = new PropertyDefineCollection();

            definedProperties.LoadPropertiesFromConfiguration(WfActivitySettings.GetConfig().PropertyGroups["GlobalParemeters"]);
            parameters.Properties.MergeDefinedProperties(definedProperties);

            return(parameters);
        }
        /// <summary>
        /// 向上递归查找参数。如果能找到appCodeName和progName对应参数,且参数值不是默认值,则使用。否则使用Default的参数
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="appCodeName"></param>
        /// <param name="progCodeName"></param>
        /// <param name="propertyName"></param>
        /// <param name="defaultValue"></param>
        /// <returns></returns>
        public static T GetValueRecursively <T>(string appCodeName, string progCodeName, string propertyName, T defaultValue)
        {
            propertyName.CheckStringIsNullOrEmpty("propertyName");

            WfGlobalParameters parameters = GetProperties(appCodeName, progCodeName);

            if (parameters == null)
            {
                parameters = WfGlobalParameters.Default;
            }
            else
            {
                if (parameters.Properties.ContainsKey(propertyName))
                {
                    if (parameters.Properties[propertyName].IsDefaultValue())
                    {
                        parameters = WfGlobalParameters.Default;
                    }
                }
            }

            return(parameters.Properties.GetValue <T>(propertyName, defaultValue));
        }