SmartCoreHub.Core.SDK
Biblioteca NuGet central do SmartCoreHub: primitivas de domínio, Result/Guard, contratos de cache/NoSql/cloud, helpers e — nos TFMs modernos — implementações reutilizáveis de repositórios genéricos (EF Core / Dapper), providers de cache (Redis, Mongo, Cosmos, Disk), adapters Azure e banda ASP.NET (middleware, CORS, documentação OpenAPI, performance, JWT claims-based, BaseApiController).
Use este pacote quando precisar da mesma fonte de contratos e implementações genéricas entre APIs, hosts .NET e SDKs que optarem por referenciar o Core.
Hosts SmartCoreHub: SmartCoreHub.Service não contém mais wrappers de Cors / Swagger / OpenApi / Scalar / Redoc / RapiDoc / ApiPerformance. O host chama as extensions deste pacote (SmartCoreHub.Core.SDK.Service.API.DI) e só mantém branding em SmartCoreHubDocumentationOptions + composição de pipeline.
Localization.SDK: pacote público auto-isolado — não depende deste Core no NuGet. Tipos HTTP/cache leves usados pelo Localization são cópia owned. Ver Isolamento-Core.md.
Extração Service → Core: Service-Extracao.md.
Instalação
dotnet add package SmartCoreHub.Core.SDK
<PackageReference Include="SmartCoreHub.Core.SDK" Version="*" />
Frameworks suportados
| TFM |
Tipos leves (contratos, Result, Memory/Disk cache, helpers) |
Tipos pesados + banda ASP.NET (Dapper, EF, Redis, Mongo, Cosmos, Azure, middleware, docs) |
netstandard2.0 |
Sim |
Não |
netstandard2.1 |
Sim |
Não |
net6.0 |
Sim |
Não |
net8.0 |
Sim |
Sim |
net10.0 |
Sim |
Sim (+ OpenAPI nativo ASP.NET) |
Dependências pesadas (Dapper, EF Core, StackExchange.Redis, MongoDB.Driver, Azure SDKs, Swashbuckle, Scalar, ReDoc, RapiDoc, etc.) entram no grafo NuGet somente quando o projeto consumidor tem como alvo net8.0 ou net10.0.
Light vs heavy
- Light: todos os TFMs — Domain (interfaces/DTOs/entidades base),
Others (Result, Guard, exceptions, HTTP leve), cache Memory/Disk, abstrações NoSql, password hashers, helpers de Service sem ASP.NET.
- Heavy (
net8/net10): repositórios Dapper/EF, factories/adapters Azure, Redis/Mongo/Cosmos, Serilog adapter, AutoMapper adapter, sanitização HTML, banda ASP.NET completa.
CacheFactory (namespace Service) cria apenas o provider Memory. Em produção, registre Redis/Disk/Mongo/Cosmos pelos tipos deste pacote (ou via AddSdkCaching()).
Mapa de namespaces
| Namespace |
Conteúdo típico |
TFM |
SmartCoreHub.Core.SDK.Others.* |
Result, Guard, exceptions, ValueObject, HTTP leve, cache leve Guid |
todos |
SmartCoreHub.Core.SDK.Domain.* |
Entidades base, DTOs, enums, interfaces (cache, cloud, data, Dapper) |
todos |
SmartCoreHub.Core.SDK.Infrastructure.* |
Cache light, dialect/resolvers, password hashers, NoSql abstrato |
todos (+ heavy em net8/10) |
SmartCoreHub.Core.SDK.Dapper.Generic / .Persistence |
Repositório Dapper + factory |
net8/10 |
SmartCoreHub.Core.SDK.EntityFrameworkCore[.Repositories] |
GenericRepository<T>, EfUnitOfWork |
net8/10 |
SmartCoreHub.Core.SDK.Caching.{Redis,Mongo,Cosmos} |
Providers de cache pesados |
net8/10 |
SmartCoreHub.Core.SDK.NoSql.Mongo.* |
Adapters Mongo |
net8/10 |
SmartCoreHub.Core.SDK.Cloud.Azure |
Blob/Queue/Table adapters e factories |
net8/10 |
SmartCoreHub.Core.SDK.Service.* |
ServiceResult, TokenHelper, IpAddressHelper, config |
todos |
SmartCoreHub.Core.SDK.Service.API.DI |
CORS, Swagger, OpenAPI, Scalar, ReDoc, RapiDoc, ApiPerformance |
net8/10 |
SmartCoreHub.Core.SDK.Service.API.Middleware |
CorrelationId, SecurityHeaders, RequestLogging, RequestSizeLimit, LocalizationHeaderCulture |
net8/10 |
SmartCoreHub.Core.SDK.Service.API.Generic |
BaseApiController |
net8/10 |
SmartCoreHub.Core.SDK.Service.Security |
IJwtAccessTokenService / JwtAccessTokenService |
net8/10 |
SmartCoreHub.Core.SDK.Infrastructure.Data.DependencyInjection |
AddConfiguredDbContext<TContext> |
net8/10 |
Layout em disco: pastas Domain/, Infrastructure/, Service/ e Others/ (tipos nativos do SDK; ver Others/README.md).
Quick start — host ASP.NET (net8/net10)
Exemplo mínimo de host genérico (sem branding SmartCoreHub). No monólito, o Service passa SmartCoreHubDocumentationOptions.Create() / CreateCors().
using SmartCoreHub.Core.SDK.Service.API.DI;
using SmartCoreHub.Core.SDK.Service.API.Middleware;
var builder = WebApplication.CreateBuilder(args);
builder.AddApiPerformance(); // Kestrel, thread pool, JSON, compression, rate limit
var docs = new OpenApiDocumentationOptions
{
Title = "My API",
Description = "API reutilizando SmartCoreHub.Core.SDK",
ContactName = "Team",
ContactEmail = "support@example.com"
};
builder.Services.AddCustomSwagger(docs);
builder.Services.AddCustomOpenApi(docs); // efeito real em net10+
builder.Services.AddCustomCors(
builder.Configuration,
builder.Environment,
new CorsHostingOptions { PrivatePolicyName = "AllowMyFrontend" });
var app = builder.Build();
app.UseMiddleware<CorrelationIdMiddleware>();
app.UseMiddleware<SecurityHeadersMiddleware>();
app.UseApiPerformance();
CorsExtensions.SetupCors(app, new CorsHostingOptions { PrivatePolicyName = "AllowMyFrontend" });
app.MapCustomOpenApi(docs);
app.MapCustomScalar(docs);
app.MapCustomRedoc(docs);
app.MapCustomRapiDoc(docs);
app.Run();
Branding no monólito SmartCoreHub
using SmartCoreHub.Core.SDK.Service.API.DI;
using SmartCoreHub.Service.API.DI; // SmartCoreHubDocumentationOptions
var docs = SmartCoreHubDocumentationOptions.Create();
var cors = SmartCoreHubDocumentationOptions.CreateCors();
builder.Services.AddCustomSwagger(docs);
builder.Services.AddCustomOpenApi(docs);
builder.Services.AddCustomCors(builder.Configuration, builder.Environment, cors);
// no pipeline:
CorsExtensions.SetupCors(app, cors);
app.MapCustomOpenApi(docs);
app.MapCustomScalar(docs);
app.MapCustomRedoc(docs);
app.MapCustomRapiDoc(docs);
Catálogo reutilizável (detalhado)
Cada tipo público listado abaixo pode ser reutilizado por consumidores do pacote. Tipos em pastas Internal não devem ser dependência estável.
Options
| Tipo |
Propriedades principais |
Uso |
OpenApiDocumentationOptions |
DocumentName, Title, Description, ContactName, ContactEmail, SwaggerUiRoutePrefix, RedocRoutePrefix, RapiDocRoutePrefix, OpenApiDocumentRoute, OpenApiDocumentUrl, SwaggerDocumentUrl, ScalarDocumentUiRoute, nomes/títulos das UIs |
Parametriza marca e rotas das UIs |
CorsHostingOptions |
PrivatePolicyName (default AllowConfiguredOrigins), PrivateAllowedHostsValue (Private), AllowedOriginsSection (Cors:AllowedOrigins), ExposedHeaders |
CORS privado vs aberto |
ApiPerformanceOptions |
PermitLimit (100), Window (1 min), ApiKeyHeaderName (X-Auth-Token), PartitionKeyFactory |
Rate limit e tuning |
Extensions e métodos
| Classe |
Método |
Assinatura resumida |
Descrição |
SwaggerExtensions |
AddCustomSwagger |
IServiceCollection AddCustomSwagger(this IServiceCollection, OpenApiDocumentationOptions?) |
SwaggerGen + XML docs + esquema Bearer |
OpenApiExtensions |
AddCustomOpenApi |
IServiceCollection AddCustomOpenApi(this IServiceCollection, OpenApiDocumentationOptions?) |
OpenAPI built-in somente em net10+; em net8 é no-op (método existe, não registra documento) |
OpenApiExtensions |
MapCustomOpenApi |
WebApplication MapCustomOpenApi(this WebApplication, OpenApiDocumentationOptions?) |
Em net10+: mapeia JSON OpenAPI + Swagger UI. Em net8: configura apenas Swagger UI |
ScalarExtensions |
MapCustomScalar |
WebApplication MapCustomScalar(this WebApplication, OpenApiDocumentationOptions?) |
Scalar + redirect /openapi |
RedocExtensions |
MapCustomRedoc |
WebApplication MapCustomRedoc(this WebApplication, OpenApiDocumentationOptions?) |
UI ReDoc |
RapiDocExtensions |
MapCustomRapiDoc |
WebApplication MapCustomRapiDoc(this WebApplication, OpenApiDocumentationOptions?) |
UI RapiDoc |
CorsExtensions |
AddCustomCors |
IServiceCollection AddCustomCors(this IServiceCollection, IConfiguration, IHostEnvironment, CorsHostingOptions?) |
Registra policy privada ou default aberta (sem BuildServiceProvider) |
CorsExtensions |
SetupCors |
void SetupCors(WebApplication, CorsHostingOptions?) |
Aplica UseCors conforme ambiente/AllowedHosts |
ApiPerformanceExtensions |
AddApiPerformance |
WebApplicationBuilder AddApiPerformance(this WebApplicationBuilder, ApiPerformanceOptions?) |
Kestrel, thread pool, JSON, compression, rate limiting. Lê PerformanceTuning:Kestrel, PerformanceTuning:ThreadPool, PerformanceTuning:Json e PerformanceTuning:MySqlPooling |
ApiPerformanceExtensions |
UseApiPerformance |
WebApplication UseApiPerformance(this WebApplication) |
UseResponseCompression + UseRateLimiter |
ApiPerformanceExtensions |
ApplyMySqlPoolingDefaults |
string ApplyMySqlPoolingDefaults(IConfiguration, string normalizedProvider, string? connectionString) |
Injeta pooling quando provider = MySQL |
ApiPerformanceExtensions |
BuildMySqlConnectionStringWithPoolingDefaults |
string BuildMySqlConnectionStringWithPoolingDefaults(string?, int min, int max, int lifetimeSeconds) |
Monta connection string com defaults |
ApiPerformanceExtensions |
ParseHttpProtocols |
HttpProtocols ParseHttpProtocols(string?) |
Parse seguro (fallback Http1AndHttp2) |
ApiPerformanceExtensions |
ExtractTokenPrefix |
string ExtractTokenPrefix(string tokenHeader) |
Prefixo não secreto de token 4 partes (_) |
Rotas padrão resultantes (com options default ou branding SmartCoreHub):
| Recurso |
Rota |
| Swagger UI |
/swagger |
| Swagger JSON |
/swagger/v1/swagger.json |
| OpenAPI nativo |
/openapi/v1.json (net10+) |
| Scalar |
/scalar/v1 |
| ReDoc |
/redoc |
| RapiDoc |
/rapidoc |
Service.API.Middleware (net8/net10)
| Middleware |
Método |
Descrição |
CorrelationIdMiddleware |
InvokeAsync(HttpContext) |
Lê/gera X-Correlation-ID e propaga em response, HttpContext.Items e Serilog |
SecurityHeadersMiddleware |
InvokeAsync(HttpContext) |
HSTS (não-dev), X-Frame-Options, X-Content-Type-Options, etc. |
RequestLoggingMiddleware |
InvokeAsync(HttpContext) |
Log estruturado de início/fim e status |
RequestSizeLimitMiddleware |
InvokeAsync(HttpContext) |
Rejeita com 413 quando Content-Length excede o limite (default 10 MiB). Não limita corpos chunked sem Content-Length |
LocalizationHeaderCultureMiddleware |
InvokeAsync(HttpContext) |
Cultura a partir de Accept-Language |
Ordem recomendada no pipeline:
app.UseMiddleware<CorrelationIdMiddleware>();
app.UseMiddleware<RequestLoggingMiddleware>();
app.UseMiddleware<SecurityHeadersMiddleware>();
app.UseMiddleware<RequestSizeLimitMiddleware>();
app.UseMiddleware<LocalizationHeaderCultureMiddleware>();
Service.API.Generic / Authentication / Helpers (net8/net10)
| Tipo |
Membros públicos relevantes |
Descrição |
BaseApiController |
GetApplicationIdFromClaims(), SetApplicationIdOnUserContext(IUserContext), CurrentUserContext, CurrentApiKeyUserContext, GetApplicationIp(), IsUserAuthenticated(), helpers de resposta |
Controller base [Authorize] |
ApiKeyAuthenticationOptions |
Options do esquema ApiKey ASP.NET |
Configuração do handler (handler em si permanece no host) |
LogAppHelper |
PrintLogInformationVersionProduct(ILogger\|IAppLogger), GetInformationVersionProduct(), ShowInformationVersionProductString() |
Banner/versão do produto |
AppInformationVersionProductDto |
DTO de versão |
Retorno de GetInformationVersionProduct |
Service.Security — JWT claims-based (net8/net10)
| Tipo |
Métodos |
Descrição |
IJwtAccessTokenService |
GenerateAccessToken(IEnumerable<Claim>), GenerateRefreshToken(), TryGetUserId(string, out long?) |
Contrato sem entidade User |
JwtAccessTokenService |
implementa a interface + BuildStandardAccessClaims(long userId, string name, string email) |
Usa ISecurityTokenAdapterFactory / config de token |
services.AddScoped<IJwtAccessTokenService, JwtAccessTokenService>();
var claims = JwtAccessTokenService.BuildStandardAccessClaims(userId, name, email);
var access = jwt.GenerateAccessToken(claims);
var refresh = jwt.GenerateRefreshToken();
No monólito, JwtTokenService do Service continua como adapter de domínio (User → claims) sobre este serviço.
Service.Common / Configuration / Validation (mistos)
| Tipo |
TFM |
Métodos / uso |
IpAddressHelper |
todos |
IsAllowedIp, IsTrustedProxy, IsIpInCidr, NormalizeIp |
AspNetIpAddressHelper |
net8/10 |
ResolveClientIp(HttpContext?, IEnumerable<string>), ResolveAuditIp(string, HttpContext?) |
ServiceResult / ServiceResult<T> / ServiceResultHelper |
todos |
Envelope de operação de aplicação; Success / Failure / ExecuteAsync |
TokenHelper |
todos |
TryParseToken, ComputeHash, GeneratePrefix / Secret / Salt, FixedTimeEquals |
ApiKeyCacheKeys |
todos |
TokenPrefix(string) |
ConfigurationHelper |
todos |
GetSection, GetConnectionString, GetValueString, GetTokenConfigurations |
AppConfigConstants |
todos |
Constantes de chaves de configuração |
HttpHeaderNamesHelper |
todos |
Nomes de headers HTTP |
ValidationFailure / ValidationErrorMapper |
todos |
Mapeamento de erros de validação |
UserContextServiceBase |
todos |
SetUserContext / GetUserContext |
CacheFactory |
todos |
Memory-only (legado) |
CacheService / InfrastructureCacheProviderResolver |
net8/10 |
Orquestração de cache + resolução de provider |
SharedDependeciesCollection / ISharedDependeciesCollection |
todos |
Bundle de dependências compartilhadas |
ServiceCollectionValidateExtensions |
todos |
ValidateNoCircularDependencies() |
Infrastructure.Data.DependencyInjection (net8/net10)
| Método |
Assinatura |
Descrição |
AddConfiguredDbContext<TContext> |
IServiceCollection AddConfiguredDbContext<TContext>(this IServiceCollection, Action<DbContextOptionsBuilder>) where TContext : DbContext |
Registra TContext + abstração DbContext |
services.AddConfiguredDbContext<MyDbContext>(options =>
options.UseMySql(connectionString, serverVersion));
Others — Result, validação e exceptions
| Tipo |
Descrição |
Result / Result<T> |
Padrão Result (sucesso/falha) |
Error |
Erro tipado usado com Result |
PaginatedResult<T> |
Envelope de página |
Guard |
Guards de argumento |
SmartCoreHubSdkException |
Exception base do SDK |
BusinessException |
Regra de negócio |
NotFoundException |
Recurso não encontrado |
ConflictException |
Conflito de estado |
ForbiddenException |
Sem permissão |
UnauthorizedException |
Não autenticado |
ValidationException |
Falha de validação |
ConfigurationException |
Config inválida |
ExternalServiceException |
Falha de serviço externo |
StringHelper / StringExtensions |
Utilitários de string |
DateTimeHelper / DateTimeExtensions |
Utilitários de data/hora |
ValueObject |
Base de equality estrutural para VOs |
Others — repositório Guid e cache leve
| Tipo |
Descrição |
IUnitOfWork |
Unidade de trabalho |
IRepository<T> / IReadRepository<T> |
Contratos Guid-based |
ILightweightCacheProvider |
Cache leve (sem ICacheProvider host) |
LightweightMemoryCacheProvider |
Implementação Memory para SDKs de feature |
| Tipo |
Descrição |
HttpRequestExecutorBase |
Base de executor HTTP |
HttpExecutionResult<T> |
Resultado de chamada HTTP |
IAuthHeaderProvider |
Provedor de headers de autenticação |
IApiErrorMapper |
Mapeamento de erros de API |
ApiKeyAuthHeaderProvider / ApiKeyAuthOptions |
API key em header |
AcceptLanguageHelper |
Parsing Accept-Language |
Headers |
Constantes de headers HTTP |
Domain — entidades e value objects
| Tipo |
Descrição |
IEntity |
Marcador de entidade |
EntityBase |
Entidade com Guid Id |
AuditableEntity |
Entidade com campos de auditoria |
LongEntityBase |
Entidade com long Id (generics EF/Dapper) |
AuditableLongEntityBase |
LongEntityBase + CreatedUserId/ModifyUserId (sem navs de usuário) |
Email / Role / ConnectionString |
Value objects |
CloudProvider / CloudRessource |
Enums de nuvem (grafia histórica mantida) |
Domain — enums e DTOs
| Tipo |
Descrição |
ECacheProvider / ETypeLocationCache |
Providers / localização de cache |
DatabaseDialect |
SQL Server / MySQL / PostgreSQL |
BaseSearchDto |
DTO base de busca/paginação |
CacheConfigurationDto |
Seção raiz de configuração de cache |
CacheEntryOptions / CacheLoggingOptions |
Opções de entrada e logging |
CacheProviderOptions (+ Memory/Redis/Disk/MongoDb/AzureCosmosDb) |
Opções por provider |
IServiceResponse<T> / ServiceResponse<T> |
Envelope de resposta de serviço |
CultureDisplayDto |
Exibição de cultura |
ITokenConfigurationDto / TokenConfigurationDto |
Configuração de token |
LoginDto / RefreshTokenDto / PasswordVerificationInput |
DTOs de autenticação |
ApiKeyTokenCacheEntry / ApiKeyTokenFormatOptions |
Cache e formato de token de API key |
TokenValidationResult / TokenAuditDeduplicationOptions |
Validação/auditoria de token |
AuditHistoryCriteriaDto / AuditHistoryItemDto |
Consulta de histórico de auditoria |
Generic*ValidationDto (Id, Predicate, Entities, Ids, EntityUpdate) |
DTOs de validação genérica (validators ficam no host) |
Guard validation DTOs (PagingGuardValidationDto, SqlIdentifierGuardValidationDto, blob/queue/provider guards, …) |
Públicos por necessidade de testes/validators internos — não usar como contrato externo de API |
ETypeLocationSaveFiles / ETypeLocationQueueMessaging |
Local de arquivos / mensageria |
TokenQueryExecutionMode |
Stored procedure vs SQL inline |
Domain — contratos comuns / data / Dapper
| Tipo |
Descrição |
IAppLogger / NullAppLogger |
Logger abstrato + no-op |
ICacheProvider / ICacheService |
Contrato de cache host |
ICacheSerializer |
Serialização de payloads de cache |
ICacheMetrics / NullCacheMetrics |
Métricas hit/miss/latência |
IClock / SystemClock |
Relógio abstrato |
ISmartCoreHubMapper |
Mapeamento de objetos |
ISmartCoreHubDataBaseConnectionFactory |
Factory de DbConnection aberta |
IRepositoryImplementationFactory / RepositoryImplementationKind |
Escolha EF vs Dapper |
IErrorGetLocalizationService |
Lookup de erros localizados |
IGenericService<TEntity> |
Contrato CRUD genérico de serviço (implementação fica no host) |
JsonSerializerHelper |
Helpers JSON compartilhados |
ParallelOptionsHelper / ProcessStopwatch / CultureDateTimeHelper |
Helpers diversos |
DatabaseExtensionsHelper |
Helpers de extensão de DB |
Domain — cloud, segurança e auditoria
| Tipo |
Descrição |
IBlobStorageAdapter / IBlobStorageAdapterFactory |
Blob storage |
IQueueStorageAdapter / IQueueStorageAdapterFactory |
Queue storage |
ITableStorageAdapter / ITableStorageAdapterFactory |
Table storage |
ICloudServiceFactory |
Contrato de factory cloud (não há implementação pública correspondente neste pacote; use as factories Azure concretas) |
IUserContext / UserContext |
Contexto de usuário |
UserClaimsHelper / ActorContextData |
Claims → ator |
ChangeType |
Tipos de mudança de auditoria |
AuditRegistrationRequestBase<T> / AuditRegistrationRequest / AuditRegistrationTypedRequest<T> |
Requests de auditoria |
IAuditService |
Serviço de auditoria genérico |
RichContentFormat / RichContentSanitizeOptions / IRichContentSanitizer |
Sanitização de conteúdo rich |
RichContentSanitizer / DefaultRichContentSanitizer |
Implementação com HtmlSanitizer (heavy) |
AutoMapperAdapter |
ISmartCoreHubMapper sobre AutoMapper (heavy) |
Infrastructure — cache light (todos os TFMs)
| Tipo |
Descrição |
MemoryCacheProvider |
ICacheProvider in-memory |
DiskCacheProvider |
Cache em disco |
SystemTextJsonCacheSerializer |
Serializer System.Text.Json |
CacheStoredEntry |
Envelope armazenado |
CacheMetrics |
Métricas hit/miss/latência — somente net6+ (ausente em netstandard) |
CacheProviderHelper é internal e não faz parte da API pública estável.
Infrastructure — cache heavy (net8/net10)
| Tipo |
Descrição |
RedisCacheProvider |
Cache Redis |
MongoDbCacheProvider / MongoCacheDocument |
Cache Mongo |
AzureCosmosDbCacheProvider |
Cache Cosmos DB |
SdkCachingServiceCollectionExtensions.AddSdkCaching() |
Wiring completo de DI do stack de cache |
Infrastructure — repositórios e dados
| Tipo |
TFM |
Descrição |
IGenericRepository<T> |
todos |
CRUD genérico para LongEntityBase |
DapperAdpterGenericRepository<T> |
heavy |
Implementação Dapper (grafia histórica) |
RepositoryImplementationFactory |
heavy |
Resolve EF ou Dapper via DI |
GenericRepository<T> |
heavy |
Implementação EF Core |
EfUnitOfWork |
heavy |
IUnitOfWork sobre DbContext |
DatabaseDialectResolver |
todos |
Detecta dialeto SQL |
DatabaseProviderType / DatabaseProviderResolver |
todos |
Provider + resolver |
IDatabaseRoutineDefinition |
todos |
Contrato de rotinas de DB |
DatabaseRoutineStateStore |
todos |
Estado idempotente de rotinas aplicadas |
DatabaseRoutineConfiguration |
heavy |
Aplica rotinas SQL (host fornece a lista) |
HelperCharSet |
heavy |
Charset/collation MySQL em configs EF |
EntityTypeConfigurationConstants |
todos |
Constantes de tipos de coluna (varchar/text) |
MySqlConnectionPoolingHelper |
todos |
Defaults de pooling MySQL em connection strings |
EfDbConnectionFactory<TContext> |
heavy |
Factory de DbConnection a partir do provider EF |
Infrastructure — NoSql
| Tipo |
TFM |
Descrição |
ENoSqlProvider |
todos |
Mongo / Cosmos / Table (enum); implementação concreta atual: Mongo — Cosmos/Table lançam NotSupportedException |
INoSqlPersistenceAdapter<T,TKey> |
todos |
Adapter NoSql genérico |
INoSqlCrudRepository<T,TKey> (+ Factory) |
todos |
Contrato CRUD |
NoSqlCrudRepository<T,TKey> (+ Factory) |
todos |
Wrapper CRUD padrão |
INoSqlPersistenceAdapterProviderFactory |
heavy |
Factory de adapters |
NoSqlPersistenceAdapterProviderFactory |
heavy |
Seleciona provider; só Mongo está implementado |
IMongoPersistenceAdapterFactory / MongoPersistenceAdapterFactory |
heavy |
Factory Mongo |
MongoPersistenceAdapter<T,TKey> |
heavy |
Adapter Mongo |
Infrastructure — Azure (net8/net10)
| Tipo |
Descrição |
AzureBlobStorageAdapter / BlobStorageAdapterFactory |
Blob |
AzureQueueStorageAdapter / QueueStorageAdapterFactory |
Queue |
AzureTableStorageAdapter / TableStorageAdapterFactory |
Table |
IAzureTableClient / AzureDataTablesClient |
Cliente Tables testável |
Infrastructure — security / logging
| Tipo |
Descrição |
IPasswordHasher |
Contrato de hash |
BcryptPasswordHasher / HmacSha512PasswordHasher |
Implementações |
PasswordHasherFactory / PasswordAlgorithm |
Factory / enum |
ISecurityTokenAdapter / ISecurityTokenAdapterFactory |
Contratos de token |
JwtTokenAdapter / SecurityTokenAdapterFactory |
Implementação JWT (heavy). Atenção: ValidateToken / GetPrincipalFromExpiredToken usam ValidateIssuer=false e ValidateAudience=false (validam a signing key). Reavalie antes de uso multi-tenant ou internet-facing |
SerilogAdapter |
IAppLogger sobre Serilog (heavy) |
Exemplos adicionais
Result e Guard
using SmartCoreHub.Core.SDK.Others.Common;
using SmartCoreHub.Core.SDK.Others.Validation;
public Result<string> Normalize(string input)
{
Guard.AgainstEmptyString(input, nameof(input));
return Result.Success(input.Trim());
}
Cache Memory
using SmartCoreHub.Core.SDK.Infrastructure.Caching.Providers;
using Microsoft.Extensions.Caching.Memory;
services.AddMemoryCache();
services.AddSingleton<ICacheProvider, MemoryCacheProvider>();
Repositório Dapper ou EF (net8/net10)
using SmartCoreHub.Core.SDK.Dapper.Generic;
using SmartCoreHub.Core.SDK.EntityFrameworkCore.Repositories;
using SmartCoreHub.Core.SDK.Infrastructure.Repositories.Generic;
// EF
services.AddScoped(typeof(IGenericRepository<>), typeof(GenericRepository<>));
// Dapper open-generic
services.AddScoped(typeof(DapperAdpterGenericRepository<>));
Entidades usam LongEntityBase (long Id). Construtor Dapper: ISmartCoreHubDataBaseConnectionFactory, IAppLogger, string? tableName.
Azure Blob factory (net8/net10)
using SmartCoreHub.Core.SDK.Cloud.Azure;
using SmartCoreHub.Core.SDK.Domain.Interfaces.Cloud;
services.AddScoped<IBlobStorageAdapterFactory, BlobStorageAdapterFactory>();
O que permanece no host (não está neste pacote)
| Item |
Onde fica |
Motivo |
GenericService<TEntity> |
SmartCoreHub.Service |
FluentValidation + validators de feature |
ApiKeyAuthenticationHandler |
SmartCoreHub.Service |
Acoplado a serviços/repositórios de domínio |
JwtTokenService (User → claims) |
SmartCoreHub.Service |
Adapter de domínio sobre IJwtAccessTokenService |
SmartCoreHubDocumentationOptions |
SmartCoreHub.Service |
Branding (títulos, e-mail, policy AllowAngularApp) |
WebApplicationBuilderServicesConfigure / WebApplicationExtensions |
SmartCoreHub.Service |
Composição do pipeline do monólito |
| DbContext / migrations / seed |
SmartCoreHub.Infrastructure |
Específico do produto |
| Controllers de feature |
APIs |
Host |
Constraints e breaking changes
- Generics EF/Dapper exigem
where TEntity : LongEntityBase.
- Nomes históricos mantidos:
DapperAdpterGenericRepository, CloudRessource.
- Cascas Obsolete em Domain/Infrastructure foram removidas. Use tipos deste pacote no monólito/host.
- Wrappers Service de documentação/CORS/performance foram removidos — chame
SmartCoreHub.Core.SDK.Service.API.DI.* diretamente.
SmartCoreHub.Localization.SDK é auto-isolado: não depende deste NuGet; contratos HTTP/cache leves do Localization são cópia owned.
- Um único
PackageId=SmartCoreHub.Core.SDK — não existem pacotes companheiros .Dapper / .Caching.* / .Cloud.Azure.
- Tipos em namespaces/
Internal (ex.: SqlIdentifierRegexHelper, DTOs de guarda) podem ser public por necessidade técnica — trate-os como API instável.
AddCustomOpenApi / documento nativo /openapi/v1.json exigem net10; em net8 use Swagger JSON.
Documentação relacionada
Desenvolvimento local (repositório)
cd backend
dotnet build Core\SmartCoreHub.Core.SDK\SmartCoreHub.Core.SDK.csproj -c Release
dotnet test Core\SmartCoreHub.Core.SDK.Tests\SmartCoreHub.Core.SDK.Tests.csproj -c Release
dotnet pack Core\SmartCoreHub.Core.SDK\SmartCoreHub.Core.SDK.csproj -c Release
Licença
Consulte o arquivo LICENSE incluído no pacote NuGet.