您将如何构建域对象并为多语言应用程序创建其各自的 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/