热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

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

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

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

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

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

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

建立泛型接口IUnitOfWorks和IRepository

具体实现代码:

public interface IUnitOfWorks
{
bool IsCommit { get; set; }//是否自动提交
///


/// 设置DbContext上下文
///

///
void SetDb(TContext context);
///
/// 获取所有实体对象
///

///
///
IQueryable All() where T : class;
///
/// 根据Lamda表达式来查询实体对象
///

///
///
///
IQueryable Where(Expression> whereLambda) where T : class;
///
/// 获取所有实体数量
///

///
int Count() where T : class;
///
/// 根据表达式获取实体数量
///

///
///
int Count(Expression> whereLambda) where T : class;
///
/// 实体对象新增
///

///
///
int Add(T model) where T : class;
///
/// 实体对象修改
///

///
///
int Update(T model) where T : class;
///
/// 实体对象根据字段修改
///

///
///
///
int Update(T model, params string[] proName) where T : class;
///
/// 实体对象删除
///

///
///
int Delete(T model) where T : class;
///
/// 删除复核条件的多个实体对象
///

///
///
int Delete(Expression> whereLambda) where T : class;
///
/// 修改信息提交
///

///
int SaveChanges(bool validatOnSave= true);
void Dispose();
}

对数据的各种操作

public interface IRepository
where T : class
{
///


/// 获取所有实体对象
///

///
IQueryable All();
///
/// 根据Lamda表达式来查询实体对象
///

///
///
IQueryable Where(Expression> whereLambda);
///
/// 获取所有实体数量
///

///
int Count();
///
/// 根据表达式获取实体数量
///

///
///
int Count(Expression> whereLambda);
///
/// 实体对象新增
///

///
///
int Add(T model, bool IsCommit = false);
///
/// 实体对象修改
///

///
///
int Update(T model, bool IsCommit = false);
///
/// 实体对象根据字段修改
///

///
///
///
int Update(T model, bool IsCommit=false,params string[] proName);
///
/// 实体对象删除
///

///
///
int Delete(T model,bool IsCommit=false);
///
/// 删除复核条件的多个实体对象
///

///
///
int Delete(Expression> whereLambda,bool IsCommit=false);
}

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

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

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

public class Repository : IRepository
where TContext : DbContext
where T : class
{
protected TContext context;
protected DbSet dbSet;
//protected bool IsCommit;//是否自动提交
protected T entity;
public Repository(TContext dbcontext)
{
cOntext= dbcontext;
dbSet = dbcontext.Set();
}
///


/// 获取所有实体对象
///

///
public IQueryable All()
{
//context.Set().AsQueryable();
return dbSet.AsQueryable();
}
///
/// 根据Lamda表达式来查询实体对象
///

///
///
public IQueryable Where(System.Linq.Expressions.Expression> whereLambda)
{
return dbSet.Where(whereLambda);
}
///
/// 获取所有实体数量
///

///
public int Count()
{
return dbSet.Count();
}
///
/// 根据表达式获取实体数量
///

///
///
public int Count(System.Linq.Expressions.Expression> whereLambda)
{
return dbSet.Where(whereLambda).Count();
}
///
/// 实体对象新增
///

///
///
public int Add(T model, bool IsCommit=false)
{
dbSet.Add(model);
int i_flag = IsCommit ? context.SaveChanges() : 0;
return i_flag;
}
///
/// 实体对象修改
///

///
///
public int Update(T model, bool IsCommit = false)
{
var entry = context.Entry(model);
entry.State = EntityState.Modified;
dbSet.Attach(model);
int i_flag = IsCommit ? context.SaveChanges() : 0;
return i_flag;
}
///
/// 实体对象根据字段修改
///

///
///
///
public int Update(T model, bool IsCommit=false,params string[] proName)
{
var entry = context.Entry(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;
}
///
/// 实体对象删除
///

///
/// public int Delete(T model,bool IsCommit=false)
{
//var entry = context.Entry(model);
//entry.State = EntityState.Deleted;
dbSet.Attach(model);
dbSet.Remove(model);
int i_flag = IsCommit ? context.SaveChanges() : 0;
return i_flag;
}
///
/// 删除复核条件的多个实体对象
///

///
///
public int Delete(System.Linq.Expressions.Expression> 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 : IUnitOfWorks
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();
}
///


/// 设置DbContext上下文
///

///
public void SetDb(TContext context)
{
dbCOntext= context;
}
private IDictionary RepositoryDic = new Dictionary();
//注册Respository
//public void Register(IRepository respository)
//{
// var key = typeof(T);
// if (RepositoryDic.ContainsKey(key))
// {
// RepositoryDic.Add(key, respository);
// }
//}
protected IRepository GenericRepository() where T : class
{
return new Repository(dbContext);
}
public IRepository GetRepository()
where T : class
{
IRepository repository = null;
var key = typeof(T);
if (RepositoryDic.ContainsKey(key))
{
repository = (IRepository)RepositoryDic[key];
}
else
{
repository = GenericRepository();
RepositoryDic.Add(key, repository);
}
return repository;
}
///
/// 获取所有实体对象
///

///
///
public IQueryable All() where T : class
{
return GetRepository().All();
}
///
/// 根据Lamda表达式来查询实体对象
///

///
///
///
public IQueryable Where(Expression> whereLambda) where T : class
{
return GetRepository().Where(whereLambda);
}
///
/// 获取所有实体数量
///

///
public int Count() where T : class
{
return GetRepository().Count();
}
///
/// 根据表达式获取实体数量
///

///
///
public int Count(Expression> whereLambda) where T : class
{
return GetRepository().Count(whereLambda);
}
///
/// 实体对象新增
///

///
///
public int Add(T model) where T : class
{
return GetRepository().Add(model, IsCommit);
}
///
/// 实体对象修改
///

///
///
public int Update(T model) where T : class
{
return GetRepository().Update(model, IsCommit);
}
///
/// 实体对象根据字段修改
///

///
///
///
public int Update(T model, params string[] proName) where T : class
{
return GetRepository().Update(model,IsCommit, proName);
}
///
/// 实体对象删除
///

///
///
public int Delete(T model) where T : class
{
return GetRepository().Delete(model, IsCommit);
}
///
/// 删除复核条件的多个实体对象
///

///
///
public int Delete(Expression> whereLambda) where T : class
{
return GetRepository().Delete(whereLambda, IsCommit);
}
///
/// 修改信息提交
///

///
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 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().add(empa);

uow().add(empb);

uow.savechange();//实现统一提交


推荐阅读
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • qt学习(六)数据库注册用户的实现方法
    本文介绍了在qt学习中实现数据库注册用户的方法,包括登录按钮按下后出现注册页面、账号可用性判断、密码格式判断、邮箱格式判断等步骤。具体实现过程包括UI设计、数据库的创建和各个模块调用数据内容。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 本文介绍了MVP架构模式及其在国庆技术博客中的应用。MVP架构模式是一种演变自MVC架构的新模式,其中View和Model之间的通信通过Presenter进行。相比MVC架构,MVP架构将交互逻辑放在Presenter内部,而View直接从Model中读取数据而不是通过Controller。本文还探讨了MVP架构在国庆技术博客中的具体应用。 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • 本文介绍了ASP.NET Core MVC的入门及基础使用教程,根据微软的文档学习,建议阅读英文文档以便更好理解,微软的工具化使用方便且开发速度快。通过vs2017新建项目,可以创建一个基础的ASP.NET网站,也可以实现动态网站开发。ASP.NET MVC框架及其工具简化了开发过程,包括建立业务的数据模型和控制器等步骤。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
author-avatar
jAne
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有