【发布时间】:2018-08-24 16:48:22
【问题描述】:
我正在研究一种从数据库中检索记录集合的方法。这些记录根据它们包含的数据的一个方面存储在单独的表中。假设它看起来像这样。
public class EnglishPhrase : IPhrase
{
public string Text {get; set;}
}
public class SpanishPhrase: IPhrase
{
public string Text {get; set;}
}
// This is actually a DbContext with DbSets.
// I have not implemented DbContext in this example to
// alleviate overhead when reproducing the situation.
public class MyContext
{
public EnglishPhrase[] EnglishPhrases { get; set; }
public SpanishPhrase[] SpanishPhrases { get; set; }
}
我的方法需要根据语言参数选择英语或西班牙语短语。现在我正在使用switch 声明来完成它。
public IEnumerable<IPhrase> GetPhrases(string language)
{
IEnumerable<IPhrase> result = null;
MyContext context = new MyContext();
switch(language)
{
case "English":
result = context.EnglishPhrases.ToList();
break;
case "Spanish":
result = context.SpanishPhrases.ToList();
break;
default:
throw new Exception();
}
return result;
}
我使用switch 是因为我稍后会添加更多语言,但这意味着每次我这样做时我都必须修改此方法。但是,我不禁觉得可能有更好的方法来做到这一点。
我可以做点别的吗,比如向IPhrase 接口添加一个Language 属性,这将允许我的方法以这种方式访问正确的DbSet,或者switch 是最简单的完成方式我的目标?
【问题讨论】:
-
如果还要添加新语言,是否还需要添加数据库表?如果是这样,我不会推荐它。一般来说,在多语言环境中添加语言永远不会导致重新编码任何内容。
-
你能修改它来做这样的事情吗? stackoverflow.com/questions/25302393/…
-
@Stefan 没错。例如,要添加法语支持,我会在我的上下文中添加一个
FrenchPhrase类、一个FrenchPhrases属性,并且(当前)在我的方法中添加一个case "French"块。 -
@JAF;好的,那么您的 close for change 关注比
switch声明要广泛得多。我会重新考虑您的方法,并使用 1 张桌子。如果要很大,请使用更动态的方法。 ...顺便说一句,如果它只是应用程序中的多语言支持,您还可以使用Resource(resx) 文件。 -
@Stefan:就像一个新的
Phrase类的集合,包含Text和Language属性。通过创建一个包含所有翻译的视图并将DbContext映射到该视图,可以将数据库中的现有表分开。谢谢!此外,实际上还有用于 UI 翻译的resx文件。这种方法和东西在后端用于报告生成。
标签: c# .net entity-framework-core open-closed-principle