2009-04-27 40 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