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. 5
      aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/DefaultLocalizationStore.cs
  2. 11
      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

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

@ -12,6 +12,11 @@ namespace LINGYUN.Abp.Localization.Dynamic
{ {
} }
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) public Task<List<LanguageInfo>> GetLanguageListAsync(CancellationToken cancellationToken = default)
{ {
return Task.FromResult(new List<LanguageInfo>()); return Task.FromResult(new List<LanguageInfo>());

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

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

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( Task<Dictionary<string, ILocalizationDictionary>> GetLocalizationDictionaryAsync(
string resourceName, string resourceName,
CancellationToken cancellationToken = default); 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( Task<List<Text>> GetListAsync(
string resourceName, string resourceName = null,
CancellationToken cancellationToken = default); CancellationToken cancellationToken = default);
Task<List<Text>> GetListAsync( 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; ResourceRepository = resourceRepository;
} }
public virtual async Task<List<LanguageInfo>> GetLanguageListAsync( public async virtual Task<List<LanguageInfo>> GetLanguageListAsync(
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
var languages = await LanguageRepository.GetActivedListAsync(cancellationToken); var languages = await LanguageRepository.GetActivedListAsync(cancellationToken);
@ -41,7 +41,7 @@ namespace LINGYUN.Abp.LocalizationManagement
.ToList(); .ToList();
} }
public virtual async Task<Dictionary<string, ILocalizationDictionary>> GetLocalizationDictionaryAsync( public async virtual Task<Dictionary<string, ILocalizationDictionary>> GetLocalizationDictionaryAsync(
string resourceName, string resourceName,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
@ -78,7 +78,40 @@ namespace LINGYUN.Abp.LocalizationManagement
return dictionaries; 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); 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( public virtual async Task<List<Text>> GetListAsync(
string resourceName, string resourceName = null,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
var languages = (await GetDbContextAsync()).Set<Language>(); 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(); var texts = await GetDbSetAsync();
return await (from txts in texts return await (from txts in texts
join r in resources
on txts.ResourceName equals r.Name
join lg in languages join lg in languages
on txts.CultureName equals lg.CultureName on txts.CultureName equals lg.CultureName
where txts.ResourceName.Equals(resourceName) && where r.Enable && lg.Enable
lg.Enable
select txts) select txts)
.ToListAsync(GetCancellationToken(cancellationToken)); .ToListAsync(GetCancellationToken(cancellationToken));
} }

Loading…
Cancel
Save