.netcore利用DI實現級聯刪除 - xms


一、引言

所謂級聯刪除是指刪除一條記錄后,附帶關聯記錄也一起刪除,比如刪除客戶后,聯系人也一起刪除;

以往我們會依賴於數據庫表的外鍵約束,但存在着明顯的問題,增加數據庫壓力、提示不友好、職責越界、事務沖突等,這類業務相關的功能不應該放到數據庫去管理。

二、依賴注入

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應用了很多設計模式,日后會在這里一一分享,這些模式帶來的巨大好處

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM