一、引言

所谓级联删除是指删除一条记录后,附带关联记录也一起删除,比如删除客户后,联系人也一起删除;

以往我们会依赖于数据库表的外键约束,但存在着明显的问题,增加数据库压力、提示不友好、职责越界、事务冲突等,这类业务相关的功能不应该放到数据库去管理。

二、依赖注入

DI、IOC等概念在这不展开介绍,大家记住它们的主要目的就是解耦,本文利用.netcore内置的DI实现相关功能

二、解决方案

利用DI注入级联删除的服务,在主体删除时获取已注册的级联删除服务,实现记录的级联删除,前面这句话可能绕口,下面用一个例子说明,删除【实体元数据】时同时删除【字段元数据】,看下代码就清晰了:

级联删除接口类 ICascadeDelete

  1. public interface ICascadeDelete<TParent>
  2. {
  3. void CascadeDelete(params TParent[] parent);
  4. }

字段删除类 AttributeDeleter,实现上面的接口

  1. public class AttributeDeleter : ICascadeDelete<Domain.Entity>
  2. {
  3. private readonly IAttributeRepository _attributeRepository;
  4. public AttributeDeleter(IAttributeRepository attributeRepository)
  5. {
  6. _attributeRepository = attributeRepository;
  7. }
  8.  
  9. /// <summary>
  10. /// 实体级联删除
  11. /// </summary>
  12. /// <param name="parent">被删除的实体</param>
  13. public void CascadeDelete(params Domain.Entity[] parent)
  14. {
  15. //删除字段
  16. _attributeRepository.DeleteMany(x =>x.EntityId.In(parent.Select(x => x.EntityId).ToArray()));
  17. }
  18. }

实体删除类EntityDeleter

  1. public class EntityDeleter
  2. {
  3. private readonly IEntityRepository _entityRepository;
  4. private readonly IEnumerable<ICascadeDelete<Domain.Entity>> _cascadeDeletes;//需要同时删除记录的服务类
  5. public EntityDeleter(IEntityRepository entityRepository
  6. , IEnumerable<ICascadeDelete<Domain.Entity>> cascadeDeletes
  7. )
  8. {
  9. _entityRepository = entityRepository;
  10. _cascadeDeletes = cascadeDeletes;
  11. }
  12.  
  13. public bool DeleteById(Guid id)
  14. {
  15. //执行级联删除,一般放在主记录删除前
  16. _cascadeDeletes?.ToList().ForEach((x) => { x.CascadeDelete(deleted); });
  17. //删除实体
  18. _entityRepository.DeleteById(id);
  19. }
  20. }

注册服务

  1. services.AddScoped(typeof(Core.Data.ICascadeDelete<>), typeof(Core.Data.ICascadeDelete<Domain.Entity>));

上面的服务注册方式是固定的写法,但实际项目可能有很多这类同一接口的实现,我们可以写个批量注册的类去解决,后面再介绍,大家也可以自己查看源码

三、结语

整个过程很简单,但解决了系统设计的几个大问题,包括大家从我的类命名(EntityDeleter)就可以看出,这是职责单一的设计思想,xms应用了很多设计模式,日后会在这里一一分享,这些模式带来的巨大好处

利用DI实现级联删除 - xms跨平台基础框架 - 基于.netcore的更多相关文章

  1. xms跨平台基础框架 - 基于.netcore

    背景 敝人经过多年开发,数百个项目“打磨(折磨)”,各种国内外框架平台都有涉及,没有一款称心顺手的,原因有三,一是设计反人类,二是不开源根本无法突破框架限制,三是即使开源也是阉割版,然后xms就开始萌 ...

  2. .netcore利用DI实现订阅者模式 - xms

    结合DI,实现发布者与订阅者的解耦,属于本次事务的对象主体不应定义为订阅者,因为订阅者不应与发布者产生任何关联 一.发布者订阅者模式 发布者发出一个事件主题,一个或多个订阅者接收这个事件,中间通过事件 ...

  3. [原创]MYSQL中利用外键实现级联删除和更新

    MySQL中利用外键实现级联删除.更新 MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在创建索引的时候,可以指定 ...

  4. ruby -- 基础学习(二) 外键配置实现级联删除

    该系列学习基于rails4.0 数据表:admins (id, name, address), articles (id, admin_id, title) admin_id 是表articles中的 ...

  5. MySQL中利用外键实现级联删除、更新

    MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在创建索引的时候,可以指定在删除.更新父表时,对子表进行的相应操作 ...

  6. EF级联删除

    引言     在主表中指定Key,子表中指定Required后,并不会在数据库中生成级联删除的外键.那怎么才能使EF在数据中生成级联删除的外键? SQLServer数据库中级联删除功能配置界面: 上图 ...

  7. [NHibernate]一对多关系(级联删除,级联添加)

    目录 写在前面 文档与系列文章 一对多关系 一个例子 级联删除 级联保存 总结 写在前面 在前面的文章中,我们只使用了一个Customer类进行举例,而在客户.订单.产品中它们的关系,咱们并没有涉及, ...

  8. mysql级联删除更新

    首先,目前在产品环境可用的MySQL版本(指4.0.x和4.1.x)中,只有InnoDB引擎才允许使用外键,所以,我们的数据表必须使用InnoDB引擎. 下面,我们先创建以下测试用数据库表: CREA ...

  9. Hibernate学习笔记(一):级联删除

    一对多的关系映射 在一的一方配置文件中将会配置set节点信息: *.hbm.xml配置文件中set节点的属性: Lazy:默认是true 即使用延迟加载,false表示即时加载: Order-by:一 ...

