热门标签 | 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();//实现统一提交


推荐阅读
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
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社区 版权所有