一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - 建立自定義的數據驅動的本地化資源provider

建立自定義的數據驅動的本地化資源provider

2019-09-05 11:40腳本之家 ASP.NET教程

本文探討了自定義的本地化資源提供者.如果想用一個可替代系統的資源處理方案,例如把所有的資源放入數據庫中,而不是放在分散的資源文件里,你可以自定義一個resource provider.

原文很長,為了便于閱讀和理解,特將該文章改寫成通俗易懂而且內容精煉的中文. 

預備知識:系統默認的處理資源和本地化的方法是使用resx文件存儲資源. 

要使用自定義的resource provider,需要2個步驟: 
a) 修改web.config 文件,以便系統使用自定義的資源提供者 
b) 建立自定義資源提供者類,最少包括3個: 
1.ResourceProviderFactory,工廠類,用來建立ResourceProvider對象. 
2.ResourceProvider,實現IResourceProvider,IImplicitResourceProvider,IwwResourceProvider 接口. 
3.ResourceReader 實現IResourceReader. 


修改web.config 文件,以使用自定義的資源提供者。 

復制代碼代碼如下:


<configuration> 
<system.web> 
<globalization resourceProviderFactoryType="Westwind.Globalization.DbSimpleResourceProviderFactory,Westwind.Globalization" /> 
</system.web> 
</configuration> 



建立自定義資源提供者類: 
1.工廠類 

復制代碼代碼如下:


[DesignTimeResourceProviderFactoryAttribute(typeof(DbDesignTimeResourceProviderFactory))] 
public class DbSimpleResourceProviderFactory : ResourceProviderFactory 


public override IResourceProvider CreateGlobalResourceProvider(string classname) 

return new DbSimpleResourceProvider(null, classname); 



public override IResourceProvider CreateLocalResourceProvider(string virtualPath) 


string ResourceSetName = DbResourceConfiguration.Current.StripVirtualPath(virtualPath); 
return new DbSimpleResourceProvider(null,ResourceSetName.ToLower()); 


2.提供者類 

復制代碼代碼如下:


public class DbSimpleResourceProvider : IResourceProvider, IImplicitResourceProvider 


private string _ResourceSetName; 


private IDictionary _resourceCache; 


private DbSimpleResourceProvider() 
{ } 


public DbSimpleResourceProvider(string virtualPath, string className) 

_ResourceSetName = className; 




private IDictionary GetResourceCache(string cultureName) 

if (cultureName == null) 
cultureName = ""; 


if (this._resourceCache == null) 
this._resourceCache = new ListDictionary(); 


IDictionary Resources = this._resourceCache[cultureName] as IDictionary; 
if (Resources == null) 

// *** DEPENDENCY HERE (#1): Using DbResourceDataManager to retrieve resources 


// *** Use datamanager to retrieve the resource keys from the database 
DbResourceDataManager Data = new DbResourceDataManager(); 
Resources = Data.GetResourceSet(cultureName as string, this._ResourceSetName); 
this._resourceCache[cultureName] = Resources; 



return Resources; 




public void ClearResourceCache() 

this._resourceCache.Clear(); 




object IResourceProvider.GetObject(string ResourceKey, CultureInfo Culture) 

string CultureName = null; 
if (Culture != null) 
CultureName = Culture.Name; 
else 
CultureName = CultureInfo.CurrentUICulture.Name; 


return this.GetObjectInternal(ResourceKey, CultureName); 




object GetObjectInternal(string ResourceKey, string CultureName) 

IDictionary Resources = this.GetResourceCache(CultureName); 

object value = null; 
if (Resources == null) 
value = null; 
else 
value = Resources[ResourceKey]; 

// *** If we're at a specific culture (en-Us) and there's no value fall back 
// *** to the generic culture (en) 
if (value == null && CultureName.Length > 3) 

// *** try again with the 2 letter locale 
return GetObjectInternal(ResourceKey,CultureName.Substring(0,2) ); 



// *** If the value is still null get the invariant value 
if (value == null) 

Resources = this.GetResourceCache(""); 
if (Resources == null) 
value = null; 
else 
value = Resources[ResourceKey]; 



// *** If the value is still null and we're at the invariant culture 
// *** let's add a marker that the value is missing 
// *** this also allows the pre-compiler to work and never return null 
if (value == null && string.IsNullOrEmpty(CultureName)) 

// *** No entry there 
value = ""; 


// *** DEPENDENCY HERE (#2): using DbResourceConfiguration and DbResourceDataManager to optionally 
// add missing resource keys 


// *** Add a key in the repository at least for the Invariant culture 
// *** Something's referencing but nothing's there 
if (DbResourceConfiguration.Current.AddMissingResources) 
new DbResourceDataManager().AddResource(ResourceKey, value.ToString(), "", this._ResourceSetName); 





return value; 


3.Reader類 

復制代碼代碼如下:


public class DbSimpleResourceReader : IResourceReader 

private IDictionary _resources; 


public DbSimpleResourceReader(IDictionary resources) 

_resources = resources; 

IDictionaryEnumerator IResourceReader.GetEnumerator() 

return _resources.GetEnumerator(); 

void IResourceReader.Close() 


IEnumerator IEnumerable.GetEnumerator() 

return _resources.GetEnumerator(); 

void IDisposable.Dispose() 



完畢。 
本人沒有測試過,待測試通過,獻上最精煉的源代碼.敬請稍候.

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩ab | 亚洲另类第一页 | 嫩草视频在线观看免费 | 三级理论在线播放大全 | 免费岛国 | 无码人妻少妇色欲AV一区二区 | 欧美成人aa久久狼窝动画 | 国产久草在线 | 236宅宅2021最新理论 | 亚洲黄色图 | 农村脱精光一级 | 18捆绑调教在线高清 | 明星梦淫 | 被巨大黑人的翻白眼 | 激情自拍网 | 极品主播的慰在线播放 | 亚洲日韩精品欧美一区二区一 | 欧美一区二区不卡视频 | 亚洲黄色三级视频 | 2021国产麻豆剧传媒剧情最新 | 欧美乱强| 精品无人乱码一区二区三区 | 国产美女亚洲精品久久久综合 | 精品久久综合一区二区 | 小浪妇奶真大水多 | 射逼网 | 美女的让男人桶爽免费看 | 极品手交handjobtattoo | 国产日韩欧美在线一二三四 | 99er在线视频 | 国产激情一区二区三区四区 | 全黄h全肉细节文在线观看 全彩成人18h漫画 | 男人天堂999 | 亚洲欧美7777 | 亚洲精品无码不卡在线观看 | 日韩日b视频 | 性绞姿始动作动态图 | ass天天裸妇pics | 亚洲国产精品无码中文字满 | 国产精品嫩草影院在线看 | 97涩色|