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

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

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



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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 多人群p全肉小说 | 爱豆传媒最新视频国产 | 欧美成人中文字幕在线看 | 91精品国产美女福到在线不卡 | 全弄乱纶小说 | 亚洲成年人在线观看 | 欧美兽皇另类 | 深夜福利影院在线观看 | 日本久久啪啪婷婷激情五月 | 女bbbxxx毛片视频 | 日本一区视频在线 | 欧美激情精品久久久久久不卡 | china国产bbw| 日本一区二区三区视频在线观看 | 亚洲2017天堂色无码 | juy799大岛优香在线观看 | 国产成人一区二区三区在线视频 | 国产日韩片 | 91混血大战上海双胞胎 | 男人猛进猛出女人下面视频 | 为什么丈夫插我我却喜欢被打着插 | 女子张腿让男人桶免费 | 成人精品一区久久久久 | 海绵宝宝第二季全集免费观看 | 日韩在线视频免费观看 | 福利片福利一区二区三区 | 国产成人免费观看在线视频 | jiuse在线| 亚洲spank男男实践网站 | 国产网站视频 | 热99精品视频 | 鬼惨笑小说 | 欧美日韩国产超高清免费看片 | 黑人粗又长 | 亚欧有色在线观看免费版高清 | 91国产在线播放 | 青青草色 | 99热资源| 欧洲一级黑寡妇 | 天天干狠狠操 | 九九成人免费视频 |