gpt4 book ai didi

c# - 是否有一种 OCP 友好的方式来动态选择要访问 DbContext 中的哪个集合?

转载 作者:太空宇宙 更新时间:2023-11-03 14:50:26 25 4
gpt4 key购买 nike

我正在研究一种从数据库中检索记录集合的方法。这些记录根据它们包含的数据的一个方面存储在单独的表中。假设它看起来像这样。

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 接口(interface)添加一个 Language 属性,这样我的方法就可以访问正确的 DbSet 这样,还是 switch 是实现我的目标的最简洁的方式?

最佳答案

这是我想到的。更像伪代码一样对待它。你需要让它适应你的场景。但是包含了开闭原则的主要概念。我使用通用类来构建语言对象。

如果您想添加更多语言,只需创建新类即可。您可以创建某种语言类,然后英语类(和其他语言)可以从它继承。

您可以使用依赖注入(inject)并仅通过接口(interface)进行操作。

public interface IPhrase<T>
{
string Text { get; set; }
}

public class Phrase<T> : IPhrase<T> where T : Language
{
public string Text { get; set; }
public DbSet<T> DbSet { get; set; }

public Phrase(string text, DbContext context)
{
Text = text;
DbSet = context.Set<T>();
}
}

public class Language
{
//do smth
}
public class English : Language
{
//do smth
}

public class Spanish : Language
{
//do smth
}

用法:

DbContext _context = new DbContext();
Phrase<English> en = new Phrase<English>("Your english text goes here", _context);

public IEnumerable<IPhrase<T>> GetPhrases(Phrase<T> language)
{
return language.DbSet.ToList();
}

GetPhrases 方法甚至可以放在 Phrase 类中。

希望对你有帮助。祝你好运!

关于c# - 是否有一种 OCP 友好的方式来动态选择要访问 DbContext 中的哪个集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52008735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com