Tooark.AspNetCore 4.0.1

dotnet add package Tooark.AspNetCore --version 4.0.1
                    
NuGet\Install-Package Tooark.AspNetCore -Version 4.0.1
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Tooark.AspNetCore" Version="4.0.1" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Tooark.AspNetCore" Version="4.0.1" />
                    
Directory.Packages.props
<PackageReference Include="Tooark.AspNetCore" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Tooark.AspNetCore --version 4.0.1
                    
#r "nuget: Tooark.AspNetCore, 4.0.1"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Tooark.AspNetCore@4.0.1
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Tooark.AspNetCore&version=4.0.1
                    
Install as a Cake Addin
#tool nuget:?package=Tooark.AspNetCore&version=4.0.1
                    
Install as a Cake Tool

Tooark.AspNetCore

Biblioteca que concentra o que o Tooark tem de específico de ASP.NET Core, mantendo os demais pacotes livres do requisito de runtime.

Conteúdo

Visão Geral

O pacote Tooark.AspNetCore fornece:

  • extensões para tipos do ASP.NET Core, hoje o ModelStateDictionary;
  • o lugar para onde o requisito de ASP.NET Core foi movido, tirando-o dos pacotes de uso geral;
  • integração com o localizador do Tooark.Extensions, traduzindo as chaves de erro das validações;
  • o lugar previsto para os filtros e middlewares da família.

Por que o pacote existe. O Microsoft.AspNetCore.App não é uma dependência NuGet comum: declará-lo faz a aplicação exigir o runtime do ASP.NET Core instalado, e esse requisito é contagioso — propaga para todo pacote que referencia, e para quem referencia esses.

Até a v3 o requisito vinha do Tooark.Extensions, por causa de um único arquivo. Na prática, um worker service ou uma ferramenta de linha de comando que usasse o Tooark.ValueObjects recebia Microsoft.AspNetCore.App no próprio runtimeconfig.json e não subia em uma imagem mcr.microsoft.com/dotnet/runtime.

A partir da v4 o requisito mora aqui. Quem faz web referencia este pacote; quem não faz, não paga por ele.

Pacote Exige o runtime do ASP.NET Core
Tooark.AspNetCore sim — é o propósito dele
Tooark.Dtos simSearchDto, PaginationDto e ResponseDto usam tipos do MVC e do Http
Tooark (agregador) sim — por referenciar os dois acima
Tooark.Extensions, Tooark.Utils, Tooark.ValueObjects, Tooark.Entities, Tooark.Attributes e os demais não

🔧 Instalação

dotnet add package Tooark.AspNetCore

O pacote não exige registro no container: GetErrors é um método de extensão e funciona sem configuração. Quando os filtros e middlewares chegarem, eles trarão o registro correspondente.

Requisito de runtime: por declarar o framework compartilhado, quem consome este pacote precisa do runtime do ASP.NET Core instalado. Em uma imagem Docker, use mcr.microsoft.com/dotnet/aspnet no lugar de mcr.microsoft.com/dotnet/runtime. Uma aplicação web já usa essa imagem, então na prática nada muda.


📦 Componentes

Extensões de ModelState

  • ModelStateExtension.GetErrors(ModelStateDictionary): devolve as mensagens de erro do ModelState.

Percorre todas as entradas do ModelStateDictionary e reúne o ErrorMessage de cada erro em uma única lista. Um campo com mais de um erro contribui com todas as mensagens dele. A ordem é a do ModelStateDictionary, que enumera pela chave do campo, e não a ordem em que os erros foram registrados.

Integração com as validações

As mensagens devolvidas são o que os atributos do Tooark.Attributes produzem: chaves de tradução no formato Chave;Campo, como Field.Required;Email. Elas viram texto pelo IStringLocalizer do Tooark.Extensions, que resolve o idioma pelo fluxo de execução da requisição.

Erros que o próprio model binding gera — um inteiro recebendo texto, por exemplo — vêm com a mensagem do framework, e não com uma chave. O localizador devolve esse texto inalterado e sinaliza ResourceNotFound, o que permite distinguir os dois casos quando isso importa.

