Skip to content

Commit 7799ad0

Browse files
authored
Merge pull request #60 from kolan72/main
Update dev from main.
2 parents 93176b1 + 0c4fb26 commit 7799ad0

7 files changed

Lines changed: 97 additions & 60 deletions

File tree

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
## 0.10.0
2+
3+
- Introduced the `QuickValidator.ValidateAsync<T>(T, Action<IRuleBuilderOptions<T, T>>, string, Action<T>, CancellationToken)` extension method.
4+
- Introduced the `QuickValidator.ValidateAsync<T>(T, Action<IRuleBuilderOptions<T, T>>, PropertyNameMode, Action<T>, CancellationToken)` extension method.
5+
- Edit 'Quick Validation' README Chapter.
6+
- Edit 'Quick Validation' NuGet README Chapter.
7+
8+
19
## 0.9.0
210

311
- Added quick validation support via `QuickValidator` and its `Validate<T>` overloads.

README.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,28 @@ if(!result.IsValid)
6767
}
6868
```
6969

70+
## 💡 Asynchronous Validation
71+
72+
If you want to add asynchronous FluentValidation rules such as `MustAsync` or `CustomAsync`, the recommended approach is to use the `WithAsyncValidation` method:
73+
```csharp
74+
//Checking if a user ID is already in use using an external web API:
75+
var result = await new ExpressValidatorBuilder<Customer>()
76+
.AddProperty(o => o.CustomerId)
77+
.WithAsyncValidation(o => o.MustAsync(async (id, cancellation) =>
78+
79+
!await apiClient.IdExistsAsync(id, cancellation)))
80+
81+
.Build()
82+
.ValidateAsync(customer);
83+
```
84+
Once you've used this method at least once within the `ExpressValidatorBuilder`, you must call the `ValidateAsync` method on the resulting `ExpressValidator`.
85+
86+
Calling `Validate` instead will result in an `InvalidOperationException`.
87+
88+
Note: You can still use the `WithValidation` method for asynchronous rules, but in that case, ensure you call only `ValidateAsync`; otherwise, FluentValidation will throw an `AsyncValidatorInvokedSynchronouslyException`.
89+
90+
As with FluentValidation itself, you can safely call `ValidateAsync` when both synchronous and asynchronous rules are present.
91+
7092
## ⚙️ Modifying FluentValidation Validator Parameters Using Options
7193

7294
To dynamically change the parameters of the `FluentValidation` validators:

src/ExpressValidator.Extensions.DependencyInjection/CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
## 0.3.9
2+
3+
- Update ExpressValidator nuget package.
4+
- Update Microsoft nuget packages.
5+
- Update Microsoft NuGet packages for ExpressValidator.Extensions.DependencyInjection.Tests.
6+
7+
18
## 0.3.7
29

310
- Update ExpressValidator nuget package.

src/ExpressValidator.Extensions.DependencyInjection/ExpressValidator.Extensions.DependencyInjection.csproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<PropertyGroup>
44
<TargetFramework>netstandard2.0</TargetFramework>
55
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
6-
<Version>0.3.7</Version>
6+
<Version>0.3.9</Version>
77
<GenerateDocumentationFile>true</GenerateDocumentationFile>
88
<Authors>Andrey Kolesnichenko</Authors>
99
<PackageLicenseExpression>MIT</PackageLicenseExpression>
@@ -15,7 +15,7 @@
1515
<PackageTags>FluentValidation Validation DependencyInjection</PackageTags>
1616
<Description>The ExpressValidator.Extensions.DependencyInjection package extends ExpressValidator to provide integration with Microsoft Dependency Injection.</Description>
1717
<Copyright>Copyright 2024 Andrey Kolesnichenko</Copyright>
18-
<AssemblyVersion>0.3.7.0</AssemblyVersion>
18+
<AssemblyVersion>0.3.9.0</AssemblyVersion>
1919
</PropertyGroup>
2020

2121
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
@@ -32,8 +32,8 @@
3232

3333
<ItemGroup>
3434
<PackageReference Include="ExpressValidator" Version="0.10.0" />
35-
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.6" />
36-
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="9.0.6" />
35+
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.7" />
36+
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="9.0.7" />
3737
</ItemGroup>
3838

3939
<ItemGroup>

src/ExpressValidator/ExpressValidator.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<PropertyGroup>
44
<TargetFrameworks>netstandard2.0;net8.0</TargetFrameworks>
55
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
6-
<Version>0.9.0</Version>
6+
<Version>0.10.0</Version>
77
<GenerateDocumentationFile>true</GenerateDocumentationFile>
88
<Authors>Andrey Kolesnichenko</Authors>
99
<Description>ExpressValidator is a library that provides the ability to validate objects using the FluentValidation library, but without object inheritance from `AbstractValidator`.</Description>
@@ -15,7 +15,7 @@
1515
<PackageIcon>ExpressValidator.png</PackageIcon>
1616
<PackageReadmeFile>NuGet.md</PackageReadmeFile>
1717
<PackageIconUrl />
18-
<AssemblyVersion>0.9.0.0</AssemblyVersion>
18+
<AssemblyVersion>0.10.0.0</AssemblyVersion>
1919
<FileVersion>0.0.0.0</FileVersion>
2020
</PropertyGroup>
2121

tests/ExpressValidator.Extensions.DependencyInjection.Tests/ExpressValidator.Extensions.DependencyInjection.Tests.csproj

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -45,50 +45,50 @@
4545
<Reference Include="FluentValidation, Version=11.0.0.0, Culture=neutral, PublicKeyToken=7de548da2fbae0f0, processorArchitecture=MSIL">
4646
<HintPath>..\..\packages\FluentValidation.11.11.0\lib\netstandard2.0\FluentValidation.dll</HintPath>
4747
</Reference>
48-
<Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=9.0.0.6, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
49-
<HintPath>..\..\packages\Microsoft.Bcl.AsyncInterfaces.9.0.6\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll</HintPath>
48+
<Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=9.0.0.7, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
49+
<HintPath>..\..\packages\Microsoft.Bcl.AsyncInterfaces.9.0.7\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll</HintPath>
5050
</Reference>
51-
<Reference Include="Microsoft.Extensions.Configuration, Version=9.0.0.6, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
52-
<HintPath>..\..\packages\Microsoft.Extensions.Configuration.9.0.6\lib\net462\Microsoft.Extensions.Configuration.dll</HintPath>
51+
<Reference Include="Microsoft.Extensions.Configuration, Version=9.0.0.7, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
52+
<HintPath>..\..\packages\Microsoft.Extensions.Configuration.9.0.7\lib\net462\Microsoft.Extensions.Configuration.dll</HintPath>
5353
</Reference>
54-
<Reference Include="Microsoft.Extensions.Configuration.Abstractions, Version=9.0.0.6, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
55-
<HintPath>..\..\packages\Microsoft.Extensions.Configuration.Abstractions.9.0.6\lib\net462\Microsoft.Extensions.Configuration.Abstractions.dll</HintPath>
54+
<Reference Include="Microsoft.Extensions.Configuration.Abstractions, Version=9.0.0.7, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
55+
<HintPath>..\..\packages\Microsoft.Extensions.Configuration.Abstractions.9.0.7\lib\net462\Microsoft.Extensions.Configuration.Abstractions.dll</HintPath>
5656
</Reference>
57-
<Reference Include="Microsoft.Extensions.Configuration.Binder, Version=9.0.0.6, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
58-
<HintPath>..\..\packages\Microsoft.Extensions.Configuration.Binder.9.0.6\lib\net462\Microsoft.Extensions.Configuration.Binder.dll</HintPath>
57+
<Reference Include="Microsoft.Extensions.Configuration.Binder, Version=9.0.0.7, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
58+
<HintPath>..\..\packages\Microsoft.Extensions.Configuration.Binder.9.0.7\lib\net462\Microsoft.Extensions.Configuration.Binder.dll</HintPath>
5959
</Reference>
60-
<Reference Include="Microsoft.Extensions.Configuration.EnvironmentVariables, Version=9.0.0.6, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
61-
<HintPath>..\..\packages\Microsoft.Extensions.Configuration.EnvironmentVariables.9.0.6\lib\net462\Microsoft.Extensions.Configuration.EnvironmentVariables.dll</HintPath>
60+
<Reference Include="Microsoft.Extensions.Configuration.EnvironmentVariables, Version=9.0.0.7, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
61+
<HintPath>..\..\packages\Microsoft.Extensions.Configuration.EnvironmentVariables.9.0.7\lib\net462\Microsoft.Extensions.Configuration.EnvironmentVariables.dll</HintPath>
6262
</Reference>
63-
<Reference Include="Microsoft.Extensions.Configuration.FileExtensions, Version=9.0.0.6, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
64-
<HintPath>..\..\packages\Microsoft.Extensions.Configuration.FileExtensions.9.0.6\lib\net462\Microsoft.Extensions.Configuration.FileExtensions.dll</HintPath>
63+
<Reference Include="Microsoft.Extensions.Configuration.FileExtensions, Version=9.0.0.7, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
64+
<HintPath>..\..\packages\Microsoft.Extensions.Configuration.FileExtensions.9.0.7\lib\net462\Microsoft.Extensions.Configuration.FileExtensions.dll</HintPath>
6565
</Reference>
66-
<Reference Include="Microsoft.Extensions.Configuration.Json, Version=9.0.0.6, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
67-
<HintPath>..\..\packages\Microsoft.Extensions.Configuration.Json.9.0.6\lib\net462\Microsoft.Extensions.Configuration.Json.dll</HintPath>
66+
<Reference Include="Microsoft.Extensions.Configuration.Json, Version=9.0.0.7, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
67+
<HintPath>..\..\packages\Microsoft.Extensions.Configuration.Json.9.0.7\lib\net462\Microsoft.Extensions.Configuration.Json.dll</HintPath>
6868
</Reference>
69-
<Reference Include="Microsoft.Extensions.DependencyInjection, Version=9.0.0.6, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
70-
<HintPath>..\..\packages\Microsoft.Extensions.DependencyInjection.9.0.6\lib\net462\Microsoft.Extensions.DependencyInjection.dll</HintPath>
69+
<Reference Include="Microsoft.Extensions.DependencyInjection, Version=9.0.0.7, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
70+
<HintPath>..\..\packages\Microsoft.Extensions.DependencyInjection.9.0.7\lib\net462\Microsoft.Extensions.DependencyInjection.dll</HintPath>
7171
</Reference>
72-
<Reference Include="Microsoft.Extensions.DependencyInjection.Abstractions, Version=9.0.0.6, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
73-
<HintPath>..\..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.9.0.6\lib\net462\Microsoft.Extensions.DependencyInjection.Abstractions.dll</HintPath>
72+
<Reference Include="Microsoft.Extensions.DependencyInjection.Abstractions, Version=9.0.0.7, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
73+
<HintPath>..\..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.9.0.7\lib\net462\Microsoft.Extensions.DependencyInjection.Abstractions.dll</HintPath>
7474
</Reference>
75-
<Reference Include="Microsoft.Extensions.FileProviders.Abstractions, Version=9.0.0.6, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
76-
<HintPath>..\..\packages\Microsoft.Extensions.FileProviders.Abstractions.9.0.6\lib\net462\Microsoft.Extensions.FileProviders.Abstractions.dll</HintPath>
75+
<Reference Include="Microsoft.Extensions.FileProviders.Abstractions, Version=9.0.0.7, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
76+
<HintPath>..\..\packages\Microsoft.Extensions.FileProviders.Abstractions.9.0.7\lib\net462\Microsoft.Extensions.FileProviders.Abstractions.dll</HintPath>
7777
</Reference>
78-
<Reference Include="Microsoft.Extensions.FileProviders.Physical, Version=9.0.0.6, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
79-
<HintPath>..\..\packages\Microsoft.Extensions.FileProviders.Physical.9.0.6\lib\net462\Microsoft.Extensions.FileProviders.Physical.dll</HintPath>
78+
<Reference Include="Microsoft.Extensions.FileProviders.Physical, Version=9.0.0.7, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
79+
<HintPath>..\..\packages\Microsoft.Extensions.FileProviders.Physical.9.0.7\lib\net462\Microsoft.Extensions.FileProviders.Physical.dll</HintPath>
8080
</Reference>
81-
<Reference Include="Microsoft.Extensions.FileSystemGlobbing, Version=9.0.0.6, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
82-
<HintPath>..\..\packages\Microsoft.Extensions.FileSystemGlobbing.9.0.6\lib\net462\Microsoft.Extensions.FileSystemGlobbing.dll</HintPath>
81+
<Reference Include="Microsoft.Extensions.FileSystemGlobbing, Version=9.0.0.7, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
82+
<HintPath>..\..\packages\Microsoft.Extensions.FileSystemGlobbing.9.0.7\lib\net462\Microsoft.Extensions.FileSystemGlobbing.dll</HintPath>
8383
</Reference>
84-
<Reference Include="Microsoft.Extensions.Options, Version=9.0.0.6, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
85-
<HintPath>..\..\packages\Microsoft.Extensions.Options.9.0.6\lib\net462\Microsoft.Extensions.Options.dll</HintPath>
84+
<Reference Include="Microsoft.Extensions.Options, Version=9.0.0.7, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
85+
<HintPath>..\..\packages\Microsoft.Extensions.Options.9.0.7\lib\net462\Microsoft.Extensions.Options.dll</HintPath>
8686
</Reference>
87-
<Reference Include="Microsoft.Extensions.Options.ConfigurationExtensions, Version=9.0.0.6, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
88-
<HintPath>..\..\packages\Microsoft.Extensions.Options.ConfigurationExtensions.9.0.6\lib\net462\Microsoft.Extensions.Options.ConfigurationExtensions.dll</HintPath>
87+
<Reference Include="Microsoft.Extensions.Options.ConfigurationExtensions, Version=9.0.0.7, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
88+
<HintPath>..\..\packages\Microsoft.Extensions.Options.ConfigurationExtensions.9.0.7\lib\net462\Microsoft.Extensions.Options.ConfigurationExtensions.dll</HintPath>
8989
</Reference>
90-
<Reference Include="Microsoft.Extensions.Primitives, Version=9.0.0.6, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
91-
<HintPath>..\..\packages\Microsoft.Extensions.Primitives.9.0.6\lib\net462\Microsoft.Extensions.Primitives.dll</HintPath>
90+
<Reference Include="Microsoft.Extensions.Primitives, Version=9.0.0.7, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
91+
<HintPath>..\..\packages\Microsoft.Extensions.Primitives.9.0.7\lib\net462\Microsoft.Extensions.Primitives.dll</HintPath>
9292
</Reference>
9393
<Reference Include="nunit.framework, Version=4.3.2.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
9494
<HintPath>..\..\packages\NUnit.4.3.2\lib\net462\nunit.framework.dll</HintPath>
@@ -102,8 +102,8 @@
102102
</Reference>
103103
<Reference Include="System.ComponentModel.DataAnnotations" />
104104
<Reference Include="System.Core" />
105-
<Reference Include="System.IO.Pipelines, Version=9.0.0.6, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
106-
<HintPath>..\..\packages\System.IO.Pipelines.9.0.6\lib\net462\System.IO.Pipelines.dll</HintPath>
105+
<Reference Include="System.IO.Pipelines, Version=9.0.0.7, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
106+
<HintPath>..\..\packages\System.IO.Pipelines.9.0.7\lib\net462\System.IO.Pipelines.dll</HintPath>
107107
</Reference>
108108
<Reference Include="System.Memory, Version=4.0.5.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
109109
<HintPath>..\..\packages\System.Memory.4.6.3\lib\net462\System.Memory.dll</HintPath>
@@ -115,11 +115,11 @@
115115
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
116116
<HintPath>..\..\packages\System.Runtime.CompilerServices.Unsafe.6.1.2\lib\net462\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
117117
</Reference>
118-
<Reference Include="System.Text.Encodings.Web, Version=9.0.0.6, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
119-
<HintPath>..\..\packages\System.Text.Encodings.Web.9.0.6\lib\net462\System.Text.Encodings.Web.dll</HintPath>
118+
<Reference Include="System.Text.Encodings.Web, Version=9.0.0.7, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
119+
<HintPath>..\..\packages\System.Text.Encodings.Web.9.0.7\lib\net462\System.Text.Encodings.Web.dll</HintPath>
120120
</Reference>
121-
<Reference Include="System.Text.Json, Version=9.0.0.6, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
122-
<HintPath>..\..\packages\System.Text.Json.9.0.6\lib\net462\System.Text.Json.dll</HintPath>
121+
<Reference Include="System.Text.Json, Version=9.0.0.7, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
122+
<HintPath>..\..\packages\System.Text.Json.9.0.7\lib\net462\System.Text.Json.dll</HintPath>
123123
</Reference>
124124
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.4.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
125125
<HintPath>..\..\packages\System.Threading.Tasks.Extensions.4.6.3\lib\net462\System.Threading.Tasks.Extensions.dll</HintPath>

0 commit comments

Comments
 (0)