Browse Source

数据字典模块添加缓存

pull/10/head
王军 4 years ago
parent
commit
62b48bfa4b
  1. 1
      aspnet-core/common.props
  2. 0
      aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain.Shared/DataDictionaries/DataDictionaryDomainException.cs
  3. 40
      aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain.Shared/DataDictionaries/Dto/DataDictionaryDetailDto.cs
  4. 50
      aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain.Shared/DataDictionaries/Dto/DataDictionaryDto.cs
  5. 2
      aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain/CompanyName.ProjectName.DataDictionaryManagement.Domain.csproj
  6. 32
      aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain/DataDictionaries/Caches/DataDictionaryCacheItemInvalidato.cs
  7. 47
      aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain/DataDictionaries/DataDictionaryManager.cs
  8. 15
      aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain/DataDictionaryDomainAutoMapperProfile.cs
  9. 8
      aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain/DataDictionaryManagementDomainModule.cs
  10. 20
      aspnet-core/modules/DataDictionaryManagement/test/CompanyName.ProjectName.DataDictionaryManagement.Domain.Tests/DataDictionaries/DataDictionaryManager_Tests.cs
  11. 9
      aspnet-core/modules/DataDictionaryManagement/test/CompanyName.ProjectName.DataDictionaryManagement.Domain.Tests/DataDictionaryManagementDomainTestModule.cs
  12. 3
      aspnet-core/modules/DataDictionaryManagement/test/CompanyName.ProjectName.DataDictionaryManagement.EntityFrameworkCore.Tests/CompanyName.ProjectName.DataDictionaryManagement.EntityFrameworkCore.Tests.csproj

1
aspnet-core/common.props

@ -5,6 +5,5 @@
<NoWarn>$(NoWarn);CS1591;CS0436</NoWarn>
<AbpProjectType>app</AbpProjectType>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<AbpPackageVersion1>4.4.0</AbpPackageVersion1>
</PropertyGroup>
</Project>

0
aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain/DataDictionaries/Exceptions/DataDictionaryDomainException.cs → aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain.Shared/DataDictionaries/DataDictionaryDomainException.cs

40
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; }
/// <summary>
/// 所属字典Id
/// </summary>
public Guid DataDictionaryId { get; set; }
/// <summary>
/// 字典明细编码
/// </summary>
public string Code { get; set; }
/// <summary>
/// 展现列表时排序用
/// </summary>
public int Order { get; set; }
/// <summary>
/// 英文显示名
/// </summary>
public string DisplayText { get; set; }
/// <summary>
/// 描述
/// </summary>
public string Description { get; set; }
/// <summary>
/// 启/停用(默认启用)
/// </summary>
public bool IsEnabled { get; set; }
}
}

50
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; }
/// <summary>
/// 租户id
/// </summary>
public Guid? TenantId { get; set; }
/// <summary>
/// 字典编码
/// </summary>
public string Code { get; set; }
/// <summary>
/// 显示名
/// </summary>
public string DisplayText { get; set; }
/// <summary>
/// 描述
/// </summary>
public string Description { get; set; }
/// <summary>
/// 字典明细集合
/// </summary>
public List<DataDictionaryDetailDto> Details { get; set; }
public DataDictionaryDto()
{
Details = new List<DataDictionaryDetailDto>();
}
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));
}
}
}

2
aspnet-core/modules/DataDictionaryManagement/src/CompanyName.ProjectName.DataDictionaryManagement.Domain/CompanyName.ProjectName.DataDictionaryManagement.Domain.csproj

@ -9,7 +9,7 @@
<ItemGroup>
<PackageReference Include="Volo.Abp.Ddd.Domain" Version="$(AbpPackageVersion)" />
<PackageReference Include="Volo.Abp.Caching" Version="4.4.0" />
<ProjectReference Include="..\CompanyName.ProjectName.DataDictionaryManagement.Domain.Shared\CompanyName.ProjectName.DataDictionaryManagement.Domain.Shared.csproj" />
</ItemGroup>

32
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<EntityChangedEventData<DataDictionary>>,
ITransientDependency
{
private readonly IDistributedCache<DataDictionaryDto> _cache;
public DataDictionaryCacheItemInvalidator(IDistributedCache<DataDictionaryDto> cache)
{
_cache = cache;
}
public async Task HandleEventAsync(EntityChangedEventData<DataDictionary> 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));
}
}
}

47
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<DataDictionaryDto> _cache;
public DataDictionaryManager(IDataDictionaryRepository dataDictionaryRepository)
public DataDictionaryManager(
IDataDictionaryRepository dataDictionaryRepository,
IDistributedCache<DataDictionaryDto> cache)
{
_dataDictionaryRepository = dataDictionaryRepository;
_cache = cache;
}
public Task<DataDictionary> FindByIdAsync(
public async Task<DataDictionaryDto> 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<DataDictionary, DataDictionaryDto>(entity);
}, token: cancellationToken);
}
public Task<DataDictionary> FindByCodeAsync(
public async Task<DataDictionaryDto> 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<DataDictionary, DataDictionaryDto>(entity);
}, token: cancellationToken);
}
public Task<DataDictionary> FindByDisplayTextAsync(
string displayText,
bool includeDetails = true,
CancellationToken cancellationToken = default)
{
return _dataDictionaryRepository.FindByDisplayTextAsync(displayText, includeDetails, cancellationToken);
}
/// <summary>
/// 创建字典类型
@ -62,7 +77,8 @@ namespace CompanyName.ProjectName.DataDictionaryManagement.DataDictionaries
/// <param name="description"></param>
/// <param name="order"></param>
/// <exception cref="DataDictionaryDomainException"></exception>
public async Task<DataDictionary> CreateDetailAsync(Guid dataDictionaryId, string code, string displayText,
public async Task<DataDictionary> CreateDetailAsync(Guid dataDictionaryId, string code,
string displayText,
string description,
int order)
{
@ -81,7 +97,8 @@ namespace CompanyName.ProjectName.DataDictionaryManagement.DataDictionaries
/// <summary>
/// 设置字典明细状态
/// </summary>
public async Task<DataDictionary> SetStatus(Guid dataDictionaryId, Guid dataDictionayDetailId, bool isEnabled)
public async Task<DataDictionary> SetStatus(Guid dataDictionaryId,
Guid dataDictionayDetailId, bool isEnabled)
{
var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId);
if (entity == null)

15
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<DataDictionary, DataDictionaryDto>();
CreateMap<DataDictionaryDetail, DataDictionaryDetailDto>();
}
}
}

8
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
{

20
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]

9
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<AbpAutoMapperOptions>(options =>
{
options.AddMaps<DataDictionaryManagementDomainModule>(validate: true);
});
}
}
}

3
aspnet-core/modules/DataDictionaryManagement/test/CompanyName.ProjectName.DataDictionaryManagement.EntityFrameworkCore.Tests/CompanyName.ProjectName.DataDictionaryManagement.EntityFrameworkCore.Tests.csproj

@ -1,7 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="../../../../common.props" />
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<RootNamespace>CompanyName.ProjectName.DataDictionaryManagement</RootNamespace>

Loading…
Cancel
Save