diff --git a/.github/workflows/_build.yml b/.github/workflows/_build.yml index 087b222..754f544 100644 --- a/.github/workflows/_build.yml +++ b/.github/workflows/_build.yml @@ -19,7 +19,10 @@ jobs: - name: Install .NET SDK uses: actions/setup-dotnet@v4 with: - dotnet-version: 6.0.x + dotnet-version: | + 8.0.x + 9.0.x + 10.0.x global-json-file: "./global.json" - name: Restore dependencies diff --git a/MiniValidation.sln b/MiniValidation.sln deleted file mode 100644 index 577eec1..0000000 --- a/MiniValidation.sln +++ /dev/null @@ -1,75 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.0.31613.370 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{751FE268-A797-46FE-AEE0-BD35D91BE850}" - ProjectSection(SolutionItems) = preProject - src\Directory.Build.props = src\Directory.Build.props - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MiniValidation", "src\MiniValidation\MiniValidation.csproj", "{60C03B53-10AC-4D37-BA95-7EEFE2FC61FC}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{BF473532-A97B-4CEE-9673-9D4B57D8C1C4}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Samples.Console", "samples\Samples.Console\Samples.Console.csproj", "{75062336-DE25-4EBF-9EC5-0465D37D4623}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Samples.Web", "samples\Samples.Web\Samples.Web.csproj", "{DBDC0E13-44E1-42E8-8751-FF5D3313D538}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{4CF82AD1-D050-422E-99D5-454AE28D6A11}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MiniValidation.UnitTests", "tests\MiniValidation.UnitTests\MiniValidation.UnitTests.csproj", "{4D247E44-6CF5-4A15-A2D3-09E40753874B}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{CDE0DB87-BF92-4F36-B305-B73CE116DD45}" - ProjectSection(SolutionItems) = preProject - Directory.Build.props = Directory.Build.props - Directory.Packages.props = Directory.Packages.props - global.json = global.json - LICENSE = LICENSE - README.md = README.md - ThirdPartyNotices.txt = ThirdPartyNotices.txt - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MiniValidation.Benchmarks", "tests\MiniValidation.Benchmarks\MiniValidation.Benchmarks.csproj", "{AFA1AA61-E230-48C8-B12B-6561E2124210}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {60C03B53-10AC-4D37-BA95-7EEFE2FC61FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {60C03B53-10AC-4D37-BA95-7EEFE2FC61FC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {60C03B53-10AC-4D37-BA95-7EEFE2FC61FC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {60C03B53-10AC-4D37-BA95-7EEFE2FC61FC}.Release|Any CPU.Build.0 = Release|Any CPU - {75062336-DE25-4EBF-9EC5-0465D37D4623}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {75062336-DE25-4EBF-9EC5-0465D37D4623}.Debug|Any CPU.Build.0 = Debug|Any CPU - {75062336-DE25-4EBF-9EC5-0465D37D4623}.Release|Any CPU.ActiveCfg = Release|Any CPU - {75062336-DE25-4EBF-9EC5-0465D37D4623}.Release|Any CPU.Build.0 = Release|Any CPU - {DBDC0E13-44E1-42E8-8751-FF5D3313D538}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DBDC0E13-44E1-42E8-8751-FF5D3313D538}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DBDC0E13-44E1-42E8-8751-FF5D3313D538}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DBDC0E13-44E1-42E8-8751-FF5D3313D538}.Release|Any CPU.Build.0 = Release|Any CPU - {4D247E44-6CF5-4A15-A2D3-09E40753874B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4D247E44-6CF5-4A15-A2D3-09E40753874B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4D247E44-6CF5-4A15-A2D3-09E40753874B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4D247E44-6CF5-4A15-A2D3-09E40753874B}.Release|Any CPU.Build.0 = Release|Any CPU - {AFA1AA61-E230-48C8-B12B-6561E2124210}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AFA1AA61-E230-48C8-B12B-6561E2124210}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AFA1AA61-E230-48C8-B12B-6561E2124210}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AFA1AA61-E230-48C8-B12B-6561E2124210}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {60C03B53-10AC-4D37-BA95-7EEFE2FC61FC} = {751FE268-A797-46FE-AEE0-BD35D91BE850} - {75062336-DE25-4EBF-9EC5-0465D37D4623} = {BF473532-A97B-4CEE-9673-9D4B57D8C1C4} - {DBDC0E13-44E1-42E8-8751-FF5D3313D538} = {BF473532-A97B-4CEE-9673-9D4B57D8C1C4} - {4D247E44-6CF5-4A15-A2D3-09E40753874B} = {4CF82AD1-D050-422E-99D5-454AE28D6A11} - {AFA1AA61-E230-48C8-B12B-6561E2124210} = {4CF82AD1-D050-422E-99D5-454AE28D6A11} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {23EC839A-3D4A-43DC-A6B4-A641D51BF0A6} - EndGlobalSection -EndGlobal diff --git a/MiniValidation.slnx b/MiniValidation.slnx new file mode 100644 index 0000000..ac3b69a --- /dev/null +++ b/MiniValidation.slnx @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/global.json b/global.json index 501e79a..512142d 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "8.0.100", + "version": "10.0.100", "rollForward": "latestFeature" } -} \ No newline at end of file +} diff --git a/samples/Samples.Console/Samples.Console.csproj b/samples/Samples.Console/Samples.Console.csproj index 92b9057..7bfb498 100644 --- a/samples/Samples.Console/Samples.Console.csproj +++ b/samples/Samples.Console/Samples.Console.csproj @@ -2,7 +2,7 @@ Exe - net6.0 + net8.0 enable diff --git a/samples/Samples.Web/Samples.Web.csproj b/samples/Samples.Web/Samples.Web.csproj index 7190ba0..f3b5e57 100644 --- a/samples/Samples.Web/Samples.Web.csproj +++ b/samples/Samples.Web/Samples.Web.csproj @@ -1,7 +1,7 @@  - net7.0 + net8.0 enable enable diff --git a/src/MiniValidation/MiniValidation.csproj b/src/MiniValidation/MiniValidation.csproj index 7f2afc4..44f3c99 100644 --- a/src/MiniValidation/MiniValidation.csproj +++ b/src/MiniValidation/MiniValidation.csproj @@ -2,7 +2,7 @@ A minimalist validation library built atop the existing validation features in .NET's `System.ComponentModel.DataAnnotations` namespace. - netstandard2.0;net6.0 + netstandard2.0;net8.0 ComponentModel DataAnnotations validation README.md 10.0 diff --git a/src/MiniValidation/TypeDetailsCache.cs b/src/MiniValidation/TypeDetailsCache.cs index aee8fb2..0d743de 100644 --- a/src/MiniValidation/TypeDetailsCache.cs +++ b/src/MiniValidation/TypeDetailsCache.cs @@ -14,6 +14,21 @@ internal class TypeDetailsCache private static readonly PropertyDetails[] _emptyPropertyDetails = Array.Empty(); private readonly ConcurrentDictionary _cache = new(); + public TypeDetailsCache() + { + TypeDescriptor.Refreshed += args => + { + if (args.TypeChanged is { } type) + { + _cache.TryRemove(type, out _); + } + else + { + _cache.Clear(); + } + }; + } + public (PropertyDetails[] Properties, bool RequiresAsync) Get(Type? type) { if (type is null) @@ -21,12 +36,13 @@ internal class TypeDetailsCache return (_emptyPropertyDetails, false); } - if (!_cache.ContainsKey(type)) + (PropertyDetails[] Properties, bool RequiresAsync) details; + while (!_cache.TryGetValue(type, out details)) { Visit(type); } - return _cache[type]; + return details; } private void Visit(Type type) diff --git a/tests/MiniValidation.Benchmarks/MiniValidation.Benchmarks.csproj b/tests/MiniValidation.Benchmarks/MiniValidation.Benchmarks.csproj index e142f3c..87f0f67 100644 --- a/tests/MiniValidation.Benchmarks/MiniValidation.Benchmarks.csproj +++ b/tests/MiniValidation.Benchmarks/MiniValidation.Benchmarks.csproj @@ -2,8 +2,7 @@ Exe - net6.0;net7.0 - net471;net6.0;net7.0 + net8.0;net9.0;net10.0 enable enable 10 diff --git a/tests/MiniValidation.UnitTests/MiniValidation.UnitTests.csproj b/tests/MiniValidation.UnitTests/MiniValidation.UnitTests.csproj index 0e7f43a..a640ad8 100644 --- a/tests/MiniValidation.UnitTests/MiniValidation.UnitTests.csproj +++ b/tests/MiniValidation.UnitTests/MiniValidation.UnitTests.csproj @@ -1,8 +1,7 @@  - net6.0;net7.0;net8.0 - net471;net6.0;net7.0;net8.0 + net8.0;net9.0;net10.0 10.0 enable enable