• .netcore利用DI实现级联删除


    一、引言

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

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

    二、依赖注入

    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     
    14     public bool DeleteById(Guid id)
    15      {
    16          //执行级联删除,一般放在主记录删除前
    17          _cascadeDeletes?.ToList().ForEach((x) => { x.CascadeDelete(deleted); });
    18          //删除实体
    19          _entityRepository.DeleteById(id);
    20      }
    21  }

    注册服务

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

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

    三、结语

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

  • 相关阅读:
    json的eval的小问题
    关于insertBefore
    关于touch-action
    关于 please verify the preference field with the prompt:Tomcat JDK name 问题解决
    总结一下,以软件开发生命周期来说明不同的测试的使用情况
    用户需求、己、竞争对手的关系
    苹果电脑快捷键大全
    软件工程与计算机科学的区别
    有人认为,“中文编程”是解决中国程序员编程效率的秘密武器,请问它是一个“银弹”么?
    Maven 和IDEA的初始配置
  • 原文地址:https://www.cnblogs.com/migomiddle/p/11847220.html
Copyright © 2020-2023  润新知