zl程序教程

您现在的位置是:首页 >  硬件

当前栏目

建立自定义的数据驱动的本地化资源provider

驱动资源数据 自定义 建立 本地化 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文件,以使用自定义的资源提供者。
复制代码代码如下:

<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()
{
}
}

完毕。
本人没有测试过,待测试通过,献上最精炼的源代码.敬请稍候.