Skip to content

Commit 4bc12ae

Browse files
ArgoZhangcm0201
andauthored
refactor(ILookup): add GetItemsAsync extension method (#4979)
* refactor: 增加 ILookup 扩展方法 GetItemsAsync * refactor: 使用扩展方法精简代码 * refactor: 利用扩展方法精简代码 * chore: bump version 9.2.0-beta02 Co-Authored-By: HUGO.CM <[email protected]> * chore: bump version 9.2.0-beta03 * refactor: Select 组件继承 ILooup * refactor: 合并扩展方法 * refactor: 继承 ILookup 接口 * refactor: 移除不使用的方法 * refactor: 调整接口实现类 * test: 增加单元测试 * refactor: 移动扩展方法 --------- Co-authored-by: HUGO.CM <[email protected]>
1 parent f25b5b9 commit 4bc12ae

File tree

8 files changed

+83
-105
lines changed

8 files changed

+83
-105
lines changed

src/BootstrapBlazor/Components/Display/Display.razor.cs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ protected override async Task OnParametersSetAsync()
8585
{
8686
await base.OnParametersSetAsync();
8787

88+
_lookupData = null;
8889
_displayText = await FormatDisplayText(Value);
8990
}
9091

@@ -169,14 +170,10 @@ private static string GetTextByValue(IEnumerable<SelectedItem> lookup, TValue va
169170
}));
170171
}
171172

173+
private IEnumerable<SelectedItem>? _lookupData;
172174
private async Task<IEnumerable<SelectedItem>?> GetLookup()
173175
{
174-
if (Lookup != null)
175-
{
176-
return Lookup;
177-
}
178-
179-
var lookupService = this.GetLookupService(InjectLookupService);
180-
return await lookupService.GetItemsAsync(LookupServiceKey, LookupServiceData);
176+
_lookupData ??= await this.GetItemsAsync(InjectLookupService, LookupServiceKey, LookupServiceData);
177+
return _lookupData;
181178
}
182179
}

src/BootstrapBlazor/Components/Filters/LookupFilter.razor.cs

Lines changed: 9 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -10,40 +10,36 @@ namespace BootstrapBlazor.Components;
1010
/// <summary>
1111
/// 枚举类型过滤组件
1212
/// </summary>
13-
public partial class LookupFilter
13+
public partial class LookupFilter : ILookup
1414
{
1515
private string? Value { get; set; }
1616

1717
/// <summary>
18-
/// 获得/设置 相关枚举类型
18+
/// <inheritdoc/>
1919
/// </summary>
2020
[Parameter]
21-
[NotNull]
2221
public IEnumerable<SelectedItem>? Lookup { get; set; }
2322

2423
/// <summary>
25-
/// 获得/设置 <see cref="ILookupService"/> 服务实例
24+
/// <inheritdoc/>
2625
/// </summary>
2726
[Parameter]
28-
[NotNull]
2927
public ILookupService? LookupService { get; set; }
3028

3129
/// <summary>
32-
/// 获得/设置 <see cref="ILookupService"/> 服务获取 Lookup 数据集合键值 常用于外键自动转换为名称操作,可以通过 <see cref="LookupServiceData"/> 传递自定义数据
30+
/// <inheritdoc/>
3331
/// </summary>
3432
[Parameter]
35-
[NotNull]
3633
public string? LookupServiceKey { get; set; }
3734

3835
/// <summary>
39-
/// 获得/设置 <see cref="ILookupService"/> 服务获取 Lookup 数据集合键值自定义数据,通过 <see cref="LookupServiceKey"/> 指定键值
36+
/// <inheritdoc/>
4037
/// </summary>
4138
[Parameter]
42-
[NotNull]
4339
public object? LookupServiceData { get; set; }
4440

4541
/// <summary>
46-
/// 获得/设置 字典数据源字符串比较规则 默认 StringComparison.OrdinalIgnoreCase 大小写不敏感
42+
/// <inheritdoc/>
4743
/// </summary>
4844
[Parameter]
4945
public StringComparison LookupStringComparison { get; set; } = StringComparison.OrdinalIgnoreCase;
@@ -99,24 +95,14 @@ protected override async Task OnParametersSetAsync()
9995
{
10096
new("", Localizer["EnumFilter.AllText"].Value)
10197
};
102-
if (Lookup != null)
98+
var lookup = await this.GetItemsAsync(InjectLookupService, LookupServiceKey, LookupServiceData);
99+
if (lookup != null)
103100
{
104-
items.AddRange(Lookup);
105-
}
106-
else if (!string.IsNullOrEmpty(LookupServiceKey))
107-
{
108-
var lookupService = GetLookupService();
109-
var lookup = await lookupService.GetItemsAsync(LookupServiceKey, LookupServiceData);
110-
if (lookup != null)
111-
{
112-
items.AddRange(lookup);
113-
}
101+
items.AddRange(lookup);
114102
}
115103
Items = items;
116104
}
117105

