【问题标题】:Language-Dependent DAO (i18n)Language-Dependent DAO (i18n)
【发布时间】:2013-08-23 11:04:59
【问题描述】:

我为我的数据库表创建了 DAO。在 SAP ABAP 中,您可以拥有包含与语言相关的文本的附加文本表(语言代码是键的一部分)。 目前,我在程序开始时创建 DAO 实例(依赖注入),并向它们传递一个语言键,该语言键有效地将 DAO 绑定到特定语言,让 DAO 仅从该特定语言读取文本。

但是在程序的后期,我需要从另一种语言中获取文本。我该如何应对?

  • 在 DAO 的 crud 和 find-by 方法中显式包含语言键?这将要求 DAO 的任何客户端也公开其方法的语言密钥,并正确地将其传递给有气味的 DAO。例如method read(id, languageCode) returns <thing>。此外,我希望域对象对 DAO/基础设施垃圾一无所知。

  • 为 DAO 本身提供一个语言感知接口,允许我创建另一个绑定到不同语言(工厂)的 DAO 实例。这需要我显式访问 DAO,否则这些 DAO 也很隐蔽。例如method createWithLang(langCode) returns <DAO>

  • 使域对象具有语言感知能力,这意味着依赖于语言的方法显式公开语言代码。但是域对象已经需要知道所有语言的所有文本才能返回正确的,它们需要直接访问某些 DAO 才能重新加载正确的文本。然后,懒惰地做这件事是一个额外的挑战(关于 ABAP OO)。

非常感谢每一个建议

【问题讨论】:

    标签: internationalization dao abap


    【解决方案1】:

    我可能会在处理与语言相关的文本的 getter 和 setter 方法中添加一个参数,并将其默认值设置为 SY-LANGU。这样,l_foo = lr_bar->get_baz_text( ) 将隐式获取用户登录时所用语言的文本,l_foo = lr_bar->get_baz_text( l_target_language ) 将检索任何其他语言的文本。您可能希望在创建对象时预取当前语言的文本,并使用哈希表来存储与语言相关的文本。

    【讨论】:

    • 谢谢。如果我的域对象有一个方法 get_baz_text( i_lang = sy-langu ),那么域对象将负责加载指定语言的文本。然而,我当前的设计使用已加载的与语言相关的文本来实例化对象,因此该对象无法重新加载任何其他语言的文本。我宁愿保持域对象和数据访问之间的分离。有什么建议吗?
    • 是的。不要过度。你不会因为漂亮的技术设计而获得任何额外的分数,尽管这可能是可悲的。
    【解决方案2】:

    在 SAP 中,所选语言是会话的一部分。您的程序还可以有一个全局可用的“会话”单例,您可以在其中存储用户语言选择。

    【讨论】:

    • 是的,大多数时候我只需要会话语言。但是在某些应用程序上下文中,我需要使用另一种语言,这取决于正在处理的业务伙伴。然后,我的所有 DAO 都绑定到我的会话语言为时已晚。我不想改变那个全局会话实例的语言,那样会玩弄全局变量,从长远来看会害死你。有什么建议吗?
    • 最简单的事情听起来就像只是创建一个新的会话,专门处理我认为与您的 BP 相关的输出。
    猜你喜欢
    • 1970-01-01
    • 2011-02-17
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多