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


推荐阅读
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • C#编程指南:实现列表与WPF数据网格的高效绑定方法 ... [详细]
  • 分享一款基于Java开发的经典贪吃蛇游戏实现
    本文介绍了一款使用Java语言开发的经典贪吃蛇游戏的实现。游戏主要由两个核心类组成:`GameFrame` 和 `GamePanel`。`GameFrame` 类负责设置游戏窗口的标题、关闭按钮以及是否允许调整窗口大小,并初始化数据模型以支持绘制操作。`GamePanel` 类则负责管理游戏中的蛇和苹果的逻辑与渲染,确保游戏的流畅运行和良好的用户体验。 ... [详细]
  • 深入解析C#中app.config文件的配置与修改方法
    在C#开发过程中,经常需要对系统的配置文件进行读写操作,如系统初始化参数的修改或运行时参数的更新。本文将详细介绍如何在C#中正确配置和修改app.config文件,包括其结构、常见用法以及最佳实践。此外,还将探讨exe.config文件的生成机制及其在不同环境下的应用,帮助开发者更好地管理和维护应用程序的配置信息。 ... [详细]
  • 在Android应用开发中,实现与MySQL数据库的连接是一项重要的技术任务。本文详细介绍了Android连接MySQL数据库的操作流程和技术要点。首先,Android平台提供了SQLiteOpenHelper类作为数据库辅助工具,用于创建或打开数据库。开发者可以通过继承并扩展该类,实现对数据库的初始化和版本管理。此外,文章还探讨了使用第三方库如Retrofit或Volley进行网络请求,以及如何通过JSON格式交换数据,确保与MySQL服务器的高效通信。 ... [详细]
  • 第六章:枚举类型与switch结构的应用分析
    第六章深入探讨了枚举类型与 `switch` 结构在编程中的应用。枚举类型(`enum`)是一种将一组相关常量组织在一起的数据类型,广泛存在于多种编程语言中。例如,在 Cocoa 框架中,处理文本对齐时常用 `NSTextAlignment` 枚举来表示不同的对齐方式。通过结合 `switch` 结构,可以更清晰、高效地实现基于枚举值的逻辑分支,提高代码的可读性和维护性。 ... [详细]
  • 在本文中,我们将为 HelloWorld 项目添加视图组件,以确保控制器返回的视图路径能够正确映射到指定页面。这一步骤将为后续的测试和开发奠定基础。首先,我们将介绍如何配置视图解析器,以便 SpringMVC 能够识别并渲染相应的视图文件。 ... [详细]
  • 本文探讨了 Java 中 Pair 类的历史与现状。虽然 Java 标准库中没有内置的 Pair 类,但社区和第三方库提供了多种实现方式,如 Apache Commons 的 Pair 类和 JavaFX 的 javafx.util.Pair 类。这些实现为需要处理成对数据的开发者提供了便利。此外,文章还讨论了为何标准库未包含 Pair 类的原因,以及在现代 Java 开发中使用 Pair 类的最佳实践。 ... [详细]
  • SQLite数据库CRUD操作实例分析与应用
    本文通过分析和实例演示了SQLite数据库中的CRUD(创建、读取、更新和删除)操作,详细介绍了如何在Java环境中使用Person实体类进行数据库操作。文章首先阐述了SQLite数据库的基本概念及其在移动应用开发中的重要性,然后通过具体的代码示例,逐步展示了如何实现对Person实体类的增删改查功能。此外,还讨论了常见错误及其解决方法,为开发者提供了实用的参考和指导。 ... [详细]
  • HBase Java API 进阶:过滤器详解与应用实例
    本文详细探讨了HBase 1.2.6版本中Java API的高级应用,重点介绍了过滤器的使用方法和实际案例。首先,文章对几种常见的HBase过滤器进行了概述,包括列前缀过滤器(ColumnPrefixFilter)和时间戳过滤器(TimestampsFilter)。此外,还详细讲解了分页过滤器(PageFilter)的实现原理及其在大数据查询中的应用场景。通过具体的代码示例,读者可以更好地理解和掌握这些过滤器的使用技巧,从而提高数据处理的效率和灵活性。 ... [详细]
  • 在《Python编程基础》课程中,我们将深入探讨Python中的循环结构。通过详细解析for循环和while循环的语法与应用场景,帮助初学者掌握循环控制语句的核心概念和实际应用技巧。此外,还将介绍如何利用循环结构解决复杂问题,提高编程效率和代码可读性。 ... [详细]
  • 本课程详细介绍了如何使用Python Flask框架从零开始构建鱼书应用,涵盖高级编程技巧和实战项目。通过视频教学,学员将学习到Flask的高效用法,包括数据库事务处理和书籍交易模型的实现。特别感谢AI资源网提供的课程下载支持。 ... [详细]
  • 成功实现Asp.Net MVC3网站与MongoDB数据库的高效集成
    我们成功地构建了一个基于Asp.NET MVC3框架的网站,并实现了与MongoDB数据库的高效集成。此次更新不仅完善了基本的创建和显示功能,还全面实现了数据的增删改查操作。在创建功能方面,我们修复了之前代码中的错误,确保每个属性都能正确生成。此外,我们还对数据模型进行了优化,以提高系统的性能和稳定性。 ... [详细]
  • 在洛谷 P1344 的坏牛奶追踪问题中,第一问要求计算最小割,而第二问则需要找到割边数量最少的最小割。通过为每条边附加一个单位权值,可以在求解最小割时优先选择边数较少的方案,从而同时解决两个问题。这种策略不仅简化了问题的求解过程,还确保了结果的最优性。 ... [详细]
  • 在Python中,是否可以通过使用Tkinter或ttk库创建一个具有自动换行功能的多行标签,并使其宽度能够随着父容器的变化而动态调整?例如,在调整NotePad窗口宽度时,实现类似记事本的自动换行效果。这种功能在设计需要显示长文本的对话框时非常有用,确保文本内容能够完整且美观地展示。 ... [详细]
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社区 版权所有