118-
private ILookupService GetLookupService() => LookupService ?? InjectLookupService;
119-
120106
/// <summary>
121107
/// <inheritdoc/>
122108
/// </summary>

src/BootstrapBlazor/Components/Select/Select.razor.cs

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ namespace BootstrapBlazor.Components;
1212
/// Select 组件实现类
1313
/// </summary>
1414
/// <typeparam name="TValue"></typeparam>
15-
public partial class Select<TValue> : ISelect
15+
public partial class Select<TValue> : ISelect, ILookup
1616
{
1717
[Inject]
1818
[NotNull]
@@ -214,23 +214,33 @@ public partial class Select<TValue> : ISelect
214214
public string? SwalFooter { get; set; }
215215

216216
/// <summary>
217-
/// 获得/设置 <see cref="ILookupService"/> 服务实例
217+
/// <inheritdoc/>
218218
/// </summary>
219219
[Parameter]
220220
public ILookupService? LookupService { get; set; }
221221

222222
/// <summary>
223-
/// 获得/设置 <see cref="ILookupService"/> 服务获取 Lookup 数据集合键值 常用于外键自动转换为名称操作,可以通过 <see cref="LookupServiceData"/> 传递自定义数据
223+
/// <inheritdoc/>
224224
/// </summary>
225225
[Parameter]
226226
public string? LookupServiceKey { get; set; }
227227

228228
/// <summary>
229-
/// 获得/设置 <see cref="ILookupService"/> 服务获取 Lookup 数据集合键值自定义数据,通过 <see cref="LookupServiceKey"/> 指定键值
229+
/// <inheritdoc/>
230230
/// </summary>
231231
[Parameter]
232232
public object? LookupServiceData { get; set; }
233233

234+
/// <summary>
235+
/// <inheritdoc/>
236+
/// </summary>
237+
IEnumerable<SelectedItem>? ILookup.Lookup { get; set; }
238+
239+
/// <summary>
240+
/// <inheritdoc/>
241+
/// </summary>
242+
StringComparison ILookup.LookupStringComparison { get; set; }
243+
234244
[Inject]
235245
[NotNull]
236246
private IStringLocalizer<Select<TValue>>? Localizer { get; set; }
@@ -347,7 +357,7 @@ protected override async Task OnParametersSetAsync()
347357
{
348358
await base.OnParametersSetAsync();
349359

350-
Items ??= await GetItemsAsync();
360+
Items ??= await this.GetItemsAsync(InjectLookupService, LookupServiceKey, LookupServiceData) ?? [];
351361

352362
// 内置对枚举类型的支持
353363
if (!Items.Any() && ValueType.IsEnum())
@@ -375,18 +385,6 @@ protected override async Task OnAfterRenderAsync(bool firstRender)
375385
}
376386
}
377387

