using System.ComponentModel.DataAnnotations;
using System.Collections.Generic;
using Microsoft.Extensions.DependencyInjection;
public static void Main()
var services = new ServiceCollection()
.AddScoped<UserService, UserService>();
var serviceProvider = services.BuildServiceProvider();
List<ValidationResult> validationResults = new List<ValidationResult>();
var inputOne = new UpdateUserRequestDto()
Email = "user001@email.com"
Console.WriteLine($"Input: {JsonConvert.SerializeObject(inputOne)}");
validationResults = new List<ValidationResult>();
vc = new ValidationContext(inputOne, null, null);
vc.InitializeServiceProvider(type => serviceProvider.GetService(type));
bool isSuccessOne = Validator.TryValidateObject(inputOne, vc, validationResults, true);
Console.WriteLine($"Scenario 1: {isSuccessOne}");
Console.WriteLine(String.Join(",", validationResults.Select(x => x.ErrorMessage).ToList()));
Console.WriteLine("====");
var inputTwo = new UpdateUserRequestDto()
Email = "user002@email.com"
Console.WriteLine($"Input: {JsonConvert.SerializeObject(inputTwo)}");
validationResults = new List<ValidationResult>();
vc = new ValidationContext(inputTwo, null, null);
vc.InitializeServiceProvider(type => serviceProvider.GetService(type));
bool isSuccessTwo = Validator.TryValidateObject(inputTwo, vc, validationResults, true);
Console.WriteLine($"Scenario 2: {isSuccessTwo}");
Console.WriteLine(String.Join(",", validationResults.Select(x => x.ErrorMessage).ToList()));
public class UpdateUserRequestDto
public string UserName { get; set; }
[Required, DataType(DataType.EmailAddress), EmailUserUnique]
public string Email { get; set; }
public DateTime DateOfBirth { get; set; }
public class EmailUserUniqueAttribute : ValidationAttribute
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
var usernameProperty = validationContext.ObjectType.GetProperty("UserName");
var usernameValue = usernameProperty.GetValue(validationContext.ObjectInstance);
UserService? _context = validationContext.GetService(typeof(UserService)) as UserService;
var entity = _context?.Users().FirstOrDefault(x => x.Email == value.ToString()
&& x.UserName != usernameValue);
return new ValidationResult(GetErrorMessage(value.ToString()));
return ValidationResult.Success;
public string GetErrorMessage(string email)
return $"Email {email} is already in use.";
public List<User> Users()
Email = "user001@email.com"
Email = "user002@email.com"
public string UserName { get; set; }
public string Email { get; set; }