Skip to main content
Altyapı servisleri, Application katmanının ihtiyaç duyduğu dış dünya entegrasyonlarını (e-posta, SMS, OAuth sağlayıcıları, TOTP üreteci, arka plan iş kuyruğu, gerçek-zamanlı bildirim) sağlayan ayrı projelerdir. Her biri src/DiyanetCleanArchitecture.Infrastructure.Services.* ya da src/DiyanetCleanArchitecture.Infrastructure.Jobs.* altında yaşar.

Ortak desen

Tüm servisler aynı üç kuralı izler:
1

Application arayüzünü implemente eder

Servis sınıfı, Application/Domain katmanının tanımladığı (ya da kendi projesindeki) bir arayüzü implemente eder: IEmailService, IOtpSmsService, IAuthenticationTotpService, IOAuthClient<TUserInfo>, IAdminNotificationBroadcaster. Tüketici kod somut sınıfı değil arayüzü inject eder.
2

Bir Add*Service extension'ı ile kaydedilir

Her projenin kök DependencyInjection.cs dosyasında Add* adında bir IServiceCollection extension metodu vardır. Program.cs bunları sırayla çağırır:
builder.Services.AddHangfireServers(builder.Configuration);
builder.Services.AddSmsService(builder.Configuration);
builder.Services.AddEmailService(builder.Configuration);
builder.Services.AddAuthenticatorService(builder.Configuration);
builder.Services.AddOAuthProviders(builder.Configuration);
builder.Services.AddNotificationService(builder.Configuration);
3

Config Services:* altında bind edilir

Servis ayarları appsettings.json içinde Services:<Ad> bölümünden bind edilir (OAuth ve Keycloak istisna — kök seviyede OAuth ve Keycloak bölümlerini kullanır). Bind, services.Configure<TOptions>(o => configuration.GetSection("Services:...").Bind(o)) deseni ile yapılır.
Çoğu servis Polly ile resilience (retry / circuit-breaker) ve bir health check ekler. Dış sağlayıcı health check’leri [External] tag’i taşır: sağlayıcı çökse de /health/ready bozulmaz, sadece /health/external degraded olur. Mantık: e-posta/SMS sağlayıcısı geçici çökerse API çalışmaya devam etmeli.

Servis matrisi

ServisProvider / TeknolojiAna arayüzConfig anahtarıDI extension
EmailBrevo SMTP (MailKit + Scriban)IEmailServiceServices:EmailAddEmailService
SMSNetGSM REST v2 OTPIOtpSmsServiceServices:SmsAddSmsService
NotificationSSE (in-memory Channel)IAdminNotificationBroadcasterServices:NotificationAddNotificationService
OAuthGoogle / Meta / KeycloakIOAuthClient<TUserInfo>OAuth, KeycloakAddOAuthProviders
AuthenticatorOtpNet (TOTP / RFC 6238)IAuthenticationTotpServiceServices:AuthenticatorAddAuthenticatorService
HangfireHangfire + PostgreSQLICommandBus / IEventBusServices:HangfireAddHangfireServers

Resilience ve health check özeti

ServisResilienceHealth check (tag)
EmailPolly retry (RetryCount, exponential) + circuit-breaker (6 hata / 1 dk)smtp[External]
SMSPolly HTTP retry (RetryCount, lineer backoff)sms-provider[External]
OAuthPolly HTTP retry (3×, exponential)
HangfirePostgres storage retry + DLX kuyruklarıhangfire[Ready]
NotificationBounded Channel DropOldest (backpressure)
AuthenticatorSaf hesaplama (dış bağımlılık yok)

Servis detayları

Email

Brevo SMTP üzerinden Scriban şablonlu e-posta; ResilientEmailGateway ile Polly koruması.

SMS

NetGSM REST v2 OTP entegrasyonu; ASCII-only mesaj, ortam bazlı telefon çözümleme.

Notification

SSE tabanlı, rol-hedefli admin bildirimleri; HMAC stream-token ile kimlik.

OAuth

Google, Meta ve Keycloak; PKCE (S256) tabanlı backend-driven akış.

Authenticator (TOTP)

OtpNet ile RFC 6238 TOTP; QR üretimi, drift toleranslı doğrulama.

Hangfire

PostgreSQL destekli arka plan iş kuyruğu; MediatR command/event köprüsü.