예제 #1
0
        ///<summary>
        /// 구문 분석된 식을 나타내는 개체를 반환합니다.
        ///</summary>
        ///<returns>
        /// 구문 분석한 식을 나타내는 <see cref="T:System.Object" />입니다.
        ///</returns>
        ///<param name="expression">선언적 식의 값입니다.</param>
        ///<param name="propertyType">식에 의해 바인딩된 속성의 형식입니다.</param>
        ///<param name="context">식을 계산하는 데 필요한 컨텍스트 정보입니다.</param>
        ///<exception cref="T:System.Web.HttpException">리소스 식이 없거나 유효하지 않은 경우</exception>
        public override object ParseExpression(string expression, Type propertyType, ExpressionBuilderContext context)
        {
            expression.ShouldNotBeWhiteSpace("expression");

            if (IsDebugEnabled)
            {
                log.Debug("표현식을 파싱합니다... expression=[{0}], propertyType=[{1}], context=[{2}]", expression, propertyType, context);
            }

            string classKey;
            string resourceKey;

            //+ 예 : <%$ ExternalResources : AssemblyName|ResourceFileName, ResourceKey %> 를 파싱한다.
            //
            StringResourceTool.ParseClassKey(expression, ',', out classKey, out resourceKey);
            var field = new ExpressionField(classKey, resourceKey);

            // 실제로 값이 있는지 검사한다.
            if (ResourceProvider.GetObject(field.ClassKey, field.ResourceKey) == null)
            {
                throw new InvalidOperationException("지정한 리소스를 찾을 수 없습니다. resource key=" + field.ResourceKey);
            }

            return(field);
        }
        private string GetParameterValue(string paramKey, CultureInfo culture)
        {
            if (IsDebugEnabled)
            {
                log.Debug("Get Parameter value. paramKey=[{0}], culuture=[{1}]", paramKey, culture);
            }

            if (paramKey.IsWhiteSpace())
            {
                return(null);
            }

            string result;

            string resourceFile, resourceKey;

            StringResourceTool.ParseClassKey(paramKey, out resourceFile, out resourceKey);

            // External Resource Provider의 예로 들면
            // 다른 resource file에 있을 시 (resource assembly에는 여러개의 resource file이 존재하고,
            // 다른 resource file의 키값을 조회하기 위해 ${filename|resourceKey} 형태를 취할 수 있다.
            //
            // Resource : ${resourceFile|resourceKey}
            if (resourceFile != StringResourceTool.DEFAULT_ASSEMBLY_NAME)
            {
                result = ResourceProvider.GetString(AssemblyName + StringResourceTool.CLASS_KEY_DELIMITER + resourceFile,
                                                    resourceKey,
                                                    culture);
            }
            else
            {
                result = base.GetObject(paramKey, culture) as string;
            }

            if (IsDebugEnabled)
            {
                log.Debug("Parameter에 해당하는 값을 조회했습니다. paramKey=[{0}], culture=[{1}], paramValue=[{2}]", paramKey, culture, result);
            }

            return(result);
        }
        /// <summary>
        /// IoC 를 이용해 원하는 ResourceProvider component를 resolve한다.
        /// </summary>
        /// <param name="componentId"></param>
        /// <param name="classKey"></param>
        /// <returns></returns>
        internal static IStringResourceProvider CreateResourceProvider(string componentId, string classKey)
        {
            if (IsDebugEnabled)
            {
                log.Debug("Castle.Windsor를 이용하여 IStringResourceProvider의 인스턴스를 생성합니다... component id=[{0}], classKey=[{1}]", componentId,
                          classKey);
            }

            var arguments = new Hashtable();

            string assemblyName, resourceName;

            StringResourceTool.ParseClassKey(classKey, out assemblyName, out resourceName);

            var key = componentId + ":" + assemblyName + StringResourceTool.CLASS_KEY_DELIMITER + resourceName;

            if (IsDebugEnabled)
            {
                log.Debug("Parsing classKey. store provider instance in hashtable with key=[{0}]", key);
            }

            IStringResourceProvider provider;

            lock (_sync) {
                if (_providers.TryGetValue(key, out provider) == false)
                {
                    if (IsDebugEnabled)
                    {
                        log.Debug("캐시에 없으므로 새로운 ResourceProvider를 생성합니다.");
                    }

                    if (assemblyName.IsNotWhiteSpace() && assemblyName != StringResourceTool.DEFAULT_ASSEMBLY_NAME)
                    {
                        arguments.Add(StringResourceTool.CLASS_ASSEMBLY_NAME, assemblyName);
                    }

                    arguments.Add(StringResourceTool.CLASS_RESOURCE_NAME, resourceName);

                    // NOTE : ResourceProvider의 Lifestyle은 항상 Transient|Thread|PerWebRequest 여야 한다.

                    provider = IoC.Resolve <IStringResourceProvider>(componentId, arguments);

                    if (provider != null && provider is ResourceProviderBase)
                    {
                        // Parameterized Key 를 파싱할 수 있는 Provider로 decoration한다.
                        // FileResourceProvider는 자체적으로 제공하므로 필요없다.
                        if ((provider is FileResourceProvider) == false)
                        {
                            provider = new ParameterizedResourceProvider((ResourceProviderBase)provider);
                        }

                        if (IsDebugEnabled)
                        {
                            log.Debug("생성된 IResourceProvider를 캐시에 저장합니다. key=[{0}]", key);
                        }

                        _providers.Add(key, provider);
                    }
                }

                if (IsDebugEnabled)
                {
                    log.Debug("새로운 ResourceProvider를 생성했습니다!!! provider=[{0}]", provider);
                }
            }

            return(provider);
        }