zoukankan      html  css  js  c++  java
  • EF的Repository设计模式实例

    个人理解:

    在mvc开发中,数据映射层使用Repository设计模式,可以通过使用接口和泛型来把一些公共的调用数据库的方法抽象出来,以降低系统模块的耦合性和减少冗余的代码。

    提高了代码的可维护性和扩展性,同时不会影响到业务逻辑层和视图。

    实例:

    我们现在有这样一个实体模型Word.cs:

    public class Word
    {

    public int WordId { get; set; }
    public string spell { get; set; }
    public string type { get; set; }
    public string speak { get; set; }
    public string translate { get; set; }
    public string sentence { get; set; }

    }

    这是EF codefirst中对应数据库实体模型的一个映射,现在用Repository模式来实现增删改查的需求。当然它要被EF数据库上下文调用:

    public class EFcontext : DbContext
    {
    public EFcontext(): base("Test")//inherit the connectionstring from web.config
    {

    }

    public DbSet<Word> Words { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

    }

    Repository最底层调用的公共代码,一个被用于继承的抽象类:EFRepositoryBase.cs

    特别提一下,这里面的 where T:class 说明泛型T必须是引用类型(类、接口、委托或数组类型)

    public abstract class EFRepositoryBase<T> :IRepository<T> where T:class
    {
    EFcontext EF = new EFcontext();

    public EFRepositoryBase(EFcontext DataCotent)
    {
    EF = DataCotent;
    }

    public DbSet<T> Entities
    {
    get { return EF.Set<T>(); } //set as T
    }

    public List<T> GetAll()
    {
    return EF.Set<T>().ToList();
    }

    public T GetById(int Id)
    {
    return EF.Set<T>().Find(Id);
    }

    public int Add(T entity)
    {
    Entities.Add(entity);
    return EF.SaveChanges();
    }

    public int Update(T entity)
    {
    EF.Entry(entity).State = EntityState.Modified;
    return EF.SaveChanges();
    }

    public int Delete(int Id)
    {
    var entity = EF.Set<T>().Find(Id);
    EF.Set<T>().Remove(entity);
    return EF.SaveChanges();
    }

    public virtual IQueryable<T> Filter(Expression<Func<T, bool>> predicate)
    {
    return EF.Set<T>().Where<T>(predicate).AsQueryable<T>();
    }
    }

    此类继承了一个接口类,用于通过接口来调用:

    public interface IRepository<TEntity> where TEntity:class
    {
    List<TEntity> GetAll();

    TEntity GetById(int Id);

    int Add(TEntity entity);

    int Update(TEntity entity);

    int Delete(int Id);

    IQueryable<TEntity> Filter(Expression<Func<TEntity, bool>> predicate);
    }

    接下来是实现Repository,通过一个类WordRepository .cs来继承此类:

    public class WordRepository : EFRepositoryBase<Word>, IWordsRepository
    {
    private readonly EFcontext EF;

    public WordRepository(EFcontext context) : base(context)
    {
    EF = context;
    }

    public List<Word> GetTenWords()
    {
    return EF.Words.OrderBy(t => Guid.NewGuid()).Take(10).ToList();
    }

    public void Dispose()
    {
    EF.Dispose();
    }
    }

    这个类可以调用父类(EFRepositoryBase)定义的泛型公共方法,而泛型的类型这里是Word,其中GetTenWords方法是针对些特定的需求无法通过公共类继承来实现的就直接写在此类中来实现。当然也要在接口类中声明:

    public interface IWordsRepository:IRepository<Word> //一定要继承IRepository接口,否则无法调用到EFRepositoryBase的方法接口
    {
    List<Word> GetTenWords();

    }

    此类调用方法如下:

    IWordsRepository _WordRepository= new WordRepository(new EFcontext());

    var result = _WordRepository.GetAll();

    vat tenwords=_WordRepository.GetTenWords();

    这里使用了接口来调用方法,其中GetAll()方法就是继承自EFRepositoryBase的方法,GetTenWords()是WordRepository类自己的方法

  • 相关阅读:
    【豆科基因组】普通豆/菜豆/四季豆Common bean (Phaseolus vulgaris L.) 基因组
    【豆科基因组】利马豆/洋扁豆Lima bean(Phaseolus lunatus L.)基因组2021NC
    工作流大大批量报错
    django中request参数
    java笔记(二)----详解装箱与拆箱
    java笔记(一)----基础知识
    Navicat 快捷键
    ant+Jacoco 统计tomcat远程部署后项目接口自动化测试或者功能测试代码覆盖率
    安全测试:BurpSuite 学习使用教程(转)
    耗电量测试(转)
  • 原文地址:https://www.cnblogs.com/XCCU-2015/p/5089839.html
Copyright © 2011-2022 走看看