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参数就可以生成谓词吗?我猜不会,但有什么选择?

C#中以列表为核心的存储库模式

如果您不能控制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);
    }
}