// Copyright (c) The Geekeey Authors // SPDX-License-Identifier: EUPL-1.2 using System.Collections.Concurrent; using System.Reflection.Metadata; [assembly: MetadataUpdateHandler(typeof(Geekeey.Request.Validation.DispatchingValidator))] namespace Geekeey.Request.Validation; internal sealed partial class DispatchingValidator : IValidator { private static readonly ConcurrentDictionary ValidatorsHandlers = new(); private readonly IServiceProvider _serviceProvider; public DispatchingValidator(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; } public static void ClearCache(Type[]? _) { ValidatorsHandlers.Clear(); } public Validation Validate(ValidationContext context) { ArgumentNullException.ThrowIfNull(context); if (context.Instance is null) { return new Validation([]); } var handler = ValidatorsHandlers.GetOrAdd(context.Instance.GetType(), static key => { var type = typeof(ValidatorInvoker<>).MakeGenericType(key); return (ValidatorInvoker)Activator.CreateInstance(type)!; }); return handler.Validate(context, _serviceProvider); } }