AFJ.Infrastructure.Lib
1.25.1
dotnet add package AFJ.Infrastructure.Lib --version 1.25.1
NuGet\Install-Package AFJ.Infrastructure.Lib -Version 1.25.1
<PackageReference Include="AFJ.Infrastructure.Lib" Version="1.25.1" />
<PackageVersion Include="AFJ.Infrastructure.Lib" Version="1.25.1" />
<PackageReference Include="AFJ.Infrastructure.Lib" />
paket add AFJ.Infrastructure.Lib --version 1.25.1
#r "nuget: AFJ.Infrastructure.Lib, 1.25.1"
#:package AFJ.Infrastructure.Lib@1.25.1
#addin nuget:?package=AFJ.Infrastructure.Lib&version=1.25.1
#tool nuget:?package=AFJ.Infrastructure.Lib&version=1.25.1
Introduction
AFJ.Infrastructure.Lib e uma biblioteca .NET (pacote NuGet) com handlers de infraestrutura reutilizados por varias aplicacoes: envio de email, envio de SMS, fila (Azure Storage Queue), logging (S3/Azure Blob/arquivo local) e mensagens/localizacao.
Email (Infrastructure.Lib.Mail)
EmailHandler implementa IEmailHandler e suporta dois provedores por meio do enum EmailProvider:
EmailProvider.SendGrid(padrao, mantem o comportamento historico da biblioteca)EmailProvider.Brevo(ex-Sendinblue)
O provedor e escolhido na criacao do cliente (construtor de EmailHandler), e nao em cada chamada de metodo. Isso significa que os metodos SendEmailAsync e SendEmailWithTemplateAsync mantêm exatamente a mesma assinatura de sempre — nenhum ponto do codigo que ja usa IEmailHandler/EmailHandler precisa ser alterado. Basta ajustar como o handler e instanciado (ou como ele e registrado no seu container de DI) para trocar de provedor:
// Compatibilidade: comportamento historico, sem alterar nada nos pontos de uso
var emailHandler = new EmailHandler(); // equivalente a new EmailHandler(EmailProvider.SendGrid)
await emailHandler.SendEmailAsync(to, subject, plainText, bodyHtml, apiKey);
await emailHandler.SendEmailWithTemplateAsync(to, subject, templateId, apiKey, data);
// Trocando para o Brevo: so muda a criacao do handler
var emailHandler = new EmailHandler(EmailProvider.Brevo);
await emailHandler.SendEmailAsync(to, subject, plainText, bodyHtml, apiKey);
await emailHandler.SendEmailWithTemplateAsync(to, subject, templateId, apiKey, data);
Se o handler for registrado em um container de DI (IServiceCollection), basta parametrizar o provedor no registro (ex.: services.AddSingleton<IEmailHandler>(new EmailHandler(EmailProvider.Brevo))) sem tocar nas classes que injetam IEmailHandler.
Observacoes sobre o Brevo:
templateIddeve ser o identificador numerico do template cadastrado no Brevo (informado comostring, convertido internamente).- O email do remetente (
from) precisa estar validado/autenticado na conta Brevo usada. - A integracao usa o SDK oficial da Brevo para C# (
brevo_csharp,TransactionalEmailsApi/SendSmtpEmail), e nao chamadas HTTP manuais.
SMS (Infrastructure.Lib.Sms)
O Brevo tambem oferece envio de SMS transacional. SmsHandler implementa ISmsHandler e segue o mesmo principio do EmailHandler: o provedor e escolhido no construtor, nao no metodo de envio.
var smsHandler = new SmsHandler(); // equivalente a new SmsHandler(SmsProvider.Brevo), unico provedor hoje
await smsHandler.SendSmsAsync(to, message, apiKey, sender: "XCaju");
Observacoes:
todeve estar no formato E.164 (ex.:+5511999999999).senderdeve ter ate 15 caracteres alfanumericos, sem espacos, para a maioria dos paises.- A integracao usa o SDK oficial da Brevo para C# (
brevo_csharp,TransactionalSMSApi/SendTransacSms), e nao chamadas HTTP manuais.
Testes (Infrastructure.Lib.Tests)
O projeto de testes usa xUnit e executa testes de integracao contra os ambientes reais do SendGrid e do Brevo (nenhum mock/fake e usado).
- Copie/edite
Infrastructure.Lib.Tests/appsettings.json(ja existe, esta no.gitignore) com suas chaves reais:
{
"SendGrid": {
"ApiKey": "SG.xxxxx",
"From": "no-reply@seudominio.com",
"To": "destinatario-de-teste@seudominio.com",
"TemplateId": "d-xxxxxxxxxxxx"
},
"Brevo": {
"ApiKey": "xkeysib-xxxxx",
"From": "no-reply@seudominio.com",
"To": "destinatario-de-teste@seudominio.com",
"TemplateId": "1",
"SmsSender": "XCaju",
"SmsTo": "+5511999999999"
}
}
- Rode os testes:
dotnet test Infrastructure.Lib.sln
Qualquer teste cujas chaves nao estejam preenchidas (ou ainda estejam com o valor REPLACE_...) e ignorado automaticamente (log SKIPPED), sem falhar o build. O pipeline de CI (dotnet build) so compila o projeto de testes; a execucao dos testes (dotnet test), que envia emails/SMS reais, e feita manualmente pelo desenvolvedor.
Build and Test
dotnet restore Infrastructure.Lib.sln
dotnet build Infrastructure.Lib.sln
dotnet test Infrastructure.Lib.sln
Contribute
Abra um pull request contra a branch homolog. O CI compila a solucao inteira (biblioteca + testes) e publica o pacote NuGet a partir da branch master.
| Product | Versions 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 was computed. 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. |
-
net8.0
- AFJ.Language (>= 1.16.0)
- AWSSDK.S3 (>= 4.0.18.7)
- Azure.Core (>= 1.51.1)
- Azure.Storage.Blobs (>= 12.27.0)
- Azure.Storage.Common (>= 12.26.0)
- Azure.Storage.Queues (>= 12.25.0)
- brevo_csharp (>= 1.1.2)
- Microsoft.AspNetCore.Http.Extensions (>= 2.3.9)
- Microsoft.AspNetCore.Localization (>= 2.3.9)
- SendGrid (>= 9.29.3)
- SendGrid.Extensions.DependencyInjection (>= 1.0.1)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on AFJ.Infrastructure.Lib:
| Package | Downloads |
|---|---|
|
Infrastructure.DataDirect
Package Description |
GitHub repositories
This package is not used by any popular GitHub repositories.