如何正确设计应包含双语信息的类

时间:2011-06-12 15:16:40

标签: c# oop domain-driven-design dns class-design

如果我的域对象应包含2种语言的字符串属性,我应该创建2个单独的属性还是创建新类型BiLingualString?

例如,在工厂分类应用程序中,工厂域对象可以包含Plant.LatName和Plant.EngName。

整个域的双语属性数量不多,大约6-8,我只需要支持两种语言,信息应该在两者中呈现给UI / strong>语言同时。 (所以这不是locallization)。在开发过程中,要求不会改变。

这可能看起来像一个简单的问题,但这个决定会对验证,持久性,对象克隆和许多其他事情产生影响。

否定方面我可以考虑使用新的dualString类型:

  • 验证:如果我打算使用DataAnattations,Enterprise Library验证块,Flued验证,这将需要更多的工作,对象图验证比简单的属性验证更难。
  • 持久性:即NH或EF需要更多复杂属性的工作。
  • OOP:更复杂的对象初始化,我必须在使用它之前初始化这个新的Type in构造函数。
  • 架构:转换对象以便在层之间传递它们更加困难,自动映射工具将需要更多的手工工作。

3 个答案:

答案 0 :(得分:5)

在阅读您的问题时,我一直在考虑why not localization,但当我阅读information should be presented to UI in both languages at the same time.时,我认为使用属性是有意义的。

在这种情况下,如果你提到BiLingualString

,我会选择每种语言都有一个字符串的课程。
public class Names
{
    public string EngName {get;set;}
    public string LatName {get;set;}
}

然后我会在我的主要植物类中使用这个类

public class Plant: Names
{

}

答案 1 :(得分:4)

如果你100%确定它总是只有拉丁语和英语,我会坚持使用最简单的解决方案 - 2个字符串属性。它在UI中也更灵活,然后有BiLingualString。而且,当你坚持下去时,你不必处理复杂类型。

答案 2 :(得分:2)

为了帮助决定,我建议考虑这种行为在所有层面上的一致性。如果将这些属性作为业务对象上的两个单独属性公开,我还希望看到它存储为数据库记录中的两个单独的列,例如,而不是存储在单独表中的同一属性的两个转换。以这种方式存储翻译似乎很奇怪,但你的理由听起来合理,6个属性不是无法管理的。但请确保您不打算在将来添加更多语言。

如果你希望这个系统有点动态,你可能需要在某个时候添加另一种语言,那么对我来说似乎更有意义的是以不同的方式实现它,这样你就不必在改变模式时需要支持一种新语言。

我想要平衡的是:考虑必须调整语言或属性以适应新语言的可能性,而不是通过将这些直接作为单独的属性公开而不是必须加载翻译而获得的优势(简单性)。一个单独的级别。