TailoredApps.Shared.MediatR.Email¶
Opis¶
Integracja wysyłania emaili z pipeline MediatR. Biblioteka dostarcza command SendMail oraz jego handler SendMailCommandHandler, dzięki czemu wysyłka emaila staje się naturalną częścią architektury CQRS — możesz wysłać email przez _mediator.Send(new SendMail { ... }) bez bezpośredniej zależności od IEmailProvider.
To podejście umożliwia łatwe wzbogacenie procesu wysyłki o logowanie, retry i auditing z poziomu pipeline behaviors, bez modyfikowania handlera.
Instalacja¶
Rejestracja w DI¶
// Program.cs
using TailoredApps.Shared.Email;
using TailoredApps.Shared.MediatR.Email.Handlers;
using TailoredApps.Shared.Email.MailMessageBuilder;
// 1. Zarejestruj email provider (SMTP lub konsola)
builder.Services.RegisterSmtpProvider();
// 2. Zarejestruj mail message builder
builder.Services.AddTransient<IMailMessageBuilder, TokenReplacingMailMessageBuilder>();
builder.Services.Configure<TokenReplacingMailMessageBuilderOptions>(o =>
{
o.Location = "EmailTemplates/";
o.FileExtension = "html";
});
// 3. Zarejestruj handler
builder.Services.AddTransient<ISendMailCommandHandler, SendMailCommandHandler>();
// 4. MediatR (jeśli jeszcze nie zarejestrowany)
builder.Services.AddMediatR(cfg =>
cfg.RegisterServicesFromAssembly(typeof(Program).Assembly));
Przykład użycia¶
public class UserRegistrationService
{
private readonly IMediator _mediator;
public UserRegistrationService(IMediator mediator) => _mediator = mediator;
public async Task RegisterUserAsync(string email, string userName)
{
// Logika rejestracji...
// Wyślij email powitalny przez MediatR pipeline
var result = await _mediator.Send(new SendMail
{
Recipent = email,
Subject = "Witaj w naszym serwisie!",
Template = "welcome.html",
TemplateVariables = new Dictionary<string, string>
{
{ "UserName", userName },
{ "ActivationUrl", $"https://app.example.com/activate/{Guid.NewGuid()}" }
},
Attachments = null
});
Console.WriteLine($"Email wysłany, MessageId: {result.MessageId}");
}
public async Task SendInvoiceAsync(
string email,
string invoiceNumber,
byte[] pdfContent)
{
await _mediator.Send(new SendMail
{
Recipent = email,
Subject = $"Faktura #{invoiceNumber}",
Template = "invoice.html",
TemplateVariables = new Dictionary<string, string>
{
{ "InvoiceNumber", invoiceNumber }
},
Attachments = new Dictionary<string, byte[]>
{
{ $"faktura_{invoiceNumber}.pdf", pdfContent }
}
});
}
}
API Reference¶
| Typ | Rodzaj | Opis |
|---|---|---|
SendMail |
Command (IRequest<SendMailResponse>) |
Dane emaila: Recipent, Subject, Template, TemplateVariables, Templates, Attachments |
SendMailResponse |
Klasa | Wynik wysyłki: MessageId (provider-specific identifier) |
SendMailCommandHandler |
Handler | Buduje treść z szablonu i wysyła przez IEmailProvider |
ISendMailCommandHandler |
Interfejs | Kontrakt handlera |
🤖 AI Agent Prompt¶
## TailoredApps.Shared.MediatR.Email — Instrukcja dla agenta AI
Używasz TailoredApps.Shared.MediatR.Email do wysyłania emaili przez MediatR pipeline.
### Rejestracja
```csharp
builder.Services.RegisterSmtpProvider(); // lub RegisterConsoleProvider()
builder.Services.AddTransient<IMailMessageBuilder, TokenReplacingMailMessageBuilder>();
builder.Services.AddTransient<ISendMailCommandHandler, SendMailCommandHandler>();
Wysyłanie emaila¶
var result = await _mediator.Send(new SendMail
{
Recipent = "user@example.com",
Subject = "Temat",
Template = "template.html", // nazwa pliku szablonu
TemplateVariables = new() { { "Name", "Jan" } },
Attachments = null // lub Dictionary<string, byte[]>
});
// result.MessageId — ID przypisany przez provider
Zasady¶
- Template to klucz szablonu przekazywany do IMailMessageBuilder.Build()
- TemplateVariables zastępują {{token}} w szablonie
- Podaj Templates (Dictionary
) gdy szablony są inline, nie z pliku - SendMail rzuci jeśli template nie zostanie znaleziony w IMailMessageBuilder ```