数据访问模式之Repository模式
数据访问模式之Repository模式
数据访问层无非就是对数据进行增删改查,其中增、删、改等我们可以抽象出来写一个公共的接口或抽象类来定义这些方法,并采用一个基类实现这些方法,这样该基类派生的子类都会继承增、删、改这些方法,这样我们就避免了每个实体都要重复实现这些方法。一句话概括就是:通过接口 泛型 与ORM结合 实现了数据访问层更好的复用。
在《企业架构模式》中,译者将Repository翻译为资源库。给出如下说明:通过用来访问领域对象的一个类似集合的接口,在领域与数据映射层之间进行协调。
下面我们就用EF来实现一个简单的Repository模式
1、我们对实体的公共操作部分,提取为IRepository接口,比如常见的增加,删除、修改等方法。如下代码
我们发现接口的泛型TEntity有一个约束需要继承BaseEntity,BaseEntity就是把实体中公共的属性抽取出来,比如:Id(主键),CreateDate(创建时间)等。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Repository.Model;
using System.Data.Entity; namespace Repository.Data
{
public interface IRepository<TEntity> where TEntity:BaseEntity
{
DbSet<TEntity> Entities { get; }
//增加单个实体
int Insert(TEntity entity);
//增加多个实体
int Insert(IEnumerable<TEntity> entities);
//更新实体
int Update(TEntity entity);
//删除
int Delete(object id);
//根据逐渐获取实体
TEntity GetByKey(object key); }
}

2、BaseEntity类
BaseEntity类中定义了所有参加数据操作实体的公共属性,因此我们把该类定义为抽象类,作为派生类的的基类。代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.DataAnnotations; namespace Repository.Model
{
public abstract class BaseEntity
{
public BaseEntity()
{
Id = Guid.NewGuid();
CreateDate = DateTime.Now;
}
[Key]
public Guid Id { get; set; }
public DateTime CreateDate { get; set; }
}
}

3、IRepository接口定义完毕,肯定需要一个雷来实现接口中的方法,下面我们定义一个抽象类EFRepositoryBase来实现该接口方法
我们用一个抽象类EFRepositoryBase来实现接口中的方法,这样派生的类都具有接口中定义的方法,也防止EFRepositoryBase直接被实例化,下面我们直接看代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Repository.Model;
using System.Data.Entity; namespace Repository.Data
{
public abstract class EFRepositoryBase<TEntity> : IRepository<TEntity> where TEntity:BaseEntity
{
DemoDbContext Db = new DemoDbContext(); #region IRepository<TEntity> 成员 public DbSet<TEntity> Entities
{
get { return Db.Set<TEntity>(); }
} public int Insert(TEntity entity)
{
Db.Set<TEntity>().Add(entity);
return Db.SaveChanges();
} public int Insert(IEnumerable<TEntity> entities)
{
throw new NotImplementedException();
}
public int Update(TEntity entity)
{
return 0;
}
public int Delete(object id)
{
throw new NotImplementedException();
} public TEntity GetByKey(object key)
{
return Db.Set<TEntity>().Find(key); } #endregion
}
}

因为我们用的EF作为数据访问,因此我们需要定义一个数据上下文,代码如下

DemoDbContext()


数据库连接字符串

我们一共定义两个实体,一个是Members(学生)类和Scores(成绩)类,Members与Scores为一对多的关系。
4、Members类和Scores类,都要继承BaseEntity基类

Member


Score

基础工作都已经完成了,下面我们来看 MemberRepository.cs类和ScoreRespository.cs类。
所有的数据操作都在EFRepositoryBase.cs中实现了,因此MemberRepository.cs和ScoreRespository.cs只需要继承EFRepositoryBase,即可实现增删改查。
1、MemberRepository.cs
MemberRepository为实体Member的操作类,因此EFRepositoryBase基类中的泛型被替换成实体Member,这样该类中就已经有了对Member的增删改查操作,我们也可以在MemberRepository中定义其他方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Repository.Model; namespace Repository.Data
{
public class MemberRepository : EFRepositoryBase<Member>, IRepository<Member>
{
} }

2、ScoreRespository.cs
ScoreRespository与MemberRepository一样,只不过是对实体Score的操作。
3、简单测试

public void test()
{
MemberRepository mr = new MemberRepository();
var entity = new Member()
{
UserName = "eric",
Age = 25,
Sex = "男"
};
mr.Insert(entity); var score = new Score()
{
MemberId = entity.Id,
Scores = 80,
courseId = Guid.NewGuid()
};
ScoreRespository sr = new ScoreRespository();
sr.Insert(score);
}


