java仓储模式_仓储(Repository)和工作单元模式(UnitOfWork)

本文详细介绍了Java中的仓储模式与工作单元模式,旨在实现业务逻辑层与数据源层的分离,提高代码可维护性和可测试性。通过定义仓储接口、实现泛型仓储基类以及使用工作单元来保持操作一致性,确保数据库操作的一致性和事务性。此外,还提供了单元测试案例以验证模式的正确性。
摘要由CSDN通过智能技术生成

仓储和工作单元模式

仓储模式

为什么要用仓储模式

通常不建议在业务逻辑层直接访问数据库。因为这样可能会导致如下结果:

重复的代码

编程错误的可能性更高

业务数据的弱类型

更难集中处理数据,比如缓存

无法轻松地从外部依赖项测试业务逻辑

在业务逻辑层通过仓库模式访问数据则可以实现如下特点:

最大化可以用自动化测试的代码量,并隔离数据层以支持单元测试。

对数据集中管理、提供一致的访问规则和逻辑。

通过将业务逻辑与数据或服务访问逻辑分隔开,从而提高代码的可维护性和可读性。

使用强类型的Entity以便在编译时识别问题而不是在运行时

实现仓储模式

使用仓储模式是为了分离业务层和数据源层,并实现业务层的Model和数据源层的Model映射。(ViewModel和Entity之间的映射)。即业务逻辑层应该和数据源层无关,业务层只关心结果,数据源层关心细节。

数据源层和业务层之间的分离有三个好处:

集中了数据逻辑或Web服务访问逻辑。

为单元测试提供了一个替代点。

提供了一种灵活的体系结构,可以作为应用程序的整体设计进行调整。

一、定义仓储接口

所有的仓储要实现该接口。该接口定义了对数据的基本操作。

public interface IRepository where TEntity : class

{

#region 属性

//IQueryable Entities { get; }

#endregion

#region 公共方法

void Insert(TEntity entity);

void Insert(IEnumerable entities);

void Delete(object id);

void Delete(TEntity entity);

void Delete(IEnumerable entities);

void Update(TEntity entity);

TEntity GetByKey(object key);

#endregion

}

二、实现泛型仓储基类

该类为仓储的泛型基类,实现之前定义的仓储接口(IRepository),并包含数据上下文(DbContext),数据集(DataSet)。

每个表都会对应一个实体(Entity)。每个实体(Entity)对应一个仓储。把实体作为泛型仓储基类的参数,来实现每个实体对应的仓储。

(使用泛型仓储基类可以把实体作为泛型参数来创建对应的仓储。)

//泛型仓储基类

public class EFBaseRepository : IRepository where TEntity : class

{

//数据上下文

internal DbContext context;

//数据集

internal DbSet dbSet;

public EFBaseRepository(DbContext context)

{

this.context = context;

this.dbSet = context.Set();

}

//public IQueryable Entities => context.Set();

public void Delete(object id)

{

TEntity entityToDelete = dbSet.Find(id);

Delete(entityToDelete);

}

public void Delete(IEnumerable entities)

{

dbSet.RemoveRange(entities);

}

public void Delete(TEntity entityToDelete)

{

if (context.Entry(entityToDelete).State == EntityState.Detached)

{

dbSet.Attach(entityToDelete);

}

dbSet.Remove(entityToDelete);

}

public TEntity GetByKey(object key)

{

return dbSet.Find(key);

}

public void Insert(TEntity entity)

{

dbSet.Add(entity);

}

public void Insert(IEnumerable entities)

{

dbSet.AddRange(entities);

}

public void Update(TEntity entity)

{

dbSet.Attach(entity);

context.Entry(entity

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值