关于Repository和UnitOfWork模式的关系

一,repository模式

描述和作用:

按照最初提出者的介绍,它是衔接数据映射层和域之间的一个纽带,作用相当于一个在内存中的域对象集合。客户端对象把查询的一些实体进行组合,并把它们提交给Repository。对象能够从Repository中移除或者添加,就好比这些对象在一个Collection对象上就行数据操作,同时映射层的代码会对应的从数据库中取出相应的数据。

从概念上讲,Repository是把一个数据存储区的数据给封装成对象的集合并提供了对这些集合的操作。。。。。。。

在领域驱动设计中,我们有个集合(aggregate)的概念, 通常我们是对于domain的每个集合会对应的定义一个repository。也就说,并不是每个实体都会有对应的一个repository。(假设这是一个仓库,简介源自网上摘录。。)

二,UnitOfWork模式

描述和作用:

简说了,主要作用是在数据持久化过程中,数据提交,确保数据的完整性,对象使用确保同一上下文对象。如果有异常,提供回滚。

三,二者的关系

即:

工作单元服务于仓储,并在工作单元中初始化上下文,为仓储单元提供上下文对象,由此确保同一上下文对象。

那么此时,问题来了,怎么在仓储中获取上下文。(使用的orm为 EF,以autofac或者MEF实现注入,以此为例) 所以,此时实现就变得很简单。

看脚本:

UOW中 
这里写图片描述 
在uow中初始化上下文对象,定义了Context的属性对象(当然,这地方可以不初始化,可以有IOC在注入时候带入参数注入,详见IOC,常见方式就几种,实现方式也很类似。) 此处如果看的觉得不爽,换成DbSet对象也可,您请随意。

repository中

这里写图片描述

在仓储构造函数中,默认初始化仓储对象和获取上下文对象,好像讲完了,没有了~~~~

以下是本人目前的,我可以说写着玩的吗?就是比较喜爱,但是有弊端,用久了就发觉了,二者组合不是很合适,尽管很多人推崇。当然好处显而易见,就是提供了统一的开发模式和规范,是开发人员的开发方式更具规则性 ,更好维护。

uow:

public OlympicOverDbContext Context 
{
    get 
    {
        ......初始化上下文
    }
}
public bool IsCommitted { get;set;}

public int Commit() 
{
    if (IsCommitted) return 0;
    try 
    {
        int result = Context.SaveChanges();
        IsCommitted = true;
        return result;
    }
    catch (DbEntityValidationException advEx) 
    {
        ...捕捉异常
        return -1;
    }
}
public void RollBack() 
{
    IsCommitted = false;
}
public void Dispose() 
{
    if (!IsCommitted) 
    {
        Commit();
    }
    Context.Dispose();
}

repository仓储:

public OlympicOverRepository(IUnitOfWork unitOfWork) 
{
    UnitOfWork = unitOfWork;
    //Context = unitOfWork.GetDbContext;
    Context = ((UnitOfWork.UnitOfWork)unitOfWork).Context;
}

#region 属性
/// <summary>
///     获取仓储上下文的实例
/// </summary>
public IUnitOfWork UnitOfWork 
{
    get;
}

/// <summary>
/// 数据上下文
/// </summary>
protected DbContext Context 
{
    get;
    private set;
}

/// <summary>
/// 获取  当前实体的查询数据集
/// </summary>
public IQueryable<TEntity> Entities 
{
    get 
    {
        return Context.Set<TEntity>();
    }
}
#endregion
public OlympicOverRepository(IUnitOfWork unitOfWork) 
{
    UnitOfWork = unitOfWork;
    //Context = unitOfWork.GetDbContext;
    Context = ((UnitOfWork.UnitOfWork)unitOfWork).Context;
}

#region 属性
/// <summary>
///     获取仓储上下文的实例
/// </summary>
public IUnitOfWork UnitOfWork 
{
    get;
}

/// <summary>
/// 数据上下文
/// </summary>
protected DbContext Context 
{
    get;
    private set;
}

/// <summary>
/// 获取  当前实体的查询数据集
/// </summary>
public IQueryable<TEntity> Entities 
{
    get 
    {
        return Context.Set<TEntity>();
    }
}
#endregion