我们发现数据操作成功。
一般Repository都会跟Unit of Work模式联合使用,如果你有好的学习资料欢迎分享,Unit of Work模式曾看了一天也没有理解其精髓。
每天学习一点点,每天进步一点点。
数据访问模式之Repository模式的更多相关文章
- 项目架构开发:数据访问层之Repository
		接上文 项目架构开发:数据访问层之Logger 本章我们继续IRepository开发,这个仓储与领域模式里边的仓储有区别,更像一个工具类,也就是有些园友说的“伪仓储”, 这个仓储只实现单表的CURD ... 
- 数据访问层之Repository
		数据访问层之Repository 接上文 项目架构开发:数据访问层之Logger 本章我们继续IRepository开发,这个仓储与领域模式里边的仓储有区别,更像一个工具类,也就是有些园友说的“伪 ... 
- Hibernate(1)——数据访问层的架构模式
		俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 数据库的概念.逻辑.数据模型概念 应用程序的分层体系结构发展 MVC设计模式与四层结构的对应关系 持久层的设 ... 
- Hibernate(1)——数据访问层的架构模式<转>
		数据库的概念.逻辑.数据模型概念 应用程序的分层体系结构发展 MVC设计模式与四层结构的对应关系 持久层的设计目标 数据映射器架构模式 JDBC的缺点 Hibernate简介 迅速使用Hibernat ... 
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【二】——使用Repository模式构建数据库访问层
		系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 在数据访问层应用Repository模式来隔离对领域对象的细节操作是很有意义的.它位于映射层 ... 
- 使用Repository模式构建数据库访问层
		使用Repository模式构建数据库访问层 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程[二]——使用Repository模式构建数据库访问层 系列导航地址http:// ... 
- 项目架构开发:数据访问层之Cache
		数据访问层简单介绍 数据访问层,提供整个项目的数据访问与持久化功能.在分层系统中所有有关数据访问.检索.持久化的任务,最终都将在这一层完成. 来看一个比较经典的数据访问层结构图 大概可以看出如下信息 ... 
- 项目架构开发:数据访问层之Logger
		接上文 项目架构开发:数据访问层之Cache 本章我们继续ILogger的开发 ILogger.cs public interface ILogger { void Info(object messa ... 
- 项目架构开发:数据访问层之UnitOfWork
		接上文 项目架构开发:数据访问层之IQuery 本章我们继续IUnitOfWork的开发,从之前的IRepository接口中就可以看出,我们并没有处理单元事务, 数据CUD每次都是立即执行的,这样有 ... 
随机推荐
- hdu 3874
			求一个序列中全部数字的和,当中数值同样的仅仅能计算一次. 先储存全部的请求,然后依照它们的右边界排序,在查询的同一时候更新区间.这里事实上有一点点DP的味道,在它进行某个查询之前,保证全部的反复数字( ... 
- Android 它们的定义ListView实现底部和页下拉刷新刷新的顶
			在项目开发.由于数据量过大,寻呼需要加载或下拉刷新.为了缓解长期等待-time负载.这个博客的评论中被自己的定义实例ListView实现底部的下拉刷新页面正在加载结果和顶部. 其效果图: 一.List ... 
- E: 无法获取锁 /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)解决方法
			/********************************************************************* * Author : Samson * Date ... 
- Web API-路由(二)
			路由匹配主要有三个阶段: 1.将URI匹配到一个路由模版: 2.选择一个controller 3.选择一个action: 可以使用系统提供的拓展点,修改默认的匹配与选择逻辑规则. 路由模版: 路由 ... 
- 程序员面试必备经典CTCI,谷歌面试官经典作品!
			1.1 判断一个字符串中的字符是否唯一 1.2 字符串翻转 1.3 去除字符串中重复字符 1.8 利用已知函数判断字符串是否为另一字符串的子串 2.1 从链表中移除重复结点 2.2 实现一个算法从一个 ... 
- EditPlus仿Sublime配色方案(三种任你选择)
			[Options] Placement=2C00000002000000030000000083FFFF0083FFFFFFFFFFFFFFFFFFFFEA000000EE000000D6050000 ... 
- linux通过建模工具Umbrello
			https://umbrello.kde.org/ Umbrello UML Modeller is a Unified Modelling Language (UML) diagram progra ... 
- html postMessage 创建聊天应用
			应用说明: 这个例子演示如何在门户页面以iframe方式嵌入第三方插件,示例中使用了一个来域名下的应用部件,门户页面通过postMessage来通信.iframe中的聊天部件通过父页面标题内容的闪烁来 ... 
- SVN服务器搭建(2)
			转自:http://www.cnblogs.com/xiaobaihome/archive/2012/03/20/2407979.html 上一篇介绍了VisualSVN Server和Tortois ... 
- UVA11125 - Arrange Some Marbles(dp)
			UVA11125 - Arrange Some Marbles(dp) option=com_onlinejudge&Itemid=8&category=24&page=sho ... 
