///<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); }