个人理解:
在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类自己的方法