一、引言

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

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

二、依赖注入

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

二、解决方案

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

级联删除接口类 ICascadeDelete

 public interface ICascadeDelete<TParent>
{
void CascadeDelete(params TParent[] parent);
}

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

 public class AttributeDeleter : ICascadeDelete<Domain.Entity>
{
private readonly IAttributeRepository _attributeRepository;
public AttributeDeleter(IAttributeRepository attributeRepository)
{
_attributeRepository = attributeRepository;
} /// <summary>
/// 实体级联删除
/// </summary>
/// <param name="parent">被删除的实体</param>
public void CascadeDelete(params Domain.Entity[] parent)
{
//删除字段
_attributeRepository.DeleteMany(x =>x.EntityId.In(parent.Select(x => x.EntityId).ToArray()));
}
}

实体删除类EntityDeleter

 public class EntityDeleter
{
private readonly IEntityRepository _entityRepository;
private readonly IEnumerable<ICascadeDelete<Domain.Entity>> _cascadeDeletes;//需要同时删除记录的服务类
public EntityDeleter(IEntityRepository entityRepository
, IEnumerable<ICascadeDelete<Domain.Entity>> cascadeDeletes
)
{
_entityRepository = entityRepository;
_cascadeDeletes = cascadeDeletes;
} public bool DeleteById(Guid id)
{
//执行级联删除,一般放在主记录删除前
_cascadeDeletes?.ToList().ForEach((x) => { x.CascadeDelete(deleted); });
//删除实体
_entityRepository.DeleteById(id);
}
}

注册服务

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. springmvc引入静态资源文件

    如果web.xml中配置的DispatcherServlet请求映射为“/”, springmvc将捕获web容器所有的请求,当然也包括对静态资源的请求.springmvc会将他们当成一个普通请求处理 ...

  2. day 20

    目录 一.继承初体验 二.寻找继承关系 三.继承背景下对象属性查找顺序 四.派生 五.子类派生出新的属性,并重复父类的属性 六.新式类与经典类(了解) 一.继承初体验 父类: class Parent ...

  3. mpvue 星星打分组件

    上图: <template> <div class="container"> <div v-for="(star,index) in sta ...

  4. 安装高可用Hadoop生态 (四) 安装Spark

    4.    安装Spark 4.1. 准备目录 -bin-without-hadoop.tgz -C /opt/cloud/packages/ -bin-without-hadoop /opt/clo ...

  5. 小白学 Python(2):基础数据类型(上)

    人生苦短,我选Python 引言 前文传送门 小白学 Python(1):开篇 接触一门新的语言,肯定要先了解它的基础数据类型.啥?你问我为啥要先了解基础数据类型? 为了你的生命安全,还是乖乖听我 B ...

  6. ElasticSearch安装SQL插件

    ElasticSearch安装SQL插件下载地址(中国大佬开发的,膜拜ing):https://github.com/NLPchina/elasticsearch-sql 1.记得选择和自己Elast ...

  7. 微信分享—ios和安卓机制居然不一样!

     实际项目中,在做微信分享追踪的时候,遇到了一个百思不得其解的问题. 在加入了用户分享追踪功能之后,页面已经加载完成的情况下,安卓分享功能没有任何问题,ios却总是分享失败. 关于ios和安卓设备的差 ...

  8. SpringBoot-Mysql模板多数据源加载

    SpringBoot-Mysql模板多数据源加载 qq交流群: 812321371 微信交流群: MercyYao 简介 在 java 项目里常用到 mysql 多数据源操作.结合 springboo ...

  9. 让搭建在 Github Pages 上的 Hexo 博客可以被 Google 搜索到

    title: 让搭建在Github Pages上的Hexo博客可以被Google搜索到 date: 2019-05-30 23:35:44 tags: 配置 --- 准备工作 搭建好的博客 npm & ...

  10. 说说babel

    一.什么是babel 二.如何配置 三.配置babel-polyfill 一.什么是babel The compiler for writing next generation JavaScript. ...