随机推荐

  1. MySQL 视图(合并多表数据)引发的严重性能问题

    问题背景: 一.客户环境连续多次出现性能问题,系统登入异常,数据库CPU告警. 处理过程: 1>协助排查数据库性能问题时发现如下两个较频繁的SQL导致严重的性能问题(均使用了视图合并多表数据): ...

  2. [专题练习] Part1 搜索

    本文中的链接有的是题解有的是题目链接,已经搞混了... 一.DFS(深度优先搜索) 过于水略过. 二.BFS(广度优先搜索) 同上. 三.记忆化 记忆化搜索,就是我们的状态会重复利用,为了防止状态的重 ...

  3. Python开发【第七篇】列表

    问题:当我们要用一系列数字的时候,我们需要将数字进行存储,我们就需要找个容器把数字装起来,我们需要用的时候再拿出来.如何将计算机运算的数据存储在一个地方,同时方便 对数据进行 增.删.改.查 列表 列 ...

  4. Halcon一日一练:图像分割之阈值分割1

    先了解什么是阈值,度娘告诉我的是:一个领域或一个系统的界限称为阈,其数值称为阈值.在图像中,我们把图像看成一个由像素灰度值组成的数集,那么阈,就是这个图像中,根据目标与背景灰度值的差异,选取的一个合适 ...

  5. enable_shared_from_this

    头文件<memory> enable_shared_from_this是一个模板类. 使用场景:需要把自己类对象作为参数传给其他函数时,就需要传递一个指向自身的share_ptr. str ...

  6. ASP.NET Core 3.0 一个 jwt 的轻量角色/用户、单个API控制的授权认证库

    目录 说明 一.定义角色.API.用户 二.添加自定义事件 三.注入授权服务和中间件 三.如何设置API的授权 四.添加登录颁发 Token 五.部分说明 六.验证 说明 ASP.NET Core 3 ...

  7. python爬取旅游数据+matplotlib简单可视化

    题目如下: 共由6个函数组成: 第一个函数爬取数据并转为DataFrame: 第二个函数爬取数据后存入Excel中,对于解题来说是多余的,仅当练手以及方便核对数据: 后面四个函数分别对应题目中的四个m ...

  8. linux系统状态网络、权限、用户大杂烩

    来来来,我们聊一下liunx系统相关的知识!! 首先从查询网络配置开始 ifconfig 查询.设置网卡和ip等参数 ifup,ifdown 脚本命令,更简单的方式启动关闭网络 ip命令是结合了ifc ...

  9. UNCTF杂项题Hidden secret 之NTFS交换数据流隐写

    ---恢复内容开始--- 做这道题目的经历比较坎坷,题目中用于隐藏flag的jpg文件出了问题,导致不能被交换数据流隐写所以出题人换了一次题目,最后做法也换了,不过出题人一开始的考察点还是基于NTFS ...

  10. Mybaits 源码解析 (五)----- 面试源码系列:Mapper接口底层原理(为什么Mapper不用写实现类就能访问到数据库?)

    刚开始使用Mybaits的同学有没有这样的疑惑,为什么我们没有编写Mapper的实现类,却能调用Mapper的方法呢?本篇文章我带大家一起来解决这个疑问 上一篇文章我们获取到了DefaultSqlSe ...