378-
private async Task<IEnumerable<SelectedItem>> GetItemsAsync()
379-
{
380-
IEnumerable<SelectedItem>? items = null;
381-
if (!string.IsNullOrEmpty(LookupServiceKey))
382-
{
383-
items = await GetLookupService().GetItemsAsync(LookupServiceKey, LookupServiceData);
384-
}
385-
return items ?? [];
386-
}
387-
388-
private ILookupService GetLookupService() => LookupService ?? InjectLookupService;
389-
390388
/// <summary>
391389
/// 获得/设置 数据总条目
392390
/// </summary>

src/BootstrapBlazor/Components/Table/LookupContent.cs

Lines changed: 10 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -7,38 +7,37 @@
77

88
namespace BootstrapBlazor.Components;
99

10-
internal class LookupContent : ComponentBase
10+
internal class LookupContent : ComponentBase, ILookup
1111
{
1212
/// <summary>
13-
/// 获得/设置 <see cref="ILookupService"/> 服务实例
13+
/// <inheritdoc/>
1414
/// </summary>
1515
[Parameter]
1616
public IEnumerable<SelectedItem>? Lookup { get; set; }
1717

1818
/// <summary>
19-
/// 获得/设置 <see cref="ILookupService"/> 服务实例
19+
/// <inheritdoc/>
2020
/// </summary>
2121
[Parameter]
2222
public ILookupService? LookupService { get; set; }
2323

2424
/// <summary>
25-
/// 获得/设置 <see cref="ILookupService"/> 服务获取 Lookup 数据集合键值 常用于外键自动转换为名称操作,可以通过 <see cref="LookupServiceData"/> 传递自定义数据
25+
/// <inheritdoc/>
2626
/// </summary>
2727
[Parameter]
28-
[EditorRequired]
2928
public string? LookupServiceKey { get; set; }
3029

3130
/// <summary>
32-
/// 获得/设置 <see cref="ILookupService"/> 服务获取 Lookup 数据集合键值自定义数据,通过 <see cref="LookupServiceKey"/> 指定键值
31+
/// <inheritdoc/>
3332
/// </summary>
3433
[Parameter]
3534
public object? LookupServiceData { get; set; }
3635

3736
/// <summary>
38-
/// 获得/设置 字典数据源字符串比较规则 默认 <see cref="StringComparison.OrdinalIgnoreCase" /> 大小写不敏感
37+
/// <inheritdoc/>
3938
/// </summary>
4039
[Parameter]
41-
public StringComparison LookupStringComparison { get; set; }
40+
public StringComparison LookupStringComparison { get; set; } = StringComparison.OrdinalIgnoreCase;
4241

4342
/// <summary>
4443
/// 获得/设置 显示值
@@ -52,7 +51,7 @@ internal class LookupContent : ComponentBase
5251

5352
private string? _content;
5453

55-
private List<SelectedItem>? _items;
54+
private IEnumerable<SelectedItem>? _items;
5655

5756
/// <summary>
5857
/// <inheritdoc/>
@@ -62,8 +61,8 @@ protected override async Task OnParametersSetAsync()
6261
{
6362
await base.OnParametersSetAsync();
6463

65-
_items ??= await GetLookupItemsAsync();
66-
var item = _items.Find(i => i.Value.Equals(Value, LookupStringComparison));
64+
_items ??= await this.GetItemsAsync(InjectLookupService, LookupServiceKey, LookupServiceData) ?? [];
65+
var item = _items.FirstOrDefault(i => i.Value.Equals(Value, LookupStringComparison));
6766
_content = item?.Text ?? Value;
6867
}
6968

@@ -78,19 +77,4 @@ protected override void BuildRenderTree(RenderTreeBuilder builder)
7877
builder.AddContent(0, _content);
7978
}
8079
}
81-
82-
private async Task<List<SelectedItem>> GetLookupItemsAsync()
83-
{
84-
IEnumerable<SelectedItem>? items;
85-
if (Lookup != null)
86-
{
87-
items = Lookup;
88-
}
89-
else
90-
{
91-
var lookupService = LookupService ?? InjectLookupService;
92-
items = await lookupService.GetItemsAsync(LookupServiceKey, LookupServiceData);
93-
}
94-
return items?.ToList() ?? [];
95-
}
9680
}

