C#中以列表为核心的存储库模式
本文关键字:存储 模式 核心 列表 | 更新日期: 2023-09-27 18:25:37
我关注这个网站:http://deviq.com/repository-pattern/
其中有一个使用DB上下文的存储库模式示例。我试图用一个列表来实现这个通用的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
}
}
在List.Find()中只使用一个ID参数就可以生成谓词吗?我猜不会,但有什么选择?
如果您不能控制t的类型以应用接口,那么另一种选择是强制实现者做艰苦的工作。
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;
}
}
您可以声明T有一个Id属性,如下所示:
public interface IEntity
{
int Id { get; }
}
public class Repository<T> : IRepository<T> where T : class, IEntity
{
private List<T> context;
virtual public T Find(int id)
{
return context.SingleOrDefault(p => p.Id == id);
}
}