当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在C#中以列表为核心的存储库模式》经验,为你挑选了2个好方法。

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

其中包含使用DB上下文的存储库模式的示例.我正在尝试用列表实现这个通用的Repository类(我想要Repository类.这是我的要求).但是,我遇到了Find方法的问题.

public class Repository : IRepository where T : class
{
   private List 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()中生成谓词吗?我猜不是,但有什么选择?



1> James Gaunt..:

您可以声明T具有Id属性,其类似于:

public interface IEntity
{
    int Id { get; }
}

public class Repository : IRepository where T : class, IEntity
{
    private List context;

    virtual public T Find(int id)
    {
        return context.SingleOrDefault(p => p.Id == id);
    }
}



2> 小智..:

如果您无法控制T的类型以便应用界面,另一个选择是强制您的实施者进行艰苦的工作.

public abstract class Repository : IRepository where T : class
{
   private List 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
{
    public override int GetId(Stooge entity)
    {
        if(entity == null)
            throw new WOOWOOWOOException();
        return (int)entity.MoronInQuestion;
    }
}

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有