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 emGuardExtensions.csforam movidos para a área dedicadaGuards/na versão 2.0.2.
Componentes
| Tipo | Nome | Responsabilidade |
|---|---|---|
| Static Class | ApplicationBuilderExtensions | DevPack middleware wiring (UseDevPackIdentityContext) |
| Static Class | BooleanExtensions | Utility extensions for bool values |
| Static Class | CollectionExtensions | ICollection<T> helpers: null-check, add-range, remove-where |
| Static Class | ConfigurationExtensions | Configuration binding and strongly typed access helpers |
| Static Class | DateOnlyExtensions | Comparison, conversion and boundary helpers for DateOnly |
| Static Class | DateTimeExtensions | Start/end-of-day, period arithmetic and formatting for DateTime |
| Static Class | DateTimeOffsetExtensions | Offset-safe boundary, normalization and period helpers for DateTimeOffset |
| Static Class | DictionaryExtensions | Safe-get and merge helpers for IDictionary |
| Static Class | EnumerableExtensions | Batching, deduplication, flattening and async helpers for IEnumerable<T> |
| Static Class | EnumExtensions | Display-name resolution and flag-set helpers for enum values |
| Static Class | HttpContextExtensions | User identity, tenant and request metadata extraction from HttpContext |
| Static Class | IdentityResultExtensions | Converts ASP.NET Core IdentityResult to DevPack Result / Error |
| Static Class | ListExtensions | Mutation and search helpers for IList<T> |
| Static Class | MemoryCacheExtensions | Reflection-based helpers for inspecting IMemoryCache entries |
| Static Class | MinimalApiPaginatedExtensions | MapPaginatedGet<TQuery,TDto> — binds standard pagination params and dispatches via Mediator |
| Static Class | NumberRoundingExtensions | Business-oriented rounding helpers for numeric values |
| Static Class | ObjectExtensions | Casting, null-coalescing and shallow-clone helpers |
| Static Class | ResultExtensions | Fluent branching helpers for Result and Result<T> outcomes |
| Static Class | ResultHttpExtensions | Result<T>.ToHttpResult(...) — bridge to ASP.NET Core Microsoft.AspNetCore.Http.IResult for Minimal APIs |
| Static Class | SemaphoreExtensions | Execute-under-lock helpers for SemaphoreSlim |
| Static Class | ServiceProviderAccessorExtensions | Convenience resolution methods for IServiceProviderAccessor |
| Static Class | StringCaseExtensions | Case conversion: camelCase, PascalCase, snake_case, kebab-case |
| Static Class | StringExtensions | Normalization, truncation, masking, parsing and formatting helpers |
| Static Class | TimeSpanExtensions | Rounding and formatting helpers for TimeSpan |
| Static Class | TypeExtensions | Runtime 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
| ErrorType | HTTP status | Title |
|---|---|---|
| Validation | 400 | Validation failed |
| NotFound | 404 | Resource not found |
| Unauthorized | 403 | Forbidden |
| Conflict | 409 | Conflict |
| Failure / Problem | 500 | Server 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.