【问题标题】:Localization with NHibernate使用 NHibernate 进行本地化
【发布时间】:2011-01-18 20:23:39
【问题描述】:

大家好 我是 NHibernate 的新手。我刚刚开始使用 NHibernate 开发我的下一个项目。要求之一是实体类应该本地化。我正在通过以下方式进行本地化: - 应该本地化的每个实体都分为 2 个表和 2 个实体。例如,我有一个包含一些信息的实体 Service,以及另一个包含本地化属性的实体 ServiceLocale,例如名称、描述等。表格也是如此。

  • Service 有一个受保护的字段,其中包含一个 ServiceLocales 列表。 ServiceLocale 有一个属性 Culture,它指定对象所属的语言。

  • ServiceLocale 列表是从 xml 映射文件中急切加载的。因此,当从数据库加载 Service 时,也会为此服务对象加载所有 ServiceLocales。

  • 服务具有公共属性、名称和描述。从这个属性中,我检查当前的文化,加载适当的 ServiceLocale 对象并返回 ServiceLocale 的名称和描述。

  • 服务使用存储库进行持久化。存储库检查保存或更新服务,以及它的所有 ServiceLocale 对象。

所以我的问题是:有没有更好的方法来通过 NHibernate 实现这种透明的本地化? 谢谢

【问题讨论】:

    标签: .net nhibernate orm localization nhibernate-mapping


    【解决方案1】:

    好的,有兴趣回答的人,我有一个。 Jason Meckley 给我写了关于 nhibernate 新闻组的解决方案。看起来最好使用休眠过滤器。 这是他的答案:

    如果您打算在任何时候查询主要实体时加载所有本地人,那就是等待发生的性能问题。现在,如果您引入可以在会话打开后立即设置的过滤器,它可能会起作用。这样每个本地化资源只返回一个结果。它也会渗入你的领域模型。

    //class
    private ISet<string> localizedvalues;
    public string Value{get{return localizedvalues.FirstOrDefault();}}
    
    //mapping
    <class name="myentity">
       <set name="localizedvalues" access="field" lazy="false" join="fetch">
             <filter name="CultureFilter" />
             ...
       </set>
    </class>
    <filter-def name="CultureFilter" condition="cultureId = :culture">
       <param name="culture" type="string" />
    </filter-def>
    
    //session configuration
    var session = factory.Open();
    session.EnableFilter("CultureFilter").SetParameter("culture", Thread.CurrentThread.CurrentCulture.LCID);
    

    这类似于 ayende 的示例的工作方式,不同之处在于我们使用集合而不是公式来提取语言环境。

    【讨论】:

    • 根据 Ayende 的说法:“请注意,在 NHibernate 2.1 及更高版本中不再支持这种行为。从一开始就是一个黑客攻击,不能保证继续工作。” ayende.com/Blog/archive/2006/12/26/…
    • ayende 的解决方案不同。它使用公式来填充效率低下的本地化数据。我正在使用 join 来获取语言环境表。所以它遵循映射/缓存规则。顺便说一句,我将它与 NHibernate 3 一起使用,但没有找到更好的本地化方法。如果你知道,请分享一下
    猜你喜欢
    • 2010-11-16
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多