Skip to main content

Desen

Her use-case bir Command (yazma) veya Query (okuma) ile temsil edilir. Üçlü her zaman birlikte yaşar:

Klasör konvansiyonu

Her use-case kendi klasöründe izole edilir:
Command’ler genelde class + init property’leridir; Query’ler sealed record pozisyonel syntax kullanır. İkisi de MediatR IRequest<...> döner.

Örnek 1 — SignUpUser (Command)

Vatandaş telefon numarasıyla kayıt başlatır; handler bir OTP challenge üretir ve doğrulama için kullanılacak challenge token’ı döner.

Command

Features/Authentication/Website/Commands/SignUpUser/SignUpUserCommand.cs

Validator

SignUpUserCommandValidator.csMustBeValidMobilePhone() extension’ı Türkiye mobil numara doğrulaması yapar (bkz. Validation & Mapping).

Handler

SignUpUserCommandHandler.cs — domain servisini, OTP value object’ini, aggregate metodunu ve UnitOfWork’ü orkestre eder:
SMS gönderimi handler içinde değildir. user.AddOtpChallenge(...) bir UserOtpGeneratedDomainEvent yayar; SaveEntitiesAsync sonrası SendOtpSmsDomainEventHandler bunu in-process dinler ve NetGSM üzerinden gönderir. Handler sadece use-case’i orkestre eder.

Örnek 2 — VerifyOtp (Command)

Kullanıcı challenge token’ı (header) + OTP kodu (body) gönderir. Handler kodu doğrular, access/refresh token üretir ve oturum başlatır. Features/Authentication/Website/Commands/VerifyOtp/VerifyOtpCommandHandler.cs
Specification (UserByOtpChallengeSpecification) tüm filtreyi DB tarafına iter ve sadece ilgili challenge’ı yükler — handler içinde manuel Where/Include yazılmaz. Domain davranışı (VerifyChallenge, VerifyOtp, StartSession) aggregate’ta kapsüllenir; handler bu metodları yalnızca çağırır.

Örnek 3 — GetAdminBagisBasvuruPlanlar (Query)

Sayfalanmış admin liste sorgusu. sealed record syntax’ı, IReadRepository<T> (cache decorator), specification, Paged<T> ve AutoMapper kullanır.

Query

Features/BagisBasvuruPlanlari/Admin/Queries/GetAdminBagisBasvuruPlanlar/GetAdminBagisBasvuruPlanlarQuery.cs

Handler

filter.Page 0-tabanlıdır. Backend PaginationHelper ve specification 0-based sayfa indeksi bekler; frontend useState(0) ile başlar. page=1 gönderilirse ilk sayfa sessizce atlanır.

ResponseWrapper zarfı

Tüm handler’lar IResponseWrapper<TResponse> döner. Şekil:
ResponseWrapper<T> static factory metodları sunar:

Sonraki adımlar

Pipeline Behaviors

Handler’dan önce çalışan Exception / Authorization / Validation / Permission zinciri.

Validation & Mapping

MustBeValidMobilePhone ve IMapFrom convention detayları.

Authorization

IRequirePermissions / IRequireTenantAccess marker’ları.

Domain Events

AddOtpChallenge’ın yaydığı event’ler ve handler’ları.