2009-04-27 39 views
2

您將如何構建您的域對象併爲多語言應用程序創建各自的NHibernate映射文件。 UI部分存儲在資源文件中,但用戶數據需要進入數據庫。使用NHibernate進行全球化

我要做到以下幾點:

Product p = DALProduct.getByID(2) 
p.name //results in the language of the current UICulture 

我發現下面的文章是非常接近: http://ayende.com/Blog/archive/2006/12/26/LocalizingNHibernateContextualParameters.aspx 由於我是新來的NHibernate我不知道是否會完全爲企業解決方案的工作。

您有其他建議嗎?你如何解決這種情況?

它應該是靈活的:

  • 插入,更新和選擇
  • 集合

回答

3

Ayendes帖子是一個很好的開始應該如何設計的。

它將完美適用於企業解決方案。單獨表中的名稱與任何其他值的列表相似。特別的是,它在映射中被過濾。

編輯 - 選項:

使用另一個實體的數據進行編輯

有產品具有所有名稱作爲列表的實體。 LocalizedProduct只有當前的語言名稱。

由任一映射它把過濾實體

  • 如在博客所描述的,與過濾器。
  • 通過使用結果轉換器(Transformers.AliasToBean)或'選擇新的LocalizedProduct(id,name,prize ...)'來選擇它。在這種情況下,LocalizedProduct不會被映射。應該是二級緩存友好的。

如果您有很多對Product的引用,那麼有兩個類可能不太好,因爲您不知道引用應該具有哪個類。

使用相同的實體編輯和顯示

class Product 
{ 
    string LocalizedName 
    { 
    get { return AllProductNames[Thread.CurrentThread.CurrentCulture.LCID]; } 
    } 

    IDictionary<int, string> AllProductNames { get; private set; } 
} 

有一個本地化的產品名稱(GET)所有產品名稱屬性。

  • 根本不過濾它們:-)有點網絡開銷。如果你只有3到5種語言,那就不是那麼糟糕。如果您有20個或更多,最好過濾名稱。
  • 使用博客中描述的(可選)過濾器,但使用產品名稱
  • 使用(可選)ResultTransformer(CriteriaUtil。AliasToEntityMap)來過濾名稱。

說實話,我會選擇一個選項,不需要映射文件中的過濾器。過濾器屬於更易於維護的查詢。

+0

我對這個解決方案的一些顧慮: *我需要手動創建所有INSERT和UPDATE語句(導致轉換表需要被更新) *該應用程序將一次運行一種文化,但如何更新產品名稱(例如在masterdata中) – Michal 2009-04-27 14:18:20

0

Here是加文國王的郵政我似乎提供了一個不同的解決方案。

0

一個答案中提到的方法進行了詳細的解釋here