Filtros e middlewares

Ainda não distribuídos. Quando existirem, entram neste pacote, nas pastas Filters/ e Middlewares/. A família só divide pacote quando o perfil de dependência difere — foi o que motivou separar o Tooark.Mediator.EntityFrameworkCore, que puxa o Entity Framework Core, do Tooark.Mediator, que não o usa. Filtros, middlewares e as extensões daqui compartilham exatamente o mesmo perfil, então dividi-los em pacotes separados não reduziria nada.

Namespaces

As extensões ficam em Tooark.AspNetCore.Extensions.


📝 Exemplos de Uso

Exemplo de leitura dos erros do ModelState

using Microsoft.AspNetCore.Mvc;
using Tooark.AspNetCore.Extensions;

[ApiController]
[Route("pessoas")]
public sealed class PessoaController : ControllerBase
{
  [HttpPost]
  public IActionResult Criar([FromBody] CriarPessoaDto dto)
  {
    if (!ModelState.IsValid)
    {
      // ["Field.Invalid;Document", "Field.Invalid;Email"]
      var erros = ModelState.GetErrors();

      return BadRequest(erros);
    }

    return Ok();
  }
}

Exemplo com as mensagens traduzidas

As chaves viram texto pelo IStringLocalizer, que vem do Tooark.Extensions e é registrado por lá:

using Tooark.Extensions.Injections;

builder.Services.AddTooarkExtensions();
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Localization;
using Tooark.AspNetCore.Extensions;

[ApiController]
[Route("pessoas")]
public sealed class PessoaController(IStringLocalizer localizer) : ControllerBase
{
  [HttpPost]
  public IActionResult Criar([FromBody] CriarPessoaDto dto)
  {
    if (!ModelState.IsValid)
    {
      // ["O campo Document é inválido", "O campo E-mail é inválido"]
      var erros = ModelState.GetErrors().Select(erro => localizer[erro].Value);

      return BadRequest(erros);
    }

    return Ok();
  }
}

O DTO validado pelos atributos do Tooark.Attributes:

using Tooark.Attributes;

public sealed class CriarPessoaDto
{
  [EmailValidation]
  public string Email { get; set; } = null!;

  [DocumentValidation("CPF")]
  public string Cpf { get; set; } = null!;
}

O nome que aparece na mensagem é o do atributo, não o da propriedade: por isso o campo Cpf produz Field.Invalid;Document, que é o padrão do DocumentValidationAttribute. Para alinhar os dois, informe o propertyName:

[DocumentValidation("CPF", propertyName: "Cpf")]
public string Cpf { get; set; } = null!;

Exemplo de filtro para não repetir a checagem

O mesmo bloco em todo endpoint pede um filtro. Enquanto o pacote não traz um pronto, ele cabe em poucas linhas:

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Localization;
using Tooark.AspNetCore.Extensions;

public sealed class ValidacaoFilter(IStringLocalizer localizer) : IActionFilter
{
  public void OnActionExecuting(ActionExecutingContext context)
  {
    if (context.ModelState.IsValid)
    {
      return;
    }

    var erros = context.ModelState.GetErrors().Select(erro => localizer[erro].Value);

    context.Result = new BadRequestObjectResult(erros);
  }

  public void OnActionExecuted(ActionExecutedContext context) { }
}
builder.Services.AddControllers(options => options.Filters.Add<ValidacaoFilter>());

📋 Dependências

Pacote Versão Descrição
Tooark.Extensions 4.x Localização das mensagens de erro
Microsoft.AspNetCore.App (framework compartilhado) 8.x/10.x ModelStateDictionary

🪪 Contribuição

Contribuições são bem-vindas! Sinta-se à vontade para abrir issues e pull requests no repositório Tooark.AspNetCore.

📄 Licença

Este projeto está licenciado sob a licença BSD 3-Clause. Veja o arquivo LICENSE para mais detalhes.

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on Tooark.AspNetCore:

Package Downloads
Tooark

Package with all Tooark resources for .NET applications.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
4.0.1 93 8/25/2026
4.0.0 97 8/25/2026