gpt4 book ai didi

c# - C#中以list为核心的Repository模式

转载 作者:太空狗 更新时间:2023-10-30 00:18:35 24 4
gpt4 key购买 nike

我正在关注这个网站:http://deviq.com/repository-pattern/

其中有一个使用数据库上下文的存储库模式示例。我试图用一个列表来实现这个通用的 Repository 类(我想要 Repository 类。这是我的要求)。但是,我在使用 Find 方法时遇到了问题。

public class Repository<T> : IRepository<T> where T : class
{
private List<T> context;

virtual public T Find(int id)
{
// I can't figure out a way to make this work with the list of a generic type
}
}

是否有可能仅使用一个 ID 参数在 List.Find() 中创建谓词?我猜不会,但有哪些选择?

最佳答案

如果您无法控制 T 的类型以应用接口(interface),另一种选择是强制您的实现者进行艰苦的工作。

public abstract class Repository<T> : IRepository<T> where T : class
{
private List<T> context;

public virtual public T Find(int id)
{
return context.FirstOrDefault(x => GetId(x) == id);
}
public abstract int GetId(T entity);
}

一个示例实现可能是

// entity
public class Stooge
{
public Stooges MoronInQuestion {get;set;}
public double MoeEnragementFactor {get;set;}
public void PloinkEyes() { /*snip*/ }
public void Slap() { /*snip*/ }
public void Punch() { /*snip*/ }
// etc
}

// enum for an Id? It's not that crazy, sometimes
public enum Stooges
{
Moe = 1,
Larry = 2,
Curly = 3,
Shemp = 4,
Joe = 5,
/* nobody likes Joe DeRita */
//CurlyJoe = -1,
}

// implementation
public class StoogeRepository : IRepository<Stooge>
{
public override int GetId(Stooge entity)
{
if(entity == null)
throw new WOOWOOWOOException();
return (int)entity.MoronInQuestion;
}
}

关于c# - C#中以list为核心的Repository模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34075311/

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