From 62b48bfa4b839eeb36e396e37ae0ef510c10982f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=86=9B?= <510423039@qq.com> Date: Tue, 9 Nov 2021 22:21:08 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20=E6=95=B0=E6=8D=AE=E5=AD=97?= =?UTF-8?q?=E5=85=B8=E6=A8=A1=E5=9D=97=E6=B7=BB=E5=8A=A0=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- aspnet-core/common.props | 1 - .../DataDictionaryDomainException.cs | 0 .../Dto/DataDictionaryDetailDto.cs | 40 +++++++++++++++ .../DataDictionaries/Dto/DataDictionaryDto.cs | 50 +++++++++++++++++++ ...ame.DataDictionaryManagement.Domain.csproj | 2 +- .../DataDictionaryCacheItemInvalidato.cs | 32 ++++++++++++ .../DataDictionaries/DataDictionaryManager.cs | 47 +++++++++++------ .../DataDictionaryDomainAutoMapperProfile.cs | 15 ++++++ .../DataDictionaryManagementDomainModule.cs | 8 ++- .../DataDictionaryManager_Tests.cs | 20 +------- ...ataDictionaryManagementDomainTestModule.cs | 9 +++- ...anagement.EntityFrameworkCore.Tests.csproj | 3 +- 12 files changed, 187 insertions(+), 40 deletions(-) rename aspnet-core/modules/DataDictionaryManagement/src/{CompanyName.ProjectName.DataDictionaryManagement.Domain/DataDictionaries/Exceptions => CompanyName.ProjectName.DataDictionaryManagement.Domain.Shared/DataDictionaries}/DataDictionaryDomainException.cs (100%) create mode 100644 aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain.Shared/DataDictionaries/Dto/DataDictionaryDetailDto.cs create mode 100644 aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain.Shared/DataDictionaries/Dto/DataDictionaryDto.cs create mode 100644 aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain/DataDictionaries/Caches/DataDictionaryCacheItemInvalidato.cs create mode 100644 aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain/DataDictionaryDomainAutoMapperProfile.cs diff --git a/aspnet-core/common.props b/aspnet-core/common.props index 9ea0f671..64e9aedd 100644 --- a/aspnet-core/common.props +++ b/aspnet-core/common.props @@ -5,6 +5,5 @@ $(NoWarn);CS1591;CS0436 app true - 4.4.0 \ No newline at end of file diff --git a/aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain/DataDictionaries/Exceptions/DataDictionaryDomainException.cs b/aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain.Shared/DataDictionaries/DataDictionaryDomainException.cs similarity index 100% rename from aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain/DataDictionaries/Exceptions/DataDictionaryDomainException.cs rename to aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain.Shared/DataDictionaries/DataDictionaryDomainException.cs diff --git a/aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain.Shared/DataDictionaries/Dto/DataDictionaryDetailDto.cs b/aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain.Shared/DataDictionaries/Dto/DataDictionaryDetailDto.cs new file mode 100644 index 00000000..2803748a --- /dev/null +++ b/aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain.Shared/DataDictionaries/Dto/DataDictionaryDetailDto.cs @@ -0,0 +1,40 @@ +using System; + +namespace CompanyName.ProjectName.DataDictionaryManagement.DataDictionaries.Dto +{ + public class DataDictionaryDetailDto + { + public Guid Id { get; set; } + + /// + /// 所属字典Id + /// + public Guid DataDictionaryId { get; set; } + + /// + /// 字典明细编码 + /// + public string Code { get; set; } + + /// + /// 展现列表时排序用 + /// + public int Order { get; set; } + + /// + /// 英文显示名 + /// + public string DisplayText { get; set; } + + + /// + /// 描述 + /// + public string Description { get; set; } + + /// + /// 启/停用(默认启用) + /// + public bool IsEnabled { get; set; } + } +} \ No newline at end of file diff --git a/aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain.Shared/DataDictionaries/Dto/DataDictionaryDto.cs b/aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain.Shared/DataDictionaries/Dto/DataDictionaryDto.cs new file mode 100644 index 00000000..ae2ca0c8 --- /dev/null +++ b/aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain.Shared/DataDictionaries/Dto/DataDictionaryDto.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; + +namespace CompanyName.ProjectName.DataDictionaryManagement.DataDictionaries.Dto +{ + public class DataDictionaryDto + { + public Guid Id { get; set; } + + /// + /// 租户id + /// + public Guid? TenantId { get; set; } + + /// + /// 字典编码 + /// + public string Code { get; set; } + + /// + /// 显示名 + /// + public string DisplayText { get; set; } + + + /// + /// 描述 + /// + public string Description { get; set; } + + /// + /// 字典明细集合 + /// + public List Details { get; set; } + + public DataDictionaryDto() + { + Details = new List(); + } + + private const string CacheKeyFormat = "i:{0},c:{1}"; + + public static string CalculateCacheKey(Guid? id, string code) + { + return string.Format(CacheKeyFormat, + id?.ToString() ?? "null", + (code.IsNullOrWhiteSpace() ? "null" : code)); + } + } +} \ No newline at end of file diff --git a/aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain/CompanyName.ProjectName.DataDictionaryManagement.Domain.csproj b/aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain/CompanyName.ProjectName.DataDictionaryManagement.Domain.csproj index ab34e685..c233f5b4 100644 --- a/aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain/CompanyName.ProjectName.DataDictionaryManagement.Domain.csproj +++ b/aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain/CompanyName.ProjectName.DataDictionaryManagement.Domain.csproj @@ -9,7 +9,7 @@ - + diff --git a/aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain/DataDictionaries/Caches/DataDictionaryCacheItemInvalidato.cs b/aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain/DataDictionaries/Caches/DataDictionaryCacheItemInvalidato.cs new file mode 100644 index 00000000..1837846b --- /dev/null +++ b/aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain/DataDictionaries/Caches/DataDictionaryCacheItemInvalidato.cs @@ -0,0 +1,32 @@ +using System.Threading.Tasks; +using CompanyName.ProjectName.DataDictionaryManagement.DataDictionaries.Aggregates; +using CompanyName.ProjectName.DataDictionaryManagement.DataDictionaries.Dto; +using Volo.Abp.Caching; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Entities.Events; +using Volo.Abp.EventBus; + +namespace CompanyName.ProjectName.DataDictionaryManagement.DataDictionaries.Caches +{ + public class DataDictionaryCacheItemInvalidator : + ILocalEventHandler>, + ITransientDependency + { + private readonly IDistributedCache _cache; + + public DataDictionaryCacheItemInvalidator(IDistributedCache cache) + { + _cache = cache; + } + + public async Task HandleEventAsync(EntityChangedEventData eventData) + { + await _cache.RemoveAsync( + DataDictionaryDto.CalculateCacheKey(eventData.Entity.Id, eventData.Entity.Code)); + await _cache.RemoveAsync( + DataDictionaryDto.CalculateCacheKey(eventData.Entity.Id, null)); + await _cache.RemoveAsync( + DataDictionaryDto.CalculateCacheKey(null, eventData.Entity.Code)); + } + } +} \ No newline at end of file diff --git a/aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain/DataDictionaries/DataDictionaryManager.cs b/aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain/DataDictionaries/DataDictionaryManager.cs index f435224a..39248d69 100644 --- a/aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain/DataDictionaries/DataDictionaryManager.cs +++ b/aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain/DataDictionaries/DataDictionaryManager.cs @@ -3,43 +3,58 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using CompanyName.ProjectName.DataDictionaryManagement.DataDictionaries.Aggregates; +using CompanyName.ProjectName.DataDictionaryManagement.DataDictionaries.Dto; using CompanyName.ProjectName.DataDictionaryManagement.DataDictionaries.Exceptions; +using Volo.Abp.Caching; using Volo.Abp.Domain.Services; namespace CompanyName.ProjectName.DataDictionaryManagement.DataDictionaries { - public class DataDictionaryManager : DataDictionaryDomainService + public class DataDictionaryManager : DataDictionaryDomainService { private readonly IDataDictionaryRepository _dataDictionaryRepository; + private readonly IDistributedCache _cache; - public DataDictionaryManager(IDataDictionaryRepository dataDictionaryRepository) + public DataDictionaryManager( + IDataDictionaryRepository dataDictionaryRepository, + IDistributedCache cache) { _dataDictionaryRepository = dataDictionaryRepository; + _cache = cache; } - public Task FindByIdAsync( + public async Task FindByIdAsync( Guid id, bool includeDetails = true, CancellationToken cancellationToken = default) { - return _dataDictionaryRepository.FindByIdAsync(id, includeDetails, cancellationToken); + var cacheKey = DataDictionaryDto.CalculateCacheKey(id, null); + return await _cache.GetOrAddAsync(cacheKey, + async () => + { + var entity = + await _dataDictionaryRepository.FindByIdAsync(id, includeDetails, + cancellationToken); + return ObjectMapper.Map(entity); + }, token: cancellationToken); } - public Task FindByCodeAsync( + public async Task FindByCodeAsync( string code, bool includeDetails = true, CancellationToken cancellationToken = default) { - return _dataDictionaryRepository.FindByCodeAsync(code, includeDetails, cancellationToken); + var cacheKey = DataDictionaryDto.CalculateCacheKey(null, code); + return await _cache.GetOrAddAsync(cacheKey, + async () => + { + var entity = + await _dataDictionaryRepository.FindByCodeAsync(code, includeDetails, + cancellationToken); + return ObjectMapper.Map(entity); + }, token: cancellationToken); } - public Task FindByDisplayTextAsync( - string displayText, - bool includeDetails = true, - CancellationToken cancellationToken = default) - { - return _dataDictionaryRepository.FindByDisplayTextAsync(displayText, includeDetails, cancellationToken); - } /// /// 创建字典类型 @@ -62,7 +77,8 @@ namespace CompanyName.ProjectName.DataDictionaryManagement.DataDictionaries /// /// /// - public async Task CreateDetailAsync(Guid dataDictionaryId, string code, string displayText, + public async Task CreateDetailAsync(Guid dataDictionaryId, string code, + string displayText, string description, int order) { @@ -81,7 +97,8 @@ namespace CompanyName.ProjectName.DataDictionaryManagement.DataDictionaries /// /// 设置字典明细状态 /// - public async Task SetStatus(Guid dataDictionaryId, Guid dataDictionayDetailId, bool isEnabled) + public async Task SetStatus(Guid dataDictionaryId, + Guid dataDictionayDetailId, bool isEnabled) { var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId); if (entity == null) diff --git a/aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain/DataDictionaryDomainAutoMapperProfile.cs b/aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain/DataDictionaryDomainAutoMapperProfile.cs new file mode 100644 index 00000000..e967d88c --- /dev/null +++ b/aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain/DataDictionaryDomainAutoMapperProfile.cs @@ -0,0 +1,15 @@ +using AutoMapper; +using CompanyName.ProjectName.DataDictionaryManagement.DataDictionaries.Aggregates; +using CompanyName.ProjectName.DataDictionaryManagement.DataDictionaries.Dto; + +namespace CompanyName.ProjectName.DataDictionaryManagement +{ + public class DataDictionaryDomainAutoMapperProfile : Profile + { + public DataDictionaryDomainAutoMapperProfile() + { + CreateMap(); + CreateMap(); + } + } +} \ No newline at end of file diff --git a/aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain/DataDictionaryManagementDomainModule.cs b/aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain/DataDictionaryManagementDomainModule.cs index 0cc1c567..abd53759 100644 --- a/aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain/DataDictionaryManagementDomainModule.cs +++ b/aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain/DataDictionaryManagementDomainModule.cs @@ -1,11 +1,15 @@ -using Volo.Abp.Domain; +using Volo.Abp.AutoMapper; +using Volo.Abp.Caching; +using Volo.Abp.Domain; using Volo.Abp.Modularity; namespace CompanyName.ProjectName.DataDictionaryManagement { [DependsOn( typeof(AbpDddDomainModule), - typeof(DataDictionaryManagementDomainSharedModule) + typeof(DataDictionaryManagementDomainSharedModule), + typeof(AbpCachingModule), + typeof(AbpAutoMapperModule) )] public class DataDictionaryManagementDomainModule : AbpModule { diff --git a/aspnet-core/modules/DataDictionaryManagement/test/CompanyName.ProjectName.DataDictionaryManagement.Domain.Tests/DataDictionaries/DataDictionaryManager_Tests.cs b/aspnet-core/modules/DataDictionaryManagement/test/CompanyName.ProjectName.DataDictionaryManagement.Domain.Tests/DataDictionaries/DataDictionaryManager_Tests.cs index 33628ef4..11ffc118 100644 --- a/aspnet-core/modules/DataDictionaryManagement/test/CompanyName.ProjectName.DataDictionaryManagement.Domain.Tests/DataDictionaries/DataDictionaryManager_Tests.cs +++ b/aspnet-core/modules/DataDictionaryManagement/test/CompanyName.ProjectName.DataDictionaryManagement.Domain.Tests/DataDictionaries/DataDictionaryManager_Tests.cs @@ -26,10 +26,7 @@ namespace CompanyName.ProjectName.DataDictionaryManagement.DataDictionaries entity.Details.Count.ShouldBe(3); entity.Details.FirstOrDefault(e => e.Code == "None").IsEnabled.ShouldBeFalse(); - var noDetailEntity = - await _dataDictionaryManager.FindByIdAsync(DataDictionaryManagementConsts.SeedDataDictionaryId, - false); - noDetailEntity.Details.Count.ShouldBe(0); + } [Fact] @@ -38,20 +35,7 @@ namespace CompanyName.ProjectName.DataDictionaryManagement.DataDictionaries var entity = await _dataDictionaryManager.FindByCodeAsync("Gender", true); entity.DisplayText.ShouldBe("性别"); entity.Details.Count.ShouldBe(3); - entity.Details.FirstOrDefault(e => e.Code == "None").IsEnabled.ShouldBeFalse(); - var noDetailEntity = await _dataDictionaryManager.FindByCodeAsync("Gender", false); - noDetailEntity.Details.Count.ShouldBe(0); - } - - [Fact] - public async Task Test_FindByDisplayTextAsync_Ok() - { - var entity = await _dataDictionaryManager.FindByDisplayTextAsync("性别", true); - entity.Code.ShouldBe("Gender"); - entity.Details.Count.ShouldBe(3); - entity.Details.FirstOrDefault(e => e.Code == "None").IsEnabled.ShouldBeFalse(); - var noDetailEntity = await _dataDictionaryManager.FindByDisplayTextAsync("性别", false); - noDetailEntity.Details.Count.ShouldBe(0); + } [Fact] diff --git a/aspnet-core/modules/DataDictionaryManagement/test/CompanyName.ProjectName.DataDictionaryManagement.Domain.Tests/DataDictionaryManagementDomainTestModule.cs b/aspnet-core/modules/DataDictionaryManagement/test/CompanyName.ProjectName.DataDictionaryManagement.Domain.Tests/DataDictionaryManagementDomainTestModule.cs index 8d166d45..7cff3a84 100644 --- a/aspnet-core/modules/DataDictionaryManagement/test/CompanyName.ProjectName.DataDictionaryManagement.Domain.Tests/DataDictionaryManagementDomainTestModule.cs +++ b/aspnet-core/modules/DataDictionaryManagement/test/CompanyName.ProjectName.DataDictionaryManagement.Domain.Tests/DataDictionaryManagementDomainTestModule.cs @@ -1,4 +1,5 @@ using CompanyName.ProjectName.DataDictionaryManagement.EntityFrameworkCore; +using Volo.Abp.AutoMapper; using Volo.Abp.Modularity; namespace CompanyName.ProjectName.DataDictionaryManagement @@ -12,6 +13,12 @@ namespace CompanyName.ProjectName.DataDictionaryManagement )] public class DataDictionaryManagementDomainTestModule : AbpModule { - + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.AddMaps(validate: true); + }); + } } } diff --git a/aspnet-core/modules/DataDictionaryManagement/test/CompanyName.ProjectName.DataDictionaryManagement.EntityFrameworkCore.Tests/CompanyName.ProjectName.DataDictionaryManagement.EntityFrameworkCore.Tests.csproj b/aspnet-core/modules/DataDictionaryManagement/test/CompanyName.ProjectName.DataDictionaryManagement.EntityFrameworkCore.Tests/CompanyName.ProjectName.DataDictionaryManagement.EntityFrameworkCore.Tests.csproj index 450da3eb..aa669b5f 100644 --- a/aspnet-core/modules/DataDictionaryManagement/test/CompanyName.ProjectName.DataDictionaryManagement.EntityFrameworkCore.Tests/CompanyName.ProjectName.DataDictionaryManagement.EntityFrameworkCore.Tests.csproj +++ b/aspnet-core/modules/DataDictionaryManagement/test/CompanyName.ProjectName.DataDictionaryManagement.EntityFrameworkCore.Tests/CompanyName.ProjectName.DataDictionaryManagement.EntityFrameworkCore.Tests.csproj @@ -1,7 +1,6 @@ - + - net5.0 CompanyName.ProjectName.DataDictionaryManagement