心目的是创建 GlobalExternalResourceProvider 以及调用 GetObject() 来检索资源。
编译页面时,将在页面分析后生成代码。此时,将调用表达式生成器的 GetCodeExpression 实现。此操作将返回在运行时检索资源值所需的代码,如下所示。
public override System.CodeDom.CodeExpression GetCodeExpression(BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context)
{
ExternalResourceExpressionFields fields = parsedData as ExternalResourceExpressionFields;
CodeMethodInvokeExpression exp = new CodeMethodInvokeExpression(new CodeTypeReferenceExpression(typeof(ExternalResourceExpressionBuilder)), "GetGlobalResourceObject", new CodePrimitiveExpression(fields.ClassKey), new CodePrimitiveExpression(fields.ResourceKey));
return exp;
}
GetCodeExpression 的输出内容将导致生成的代码类似于如下所示的粗黑体代码。
labExternalResource.Text = ExternalResourceExpressionBuilder.GetGlobalResourceObject("CommonResources|CommonTerms", "Hello") as string;
您会注意到,生成的代码依赖由 ExternalResourceExpressionBuilder 实现的静态方法。GetGlobalResourceObject 是一种辅助方法,可实例化 GlobalExternalResourceProvider 并且检索资源条目。对于已编译页面,此代码在运行时从外部资源检索值。
对于未编译页面,在运行时通过调用 EvaluateExpression 来对表达式进行判断。ExternalResourceExpressionBuilder 实现 EvaluateExpression 的替换,其再次使用 GlobalExternalResourceProvider 检索适合的资源。
public override object EvaluateExpression(object target, BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context)
{
ExternalResourceExpressionFields fields = parsedData as ExternalResourceExpressionFields;
ExternalResourceExpressionBuilder.EnsureResourceProviderFactory();
IResourceProvider provider = ExternalResourceExpressionBuilder.
s_resourceProviderFactory.CreateGlobalResourceProvider(fields.ClassKey);
return provider.GetObject(fields.ResourceKey, null);
}
配置自定义表达式生成器后,您可以随意加入声明语句,以便从外部程序集检索资源,同时默认本地化表达式仍用于从 App_LocalResources 或 App_GlobalResources 检索值。
ExpressionBuilder 配置
要配置自定义表达式构建器,您需要将其添加到 Web.config 中的 <expressionBuilders> 部分。在本例中,我们将“ExternalResources”前缀的 ExternalResourceExpressionBuilder 与此配置关联。
<expressionBuilders>
<add expressionPrefix="ExternalResources" type="CustomResourceProviders.ExternalResourceExpressionBuilder, CustomResourceProviders, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f201d8942d9dbbb1"/>
</expressionBuilders>
现在,将根据先前部分介绍的 ExternalResourceExpressionBuilder 实现分析或判断所有使用“ExternalResources”前缀的资源表达式。
访问本地、全局和外部资源
列表 5 说明了使用从默认和自定义来源提取资源的全部三种本地化表达式(隐式、显式和自定义显式)的应用程序。
列表 5. 单一页面中的隐式、显式和自定义显式本地化表达式
<asp:Label ID="labHelloLocal" runat="server" Text="HelloDefault" meta:resourcekey="labHelloL
|