Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public record AddAdminCommand
(string UserName, string Email, string Password, int RoleId) : IRequest<OperationResult<bool>>,
IValidatableModel<AddAdminCommand>
{
public IValidator<AddAdminCommand> ValidateApplicationModel(ApplicationBaseValidationModelProvider<AddAdminCommand> validator)
public static IValidator<AddAdminCommand> ValidateApplicationModel(ApplicationBaseValidationModelProvider<AddAdminCommand> validator)
{
validator.RuleFor(c => c.Email)
.EmailAddress()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ namespace CleanArc.Application.Features.Admin.Queries.GetToken;
public record AdminGetTokenQuery(string UserName, string Password) : IRequest<OperationResult<AdminGetTokenQueryResult>>,
IValidatableModel<AdminGetTokenQuery>
{
public IValidator<AdminGetTokenQuery> ValidateApplicationModel(ApplicationBaseValidationModelProvider<AdminGetTokenQuery> validator)
public static IValidator<AdminGetTokenQuery> ValidateApplicationModel(ApplicationBaseValidationModelProvider<AdminGetTokenQuery> validator)
{
validator.RuleFor(c => c.UserName)
.NotEmpty()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public record AddOrderCommand( string OrderName) : IRequest<OperationResult<bool
[JsonIgnore]
public int UserId { get; set; }

public IValidator<AddOrderCommand> ValidateApplicationModel(ApplicationBaseValidationModelProvider<AddOrderCommand> validator)
public static IValidator<AddOrderCommand> ValidateApplicationModel(ApplicationBaseValidationModelProvider<AddOrderCommand> validator)
{
validator.RuleFor(c => c.OrderName)
.NotEmpty()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public record UpdateUserOrderCommand
[JsonIgnore]
public int UserId { get; set; }

public IValidator<UpdateUserOrderCommand> ValidateApplicationModel(ApplicationBaseValidationModelProvider<UpdateUserOrderCommand> validator)
public static IValidator<UpdateUserOrderCommand> ValidateApplicationModel(ApplicationBaseValidationModelProvider<UpdateUserOrderCommand> validator)
{
validator.RuleFor(c => c.OrderId).NotEmpty().GreaterThan(0);
validator.RuleFor(c => c.OrderName).NotEmpty().NotNull();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ namespace CleanArc.Application.Features.Role.Commands.AddRoleCommand;
public record AddRoleCommand(string RoleName) : IRequest<OperationResult<bool>>,
IValidatableModel<AddRoleCommand>
{
public IValidator<AddRoleCommand> ValidateApplicationModel(ApplicationBaseValidationModelProvider<AddRoleCommand> validator)
public static IValidator<AddRoleCommand> ValidateApplicationModel(ApplicationBaseValidationModelProvider<AddRoleCommand> validator)
{
validator
.RuleFor(c => c.RoleName)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public record UserCreateCommand
,IValidatableModel<UserCreateCommand>
{

public IValidator<UserCreateCommand> ValidateApplicationModel(ApplicationBaseValidationModelProvider<UserCreateCommand> validator)
public static IValidator<UserCreateCommand> ValidateApplicationModel(ApplicationBaseValidationModelProvider<UserCreateCommand> validator)
{

validator
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ namespace CleanArc.Application.Features.Users.Commands.RefreshUserTokenCommand;
public record RefreshUserTokenCommand(Guid RefreshToken) : IRequest<OperationResult<AccessToken>>,
IValidatableModel<RefreshUserTokenCommand>
{
public IValidator<RefreshUserTokenCommand> ValidateApplicationModel(ApplicationBaseValidationModelProvider<RefreshUserTokenCommand> validator)
public static IValidator<RefreshUserTokenCommand> ValidateApplicationModel(ApplicationBaseValidationModelProvider<RefreshUserTokenCommand> validator)
{
validator.RuleFor(c => c.RefreshToken)
.NotEmpty()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ namespace CleanArc.Application.Features.Users.Queries.GenerateUserToken;
public record GenerateUserTokenQuery(string UserKey, string Code) : IRequest<OperationResult<AccessToken>>,
IValidatableModel<GenerateUserTokenQuery>
{
public IValidator<GenerateUserTokenQuery> ValidateApplicationModel(ApplicationBaseValidationModelProvider<GenerateUserTokenQuery> validator)
public static IValidator<GenerateUserTokenQuery> ValidateApplicationModel(ApplicationBaseValidationModelProvider<GenerateUserTokenQuery> validator)
{
validator.RuleFor(c => c.Code)
.NotEmpty()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public record PasswordUserTokenRequestQuery
(string UserName,string Password)
:IValidatableModel<PasswordUserTokenRequestQuery>,IRequest<OperationResult<AccessToken>>
{
public IValidator<PasswordUserTokenRequestQuery> ValidateApplicationModel(ApplicationBaseValidationModelProvider<PasswordUserTokenRequestQuery> validator)
public static IValidator<PasswordUserTokenRequestQuery> ValidateApplicationModel(ApplicationBaseValidationModelProvider<PasswordUserTokenRequestQuery> validator)
{
validator.RuleFor(c => c.UserName)
.NotEmpty();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ namespace CleanArc.Application.Features.Users.Queries.TokenRequest;
public record UserTokenRequestQuery(string UserPhoneNumber) : IRequest<OperationResult<UserTokenRequestQueryResponse>>,
IValidatableModel<UserTokenRequestQuery>
{
public IValidator<UserTokenRequestQuery> ValidateApplicationModel(ApplicationBaseValidationModelProvider<UserTokenRequestQuery> validator)
public static IValidator<UserTokenRequestQuery> ValidateApplicationModel(ApplicationBaseValidationModelProvider<UserTokenRequestQuery> validator)
{

validator.RuleFor(c => c.UserPhoneNumber).NotEmpty()
Expand Down
62 changes: 22 additions & 40 deletions src/Shared/CleanArc.SharedKernel/Extensions/ValidatorExtensions.cs
Original file line number Diff line number Diff line change
@@ -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<object>.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<TModel>(IServiceCollection services) where TModel : class, IValidatableModel<TModel>
{
services.AddScoped(sp =>
{
var validatorPrpvider = new ApplicationBaseValidationModelProvider<TModel>();
var validator = TModel.ValidateApplicationModel(validatorPrpvider);
return validator;
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@ namespace CleanArc.SharedKernel.ValidationBase.Contracts;

public interface IValidatableModel<TApplicationModel> where TApplicationModel:class
{
IValidator<TApplicationModel> ValidateApplicationModel(ApplicationBaseValidationModelProvider<TApplicationModel> validator);
public static abstract IValidator<TApplicationModel> ValidateApplicationModel(ApplicationBaseValidationModelProvider<TApplicationModel> validator);
}