Browse Source

Merge pull request #616 from colinin/5.3.0

feat: 动态本地化一次性查询,提高启动速度
pull/645/head
yx lin 4 years ago
committed by GitHub
parent
commit
6a59d2c77a
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 9
      aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/DefaultLocalizationStore.cs
  2. 13
      aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/DynamicLocalizationInitializeService.cs
  3. 6
      aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/ILocalizationStore.cs
  4. 2
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/ITextRepository.cs
  5. 39
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/LocalizationStore.cs
  6. 13
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore/LINGYUN/Abp/LocalizationManagement/EntityFrameworkCore/EfCoreTextRepository.cs

9
aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/DefaultLocalizationStore.cs

@ -10,8 +10,13 @@ namespace LINGYUN.Abp.Localization.Dynamic
{
public DefaultLocalizationStore()
{
}
}
public Task<Dictionary<string, Dictionary<string, ILocalizationDictionary>>> GetAllLocalizationDictionaryAsync(CancellationToken cancellationToken = default)
{
return Task.FromResult(new Dictionary<string, Dictionary<string, ILocalizationDictionary>>());
}
public Task<List<LanguageInfo>> GetLanguageListAsync(CancellationToken cancellationToken = default)
{
return Task.FromResult(new List<LanguageInfo>());

13
aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/DynamicLocalizationInitializeService.cs

@ -23,21 +23,22 @@ namespace LINGYUN.Abp.Localization.Dynamic
LocalizationOptions = localizationOptions.Value;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
protected async override Task ExecuteAsync(CancellationToken stoppingToken)
{
try
{
var resourceTexts = await Store.GetAllLocalizationDictionaryAsync(stoppingToken);
foreach (var resource in LocalizationOptions.Resources)
{
foreach (var contributor in resource.Value.Contributors)
{
if (contributor.GetType().IsAssignableFrom(typeof(DynamicLocalizationResourceContributor)))
{
var resourceLocalizationDic = await Store
.GetLocalizationDictionaryAsync(
resource.Value.ResourceName,
stoppingToken);
DynamicOptions.AddOrUpdate(resource.Value.ResourceName, resourceLocalizationDic);
if (resourceTexts.TryGetValue(resource.Value.ResourceName, out var resourceLocalizationDic))
{
DynamicOptions.AddOrUpdate(resource.Value.ResourceName, resourceLocalizationDic);
}
}
}
}

6
aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/ILocalizationStore.cs

@ -32,5 +32,11 @@ namespace LINGYUN.Abp.Localization.Dynamic
Task<Dictionary<string, ILocalizationDictionary>> GetLocalizationDictionaryAsync(
string resourceName,
CancellationToken cancellationToken = default);
/// <summary>
/// 获取所有资源本地化字典
/// </summary>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<Dictionary<string, Dictionary<string, ILocalizationDictionary>>> GetAllLocalizationDictionaryAsync(CancellationToken cancellationToken = default);
}
}

2
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/ITextRepository.cs

@ -15,7 +15,7 @@ namespace LINGYUN.Abp.LocalizationManagement
);
Task<List<Text>> GetListAsync(
string resourceName,
string resourceName = null,
CancellationToken cancellationToken = default);
Task<List<Text>> GetListAsync(

39
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/LocalizationStore.cs

@ -31,7 +31,7 @@ namespace LINGYUN.Abp.LocalizationManagement
ResourceRepository = resourceRepository;
}
public virtual async Task<List<LanguageInfo>> GetLanguageListAsync(
public async virtual Task<List<LanguageInfo>> GetLanguageListAsync(
CancellationToken cancellationToken = default)
{
var languages = await LanguageRepository.GetActivedListAsync(cancellationToken);
@ -41,7 +41,7 @@ namespace LINGYUN.Abp.LocalizationManagement
.ToList();
}
public virtual async Task<Dictionary<string, ILocalizationDictionary>> GetLocalizationDictionaryAsync(
public async virtual Task<Dictionary<string, ILocalizationDictionary>> GetLocalizationDictionaryAsync(
string resourceName,
CancellationToken cancellationToken = default)
{
@ -78,7 +78,40 @@ namespace LINGYUN.Abp.LocalizationManagement
return dictionaries;
}
public virtual async Task<bool> ResourceExistsAsync(string resourceName, CancellationToken cancellationToken = default)
public async virtual Task<Dictionary<string, Dictionary<string, ILocalizationDictionary>>> GetAllLocalizationDictionaryAsync(CancellationToken cancellationToken = default)
{
var result = new Dictionary<string, Dictionary<string, ILocalizationDictionary>>();
var textList = await TextRepository.GetListAsync(resourceName: null, cancellationToken: cancellationToken);
foreach (var resourcesGroup in textList.GroupBy(x => x.ResourceName))
{
var dictionaries = new Dictionary<string, ILocalizationDictionary>();
foreach (var textGroup in resourcesGroup.GroupBy(x => x.CultureName))
{
var cultureTextDictionaires = new Dictionary<string, LocalizedString>();
foreach (var text in textGroup)
{
// 本地化名称去重
if (!cultureTextDictionaires.ContainsKey(text.Key))
{
cultureTextDictionaires[text.Key] = new LocalizedString(text.Key, text.Value.NormalizeLineEndings());
}
}
// 本地化语言去重
if (!dictionaries.ContainsKey(textGroup.Key))
{
dictionaries[textGroup.Key] = new StaticLocalizationDictionary(textGroup.Key, cultureTextDictionaires);
}
}
result.Add(resourcesGroup.Key, dictionaries);
}
return result;
}
public async virtual Task<bool> ResourceExistsAsync(string resourceName, CancellationToken cancellationToken = default)
{
return await ResourceRepository.ExistsAsync(resourceName, cancellationToken);
}

13
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore/LINGYUN/Abp/LocalizationManagement/EntityFrameworkCore/EfCoreTextRepository.cs

@ -48,17 +48,24 @@ namespace LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore
}
public virtual async Task<List<Text>> GetListAsync(
string resourceName,
string resourceName = null,
CancellationToken cancellationToken = default)
{
var languages = (await GetDbContextAsync()).Set<Language>();
var resources = (IQueryable<Resource>)(await GetDbContextAsync()).Set<Resource>();
if (!resourceName.IsNullOrWhiteSpace())
{
resources = resources.Where(x => x.Name.Equals(resourceName));
}
var texts = await GetDbSetAsync();
return await (from txts in texts
join r in resources
on txts.ResourceName equals r.Name
join lg in languages
on txts.CultureName equals lg.CultureName
where txts.ResourceName.Equals(resourceName) &&
lg.Enable
where r.Enable && lg.Enable
select txts)
.ToListAsync(GetCancellationToken(cancellationToken));
}

Loading…
Cancel
Save