建立自定义的数据驱动的本地化资源provider
2023-06-13 09:14:23 时间
原文很长,为了便于阅读和理解,特将该文章改写成通俗易懂而且内容精炼的中文.
预备知识:系统默认的处理资源和本地化的方法是使用resx文件存储资源.
要使用自定义的resourceprovider,需要2个步骤:
a)修改web.config文件,以便系统使用自定义的资源提供者
b)建立自定义资源提供者类,最少包括3个:
1.ResourceProviderFactory,工厂类,用来建立ResourceProvider对象.
2.ResourceProvider,实现IResourceProvider,IImplicitResourceProvider,IwwResourceProvider接口.
3.ResourceReader实现IResourceReader.
修改web.config文件,以使用自定义的资源提供者。
复制代码代码如下:
预备知识:系统默认的处理资源和本地化的方法是使用resx文件存储资源.
要使用自定义的resourceprovider,需要2个步骤:
a)修改web.config文件,以便系统使用自定义的资源提供者
b)建立自定义资源提供者类,最少包括3个:
1.ResourceProviderFactory,工厂类,用来建立ResourceProvider对象.
2.ResourceProvider,实现IResourceProvider,IImplicitResourceProvider,IwwResourceProvider接口.
3.ResourceReader实现IResourceReader.
修改web.config文件,以使用自定义的资源提供者。
<configuration>
<system.web>
<globalizationresourceProviderFactoryType="Westwind.Globalization.DbSimpleResourceProviderFactory,Westwind.Globalization"/>
</system.web>
</configuration>
建立自定义资源提供者类:
1.工厂类
[DesignTimeResourceProviderFactoryAttribute(typeof(DbDesignTimeResourceProviderFactory))]
publicclassDbSimpleResourceProviderFactory:ResourceProviderFactory
{
publicoverrideIResourceProviderCreateGlobalResourceProvider(stringclassname)
{
returnnewDbSimpleResourceProvider(null,classname);
}
publicoverrideIResourceProviderCreateLocalResourceProvider(stringvirtualPath)
{
stringResourceSetName=DbResourceConfiguration.Current.StripVirtualPath(virtualPath);
returnnewDbSimpleResourceProvider(null,ResourceSetName.ToLower());
}
}
2.提供者类
publicclassDbSimpleResourceProvider:IResourceProvider,IImplicitResourceProvider
{
privatestring_ResourceSetName;
privateIDictionary_resourceCache;
privateDbSimpleResourceProvider()
{}
publicDbSimpleResourceProvider(stringvirtualPath,stringclassName)
{
_ResourceSetName=className;
}
privateIDictionaryGetResourceCache(stringcultureName)
{
if(cultureName==null)
cultureName="";
if(this._resourceCache==null)
this._resourceCache=newListDictionary();
IDictionaryResources=this._resourceCache[cultureName]asIDictionary;
if(Resources==null)
{
//***DEPENDENCYHERE(#1):UsingDbResourceDataManagertoretrieveresources
//***Usedatamanagertoretrievetheresourcekeysfromthedatabase
DbResourceDataManagerData=newDbResourceDataManager();
Resources=Data.GetResourceSet(cultureNameasstring,this._ResourceSetName);
this._resourceCache[cultureName]=Resources;
}
returnResources;
}
publicvoidClearResourceCache()
{
this._resourceCache.Clear();
}
objectIResourceProvider.GetObject(stringResourceKey,CultureInfoCulture)
{
stringCultureName=null;
if(Culture!=null)
CultureName=Culture.Name;
else
CultureName=CultureInfo.CurrentUICulture.Name;
returnthis.GetObjectInternal(ResourceKey,CultureName);
}
objectGetObjectInternal(stringResourceKey,stringCultureName)
{
IDictionaryResources=this.GetResourceCache(CultureName);
objectvalue=null;
if(Resources==null)
value=null;
else
value=Resources[ResourceKey];
//***Ifwe"reataspecificculture(en-Us)andthere"snovaluefallback
//***tothegenericculture(en)
if(value==null&&CultureName.Length>3)
{
//***tryagainwiththe2letterlocale
returnGetObjectInternal(ResourceKey,CultureName.Substring(0,2));
}
//***Ifthevalueisstillnullgettheinvariantvalue
if(value==null)
{
Resources=this.GetResourceCache("");
if(Resources==null)
value=null;
else
value=Resources[ResourceKey];
}
//***Ifthevalueisstillnullandwe"reattheinvariantculture
//***let"saddamarkerthatthevalueismissing
//***thisalsoallowsthepre-compilertoworkandneverreturnnull
if(value==null&&string.IsNullOrEmpty(CultureName))
{
//***Noentrythere
value="";
//***DEPENDENCYHERE(#2):usingDbResourceConfigurationandDbResourceDataManagertooptionally
//addmissingresourcekeys
//***AddakeyintherepositoryatleastfortheInvariantculture
//***Something"sreferencingbutnothing"sthere
if(DbResourceConfiguration.Current.AddMissingResources)
newDbResourceDataManager().AddResource(ResourceKey,value.ToString(),"",this._ResourceSetName);
}
returnvalue;
}
3.Reader类
publicclassDbSimpleResourceReader:IResourceReader
{
privateIDictionary_resources;
publicDbSimpleResourceReader(IDictionaryresources)
{
_resources=resources;
}
IDictionaryEnumeratorIResourceReader.GetEnumerator()
{
return_resources.GetEnumerator();
}
voidIResourceReader.Close()
{
}
IEnumeratorIEnumerable.GetEnumerator()
{
return_resources.GetEnumerator();
}
voidIDisposable.Dispose()
{
}
}
完毕。
本人没有测试过,待测试通过,献上最精炼的源代码.敬请稍候.
相关文章
- 技术驱动下的“新出海”——GTC2022 技术出海峰会,共探数字全球化
- windowshello指纹识别器_win10指纹驱动安装失败
- vm虚拟机怎么启动_虚拟机macos运行显卡驱动
- 不同于NLP,数据驱动方法与机器学习无法攻克NLU,原因有三点
- 智能小车制作过程全纪录: 二、软件平台— Arduino底盘驱动详解架构师
- Linux上无法卸载驱动的挣扎(无法卸载驱动linux)
- MySQL驱动加载完毕!(加载mysql驱动)
- 驱动Linux系统中网卡驱动的加载步骤(linux加载网卡)
- Linux下载安装显示器驱动程序指南(linux显示器驱动)
- QT快速加载MySQL驱动的简单操作(qt加载mysql驱动)
- 使用MySQL和HTML打造高效的数据驱动网站(mysql与html)
- PDO驱动的MSSQL数据库应用简介(pdo_mssql)
- Linux之驱动:服务于你我他(linux 驱动程序)
- 驱动cnd程序实现MySQL数据库连接(cnd 输入mysql)