Pārlūkot izejas kodu

Cleanup and refactoring

Lukas Angerer 1 gadu atpakaļ
vecāks
revīzija
37ba4afaa7
1 mainītis faili ar 36 papildinājumiem un 22 dzēšanām
  1. 36 22
      CustomFluentValidationManager.cs

+ 36 - 22
CustomFluentValidationManager.cs

@@ -2,14 +2,44 @@
 
 using FluentValidation;
 using FluentValidation.Internal;
+using FluentValidation.Results;
 using FluentValidation.Validators;
 
 using Microsoft.AspNetCore.Components.Forms;
 
 namespace BlazorEditForms;
 
+public static class ValidationFailureExtensions
+{
+    private const string FieldIdentifierKey = $"{nameof(FieldIdentifier)}_Key";
+
+    public static FieldIdentifier? GetFieldIdentifier(this ValidationFailure failure)
+    {
+        failure.FormattedMessagePlaceholderValues.TryGetValue(FieldIdentifierKey, out var fieldIdentifier);
+        return (FieldIdentifier?)fieldIdentifier;
+    }
+
+    public static void SetFieldIdentifier(this ValidationFailure failure, FieldIdentifier fieldIdentifier)
+    {
+        failure.FormattedMessagePlaceholderValues[FieldIdentifierKey] = fieldIdentifier;
+    }
+}
+
 public class CustomFluentValidationManager : IDisposable
 {
+    static CustomFluentValidationManager()
+    {
+        ValidatorOptions.Global.OnFailureCreated = (failure, context, value, rule, component) =>
+        {
+            if (!string.IsNullOrEmpty(rule.PropertyName))
+            {
+                failure.SetFieldIdentifier(new FieldIdentifier(context.InstanceToValidate, rule.PropertyName));
+            }
+
+            return failure;
+        };
+    }
+
     private readonly EventHandler<ValidationRequestedEventArgs> _validationRequestedHandler;
     private readonly EventHandler<FieldChangedEventArgs> _fieldChangedHandler;
 
@@ -32,25 +62,12 @@ public class CustomFluentValidationManager : IDisposable
         // separate API to manage the validation messages that can (with public methods) only be _extracted from_ the
         // edit context.
         _validationMessageStore = new ValidationMessageStore(_editContext);
-
-        // TODO: how to make this multi-threaded ?
-        ValidatorOptions.Global.OnFailureCreated = (failure, context, value, rule, component) =>
-        {
-            if (!string.IsNullOrEmpty(rule.PropertyName))
-            {
-                failure.FormattedMessagePlaceholderValues["MINE"] =
-                    new FieldIdentifier(context.InstanceToValidate, rule.PropertyName);
-            }
-
-            return failure;
-        };
     }
 
     private async Task ValidateModel()
     {
         var validationContext = ValidationContext<object>.CreateWithOptions(_editContext.Model, strategy =>
         {
-            //strategy.UseCustomSelector(new MySelector());
             strategy.IncludeRulesNotInRuleSet();
         });
         var validationResult = await _validator.ValidateAsync(validationContext);
@@ -58,10 +75,10 @@ public class CustomFluentValidationManager : IDisposable
         _validationMessageStore.Clear();
         foreach (var failure in validationResult.Errors)
         {
-            if (failure.FormattedMessagePlaceholderValues.TryGetValue("MINE", out var mine))
+            var fieldIdentifier = failure.GetFieldIdentifier();
+            if (fieldIdentifier.HasValue)
             {
-                var fieldIdentifier = (FieldIdentifier)mine;
-                _validationMessageStore.Add(fieldIdentifier, failure.ErrorMessage);
+                _validationMessageStore.Add(fieldIdentifier.Value, failure.ErrorMessage);
             }
         }
 
@@ -73,7 +90,6 @@ public class CustomFluentValidationManager : IDisposable
         var validationContext = ValidationContext<object>.CreateWithOptions(_editContext.Model, strategy =>
         {
             strategy.UseCustomSelector(new FieldIdentifierSelector(fieldIdentifier));
-            //strategy.IncludeRulesNotInRuleSet();
         });
         var validationResult = await _validator.ValidateAsync(validationContext);
 
@@ -81,12 +97,10 @@ public class CustomFluentValidationManager : IDisposable
 
         foreach (var failure in validationResult.Errors)
         {
-            if (failure.FormattedMessagePlaceholderValues.TryGetValue("MINE", out var mine))
+            var failureIdentifier = failure.GetFieldIdentifier();
+            if (fieldIdentifier.Equals(failureIdentifier))
             {
-                if (fieldIdentifier.Equals(mine))
-                {
-                    _validationMessageStore.Add(fieldIdentifier, failure.ErrorMessage);
-                }
+                _validationMessageStore.Add(fieldIdentifier, failure.ErrorMessage);
             }
         }