博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EF中Repository模式应用场景
阅读量:6162 次
发布时间:2019-06-21

本文共 2018 字,大约阅读时间需要 6 分钟。

转载来源

在DDD领域构架系统中,为了将领域模型从领域逻辑层中和数据映射层之间解耦出来,我们引用到了Repository模式,属于属于泛型编程中一个比较常用的模式,尤其应用到MVC构架中更为常见,我们来简单的介绍几个概念:

1、在《领域驱动设计:软件核心复杂性应对之道》,将Repository翻译为仓储,说明为:

一种用来封装存储,读取和查找行为的机制,它模拟了一个对象集合。

2、在《企业构架模式》中,译者对其翻译为:资源库,说明如下:

通过用来访问领域对象的一个类似集合的接口,在领域与数据映射层之间进行协调

下面通过一个案例才详细说明该解耦过程

一、新建应用程序,添加Linq To Sql,新建两个领域模型,用会员模型(Dinner)和会议模型(RSVP),很明显这里应该是一对多的关系,也即是说一张会议会有很多人来参与。

二、 我们将对实体的公共操作部分,提取为IRepository接口,比如常见的也就是增删改查等方法。如下代码:

public interface IRepository
where T : class {
//改变模型中没有更新,里面的Save就取代更新功能 IEnumerable
FindAll(Func
exp); void Add(T entity); void Delete(T entity); void Save(); }

三,下面我们实现一个泛型的类来具体实现上面的接口的方法。也就是实现领域模型的操作:

public class Repository
: IRepository
where T:class {
public DataContext context; public Repository(DataContext context) { this.context = context; } public IEnumerable
FindAll(Func
exp) { return context.GetTable
().Where(exp); } public void Add(T entity) { context.GetTable
().InsertOnSubmit(entity); } public void Delete(T entity) { context.GetTable
().DeleteOnSubmit(entity); } public void Save() { context.SubmitChanges(); } }

3.上面我们实现是每个实体公共的操作,但是实际中每个实体都有符合自己业务的逻辑。我们单独定义另外一个接口,用来某些业务领域类特殊操作的约束,例如:

interface IDinnerRepository: IRepository
{
IList
GetAllByDinnerId(int id); }

4、最后该实体的Repository类实现,注意要同时继承它的接口约束和Repository<T>类,如下:

public class DinnerRepository : Repository
, IDinnerRepository {
public DinnerRepository(DataContext dc) : base(dc) { } public IList
GetAllByBookId(int id) { var listDinner = from c in context.GetTable
() where c.DinnerID == id select c; return listDinner.ToList(); } }

基本思路就这样了,在我们使用的时候,需要几个扩展类,在定义领域模型责任接口,在实现领域对象业务领域的扩展,实现类就要同时继承基类和约束接口了。

转载于:https://www.cnblogs.com/spilledlight/articles/9257173.html

你可能感兴趣的文章
闲说HeartBeat心跳包和TCP协议的KeepAlive机制
查看>>
MoSQL
查看>>
Hibernate多对一外键单向关联(Annotation配置)
查看>>
《CLR via C#》读书笔记 之 方法
查看>>
设计模式:组合模式(Composite Pattern)
查看>>
ContentValues 和HashTable区别
查看>>
LogicalDOC 6.6.2 发布,文档管理系统
查看>>
给PowerShell脚本传递参数
查看>>
实战2——Hadoop的日志分析
查看>>
利用FIFO进行文件拷贝一例
查看>>
Ecshop安装过程中的的问题:cls_image::gd_version()和不支持JPEG
查看>>
resmgr:cpu quantum等待事件
查看>>
一个屌丝程序猿的人生(六十六)
查看>>
Java 编码 UTF-8
查看>>
SpringMVC实战(注解)
查看>>
关于静态属性和静态函数
查看>>
进程的基本属性:进程ID、父进程ID、进程组ID、会话和控制终端
查看>>
spring+jotm+ibatis+mysql实现JTA分布式事务
查看>>
MyBatis启动:MapperStatement创建
查看>>
调查问卷相关
查看>>