From 5a6fc88b45e5b00482f1624f7e74af2dbb2e9291 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sun, 26 Jan 2025 13:05:05 +0800 Subject: [PATCH 01/11] =?UTF-8?q?doc:=20=E6=9B=B4=E6=94=B9=E7=A4=BA?= =?UTF-8?q?=E4=BE=8B=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Samples/AutoFills.razor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BootstrapBlazor.Server/Components/Samples/AutoFills.razor.cs b/src/BootstrapBlazor.Server/Components/Samples/AutoFills.razor.cs index 872874a68da..2803d12ea49 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/AutoFills.razor.cs +++ b/src/BootstrapBlazor.Server/Components/Samples/AutoFills.razor.cs @@ -18,7 +18,7 @@ partial class AutoFills [NotNull] private Foo Model3 { get; set; } = new(); - private static string OnGetDisplayText(Foo foo) => foo.Name ?? ""; + private static string? OnGetDisplayText(Foo? foo) => foo?.Name; [NotNull] private IEnumerable? Items1 { get; set; } From 829d7c06e40b224977926f1339f83696745e4e1d Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sun, 26 Jan 2025 13:13:20 +0800 Subject: [PATCH 02/11] =?UTF-8?q?doc:=20=E5=A2=9E=E5=8A=A0=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E6=97=B6=E9=95=BF=E6=8F=8F=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Pages/CacaheExpiration.razor.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/BootstrapBlazor.Server/Components/Pages/CacaheExpiration.razor.cs b/src/BootstrapBlazor.Server/Components/Pages/CacaheExpiration.razor.cs index 19bf5e463e4..e21ecb08e2e 100644 --- a/src/BootstrapBlazor.Server/Components/Pages/CacaheExpiration.razor.cs +++ b/src/BootstrapBlazor.Server/Components/Pages/CacaheExpiration.razor.cs @@ -57,6 +57,14 @@ private async Task GetCacheEntryExpiration() { ExpirationTime = $"Token: {entry.ExpirationTokens.Count}"; } + else + { + ExpirationTime = "Not Set"; + } + } + else + { + ExpirationTime = "Not Found"; } } } From c8a5b52d93bcc5ff5568f6f3cf7bb79c21517d2b Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sun, 26 Jan 2025 16:49:13 +0800 Subject: [PATCH 03/11] =?UTF-8?q?refactor:=20=E6=9B=B4=E6=94=B9=20OnGetDis?= =?UTF-8?q?playText=20=E5=A2=9E=E5=8A=A0=E5=8F=AF=E4=B8=BA=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Components/AutoFill/AutoFill.razor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BootstrapBlazor/Components/AutoFill/AutoFill.razor.cs b/src/BootstrapBlazor/Components/AutoFill/AutoFill.razor.cs index 740562d17f5..11eff0e19e1 100644 --- a/src/BootstrapBlazor/Components/AutoFill/AutoFill.razor.cs +++ b/src/BootstrapBlazor/Components/AutoFill/AutoFill.razor.cs @@ -58,7 +58,7 @@ public partial class AutoFill /// [Parameter] [NotNull] - public Func? OnGetDisplayText { get; set; } + public Func? OnGetDisplayText { get; set; } /// /// 图标 From 5b5d5ad56475169af99df5907311cf953ed6ee07 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sun, 26 Jan 2025 16:49:35 +0800 Subject: [PATCH 04/11] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=20CacheMan?= =?UTF-8?q?ager=20=E4=BC=98=E5=8C=96=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Services/CacheManager.cs | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/BootstrapBlazor/Services/CacheManager.cs b/src/BootstrapBlazor/Services/CacheManager.cs index 4b7ba4ce2cc..bed6403e9c3 100644 --- a/src/BootstrapBlazor/Services/CacheManager.cs +++ b/src/BootstrapBlazor/Services/CacheManager.cs @@ -178,6 +178,10 @@ public IEnumerable Keys private MethodInfo? _allValuesMethodInfo = null; + private static readonly FieldInfo _coherentStateFieldInfo = typeof(MemoryCache).GetField("_coherentState", BindingFlags.Instance | BindingFlags.NonPublic)!; + + private static MethodInfo GetAllValuesMethodInfo(Type type) => type.GetMethod("GetAllValues", BindingFlags.Instance | BindingFlags.Public)!; + /// /// /// @@ -200,18 +204,10 @@ public bool TryGetCacheEntry(object? key, [NotNullWhen(true)] out ICacheEntry? e return entry != null; } - private static object GetCoherentState(MemoryCache cache) - { - var fieldInfo = cache.GetType().GetField("_coherentState", BindingFlags.Instance | BindingFlags.NonPublic)!; - return fieldInfo.GetValue(cache)!; - } - - private static MethodInfo GetAllValuesMethodInfo(object coherentStateInstance) => coherentStateInstance.GetType().GetMethod("GetAllValues", BindingFlags.Instance | BindingFlags.Public)!; - private List GetAllValues(MemoryCache cache) { - _coherentStateInstance ??= GetCoherentState(cache); - _allValuesMethodInfo ??= GetAllValuesMethodInfo(_coherentStateInstance); + _coherentStateInstance = _coherentStateFieldInfo.GetValue(cache)!; + _allValuesMethodInfo ??= GetAllValuesMethodInfo(_coherentStateInstance.GetType()); var ret = new List(); if (_allValuesMethodInfo.Invoke(_coherentStateInstance, null) is IEnumerable values) From 123d5b3eb39ca8db07475e92d3e595601c11224c Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sun, 26 Jan 2025 16:49:49 +0800 Subject: [PATCH 05/11] =?UTF-8?q?doc:=20=E6=9B=B4=E6=96=B0=E7=A4=BA?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Samples/InputGroups.razor | 2 +- .../Components/Samples/InputGroups.razor.cs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/BootstrapBlazor.Server/Components/Samples/InputGroups.razor b/src/BootstrapBlazor.Server/Components/Samples/InputGroups.razor index 8a7ab7e23c6..31a07fa37d6 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/InputGroups.razor +++ b/src/BootstrapBlazor.Server/Components/Samples/InputGroups.razor @@ -88,7 +88,7 @@
- +
diff --git a/src/BootstrapBlazor.Server/Components/Samples/InputGroups.razor.cs b/src/BootstrapBlazor.Server/Components/Samples/InputGroups.razor.cs index acee7641ea3..6f615df2348 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/InputGroups.razor.cs +++ b/src/BootstrapBlazor.Server/Components/Samples/InputGroups.razor.cs @@ -54,9 +54,9 @@ protected override void OnInitialized() private readonly IEnumerable Items = new SelectedItem[] { - new SelectedItem("", "请选择 ..."), - new SelectedItem("Beijing", "北京"), - new SelectedItem("Shanghai", "上海") + new("", "请选择 ..."), + new("Beijing", "北京"), + new("Shanghai", "上海") }; private string? GroupFormClassString => CssBuilder.Default("row g-3").AddClass("form-inline", FormRowType == RowType.Inline).Build(); From 107f6cae7738fb7d08e515f8ee0e6acf5be797a4 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sun, 26 Jan 2025 18:00:00 +0800 Subject: [PATCH 06/11] =?UTF-8?q?refactor:=20=E5=A2=9E=E5=8A=A0=E6=89=A9?= =?UTF-8?q?=E5=B1=95=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extensions/ICacheEntryExtensions.cs | 57 +++++++++++++++++++ .../Extensions/ICacheEntryExtensions.cs | 38 +++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 src/BootstrapBlazor.Server/Extensions/ICacheEntryExtensions.cs create mode 100644 src/BootstrapBlazor/Extensions/ICacheEntryExtensions.cs diff --git a/src/BootstrapBlazor.Server/Extensions/ICacheEntryExtensions.cs b/src/BootstrapBlazor.Server/Extensions/ICacheEntryExtensions.cs new file mode 100644 index 00000000000..1b77f129f8d --- /dev/null +++ b/src/BootstrapBlazor.Server/Extensions/ICacheEntryExtensions.cs @@ -0,0 +1,57 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the Apache 2.0 License +// See the LICENSE file in the project root for more information. +// Maintainer: Argo Zhang(argo@live.ca) Website: https://www.blazor.zone + +using Microsoft.Extensions.Caching.Memory; +using System.Reflection; + +namespace BootstrapBlazor.Server.Extensions; + +/// +/// 扩展方法 +/// +public static class ICacheEntryExtensions +{ + /// + /// 获取缓存项过期时间 + /// + /// + /// + public static string GetExpiration(this ICacheEntry entry) + { + string? ret; + if (entry.Priority == CacheItemPriority.NeverRemove) + { + ret = "Never Remove"; + } + else if (entry.SlidingExpiration.HasValue) + { + ret = $"Sliding: {entry.GetSlidingLeftTime().TotalSeconds:###}/{entry.SlidingExpiration.Value.TotalSeconds}"; + } + else if (entry.AbsoluteExpiration.HasValue) + { + ret = $"Absolute: {entry.AbsoluteExpiration.Value}"; + } + else if (entry.ExpirationTokens.Count != 0) + { + ret = $"Token: {entry.ExpirationTokens.Count}"; + } + else + { + ret = "Not Set"; + } + return ret; + } + + private static TimeSpan GetSlidingLeftTime(this ICacheEntry entry) + { + var ret = TimeSpan.Zero; + var lastAccessed = entry.GetLastAccessed(); + if (lastAccessed != null) + { + ret = entry.SlidingExpiration!.Value - (DateTime.UtcNow - lastAccessed.Value); + } + return ret; + } +} diff --git a/src/BootstrapBlazor/Extensions/ICacheEntryExtensions.cs b/src/BootstrapBlazor/Extensions/ICacheEntryExtensions.cs new file mode 100644 index 00000000000..f6fc4aac4ee --- /dev/null +++ b/src/BootstrapBlazor/Extensions/ICacheEntryExtensions.cs @@ -0,0 +1,38 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the Apache 2.0 License +// See the LICENSE file in the project root for more information. +// Maintainer: Argo Zhang(argo@live.ca) Website: https://www.blazor.zone + +using Microsoft.Extensions.Caching.Memory; +using System.Reflection; + +namespace BootstrapBlazor.Components; + +/// +/// 扩展方法 +/// +public static class ICacheEntryExtensions +{ + /// + /// 获得缓存项 最后访问时间 + /// + /// + /// + public static DateTime? GetLastAccessed(this ICacheEntry entry) + { + _lastAccessedProperty ??= entry.GetType().GetProperty("LastAccessed", BindingFlags.Instance | BindingFlags.NonPublic); + + DateTime? ret = null; + if (_lastAccessedProperty != null) + { + var v = _lastAccessedProperty.GetValue(entry); + if (v is DateTime val) + { + ret = val; + } + } + return ret; + } + + private static PropertyInfo? _lastAccessedProperty = null; +} From cc4158d37b4865d65f5cc0604908cf0bbf94dc77 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sun, 26 Jan 2025 18:00:32 +0800 Subject: [PATCH 07/11] =?UTF-8?q?doc:=20=E6=9B=B4=E6=96=B0=E8=B6=85?= =?UTF-8?q?=E6=97=B6=E6=97=B6=E9=95=BF=E5=88=97=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Pages/CacaheExpiration.razor.cs | 33 +++---------------- .../Components/Pages/CacheList.razor | 4 +-- 2 files changed, 7 insertions(+), 30 deletions(-) diff --git a/src/BootstrapBlazor.Server/Components/Pages/CacaheExpiration.razor.cs b/src/BootstrapBlazor.Server/Components/Pages/CacaheExpiration.razor.cs index e21ecb08e2e..243fe9c7d7f 100644 --- a/src/BootstrapBlazor.Server/Components/Pages/CacaheExpiration.razor.cs +++ b/src/BootstrapBlazor.Server/Components/Pages/CacaheExpiration.razor.cs @@ -19,7 +19,7 @@ public partial class CacaheExpiration /// 获得/设置 实例 /// [Parameter, NotNull] - public object? Key { get; set; } + public TableColumnContext? TableColumnContext { get; set; } private string? ExpirationTime { get; set; } @@ -39,32 +39,9 @@ private async Task GetCacheEntryExpiration() ExpirationTime = "loading ..."; await Task.Yield(); - if (CacheManager.TryGetCacheEntry(Key, out ICacheEntry? entry)) - { - if (entry.Priority == CacheItemPriority.NeverRemove) - { - ExpirationTime = "Never Remove"; - } - else if (entry.SlidingExpiration.HasValue) - { - ExpirationTime = $"Sliding: {entry.SlidingExpiration.Value}"; - } - else if (entry.AbsoluteExpiration.HasValue) - { - ExpirationTime = $"Absolute: {entry.AbsoluteExpiration.Value}"; - } - else if (entry.ExpirationTokens.Count != 0) - { - ExpirationTime = $"Token: {entry.ExpirationTokens.Count}"; - } - else - { - ExpirationTime = "Not Set"; - } - } - else - { - ExpirationTime = "Not Found"; - } + var key = TableColumnContext.Row; + ExpirationTime = CacheManager.TryGetCacheEntry(key, out ICacheEntry? entry) + ? entry.GetExpiration() + : "Not Found"; } } diff --git a/src/BootstrapBlazor.Server/Components/Pages/CacheList.razor b/src/BootstrapBlazor.Server/Components/Pages/CacheList.razor index dc3be3babfb..5393f3e6102 100644 --- a/src/BootstrapBlazor.Server/Components/Pages/CacheList.razor +++ b/src/BootstrapBlazor.Server/Components/Pages/CacheList.razor @@ -18,9 +18,9 @@ @GetValue(v.Row) - + From 0f08dc52eebb23a8349e1c34080c687b098a54db Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sun, 26 Jan 2025 18:49:49 +0800 Subject: [PATCH 08/11] =?UTF-8?q?doc:=20=E5=AE=9E=E7=8E=B0=E8=BF=87?= =?UTF-8?q?=E6=9C=9F=E6=97=B6=E9=97=B4=E5=AE=9E=E6=97=B6=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Pages/CacaheExpiration.razor.cs | 12 ++---- .../Components/Pages/CacheList.razor | 4 +- .../Components/Pages/CacheList.razor.cs | 43 ++++++++++--------- 3 files changed, 28 insertions(+), 31 deletions(-) diff --git a/src/BootstrapBlazor.Server/Components/Pages/CacaheExpiration.razor.cs b/src/BootstrapBlazor.Server/Components/Pages/CacaheExpiration.razor.cs index 243fe9c7d7f..cc9c4035116 100644 --- a/src/BootstrapBlazor.Server/Components/Pages/CacaheExpiration.razor.cs +++ b/src/BootstrapBlazor.Server/Components/Pages/CacaheExpiration.razor.cs @@ -12,14 +12,11 @@ namespace BootstrapBlazor.Server.Components.Pages; /// public partial class CacaheExpiration { - [Inject, NotNull] - private ICacheManager? CacheManager { get; set; } - /// - /// 获得/设置 实例 + /// 获得/设置 实例 /// [Parameter, NotNull] - public TableColumnContext? TableColumnContext { get; set; } + public object? Context { get; set; } private string? ExpirationTime { get; set; } @@ -39,9 +36,8 @@ private async Task GetCacheEntryExpiration() ExpirationTime = "loading ..."; await Task.Yield(); - var key = TableColumnContext.Row; - ExpirationTime = CacheManager.TryGetCacheEntry(key, out ICacheEntry? entry) + ExpirationTime = Context is ICacheEntry entry ? entry.GetExpiration() - : "Not Found"; + : "-"; } } diff --git a/src/BootstrapBlazor.Server/Components/Pages/CacheList.razor b/src/BootstrapBlazor.Server/Components/Pages/CacheList.razor index 5393f3e6102..dc0ab767f60 100644 --- a/src/BootstrapBlazor.Server/Components/Pages/CacheList.razor +++ b/src/BootstrapBlazor.Server/Components/Pages/CacheList.razor @@ -10,7 +10,7 @@ @@ -20,7 +20,7 @@ diff --git a/src/BootstrapBlazor.Server/Components/Pages/CacheList.razor.cs b/src/BootstrapBlazor.Server/Components/Pages/CacheList.razor.cs index 317ca3ff084..fa083c2516f 100644 --- a/src/BootstrapBlazor.Server/Components/Pages/CacheList.razor.cs +++ b/src/BootstrapBlazor.Server/Components/Pages/CacheList.razor.cs @@ -24,9 +24,11 @@ public partial class CacheList /// /// /// - protected override void OnInitialized() + protected override async Task OnParametersSetAsync() { - base.OnInitialized(); + await base.OnParametersSetAsync(); + + await Task.Yield(); UpdateCacheList(); } @@ -49,30 +51,29 @@ private void OnRefresh() private void UpdateCacheList() { - _cacheList = [.. CacheManager.Keys.OrderBy(i => i.ToString())]; - } - - private string GetValue(object key) - { - string ret = "-"; - if (CacheManager.TryGetValue(key, out object? value)) + _cacheList = CacheManager.Keys.OrderBy(i => i.ToString()).Select(key => { - if (value is string stringValue) + ICacheEntry? entry = null; + if (CacheManager.TryGetCacheEntry(key, out var val)) { - ret = stringValue; - return ret; + entry = val; } + return (object)entry!; + }).ToList(); + } - if (value is IEnumerable) - { - ret = $"{LambdaExtensions.ElementCount(value)}"; - } - else - { - ret = value?.ToString() ?? "-"; - } + private static string GetKey(object data) => data is ICacheEntry entry ? entry.Key.ToString()! : "-"; + + private static string GetValue(object data) => data is ICacheEntry entry ? GetCacheEntryValue(entry) : "-"; + + private static string GetCacheEntryValue(ICacheEntry entry) + { + var value = entry.Value; + if (value is string stringValue) + { + return stringValue; } - return ret; + return value is IEnumerable ? $"{LambdaExtensions.ElementCount(value)}" : value?.ToString() ?? "-"; } } From cff854499d077cbc08e45e3ce3dad6d98a181823 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sun, 26 Jan 2025 18:51:17 +0800 Subject: [PATCH 09/11] =?UTF-8?q?refactor:=20=E7=B2=BE=E7=AE=80=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Pages/CacaheExpiration.razor.cs | 4 +--- .../Extensions/ICacheEntryExtensions.cs | 7 +------ 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/src/BootstrapBlazor.Server/Components/Pages/CacaheExpiration.razor.cs b/src/BootstrapBlazor.Server/Components/Pages/CacaheExpiration.razor.cs index cc9c4035116..9df8217e3fd 100644 --- a/src/BootstrapBlazor.Server/Components/Pages/CacaheExpiration.razor.cs +++ b/src/BootstrapBlazor.Server/Components/Pages/CacaheExpiration.razor.cs @@ -36,8 +36,6 @@ private async Task GetCacheEntryExpiration() ExpirationTime = "loading ..."; await Task.Yield(); - ExpirationTime = Context is ICacheEntry entry - ? entry.GetExpiration() - : "-"; + ExpirationTime = Context is ICacheEntry entry ? entry.GetExpiration() : "-"; } } diff --git a/src/BootstrapBlazor.Server/Extensions/ICacheEntryExtensions.cs b/src/BootstrapBlazor.Server/Extensions/ICacheEntryExtensions.cs index 1b77f129f8d..dcfa675daa6 100644 --- a/src/BootstrapBlazor.Server/Extensions/ICacheEntryExtensions.cs +++ b/src/BootstrapBlazor.Server/Extensions/ICacheEntryExtensions.cs @@ -46,12 +46,7 @@ public static string GetExpiration(this ICacheEntry entry) private static TimeSpan GetSlidingLeftTime(this ICacheEntry entry) { - var ret = TimeSpan.Zero; var lastAccessed = entry.GetLastAccessed(); - if (lastAccessed != null) - { - ret = entry.SlidingExpiration!.Value - (DateTime.UtcNow - lastAccessed.Value); - } - return ret; + return lastAccessed == null ? TimeSpan.Zero : entry.SlidingExpiration!.Value - (DateTime.UtcNow - lastAccessed.Value); } } From b3e6d5704f06f46a98b2995ac06606fbb3fba883 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sun, 26 Jan 2025 18:57:51 +0800 Subject: [PATCH 10/11] =?UTF-8?q?test:=20=E6=9B=B4=E6=96=B0=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extensions/ICacheEntryExtensionsTest.cs | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 test/UnitTest/Extensions/ICacheEntryExtensionsTest.cs diff --git a/test/UnitTest/Extensions/ICacheEntryExtensionsTest.cs b/test/UnitTest/Extensions/ICacheEntryExtensionsTest.cs new file mode 100644 index 00000000000..c8c67c2cd7f --- /dev/null +++ b/test/UnitTest/Extensions/ICacheEntryExtensionsTest.cs @@ -0,0 +1,22 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the Apache 2.0 License +// See the LICENSE file in the project root for more information. +// Maintainer: Argo Zhang(argo@live.ca) Website: https://www.blazor.zone + +namespace UnitTest.Extensions; + +public class ICacheEntryExtensionsTest : BootstrapBlazorTestBase +{ + [Fact] + public void GetLastAccessed_Ok() + { + Cache.GetOrCreate("test_01", entry => + { + return 1; + }); + + Assert.True(Cache.TryGetCacheEntry("test_01", out var entry)); + var v = entry.GetLastAccessed(); + Assert.NotNull(v); + } +} From 6eb8e8cfd7c620607fcbda6840783140e3179c65 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sun, 26 Jan 2025 19:10:33 +0800 Subject: [PATCH 11/11] =?UTF-8?q?test:=20=E6=9B=B4=E6=96=B0=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extensions/ICacheEntryExtensions.cs | 7 +++- .../Extensions/ICacheEntryExtensionsTest.cs | 40 ++++++++++++++++++- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/BootstrapBlazor/Extensions/ICacheEntryExtensions.cs b/src/BootstrapBlazor/Extensions/ICacheEntryExtensions.cs index f6fc4aac4ee..925fefcf6fa 100644 --- a/src/BootstrapBlazor/Extensions/ICacheEntryExtensions.cs +++ b/src/BootstrapBlazor/Extensions/ICacheEntryExtensions.cs @@ -17,9 +17,14 @@ public static class ICacheEntryExtensions /// 获得缓存项 最后访问时间 /// /// + /// /// - public static DateTime? GetLastAccessed(this ICacheEntry entry) + public static DateTime? GetLastAccessed(this ICacheEntry entry, bool force = false) { + if (force) + { + _lastAccessedProperty = null; + } _lastAccessedProperty ??= entry.GetType().GetProperty("LastAccessed", BindingFlags.Instance | BindingFlags.NonPublic); DateTime? ret = null; diff --git a/test/UnitTest/Extensions/ICacheEntryExtensionsTest.cs b/test/UnitTest/Extensions/ICacheEntryExtensionsTest.cs index c8c67c2cd7f..3286c3eed43 100644 --- a/test/UnitTest/Extensions/ICacheEntryExtensionsTest.cs +++ b/test/UnitTest/Extensions/ICacheEntryExtensionsTest.cs @@ -3,6 +3,9 @@ // See the LICENSE file in the project root for more information. // Maintainer: Argo Zhang(argo@live.ca) Website: https://www.blazor.zone +using Microsoft.Extensions.Caching.Memory; +using Microsoft.Extensions.Primitives; + namespace UnitTest.Extensions; public class ICacheEntryExtensionsTest : BootstrapBlazorTestBase @@ -16,7 +19,42 @@ public void GetLastAccessed_Ok() }); Assert.True(Cache.TryGetCacheEntry("test_01", out var entry)); - var v = entry.GetLastAccessed(); + var v = entry.GetLastAccessed(true); Assert.NotNull(v); } + + [Fact] + public void GetLastAccessed_Null() + { + var mock = new MockCacheEntry(); + var v = mock.GetLastAccessed(true); + Assert.Null(v); + } + + class MockCacheEntry : ICacheEntry + { + public object Key { get; } + public object? Value { get; set; } + public DateTimeOffset? AbsoluteExpiration { get; set; } + public TimeSpan? AbsoluteExpirationRelativeToNow { get; set; } + public TimeSpan? SlidingExpiration { get; set; } + public IList ExpirationTokens { get; } + public IList PostEvictionCallbacks { get; } + public CacheItemPriority Priority { get; set; } + public long? Size { get; set; } + + private int LastAccessed { get; set; } + + public MockCacheEntry() + { + Key = "_test"; + ExpirationTokens = []; + PostEvictionCallbacks = []; + } + + public void Dispose() + { + throw new NotImplementedException(); + } + } }