Validação do lado do cliente (validação nas camadas de apresentação)Client-side validation (validation in the presentation layers)

Mesmo quando a fonte de verdade for o modelo de domínio e, em último caso, você precisar ter validação no nível de modelo de domínio, a validação ainda poderá ser manipulada tanto no nível de modelo de domínio (lado do servidor) quanto da interface do usuário (lado do cliente).Even when the source of truth is the domain model and ultimately you must have validation at the domain model level, validation can still be handled at both the domain model level (server side) and the UI (client side).

A validação do lado do cliente é uma ótima conveniência para usuários.Client-side validation is a great convenience for users. Ela economiza tempo que de outra forma seria gasto aguardando uma viagem de ida e volta que talvez retorne erros de validação.It saves time they would otherwise spend waiting for a round trip to the server that might return validation errors. Em termos de negócios, até mesmo algumas frações de segundos multiplicadas por centenas de vezes por dia chega a ser muito tempo, despesa e frustração.In business terms, even a few fractions of seconds multiplied hundreds of times each day adds up to a lot of time, expense, and frustration. A validação imediata e simples permite que os usuários trabalhem com mais eficiência e façam contribuições e produzam entradas e saídas de melhor qualidade.Straightforward and immediate validation enables users to work more efficiently and produce better quality input and output.

Como o modelo de exibição e o modelo de domínio são diferentes, a validação do modelo de exibição e do modelo de domínio podem ser semelhantes, mas têm um propósito diferente.Just as the view model and the domain model are different, view model validation and domain model validation might be similar but serve a different purpose. Se estiver preocupado com DRY (o princípio Don't Repeat Yourself), considere que, nesse caso, a reutilização de código poderá significar também acoplamento e, em aplicativos empresariais, será mais importante não acoplar o lado do servidor com o do cliente do que seguir o princípio DRY.If you are concerned about DRY (the Don’t Repeat Yourself principle), consider that in this case code reuse might also mean coupling, and in enterprise applications it is more important not to couple the server side to the client side than to follow the DRY principle.

Mesmo ao usar a validação do lado do cliente, você sempre deve validar seus comandos ou DTOs de entrada no código do servidor, porque as APIs do servidor são um possível vetor de ataque.Even when using client-side validation, you should always validate your commands or input DTOs in server code, because the server APIs are a possible attack vector. Geralmente, fazer as duas é a melhor opção, porque se você tiver um aplicativo cliente, de uma perspectiva do UX, será melhor ser proativo e não permitir que o usuário insira informações inválidas.Usually, doing both is your best bet because if you have a client application, from a UX perspective, it is best to be proactive and not allow the user to enter invalid information.

Portanto, no código do lado do cliente você normalmente valida os ViewModels.Therefore, in client-side code you typically validate the ViewModels. Você também pode validar os DTOs ou comandos de saída do cliente antes de enviá-los aos serviços.You could also validate the client output DTOs or commands before you send them to the services.

A implementação de validação do lado do cliente depende de qual tipo de aplicativo cliente você está criando.The implementation of client-side validation depends on what kind of client application you are building. Será diferente se você estiver validando dados em um aplicativo Web MVC da Web com a maior parte do código em .NET, um aplicativo Web SPA com a validação sendo codificada em JavaScript ou TypeScript ou um aplicativo móvel codificado com Xamarin e C#.It will be different if you are validating data in a web MVC web application with most of the code in .NET, a SPA web application with that validation being coded in JavaScript or TypeScript, or a mobile app coded with Xamarin and C#.

Recursos adicionaisAdditional resources

Validação de aplicativos móveis XamarinValidation in Xamarin mobile apps

Validação em aplicativos ASP.NET CoreValidation in ASP.NET Core apps

Validação em aplicativos Web SPA (Angular 2, TypeScript, JavaScript)Validation in SPA Web apps (Angular 2, TypeScript, JavaScript)

Em resumo, estes são os conceitos mais importantes no que diz respeito à validação:In summary, these are the most important concepts in regards to validation:

  • Entidades e agregações devem impor sua própria consistência e serem "sempre válidas".Entities and aggregates should enforce their own consistency and be "always valid”. Raízes agregadas são responsáveis pela consistência de várias entidades dentro da mesma agregação.Aggregate roots are responsible for multi-entity consistency within the same aggregate.

  • Se você acha que uma entidade precisa entrar em um estado inválido, considere usar um modelo de objeto diferente – por exemplo, usar um DTO temporário até criar a entidade de domínio definitiva.If you think that an entity needs to enter an invalid state, consider using a different object model—for example, using a temporary DTO until you create the final domain entity.

  • Se precisar criar vários objetos relacionados, como uma agregação, e eles apenas forem válidos depois que todos tiverem sido criados, considere usar o padrão de fábrica.If you need to create several related objects, such as an aggregate, and they are only valid once all of them have been created, consider using the Factory pattern.

  • Na maioria dos casos, ter validação redundante no lado do cliente é bom, porque o aplicativo pode ser proativo.In most of the cases, having redundant validation in the client side is good, because the application can be proactive.