Yeni bir özellik nereden başlar?
Yeni bir özellik nereden başlar?
Önce Domain: aggregate metodunu (gerekirse yeni value object / domain event) yazın. Sonra Application:
Command/Query + Validator + Handler. Ardından API: ince bir controller action (_mediator.Send). Cache/e-posta/SMS gerekiyorsa bir INotificationHandler<TDomainEvent> ekleyin.Adım adım reçete: Playbook’lar → Command’ı uçtan uca ekle ve Application → Command’lar ve Query’ler.Handler'da SaveChanges neden yasak?
Handler'da SaveChanges neden yasak?
Çünkü domain event’ler yalnızca
IUnitOfWork.SaveEntitiesAsync üzerinden dispatch edilir — SaveEntitiesAsync, SaveChanges’ten sonra biriken event’leri MediatR’a yollar (DispatchDomainEventsAsync). Düz DbContext.SaveChangesAsync bunu atlar, event’ler hiç çalışmaz. Bu yüzden EFRepository.SaveChangesAsync bilerek exception fırlatır.Doğru kullanım her zaman: await _unitOfWork.SaveEntitiesAsync(ct);. Detay: Domain Event’ler.Bir kaydı güncelledim ama cache güncellenmiyor — neden?
Bir kaydı güncelledim ama cache güncellenmiyor — neden?
Birkaç olası neden:
- Aggregate metodu ilgili domain event’i yaymıyor (
AddDomainEventeksik). - O event için bir invalidation handler yok (örn.
InvalidateFaqCacheDomainEventHandler). - Handler farklı bir tag düşürüyor; spec’teki
WithTags(...)ile handler’dakiRemoveByTagAsync(...)aynı string olmalı (bu yüzdenCacheTagssabitleri kullanılır). - Çoklu-instance’ta broadcast kapalı:
Cache:BroadcastTagInvalidationve Redis kayıt sırası (AddRedisCache → AddCache → AddHybridCache) doğru olmalı; aksi halde L1-only kalır.
Keycloak realm metadata unreachable hatası alıyorum.
Keycloak realm metadata unreachable hatası alıyorum.
Token doğrulama JWKS metadata’sına erişemiyordur. Kontrol listesi:
- Keycloak ayakta mı (dev
8080)? Keycloakconfig’indeki authority/realm URL’i API’den erişilebilir mi (container ağı vs. host)?- Realm gerçekten kurulu mu? İlk kurulumda
KeycloakProvisioningrealm/client/user/mapper’ı RunOnce ile oluşturur. - JWKS cache 60 dk; yeni kurduysanız anahtar henüz çekilmemiş olabilir.
Migration nasıl eklenir?
Migration nasıl eklenir?
-p projesi DbContext’i (Infrastructure.EFCore), -s startup projesi (API). “No DbContext found” alıyorsanız genelde bu iki parametre eksiktir. Şemalar: public ve messaging (MassTransit outbox/inbox). Detay: Veri → Migration’lar.Yeni bir proje nasıl üretilir (template)?
Yeni bir proje nasıl üretilir (template)?
Şablon
dotnet new template’i olarak paketlidir:sourceName DiyanetCleanArchitecture olduğundan tüm namespace’ler MyProject ile yeniden adlandırılır. Semboller: Framework (net10.0), ProjectKeycloakId (kebab-case, varsayılan my-project), SkipRestore. Detay: Başlarken → Template Kullanımı.OTP SMS gelmiyor (dev/test).
OTP SMS gelmiyor (dev/test).
NetGSM yapılandırması
Services:Sms altındadır. Dev’de gerçek SMS göndermek istemiyorsanız Phones[] test numaralarını kullanın. Kontrol:Username/Password/MessageHeaderdolu mu?- Numara geçerli mobil formatta mı? Gönderim
Phone.ToNetGsmFormat()ile yapılır. - Kayıt başarılı olduysa SMS bir kez gönderilmiştir; gelmezse yeniden kayıt değil,
resend-otpçağrılır (60 sn cooldown, max 3 — bkz. OTP playbook’u). SmsServiceException→ API503döner; log’larda (Seq) gateway hatasını arayın.
Personel token neden bu kadar çabuk düşüyor (5 dk)?
Personel token neden bu kadar çabuk düşüyor (5 dk)?
Yönetim (personel) realm’inde access token süresi bilerek 5 dakikadır — yetki değişikliklerinin (rol/permission) hızlı yansıması ve sızan token’ın kısa ömürlü olması için.
keycloak-js sessiz refresh ile token’ı yeniler; refresh anında IUserContextProvider.InvalidateAsync(sub) permission cache’ini düşürür. Vatandaş realm’inde token 2 saattir. Detay: Personel Girişi playbook’u.Domain katmanından DbContext'e erişebilir miyim?
Domain katmanından DbContext'e erişebilir miyim?
Hayır. Domain hiçbir altyapıya (EF Core, DbContext) bağımlı olmaz; yalnızca
IRepository<T> / IReadRepository<T> / IUnitOfWork soyutlamalarını bilir. DbContext bağımlılığı Application/Infrastructure katmanlarında kalır. Aggregate içinde sorgu gerekiyorsa bunu bir domain service’e (örn. UserRegistrationService, repository alır) veya Application handler’a taşıyın. Detay: Mimari → Bağımlılık Akışı.Stage ve Prod farkı nedir?
Stage ve Prod farkı nedir?
- Stage (
docker-compose.stage.yml/.stage.local.yml): nginx-proxy + path-based routing;.stage.local.ymlHTTP-only yereldir,.stage.ymlLet’s Encrypt ile TLS. - Prod (
docker-compose.prod.yml): nginx-proxy + acme-companion ile otomatik TLS. Hetzner çoklu-proje için.platform.yml+.shared-infra.yml+.app.yml. - Müşteri on-prem’de Let’s Encrypt çalışmaz (intranet/kurumsal cert) ve mevcut Postgres kullanılır. Detay: Operasyon → Docker Prod.
Çoklu instance'ta cache tutarlılığı nasıl sağlanıyor?
Çoklu instance'ta cache tutarlılığı nasıl sağlanıyor?
Bir node tag’i düşürdüğünde (
RemoveByTagAsync) L1+L2 temizlenir ve bir CacheInvalidationIntegrationEvent RabbitMQ’ya yayılır. Diğer node’lar bunu tüketip yalnızca kendi L1’lerini temizler (RemoveByTagLocallyAsync — tekrar broadcast etmez). Kendi yayınını yeniden işlememek için SourceNodeId == NodeId olan event’ler atlanır (echo guard). L2 (Redis) ortak olduğundan zaten paylaşımlıdır; broadcast yalnızca L1’leri senkron tutar. Detay: Çoklu-instance cache.İlgili
Sözlük
Terimlerin Türkçe açıklamaları.
Playbook'lar
Uçtan uca senaryolar.