快速业务通道

扩展ASP.NET 2.0资源提供程序模型(2)

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-21
化 API 挂接,我们可回到 Web.config 的<globalization>部分。

<globalization uiCulture="auto" culture="auto" resourceProviderFactoryType="CustomResourceProviders.ExternalResourceProviderFactory, CustomResourceProviders, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f201d8942d9dbbb1" />

现在,默认提供程序模型被外部资源提供程序模型替换。让我们了解一下提供程序工作原理。

GlobalExternalResourceProvider

GlobalExternalResourceProvider 实现 IResourceProvider。此提供程序与 GlobalResXResourceProvider 非常类似,仅有以下一处例外:此提供程序从预先存在的附属程序集检索全局资源,并且要求知道存储资源的特定程序集名称。

GlobalExternalResourceProvider 的构造函数接收用管道符号 ("|") 隔开的程序集名称和资源类型。此信息解析如下。

public GlobalExternalResourceProvider(string classKey)
{
 if (classKey.IndexOf(''|'') > 0)
 {
string[] textArray = classKey.Split(''|'');
this.m_assemblyName = textArray[0];
this.m_classKey = textArray[1];
 }
 else
throw new ArgumentException(String.Format(Thread.CurrentThread.CurrentUICulture, Properties.Resources.Provider_InvalidConstructor, classKey));
}

如果传递到构造函数的 classKey 参数格式无效,则将引发 ArgumentException。这将导致页面分析程序报告显式表达式错误。针对本地化 API 直接编写的代码将在运行时失败。

针对每个独特的程序集和资源类型组合,都创建并缓存了一个提供程序实例。在页面解析(用于验证)或运行时期间请求资源时,将调用 GetObject(),如下所示。

public object GetObject(string resourceKey, System.Globalization.CultureInfo culture)
{
 this.EnsureResourceManager();
 if (culture == null)
 {
culture = CultureInfo.CurrentUICulture;
 }
 return this.m_resourceManager.GetObject(resourceKey, culture);
}

在内部,GlobalExternalResourceProvider 依赖 ResourceManager 类型的现有功能来检索资源及处理资源回退。技巧在于为正确的程序集创建 ResourceManager。首次调用 EnsureResourceManager() 时,将加载资源程序集并在此程序集内为特定类型创建一个 ResourceManager 实例。如果指定不包含资源类型的程序集,则将出现异常。加载程序集并创建 ResourceManager 的代码显示如下。

Assembly asm = Assembly.Load(this.m_assemblyName);
ResourceManager rm = new ResourceManager(String.Format(CultureInfo.InvariantCulture, "{0}.{1}", this.m_assemblyName, this.m_classKey), asm);
this.m_resourceManager = rm;

使用 ExternalResourceProvider,可以从部署到 Web 应用程序 \bin 目录的任何程序集或“全局程序集缓存”(GAC) 检索资源。

由于本地资源不受支持,提供程序将针对 ResourceReader 属性返回 NotSupportedException;因此,隐式本地化表达式将得不到解析。

支持自定义本地化表达式

在以下情况下配置自定义提供程序非常合适,即所有资源均将存储在一个备用位置,并且您不打算利用分别位于 App_LocalResources 和 App_GlobalResources 中的资源。如果想支持本地和全局资源(默认提供程序)的标准实现,同时可选择从其他资源(自定义提供程序)提取某些资源,应该怎么办?可通过实现以自定义资源提供程序为目标的自定义表达式来满足上述要求。

ResourceExpressionBuilder 工作原理

在编译前,表达式由与页面分析步骤交互的表达式生成器来处理。表达式包括由 <%$ %> 分

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号