2

您将如何构建您的域对象并为多语言应用程序创建其各自的 NHibernate 映射文件。UI 部分存储在资源文件中,但用户数据需要进入数据库。

我想做以下事情:

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 的新手,我不确定这是否适用于企业解决方案.

您还有其他建议吗?你如何解决这种情况?

它应该灵活:

  • 插入、更新和选择
  • 收藏品
4

3 回答 3

3

Ayendes 帖子是如何设计它的一个很好的开始。

它将完美地适用于企业解决方案。单独表中的名称与任何其他值列表一样。特殊的是,它在映射中被过滤。

编辑 - 选项:

使用另一个实体编辑数据

有一个 Product 实体,其中包含所有名称作为列表。LocalizedProduct 只有当前语言名称。

获取过滤后的实体

  • 通过按照博客中的描述映射它,使用过滤器。
  • 通过使用结果转换器 (Transformers.AliasToBean) 或使用“select new 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) 过滤名称。

老实说,我会选择一个在映射文件中不需要过滤器的选项。过滤器属于更易于维护的查询。

于 2009-04-27T14:12:02.500 回答
0

是 Gavin King's Post I,它似乎提供了不同的解决方案。

于 2009-04-27T20:50:47.597 回答
0

作为答案提到的方法已在此处详细解释

于 2009-06-24T16:52:39.363 回答