src/BootstrapBlazor/Extensions/IEditorItemExtensions.cs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,6 @@ namespace BootstrapBlazor.Components;
1212
/// </summary>
1313
public static class IEditorItemExtensions
1414
{
15-
/// <summary>
16-
/// 判断当前 IEditorItem 实例是否为 Lookup 类型
17-
/// </summary>
18-
/// <param name="item"></param>
19-
/// <returns></returns>
20-
public static bool IsLookup(this IEditorItem item) => item.Lookup != null || !string.IsNullOrEmpty(item.LookupServiceKey);
21-
2215
/// <summary>
2316
/// 判断当前 IEditorItem 实例是否可以编辑
2417
/// </summary>

src/BootstrapBlazor/Extensions/ILookupServiceExtensions.cs

Lines changed: 0 additions & 23 deletions
This file was deleted.

src/BootstrapBlazor/Extensions/ILooupExtensions.cs

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,39 @@ namespace BootstrapBlazor.Components;
1010
/// </summary>
1111
public static class ILooupExtensions
1212
{
13+
/// <summary>
14+
/// 判断当前 <see cref="ILookup"/> 实例是否配置 Lookup 数据
15+
/// </summary>
16+
/// <param name="lookup"></param>
17+
/// <returns></returns>
18+
public static bool IsLookup(this ILookup lookup) => lookup.Lookup != null || !string.IsNullOrEmpty(lookup.LookupServiceKey);
19+
1320
/// <summary>
1421
/// 获得 ILookupService 实例
1522
/// </summary>
16-
/// <param name="item"></param>
23+
/// <param name="lookup"></param>
24+
/// <param name="service"></param>
25+
/// <returns></returns>
26+
public static ILookupService GetLookupService(this ILookup lookup, ILookupService service) => lookup.LookupService ?? service;
27+
28+
/// <summary>
29+
///
30+
/// </summary>
31+
/// <param name="lookup"></param>
32+
/// <param name="service"></param>
33+
/// <param name="key"></param>
34+
/// <param name="data"></param>
35+
/// <returns></returns>
36+
public static async Task<IEnumerable<SelectedItem>?> GetItemsAsync(this ILookup lookup, ILookupService service, string? key, object? data) => lookup.Lookup ?? await lookup.GetLookupService(service).GetItemsAsync(key, data);
37+
38+
/// <summary>
39+
/// 根据指定键值获取 Lookup 集合扩展方法,先调用同步方法,如果返回 null 则调用异步方法
40+
/// </summary>
1741
/// <param name="service"></param>
42+
/// <param name="key"></param>
43+
/// <param name="data"></param>
1844
/// <returns></returns>
19-
public static ILookupService GetLookupService(this ILookup item, ILookupService service) => item.LookupService ?? service;
45+
public static async Task<IEnumerable<SelectedItem>?> GetItemsAsync(this ILookupService service, string? key, object? data) => string.IsNullOrEmpty(key)
46+
? null
47+
: service.GetItemsByKey(key, data) ?? await service.GetItemsByKeyAsync(key, data);
2048
}

test/UnitTest/Components/SelectTest.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,21 @@ public void LookupService_Ok()
118118
Assert.Equal(2, cut.Instance.Items.Count());
119119
}
120120

121+
[Fact]
122+
public void Select_Lookup()
123+
{
124+
var cut = Context.RenderComponent<Select<string>>(pb =>
125+
{
126+
pb.Add(a => a.LookupServiceKey, "FooLookup");
127+
});
128+
ILookup lookup = cut.Instance;
129+
lookup.Lookup = [new SelectedItem("", "test")];
130+
Assert.Single(lookup.Lookup);
131+
132+
lookup.LookupStringComparison = StringComparison.Ordinal;
133+
Assert.Equal(StringComparison.Ordinal, lookup.LookupStringComparison);
134+
}
135+
121136
[Fact]
122137
public void IsClearable_Ok()
123138
{

0 commit comments

Comments
 (0)