2011-08-26 39 views
6

我有要求,最終用戶可以更改本地化資源,並且應用程序中可以看到更改,而無需重新啓動應用程序。ASP.NET本地化:在不重新啓動應用程序的情況下更改資源?

更新澄清情景:
我說的是在運行時更改了本地化資源。可以說我在頁面的德語翻譯中有一個錯字。然後,一些管理員用戶應該有可能在運行時更改該錯字。應該不需要重新部署或重新啓動,以便將此更改反映到UI中。

我正在使用ASP.NET MVC3。

我有什麼選擇?

我一直在尋找編寫從數據庫加載資源的custom ResourceProvider
這似乎不是太大的力氣,不過到目前爲止,我指出了兩個缺點:

  • 它不與在MVC3用於方便的驗證DataAnnotations工作(DataAnnotations用ErrorMessageResourceType參數,工作只使用編譯資源)
  • 我們基本上必須提供我們自己的工具來管理資源(如翻譯等),這很遺憾,因爲有很多工具可以與resx-files一起工作。

還有什麼其他的選擇?運行時部署的resx文件是否可以被選中?
但我懷疑應用程序在檢測到這些更改時會自動「重新啓動」:我懷疑ASP.NET意識到resx文件已更改,然後它將回收應用程序池並編譯新的resx文件飛。
這是正確的嗎?有沒有辦法解決?

我還沒有看過在部署之前將資源編譯成附屬程序集。這甚至是Web應用程序推薦的場景嗎?
但即使對於已編譯的附屬程序集,我懷疑ASP.NET會重新啓動應用程序,這些程序集在運行時會發生更改。它是否正確?

我會對如何滿足原始需求感興趣嗎? 我會對我上面提到的選項有任何意見。

+1

你有沒有嘗試UpdatableResXResourceProvider中提出的[這個答案](http://stackoverflow.com/questions/1535027/app-domain-restarts-when-resx-file-changes-any-way-to-avoid-this/1853530#1853530)? –

+1

對不起,我想知道,在運行時改變現有資源我認爲你唯一的選擇是自定義資源提供者,但我沒有看到任何干淨的解決方案來解決DataAnnotations問題,而不訴諸自定義註釋。 – TheCodeKing

+0

我有辦法做到這一點,但只有當你的資源鍵是固定的? – TheCodeKing

回答

1

DataAnnotations接受ErrorMessageResourceType,它告訴ValidationAttrributes在哪裏訪問資源。你可以通過這個如下:

[Required(
    ErrorMessageResourceType = typeof(DynamicResources), 
    ErrorMessageResourceName = "ResourceKey")] 
public string Username { get; set; } 

通過創建此參數與每個鍵的靜態屬性類型,你可以創建一個實現從數據庫或其他實現負載的資源。然後,您可以將其與DRY的動態對象結合使用,並將實現移至TryGetMember。潛在然後使用T4模板在編譯時生成數據庫的靜,這個結束了:

public class DynamicResources : DynamicObject 
{ 
    // move these into partial and generate using T4 
    public static string MyResource 
    { 
     get { return Singleton.MyResource; } 
    } 

    public static string MyOtherResource 
    { 
     get { return Singleton.MyOtherResource; } 
    } 

    // base implementation to retrieve resources 
    private static dynamic singleton; 

    private static dynamic Singleton 
    { 
     get { return singleton ?? (singleton = new DynamicResources()); } 
    } 

    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     // some logic here to look up resources 
     result = GetResourceKeyFromDatabase(binder.Name); 
     return true; 
    } 
} 

當然,這將是完美的,如果資源不是靜態屬性。

+0

此解決方案不適用於問題中鏈接的MSDN中的自定義資源提供程序方法。註釋期望ErrorMessageResourceType具有ErrorMessageResourceName的靜態屬性。實施動態資源查找時情況並非如此。 – jbandi

+0

確定還有一種替代方法,它依賴於固定的資源密鑰,但隨後在您的應用程序中使用資源時,他們需要進行預定義。 – TheCodeKing

+0

謝謝!這可能是我能得到的最好的。不過,在我使用該解決方案之前,我會研究其他驗證策略... – jbandi

相關問題