快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-21
会注意到有关此项实现的一些内容:

• 只支持全局资源。替换随 ASP.NET 2.0 一起免费提供的页面资源模型没有意义。从外部程序集只能得到全局资源。

• 我们无法从 ExternalResourceProviderFactory 访问 LocalResXResourceProvider。这是无法从代码构建的内部类型。如果我们用 ExternalResourceProviderFactory 替换默认提供程序,则只有全局资源会受到支持(我将在以后章节讨论一种替代方法)。

• ResourceManager 用于访问资源。默认 ResourceManager 已经为我们提供了一种从程序集访问资源的方法,因此我们无需替换此项访问外部资源的功能。

现在,我将说明此项实现的重点。

相同的本地化表达式,不同的使用案例

请记住,资源提供程序是因本地化表达式和本地化 API 而被调用的。要访问外部资源,将使用显式表达式。这些表达式将与用于访问全局资源的表达式类似,只有少许变化;尤其是程序集名称必须与资源类型一起提供。默认提供程序知道如何找到全局资源程序集。此外部资源提供程序依赖程序集名称以获得相同的结果。

默认提供程序模型(显式全局资源)的 $Resources 表达式语法如下。

<%$ Resources: [resourceType], [resourceKey] %>

配置 ExternalResourceProviderFactory 时,可使用同一表达式访问外部资源,语法变化如下。

<%$ Resources: [assemblyName]|[resourceType], [resourceKey] %>

例如,要从 CommonResources.dll 程序集、全局资源类型“CommonTerms”检索资源,将使用以下显式表达式。

<asp:Label ID="labGlobalResource" runat="server" Text="<%$ Resources:CommonResources|CommonTerms, Hello %>" ></asp:Label>

编译页面时,将生成以下代码。

labGlobalResource.Text = this.GetGlobalResourceObject("CommonResources|CommonTerms", "Hello");

这说明只要提供了正确的信息,外部资源提供程序模型就能通过本地化 API 利用现有表达式和代码。最后将由 ExternalResourceProvider 将信息从资源类型解析为单独的程序集名称。

ExternalResourceProviderFactory

同 DBResourceProviderFactory 一样,ExternalResourceProviderFactory 继承 ResourceProviderFactory 并能替换 CreateGlobalResourceProvider() 和 CreateLocalResourceProvider()。列表 4 显示了完整实现。

列表 4. 实现 ExternalResourceProviderFactory

public class ExternalResourceProviderFactory : ResourceProviderFactory
{
 public override IResourceProvider CreateGlobalResourceProvider
(string classKey)
 {
return new GlobalExternalResourceProvider(classKey);
 }
 public override IResourceProvider CreateLocalResourceProvider
(string virtualPath)
 {
throw new NotSupportedException(String.Format
(Thread.CurrentThread.CurrentUICulture, Properties.Resources.Provider_LocalResourcesNotSupported, "ExternalResourceProviderFactory"));
 }
}

CreateGlobalResourceProvider() 负责通过提供的类密钥实例化 GlobalExternalResourceProvider 类型。请记住,此提供程序的类密钥必须包括程序集名称和资源类型。由于我们不在外部程序集中存储本地资源,因此 CreateLocalResourceProvider() 会引发 NotSupportedException。如果在页面上使用本地化表达式,实际上会导致解析异常。因此,如果想继续支持本地资源,这可能不是挂接 ExternalResourceProvider 的理想方案。随后,我将说明如何通过自定义的本地化表达式避免此问题。

要将 ExternalResourceProviderFactory 与现有表达式和本地

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号