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