diff --git a/src/Core/CleanArc.Application/Features/Admin/Commands/AddAdminCommand/AddAdminCommand.cs b/src/Core/CleanArc.Application/Features/Admin/Commands/AddAdminCommand/AddAdminCommand.cs index c842030..33e7743 100644 --- a/src/Core/CleanArc.Application/Features/Admin/Commands/AddAdminCommand/AddAdminCommand.cs +++ b/src/Core/CleanArc.Application/Features/Admin/Commands/AddAdminCommand/AddAdminCommand.cs @@ -10,7 +10,7 @@ public record AddAdminCommand (string UserName, string Email, string Password, int RoleId) : IRequest>, IValidatableModel { - public IValidator ValidateApplicationModel(ApplicationBaseValidationModelProvider validator) + public static IValidator ValidateApplicationModel(ApplicationBaseValidationModelProvider validator) { validator.RuleFor(c => c.Email) .EmailAddress() diff --git a/src/Core/CleanArc.Application/Features/Admin/Queries/GetToken/AdminGetTokenQuery.cs b/src/Core/CleanArc.Application/Features/Admin/Queries/GetToken/AdminGetTokenQuery.cs index 6c560a6..26b6935 100644 --- a/src/Core/CleanArc.Application/Features/Admin/Queries/GetToken/AdminGetTokenQuery.cs +++ b/src/Core/CleanArc.Application/Features/Admin/Queries/GetToken/AdminGetTokenQuery.cs @@ -10,7 +10,7 @@ namespace CleanArc.Application.Features.Admin.Queries.GetToken; public record AdminGetTokenQuery(string UserName, string Password) : IRequest>, IValidatableModel { - public IValidator ValidateApplicationModel(ApplicationBaseValidationModelProvider validator) + public static IValidator ValidateApplicationModel(ApplicationBaseValidationModelProvider validator) { validator.RuleFor(c => c.UserName) .NotEmpty() diff --git a/src/Core/CleanArc.Application/Features/Order/Commands/AddOrderCommand.cs b/src/Core/CleanArc.Application/Features/Order/Commands/AddOrderCommand.cs index 5cf8436..48ecbfc 100644 --- a/src/Core/CleanArc.Application/Features/Order/Commands/AddOrderCommand.cs +++ b/src/Core/CleanArc.Application/Features/Order/Commands/AddOrderCommand.cs @@ -13,7 +13,7 @@ public record AddOrderCommand( string OrderName) : IRequest ValidateApplicationModel(ApplicationBaseValidationModelProvider validator) + public static IValidator ValidateApplicationModel(ApplicationBaseValidationModelProvider validator) { validator.RuleFor(c => c.OrderName) .NotEmpty() diff --git a/src/Core/CleanArc.Application/Features/Order/Commands/UpdateUserOrderCommand.cs b/src/Core/CleanArc.Application/Features/Order/Commands/UpdateUserOrderCommand.cs index 9f4f2fe..1f6b771 100644 --- a/src/Core/CleanArc.Application/Features/Order/Commands/UpdateUserOrderCommand.cs +++ b/src/Core/CleanArc.Application/Features/Order/Commands/UpdateUserOrderCommand.cs @@ -13,7 +13,7 @@ public record UpdateUserOrderCommand [JsonIgnore] public int UserId { get; set; } - public IValidator ValidateApplicationModel(ApplicationBaseValidationModelProvider validator) + public static IValidator ValidateApplicationModel(ApplicationBaseValidationModelProvider validator) { validator.RuleFor(c => c.OrderId).NotEmpty().GreaterThan(0); validator.RuleFor(c => c.OrderName).NotEmpty().NotNull(); diff --git a/src/Core/CleanArc.Application/Features/Role/Commands/AddRoleCommand/AddRoleCommand.cs b/src/Core/CleanArc.Application/Features/Role/Commands/AddRoleCommand/AddRoleCommand.cs index edfff41..2899c70 100644 --- a/src/Core/CleanArc.Application/Features/Role/Commands/AddRoleCommand/AddRoleCommand.cs +++ b/src/Core/CleanArc.Application/Features/Role/Commands/AddRoleCommand/AddRoleCommand.cs @@ -9,7 +9,7 @@ namespace CleanArc.Application.Features.Role.Commands.AddRoleCommand; public record AddRoleCommand(string RoleName) : IRequest>, IValidatableModel { - public IValidator ValidateApplicationModel(ApplicationBaseValidationModelProvider validator) + public static IValidator ValidateApplicationModel(ApplicationBaseValidationModelProvider validator) { validator .RuleFor(c => c.RoleName) diff --git a/src/Core/CleanArc.Application/Features/Users/Commands/Create/UserCreateCommand.cs b/src/Core/CleanArc.Application/Features/Users/Commands/Create/UserCreateCommand.cs index ccf0a7d..f038adf 100644 --- a/src/Core/CleanArc.Application/Features/Users/Commands/Create/UserCreateCommand.cs +++ b/src/Core/CleanArc.Application/Features/Users/Commands/Create/UserCreateCommand.cs @@ -14,7 +14,7 @@ public record UserCreateCommand ,IValidatableModel { - public IValidator ValidateApplicationModel(ApplicationBaseValidationModelProvider validator) + public static IValidator ValidateApplicationModel(ApplicationBaseValidationModelProvider validator) { validator diff --git a/src/Core/CleanArc.Application/Features/Users/Commands/RefreshUserTokenCommand/RefreshUserTokenCommand.cs b/src/Core/CleanArc.Application/Features/Users/Commands/RefreshUserTokenCommand/RefreshUserTokenCommand.cs index c5f3e7a..76908e1 100644 --- a/src/Core/CleanArc.Application/Features/Users/Commands/RefreshUserTokenCommand/RefreshUserTokenCommand.cs +++ b/src/Core/CleanArc.Application/Features/Users/Commands/RefreshUserTokenCommand/RefreshUserTokenCommand.cs @@ -10,7 +10,7 @@ namespace CleanArc.Application.Features.Users.Commands.RefreshUserTokenCommand; public record RefreshUserTokenCommand(Guid RefreshToken) : IRequest>, IValidatableModel { - public IValidator ValidateApplicationModel(ApplicationBaseValidationModelProvider validator) + public static IValidator ValidateApplicationModel(ApplicationBaseValidationModelProvider validator) { validator.RuleFor(c => c.RefreshToken) .NotEmpty() diff --git a/src/Core/CleanArc.Application/Features/Users/Queries/GenerateUserToken/GenerateUserTokenQuery.cs b/src/Core/CleanArc.Application/Features/Users/Queries/GenerateUserToken/GenerateUserTokenQuery.cs index efe1c5e..923f028 100644 --- a/src/Core/CleanArc.Application/Features/Users/Queries/GenerateUserToken/GenerateUserTokenQuery.cs +++ b/src/Core/CleanArc.Application/Features/Users/Queries/GenerateUserToken/GenerateUserTokenQuery.cs @@ -10,7 +10,7 @@ namespace CleanArc.Application.Features.Users.Queries.GenerateUserToken; public record GenerateUserTokenQuery(string UserKey, string Code) : IRequest>, IValidatableModel { - public IValidator ValidateApplicationModel(ApplicationBaseValidationModelProvider validator) + public static IValidator ValidateApplicationModel(ApplicationBaseValidationModelProvider validator) { validator.RuleFor(c => c.Code) .NotEmpty() diff --git a/src/Core/CleanArc.Application/Features/Users/Queries/TokenRequest/PasswordUserTokenRequestQuery.cs b/src/Core/CleanArc.Application/Features/Users/Queries/TokenRequest/PasswordUserTokenRequestQuery.cs index a0d8edd..dff013d 100644 --- a/src/Core/CleanArc.Application/Features/Users/Queries/TokenRequest/PasswordUserTokenRequestQuery.cs +++ b/src/Core/CleanArc.Application/Features/Users/Queries/TokenRequest/PasswordUserTokenRequestQuery.cs @@ -11,7 +11,7 @@ public record PasswordUserTokenRequestQuery (string UserName,string Password) :IValidatableModel,IRequest> { - public IValidator ValidateApplicationModel(ApplicationBaseValidationModelProvider validator) + public static IValidator ValidateApplicationModel(ApplicationBaseValidationModelProvider validator) { validator.RuleFor(c => c.UserName) .NotEmpty(); diff --git a/src/Core/CleanArc.Application/Features/Users/Queries/TokenRequest/UserTokenRequestQuery.cs b/src/Core/CleanArc.Application/Features/Users/Queries/TokenRequest/UserTokenRequestQuery.cs index 2b6f92a..33afd31 100644 --- a/src/Core/CleanArc.Application/Features/Users/Queries/TokenRequest/UserTokenRequestQuery.cs +++ b/src/Core/CleanArc.Application/Features/Users/Queries/TokenRequest/UserTokenRequestQuery.cs @@ -10,7 +10,7 @@ namespace CleanArc.Application.Features.Users.Queries.TokenRequest; public record UserTokenRequestQuery(string UserPhoneNumber) : IRequest>, IValidatableModel { - public IValidator ValidateApplicationModel(ApplicationBaseValidationModelProvider validator) + public static IValidator ValidateApplicationModel(ApplicationBaseValidationModelProvider validator) { validator.RuleFor(c => c.UserPhoneNumber).NotEmpty() diff --git a/src/Shared/CleanArc.SharedKernel/Extensions/ValidatorExtensions.cs b/src/Shared/CleanArc.SharedKernel/Extensions/ValidatorExtensions.cs index ed5bcab..038f359 100644 --- a/src/Shared/CleanArc.SharedKernel/Extensions/ValidatorExtensions.cs +++ b/src/Shared/CleanArc.SharedKernel/Extensions/ValidatorExtensions.cs @@ -1,50 +1,32 @@ -using CleanArc.SharedKernel.ValidationBase; +using System.Reflection; +using CleanArc.SharedKernel.ValidationBase; using CleanArc.SharedKernel.ValidationBase.Contracts; using FluentValidation; using Microsoft.Extensions.DependencyInjection; -namespace CleanArc.SharedKernel.Extensions +namespace CleanArc.SharedKernel.Extensions; + +public static class ValidatorExtensions { - public static class ValidatorExtensions + public static IServiceCollection RegisterValidatorsAsServices(this IServiceCollection services) { - public static IServiceCollection RegisterValidatorsAsServices(this IServiceCollection services) - { - - var types = AppDomain.CurrentDomain.GetAssemblies().Where(c => c != typeof(ValidatorExtensions).Assembly).SelectMany(a => a.GetExportedTypes()).Where(t => t.GetInterfaces().Any(i => - i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IValidatableModel<>))) - .ToList(); - - - - foreach (var type in types) - { - var typeConstructorArgumentLength = type.GetConstructors().OrderByDescending(c=>c.GetParameters().Length).First().GetParameters().Length; - var model = Activator.CreateInstance(type, new object[typeConstructorArgumentLength]); - - var methodInfo = type.GetMethod(nameof(IValidatableModel.ValidateApplicationModel)); + var types = AppDomain.CurrentDomain.GetAssemblies().Where(c => c != typeof(ValidatorExtensions).Assembly).SelectMany(a => a.GetExportedTypes()).Where(t => t.GetInterfaces().Any(i => + i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IValidatableModel<>))) + .ToList(); + var injectorMethod = typeof(ValidatorExtensions).GetMethod(nameof(InjectValidator), BindingFlags.NonPublic | BindingFlags.Static); - if (model != null) - { - var methodArgument = Activator.CreateInstance(typeof(ApplicationBaseValidationModelProvider<>).MakeGenericType(type)); - var validator = methodInfo?.Invoke(model, new[] { methodArgument }); + types.ForEach(t => injectorMethod.MakeGenericMethod(t).Invoke(null, [services])); - if (validator != null) - { - var interfaces = validator.GetType().GetInterfaces(); - - - var validatorInterface = interfaces - .FirstOrDefault(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IValidator<>)); - - if (validatorInterface != null) - services.AddScoped(validatorInterface, _ => validator); - - } - } - } - return services; - } + return services; } - -} + static void InjectValidator(IServiceCollection services) where TModel : class, IValidatableModel + { + services.AddScoped(sp => + { + var validatorPrpvider = new ApplicationBaseValidationModelProvider(); + var validator = TModel.ValidateApplicationModel(validatorPrpvider); + return validator; + }); + } +} \ No newline at end of file diff --git a/src/Shared/CleanArc.SharedKernel/ValidationBase/Contracts/IValidatableModel.cs b/src/Shared/CleanArc.SharedKernel/ValidationBase/Contracts/IValidatableModel.cs index 153f993..38e7ba9 100644 --- a/src/Shared/CleanArc.SharedKernel/ValidationBase/Contracts/IValidatableModel.cs +++ b/src/Shared/CleanArc.SharedKernel/ValidationBase/Contracts/IValidatableModel.cs @@ -4,5 +4,5 @@ namespace CleanArc.SharedKernel.ValidationBase.Contracts; public interface IValidatableModel where TApplicationModel:class { - IValidator ValidateApplicationModel(ApplicationBaseValidationModelProvider validator); + public static abstract IValidator ValidateApplicationModel(ApplicationBaseValidationModelProvider validator); } \ No newline at end of file