ASPNET CORE Validação com Injeção de Dependência.
Com o tutorial ASPNET Core Validação Customizadas Server Side e Client Side explica basicamente formas na criação de validações próprias e o foco é blindar a sua aplicação e melhorar os processos de validação de modelos.
Nesse tutorial adicional é demonstrado o uso da parte da injeção de dependência (recurso nativo nas aplicações .NET CORE) dentro de um classe de validação, muito útil para acesso a diversos recursos disponibilizados pela aplicação como por exemplo, acesso a base de dados e informações de alguma camada proposta ou existente na aplicação.
O exemplo que é proposto é o seguinte, tem um classe com o nome de People
que possui o seguinte layout:
public class People
{
[Required]
public Guid Id { get; set; } [Required]
public string Name { get; set; } [Required]
[Unique]
public string NickName { get; set; }
}
sendo que no NickName
tem um atributo de validação com o nome de Unique
. O corpo de código desse atributo segue:
public class UniqueAttribute : ValidationAttribute
{ public UniqueAttribute() { } protected override ValidationResult IsValid
(
object value,
ValidationContext validationContext
)
{
DatabaseService service = validationContext
.GetService(typeof(DatabaseService)) as DatabaseService;
People people = service
.People
.AsNoTracking()
.FirstOrDefault(x => x.NickName == value.ToString()); People request = validationContext.ObjectInstance as People; if (people != null)
{
if (people.Id == request.Id)
{
return ValidationResult.Success;
}
return new ValidationResult("Nick Name already existing");
}
return ValidationResult.Success;
}
}
e nesse código resgato a classe do Entity Framework (ORM)
para busca na tabela referente validando se o campo NickName
não existe para cadastros novos ou na alteração confere se o NickName
é da mesma pessoa ou diferente.
Esse exemplo é a forma de buscar as instâncias que estão previamente configuradas como injeção de dependência na aplicação sendo que o código que está no corpo dessa classe UniqueAttribute
utilizando validationContext.GetService
passando o tipo (typeof
) para a busca do objeto que tem acesso a base de dados, exemplo:
DatabaseService service = validationContext
.GetService(typeof(DatabaseService)) as DatabaseService;
O exemplo completo no meu Github acessa aqui.
Referencia