数据仓储模式UnitOfWorks和Repository的实现(

网上看了相关内容关于UnitOfWorks和Repository的数据仓储模式的实现,也来动手搭建下。

ORM使用微软自己的EF来实现

建立一个项目,使用EF,我采用的是DBFirst。建立好连接,连上数据库拖入我要的表,DBFirst有时候还是挺方便的。

然后就要开始实现这个数据仓储模式了

建立泛型接口IUnitOfWorks<TContext>和IRepository<T>

具体实现代码:

   

public interface IUnitOfWorks<TContext>
    {
        bool IsCommit { get; set; }//是否自动提交
        /// <summary>
        /// 设置DbContext上下文
        /// </summary>
        /// <param name="context"></param>
        void SetDb(TContext context);
        /// <summary>
        /// 获取所有实体对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        IQueryable<T> All<T>() where T : class;
 
        /// <summary>
        /// 根据Lamda表达式来查询实体对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="whereLambda"></param>
        /// <returns></returns>
        IQueryable<T> Where<T>(Expression<Func<T, bool>> whereLambda) where T : class;
 
        /// <summary>
        /// 获取所有实体数量
        /// </summary>
        /// <returns></returns>
        int Count<T>() where T : class;
 
        /// <summary>
        /// 根据表达式获取实体数量
        /// </summary>
        /// <param name="whereLambda"></param>
        /// <returns></returns>
        int Count<T>(Expression<Func<T, bool>> whereLambda) where T : class;
 
        /// <summary>
        /// 实体对象新增
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        int Add<T>(T model) where T : class;
 
        /// <summary>
        /// 实体对象修改
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        int Update<T>(T model) where T : class;
 
        /// <summary>
        /// 实体对象根据字段修改
        /// </summary>
        /// <param name="model"></param>
        /// <param name="proName"></param>
        /// <returns></returns>
        int Update<T>(T model, params string[] proName) where T : class;
 
        /// <summary>
        /// 实体对象删除
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        int Delete<T>(T model) where T : class;
 
        /// <summary>
        /// 删除复核条件的多个实体对象
        /// </summary>
        /// <param name="whereLambda"></param>
        /// <returns></returns>
        int Delete<T>(Expression<Func<T, bool>> whereLambda) where T : class;
 
        /// <summary>
        /// 修改信息提交
        /// </summary>
        /// <returns></returns>
        int SaveChanges(bool validatonSave = true);
 
        void Dispose();
    }


对数据的各种操作

 

  public interface IRepository<T>
        where T : class
    {
        /// <summary>
        /// 获取所有实体对象
        /// </summary>
        /// <returns></returns>
        IQueryable<T> All();
 
        /// <summary>
        /// 根据Lamda表达式来查询实体对象
        /// </summary>
        /// <param name="whereLambda"></param>
        /// <returns></returns>
        IQueryable<T> Where(Expression<Func<T, bool>> whereLambda);
 
        /// <summary>
        /// 获取所有实体数量
        /// </summary>
        /// <returns></returns>
        int Count();
 
        /// <summary>
        /// 根据表达式获取实体数量
        /// </summary>
        /// <param name="whereLambda"></param>
        /// <returns></returns>
        int Count(Expression<Func<T, bool>> whereLambda);
 
        /// <summary>
        /// 实体对象新增
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        int Add(T model, bool IsCommit = false);
 
        /// <summary>
        /// 实体对象修改
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        int Update(T model, bool IsCommit = false);
 
        /// <summary>
        /// 实体对象根据字段修改
        /// </summary>
        /// <param name="model"></param>
        /// <param name="proName"></param>
        /// <returns></returns>
        int Update(T model, bool IsCommit=false,params string[] proName);
 
        /// <summary>
        /// 实体对象删除
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        int Delete(T model,bool IsCommit=false);
 
        /// <summary>
        /// 删除复核条件的多个实体对象
        /// </summary>
        /// <param name="whereLambda"></param>
        /// <returns></returns>
        int Delete(Expression<Func<T, bool>> whereLambda,bool IsCommit=false);
    }


对于IsCommit是否默认提交,设置成可选参数,默认设置成不直接提交需要最终统一提交以实现事务操作。当然也可以直接设置IsCommit为True那么可以单个操作提交.

看起来这两接口是不是挺像的

接下来是这两接口的具体实现

   

 public class Repository<TContext, T> : IRepository<T>
        where TContext : DbContext
        where T : class
    {
        protected TContext context;
        protected DbSet<T> dbSet;
        //protected bool IsCommit;//是否自动提交
        protected T entity;
 
        public Repository(TContext dbcontext)
        {
            context = dbcontext;
            dbSet = dbcontext.Set<T>();
        }
 
        /// <summary>
        /// 获取所有实体对象
        /// </summary>
        /// <returns></returns>
        public IQueryable<T> All()
        {
            //context.Set<T>().AsQueryable();
            return dbSet.AsQueryable();
        }
 
        /// <summary>
        /// 根据Lamda表达式来查询实体对象
        /// </summary>
        /// <param name="whereLambda"></param>
        /// <returns></returns>
        public IQueryable<T> Where(System.Linq.Expressions.Expression<Func<T, bool>> whereLambda)
        {
            return dbSet.Where(whereLambda);
        }
 
        /// <summary>
        /// 获取所有实体数量
        /// </summary>
        /// <returns></returns>
        public int Count()
        {
            return dbSet.Count();
        }
 
        /// <summary>
        /// 根据表达式获取实体数量
        /// </summary>
        /// <param name="whereLambda"></param>
        /// <returns></returns>
        public int Count(System.Linq.Expressions.Expression<Func<T, bool>> whereLambda)
        {
            return dbSet.Where(whereLambda).Count();
        }
 
        /// <summary>
        /// 实体对象新增
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public int Add(T model, bool IsCommit=false)
        {
            dbSet.Add(model);
            int i_flag = IsCommit ? context.SaveChanges() : 0;
            return i_flag;
        }
 
        /// <summary>
        /// 实体对象修改
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public int Update(T model, bool IsCommit = false)
        {
            var entry = context.Entry<T>(model);
            entry.State = EntityState.Modified;
            dbSet.Attach(model);
            int i_flag = IsCommit ? context.SaveChanges() : 0;
            return i_flag;
        }
 
        /// <summary>
        /// 实体对象根据字段修改
        /// </summary>
        /// <param name="model"></param>
        /// <param name="proName"></param>
        /// <returns></returns>
        public int Update(T model, bool IsCommit=false,params string[] proName)
        {
            var entry = context.Entry<T>(model);
            entry.State = EntityState.Unchanged;
            foreach (string s in proName)
            {
                entry.Property(s).IsModified = true;
            }
            int i_flag = IsCommit ? context.SaveChanges() : 0;
            return i_flag;
        }
 
        /// <summary>
        /// 实体对象删除
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns
        public int Delete(T model,bool IsCommit=false)
        {
            //var entry = context.Entry<T>(model);
            //entry.State = EntityState.Deleted;
            dbSet.Attach(model);
            dbSet.Remove(model);
            int i_flag = IsCommit ? context.SaveChanges() : 0;
            return i_flag;
        }
 
        /// <summary>
        /// 删除复核条件的多个实体对象
        /// </summary>
        /// <param name="whereLambda"></param>
        /// <returns></returns>
        public int Delete(System.Linq.Expressions.Expression<Func<T, bool>> whereLambda,bool IsCommit=false)
        {
            var enties = dbSet.Where(whereLambda).ToList();
            foreach (var item in enties)
            {
                dbSet.Remove(item);
            }
            int i_flag = IsCommit ? context.SaveChanges() : 0;
            return i_flag;
        }
    }
    public class UnitOfWorks<TContext> : IUnitOfWorks<TContext>
        where TContext : DbContext
    {
        protected TContext dbContext;
        protected bool _IsCommit=false;
        public bool IsCommit { get { return _IsCommit; } set { _IsCommit = value; } }
 
        public UnitOfWorks()
        {
            dbContext = (TContext)EFContextFactory.GetDbContext();
        }
 
        /// <summary>
        /// 设置DbContext上下文
        /// </summary>
        /// <param name="context"></param>
        public void SetDb(TContext context)
        {
            dbContext = context;
        }
 
        private IDictionary<Type, object> RepositoryDic = new Dictionary<Type, object>();
 
        //注册Respository
        //public void Register<T>(IRepository<T> respository)
        //{
        //    var key = typeof(T);
        //    if (RepositoryDic.ContainsKey(key))
        //    {
        //        RepositoryDic.Add(key, respository);
        //    }
        //}
 
        protected IRepository<T> GenericRepository<T>() where T : class
        {
            return new Repository<DbContext, T>(dbContext);
        }
 
        public IRepository<T> GetRepository<T>()
            where T : class
        {
            IRepository<T> repository = null;
            var key = typeof(T);
 
            if (RepositoryDic.ContainsKey(key))
            {
                repository = (IRepository<T>)RepositoryDic[key];
            }
            else
            {
                repository = GenericRepository<T>();
                RepositoryDic.Add(key, repository);
            }
            return repository;
        }
 
        /// <summary>
        /// 获取所有实体对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public IQueryable<T> All<T>() where T : class
        {
            return GetRepository<T>().All();
        }
 
        /// <summary>
        /// 根据Lamda表达式来查询实体对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="whereLambda"></param>
        /// <returns></returns>
        public IQueryable<T> Where<T>(Expression<Func<T, bool>> whereLambda) where T : class
        {
            return GetRepository<T>().Where(whereLambda);
        }
 
        /// <summary>
        /// 获取所有实体数量
        /// </summary>
        /// <returns></returns>
        public int Count<T>() where T : class
        {
            return GetRepository<T>().Count();
        }
 
        /// <summary>
        /// 根据表达式获取实体数量
        /// </summary>
        /// <param name="whereLambda"></param>
        /// <returns></returns>
        public int Count<T>(Expression<Func<T, bool>> whereLambda) where T : class
        {
            return GetRepository<T>().Count(whereLambda);
        }
 
        /// <summary>
        /// 实体对象新增
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public int Add<T>(T model) where T : class
        {
            return GetRepository<T>().Add(model, IsCommit);
        }
 
        /// <summary>
        /// 实体对象修改
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public int Update<T>(T model) where T : class
        {
            return GetRepository<T>().Update(model, IsCommit);
        }
 
        /// <summary>
        /// 实体对象根据字段修改
        /// </summary>
        /// <param name="model"></param>
        /// <param name="proName"></param>
        /// <returns></returns>
        public int Update<T>(T model, params string[] proName) where T : class
        {
            return GetRepository<T>().Update(model,IsCommit, proName);
        }
 
        /// <summary>
        /// 实体对象删除
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public int Delete<T>(T model) where T : class
        {
            return GetRepository<T>().Delete(model, IsCommit);
        }
 
        /// <summary>
        /// 删除复核条件的多个实体对象
        /// </summary>
        /// <param name="whereLambda"></param>
        /// <returns></returns>
        public int Delete<T>(Expression<Func<T, bool>> whereLambda) where T : class
        {
            return GetRepository<T>().Delete(whereLambda, IsCommit);
        }
 
        /// <summary>
        /// 修改信息提交
        /// </summary>
        /// <returns></returns>
        public int SaveChanges(bool validatonSave = true)
        {
            if (!validatonSave)
                dbContext.Configuration.ValidateOnSaveEnabled = false;
            return dbContext.SaveChanges();
        }
 
 
        public void Dispose()
        {
            if (dbContext != null)
                dbContext.Dispose();
            GC.SuppressFinalize(this);
        }
    }

具体使用方法:

使用IOC的方式,属性注入来实现

 public IUnitOfWorks<DbContext> uow { get; set; }

//查询

var query = uow.Where(b=>b.id=="test");

//新增 对表employee进行新增人员

employee empa = new employee();

employee empb = new employee();

empa.id="001";

empa.name="a";

empb.id="002";

empb.name="b";

uow<employee>().add(empa);

uow<employee>().add(empb);

uow.savechange();//实现统一提交
--------------------- 
作者:Sammy爱学习 
来源:CSDN 
原文:https://blog.csdn.net/sammy520/article/details/79310864 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SQL Sugar ORM 是一个开源的ORM框架,旨在简化基于SQL数据库的数据访问和操作。它提供了简单易用的API和丰富的功能,使开发人员能够以更高效和便捷的方式进行数据库操作。 SQL Sugar ORM的主要特点如下: 1. 高性能:SQL Sugar ORM具有优秀的性能,能够高效地处理大量的数据操作。它通过执行高效的SQL查询和优化的数据库访问方式,提供了快速的数据操作速度。 2. 易用性:SQL Sugar ORM提供了简单易用的API,开发人员只需要少量的代码就能完成复杂的数据库操作。它支持面向对象的编程方式,开发人员可以通过定义实体类来映射数据库表结构,简化了开发流程。 3. 数据库支持:SQL Sugar ORM支持多种常见的数据库,包括MySQL、SQL Server、Oracle等。开发人员可以根据自己的需求选择合适的数据库进行开发。 4. 数据库迁移:SQL Sugar ORM提供了数据库迁移的功能,能够自动识别数据库表结构的变化,并根据变化自动执行相应的数据库迁移操作。这使得开发人员能够更轻松地进行数据库结构的变更和升级。 5. 缓存支持:SQL Sugar ORM支持数据缓存的功能,可以有效地提高数据的访问速度。开发人员可以根据需求选择不同的缓存方式,如内存缓存、分布式缓存等,提供更好的性能和可扩展性。 总的来说,SQL Sugar ORM是一个功能强大、易用性高的ORM框架,能够帮助开发人员提高开发效率和程序性能,提供更好的数据库操作体验。无论是对于个人开发者还是团队开发来说,SQL Sugar ORM都是一个值得推荐的工具箱。 ### 回答2: SqlSugar是一个功能强大、简单易用的ORM(对象关系映射)框架。它可以帮助我们更方便地进行数据库操作,提高开发效率。 首先,SqlSugar提供了简单易用的API,使用起来非常方便。它可以支持复杂的查询语句、连表查询、分页查询等,并且可以使用Lambda表达式进行查询构造,使得代码更加简洁明了。 其次,SqlSugar支持多种数据库的操作,包括常用的MySQL、SqlServer、Oracle等。这样,我们在使用不同的数据库时,只需要简单地修改连接字符串,而无需更改大量的数据操作代码。 另外,SqlSugar还提供了强大的缓存机制,可以将查询的结果缓存起来,提高了查询的性能。同时,它还支持事务的操作,保证了数据的一致性。 此外,SqlSugar还支持数据库迁移和表的初始化操作,为我们的项目提供了便捷的数据库部署和更新方式。 最后,SqlSugar的性能也非常优异。它采用了高性能的SQL解析器和缓存机制,提高了数据操作的效率。 总结来说,SqlSugar是一个功能强大、简单易用的ORM框架,可以提高我们的开发效率和代码质量。无论是从编码的角度还是性能的角度来看,SqlSugar都是一个非常优秀的工具箱。 ### 回答3: SQL Sugar ORM是一个简单易用的ORM(对象关系映射)工具箱。它为开发者提供了一种便捷的方式来操作数据库,无需编写复杂的SQL语句,大大简化了数据库操作的流程。 首先,SQL Sugar ORM支持多种数据库,包括MySQL、SQLite、SqlServer等。这使得开发者在不同的项目中可以选择适合自己的数据库,而无需转换代码。 其次,SQL Sugar ORM提供了一套简单直观的API,使得开发者可以通过面向对象的方式来操作数据库。开发者只需要定义好实体类,并通过注解将其与数据库表进行关联,就可以通过简单的方法调用来进行增删改查等操作。 此外,SQL Sugar ORM还提供了丰富的查询方法和条件表达式,使得开发者可以根据自己的需求来灵活地查询数据,而无需编写复杂的SQL语句。开发者可以通过链式调用的方式,依照条件筛选、排序、分页等来获取需要的数据。 另外,SQL Sugar ORM还支持事务管理,可以保证数据的一致性和完整性。开发者可以通过简单的方法调用来开启、提交或回滚事务,确保数据库操作的原子性和一致性。 总之,SQL Sugar ORM是一个功能强大,易于使用的ORM工具箱,它简化了数据库操作的流程,提高了开发效率。无论是小型项目还是大型项目,都可以使用SQL Sugar ORM来提升开发体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值