Pular para o conteúdo principal
Versão: main (dev) 🚧

ITLab.Template.DevPack.Extensions

Provides reusable extension methods for common primitives, collections, dates, enums, results, HTTP context and infrastructure abstractions.

Nota: guards customizados (ObjectGuards, DateTimeOffsetGuards, DateOnlyGuards) que viviam aqui em GuardExtensions.cs foram movidos para a área dedicada Guards/ na versão 2.0.2.

Componentes

TipoNomeResponsabilidade
Static ClassApplicationBuilderExtensionsDevPack middleware wiring (UseDevPackIdentityContext)
Static ClassBooleanExtensionsUtility extensions for bool values
Static ClassCollectionExtensionsICollection<T> helpers: null-check, add-range, remove-where
Static ClassConfigurationExtensionsConfiguration binding and strongly typed access helpers
Static ClassDateOnlyExtensionsComparison, conversion and boundary helpers for DateOnly
Static ClassDateTimeExtensionsStart/end-of-day, period arithmetic and formatting for DateTime
Static ClassDateTimeOffsetExtensionsOffset-safe boundary, normalization and period helpers for DateTimeOffset
Static ClassDictionaryExtensionsSafe-get and merge helpers for IDictionary
Static ClassEnumerableExtensionsBatching, deduplication, flattening and async helpers for IEnumerable<T>
Static ClassEnumExtensionsDisplay-name resolution and flag-set helpers for enum values
Static ClassHttpContextExtensionsUser identity, tenant and request metadata extraction from HttpContext
Static ClassIdentityResultExtensionsConverts ASP.NET Core IdentityResult to DevPack Result / Error
Static ClassListExtensionsMutation and search helpers for IList<T>
Static ClassMemoryCacheExtensionsReflection-based helpers for inspecting IMemoryCache entries
Static ClassMinimalApiPaginatedExtensionsMapPaginatedGet<TQuery,TDto> — binds standard pagination params and dispatches via Mediator
Static ClassNumberRoundingExtensionsBusiness-oriented rounding helpers for numeric values
Static ClassObjectExtensionsCasting, null-coalescing and shallow-clone helpers
Static ClassResultExtensionsFluent branching helpers for Result and Result<T> outcomes
Static ClassResultHttpExtensionsResult<T>.ToHttpResult(...) — bridge to ASP.NET Core Microsoft.AspNetCore.Http.IResult for Minimal APIs
Static ClassSemaphoreExtensionsExecute-under-lock helpers for SemaphoreSlim
Static ClassServiceProviderAccessorExtensionsConvenience resolution methods for IServiceProviderAccessor
Static ClassStringCaseExtensionsCase conversion: camelCase, PascalCase, snake_case, kebab-case
Static ClassStringExtensionsNormalization, truncation, masking, parsing and formatting helpers
Static ClassTimeSpanExtensionsRounding and formatting helpers for TimeSpan
Static ClassTypeExtensionsRuntime type inspection, open-generic detection and assignability helpers

Como usar

// Date boundary for a query range.
var start = requestedDate.StartOfDay();
var end = requestedDate.EndOfDay();

// Null-safe collection check.
if (items.IsNullOrEmpty())
return Result.Success();

// Fluent result branching.
return await mediator
.Send(command)
.OnSuccess(order => mapper.Map<OrderDto>(order));

// Extract tenant from HTTP context.
var tenantId = httpContext.GetTenantId();

// Case conversion for API field names.
var fieldName = "FullName".ToSnakeCase(); // "full_name"

ResultHttpExtensions — Result → IResult bridge

Translates Result<T> / Result to ASP.NET Core Microsoft.AspNetCore.Http.IResult for Minimal APIs.

Default mapping

ErrorTypeHTTP statusTitle
Validation400Validation failed
NotFound404Resource not found
Unauthorized403Forbidden
Conflict409Conflict
Failure / Problem500Server error

Usage

group.MapPost("/", async (CreateOrderCommand cmd, IMediator m, CancellationToken ct) =>
{
var result = await m.Send(cmd, ct);
return result.ToHttpResult(value => Results.Created($"/orders/{value}", value));
}).RequireAuthorization(MyAppPermissions.Pedidos.Create);

Pass an optional errorMapper to override the default problem mapping for a specific endpoint.

MapPaginatedGet — paginated endpoint helper

Solves the binding gotcha around PaginatedQueryBase<TDto>: [AsParameters] requires every public property to be supplied even when defaults suffice. MapPaginatedGet binds the six standard pagination parameters individually with sensible defaults and dispatches the query through Mediator.

// Endpoint
group.MapPaginatedGet<ListOrdersQuery, OrderSummaryDto>(
"/", policyName: MyAppPermissions.Pedidos.Read);

// Query (note: `class`, not `record` — base is an abstract class)
public sealed class ListOrdersQuery : PaginatedQueryBase<OrderSummaryDto>;

Bound parameters: pageNumber (1), pageSize (10), orderBy (""), order (asc), filter (""), paginated (true).

O que não fazer

  • Do not add product-specific business behavior in shared extensions.
  • Do not hide expensive operations behind innocent-looking extension names.

Extensão pelo produto

  • Products can add extensions in product namespaces when behavior is not broadly reusable.
  • Shared extensions added to DevPack should be deterministic and dependency-light.