c# - 使用 NHibernate 实现全局化

标签 c# nhibernate model relational

您将如何构建域对象并为多语言应用程序创建其各自的 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 的新手,我不确定这是否完全适用于企业解决方案。

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

它应该灵活地:

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

最佳答案

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

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

编辑 - 选项:

使用另一个实体编辑数据

有一个产品实体,其中包含所有名称列表。 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) 来过滤名称。

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

关于c# - 使用 NHibernate 实现全局化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/793634/

相关文章:

c# - SourceMonitor 中用于计算复杂度的参数是什么?

c# 使用 IXmlSerializable 反序列化

c# - WinForm 启动画面和焦点

nhibernate - FluentNhibernate 和 NHibernate 3.2

NHibernate QueryOver 关联不包含项目

php - 如何在行为配置 Yii 中使用模型属性值

java - 在客户端-服务器环境中建模用户类的最佳实践

c# - 如何在不使用 AppDomains 的情况下实现 .net 插件?

c# - 流利的 nHibernate 加入

Java - 使用文本区域将 JTable 设置为不可编辑