仓储
一、仓储的定义 仓储,顾名思义,存储数据的仓库。仓储作用之一是用于数据的持久化。从架构层面来说,仓储用于连接领域层和基础结构层,领域层通过仓储访问存储机制,而不用过于关心存储机制的具体细节。按照DDD设计原则,仓储的作用对象的领域模型的聚合根,也就是说每一个聚合都有一个单独的仓储。可能这样说大家未必能理解,相信看了仓储的代码设计,大家能有一个更加透彻的认识。
二、使用仓储的意义 1、站在领域层更过关心领域逻辑的层面,上面说了,仓储作为领域层和基础结构层的连接组件,使得领域层不必过多的关注存储细节。在设计时,将仓储接口放在领域层,而将仓储的具体实现放在基础结构层,领域层通过接口访问数据存储,而不必过多的关注仓储存储数据的细节(也就是说领域层不必关心你用EntityFrameWork还是NHibernate来存储数据),这样使得领域层将更多的关注点放在领域逻辑上面。
2、站在架构的层面,仓储解耦了领域层和ORM之间的联系,这一点也就是很多人设计仓储模式的原因,比如我们要更换ORM框架,我们只需要改变仓储的实现即可,对于领域层和仓储的接口基本不需要做任何改变。
初始化
c#
private readonly SooRepository<SysRegion> _sysRegionRep;
public SysRegionService(SqlSugarRepository<SysRegion> sysRegionRep)
{
_sysRegionRep = DBCash.useRepo<SysRegion>(0);
}GetList
查询所有数据
c#
<List<SysRegion> list= _sysRegionRep.GetList(u => u.Pid == input.Id);获取前100条
c#
<List<SysRegion> list= _sysRegionRep.GetList(100);GetFirst
获取第一条结果
c#
var sysRegion = _sysRegionRep.GetFirst(u => u.Id == input.Id);GetPageList
查询获取分页结果,并结合了clip功能实现自定义的条件过滤。
c#
var res=Rep.GetPageList(input.Page, input.PageSize, (c, d) => {
c.where(()=>d.CreateTime,input.StartTime,">=")
.where(()=>d.CreateTime,input.EndTime,"<=")
.orderByDesc(()=>d.CreateTime);
});GetTreeList
查询树结构数据,传入外键,然后按主键进行查询。可自定义每层的更多自定义过滤条件(通过Clip)
c#
var menuList = _sysMenuRep.GetTreeList((m) => m.Pid, 0
, (c, m) => {
c.where(() => m.Type, MenuTypeEnum.Btn, "!=")
.where(() => m.Status, StatusEnum.Enable)
.orderBy(() => m.OrderNo)
.orderBy(() => m.Id);
});GetChildList
查询子节点列表
c#
var list = Rep.GetChildList((r) => r.Pid, input.Id);Insert
新增一条数据,提交到数据库
c#
_sysRegionRep.Insert(sysRegion)InsertRange
批量新增数据,提交到数据库
c#
_sysRegionRep.InsertRange(sysRegions)IsAny
检查是否存在
c#
var isExist = _sysRegionRep.IsAny(u => u.Name == input.Name && u.Code == input.Code);
if (isExist)
throw Oops.Oh(ErrorCodeEnum.R2002);Update
更新一条数据,提交到数据库
c#
_sysRegionRep.Update(new SysRegion());UpdateRange
批量更新数据,提交到数据库
c#
_sysRegionRep.UpdateRange(new SysRegion());DeleteByIds
按主键进行删除,批量
c#
public async Task DeleteRegion(DeleteRegionInput input)
{
var regionTreeList = _sysRegionRep.useBus().Where(u => u.Pid == input.Id).ToList();
var regionIdList = regionTreeList.Select(u => u.Id).ToList();
regionIdList.Add(input.Id);
_sysRegionRep.DeleteByIds(regionIdList);
}Delete
条件删除
c#
_sysPosRep.Delete(u => u.Id == input.Id);ChangeTo
获取一个新的仓库,基于某个实体类
c#
var hasPosEmp = _sysPosRep.ChangeTo<SysUser>()
.IsAny(u => u.PosId == input.Id);