|
3 | 3 | // See the LICENSE file in the project root for more information. |
4 | 4 | // Maintainer: Argo Zhang([email protected]) Website: https://www.blazor.zone |
5 | 5 |
|
| 6 | +using System.Collections.Concurrent; |
| 7 | + |
6 | 8 | namespace Microsoft.Extensions.DependencyInjection; |
7 | 9 |
|
8 | 10 | /// <summary> |
9 | 11 | /// 演示网站示例数据注入服务实现类 |
10 | 12 | /// </summary> |
11 | 13 | internal class DemoLookupService(IServiceProvider provider) : LookupServiceBase |
12 | 14 | { |
13 | | - private IServiceProvider Provider { get; } = provider; |
| 15 | + /// <summary> |
| 16 | + /// <inheritdoc/> |
| 17 | + /// </summary> |
| 18 | + /// <param name="key"></param> |
| 19 | + /// <param name="data"></param> |
| 20 | + /// <returns></returns> |
| 21 | + public override IEnumerable<SelectedItem>? GetItemsByKey(string? key, object? data) => null; |
| 22 | + |
| 23 | + private static readonly ConcurrentDictionary<string, List<SelectedItem>> _cache = []; |
14 | 24 |
|
15 | | - public override IEnumerable<SelectedItem>? GetItemsByKey(string? key, object? data) |
| 25 | + /// <summary> |
| 26 | + /// <inheritdoc/> |
| 27 | + /// </summary> |
| 28 | + /// <param name="key"></param> |
| 29 | + /// <param name="data"></param> |
| 30 | + /// <returns></returns> |
| 31 | + public override async Task<IEnumerable<SelectedItem>?> GetItemsByKeyAsync(string? key, object? data) |
16 | 32 | { |
17 | 33 | IEnumerable<SelectedItem>? items = null; |
18 | 34 | if (key == "Foo.Complete") |
19 | 35 | { |
20 | | - var localizer = Provider.GetRequiredService<IStringLocalizer<Foo>>(); |
21 | | - items = new List<SelectedItem>() |
| 36 | + // 使用缓存技术防止多次调用提高应用性能 |
| 37 | + if (_cache.TryGetValue(key, out var value)) |
22 | 38 | { |
23 | | - new() { Value = "True", Text = localizer["True"].Value }, |
24 | | - new() { Value = "False", Text = localizer["False"].Value } |
25 | | - }; |
| 39 | + items = value; |
| 40 | + } |
| 41 | + else |
| 42 | + { |
| 43 | + // 模拟异步延时实战中大概率从数据库中获得数据 |
| 44 | + await Task.Delay(1); |
| 45 | + |
| 46 | + var localizer = provider.GetRequiredService<IStringLocalizer<Foo>>(); |
| 47 | + var v = new List<SelectedItem>() |
| 48 | + { |
| 49 | + new() { Value = "True", Text = localizer["True"].Value }, |
| 50 | + new() { Value = "False", Text = localizer["False"].Value } |
| 51 | + }; |
| 52 | + _cache.TryAdd(key, v); |
| 53 | + items = v; |
| 54 | + } |
26 | 55 | } |
27 | 56 | return items; |
28 | 57 | } |
|
0 commit comments