你的位置:首页 > ASP.net教程

[ASP.net教程]告别错误的Repository模式!


引言

 


 

小弟工作过2家小作坊!项目经理使用的框架都是基于EF的Repository(仓储)设计模式,我想说这种模式根本就是错误的使用! 更可怕的是博客园里面也有很多这种教程!

之所以说错误的!是因为EF本身就是Repository(仓储)的设计! 何必再套一层包裹给自己找事?而且也套的丑陋无比! 让我们先来看下Repository的代码思想!

下面的代码将对实体的公共操作部分,提取为IRepository接口,比如常见的CRUD方法

 

 public interface IRepository<T> where T : class  {     IEnumerable<T> FindAll(Func<T, bool> exp);    void Add(T entity);    void Delete(T entity);    void Update(T entity);  }

 

然后再泛型的类来具体实现上面的接口的方法。

 1 public class Repository<T> : IRepository<T> where T:class 2   { 3     public DataContext context; 4  5     public Repository(DataContext context) 6     { 7       this.context = context; 8     } 9     public IEnumerable<T> FindAll(Func<T, bool> exp)10     {11       return context.GetTable<T>().Where(exp);12     }13     public void Add(T entity)14     {15       context.GetTable<T>().InsertOnSubmit(entity);16     }17     public void Delete(T entity)18     {19       context.GetTable<T>().DeleteOnSubmit(entity);20     }21     public void Update()22     {23       context.SubmitChanges();24     }25 26   }

 

然后再在BLL业务层 通过依赖注入调用这个Repository对象进行 插入 删除!等操作 我上面只简单的实现了CRUD!如果要更多接口我还得去套!这是何必呢?何苦呢?EF本身就是实现了仓库的模式!

我相信这里会有人说 "使用该模式的最大好处就是将领域模型代码和数据映射层之间解耦出来。",但是你完全可以使用一个接口啊!也能实现解耦啊!

 

 interface IDbProvide  {    //返回db服务模型    DbContext GetDb();      }  //实现接口  public class ModelContext : DbContext, IDbProvide  {    public ModelContext() :      base("name=DefaultContext")    {      Database.SetInitializer(new DropCreateDatabaseIfModelChanges<ModelContext>());    }    DbContext IDbProvide.GetDb()    {      return this;    }  }

 

 

这样我在BLL层 依然能通过依赖注入来解耦业务逻辑和数据映射层啊!

 

 

 //关于学生的业务public class StudentBll : IStudentBll  {    IDbProvide IDal { get; set; }    public StudentBll()    {      //依赖注入 业务逻辑层不具体依赖于数据层      IDal = IocDal< IDbProvide>.Provide;    }     //获取最高分数的同学    public Student CalculateScroebyTop01()    {      var stus = IDal.GetDb().OrderByDescending(s=>s.TotalScore).First();      return stus.OrderByDescending(s=>s.TotalScore).First();        }      }

 

 

不服来辩!