ABP Framework ile Adım Adım Yazılım Geliştirme – Bölüm 2: Proje Mimarisini Anlama
ABP Framework, modern ve sürdürülebilir uygulamalar geliştirmek için katmanlı mimari ve modüler tasarım prensiplerini benimser. Bu bölüm, ABP’nin temel mimari yapısını ve bileşenlerin birbirleriyle nasıl etkileşime girdiğini detaylı bir şekilde açıklayacaktır.
ABP’nin Katmanlı Mimarisi
ABP, yazılım geliştirme pratiklerindeki “ayrışım” (separation of concerns) ilkesine uygun olarak, her biri belirli bir sorumluluğu üstlenen katmanlara ayrılmıştır:
- Domain Layer (Domain, Domain.Shared): Uygulamanın temel iş kurallarını, varlıklarını (entities), değer nesnelerini (value objects), domain servislerini ve spesifikasyonlarını barındırır.
Domain.Shared
projesi, hem sunucu hem de istemci tarafında kullanılacak DTO’lar, sabitler ve enum’lar gibi paylaşılan tipleri içerir. Bu katman, diğer tüm katmanların bağımlı olduğu çekirdek katmandır. - Application Layer (Application, Application.Contracts): Domain katmanındaki işlevleri kullanarak kullanıcı hikayelerini (use cases) ve uygulama iş mantığını uygular. Genellikle Application Services adı verilen sınıflar aracılığıyla CRUD (Create, Read, Update, Delete) operasyonlarını ve domain operasyonlarını düzenler.
Application.Contracts
projesi, uygulama servislerinin arayüzlerini ve bu servisler arasında veri transferi için kullanılan DTO (Data Transfer Object)‘ları tanımlar. Bu sayede, sunum katmanı ile uygulama katmanı arasındaki bağımlılık azalır. - Infrastructure Layer (EntityFrameworkCore, MongoDb, Redis vb.): Uygulamanın dış kaynaklarla (veritabanı, dosya sistemi, dış API’ler vb.) etkileşimini yöneten katmandır. ABP, varsayılan olarak Entity Framework Core entegrasyonu sunar (
.EntityFrameworkCore
projesi). Bu katman, repository implementasyonlarını, DbContext yapılandırmalarını ve dış servis entegrasyonlarını içerir. - Presentation Layer (Web, HttpApi, HttpApi.Client, Blazor, Angular vb.): Kullanıcı arayüzünü (UI) veya harici API’leri temsil eden katmandır. Kullanıcıdan gelen istekleri alır, uygulama katmanına iletir ve sonuçları kullanıcıya sunar.
Web
: ASP.NET Core MVC/Razor Pages tabanlı web uygulamaları için.HttpApi
: RESTful API’ler için (genellikle mobil uygulamalar veya tek sayfa uygulamalar için).HttpApi.Client
:HttpApi
katmanındaki servisleri tüketmek için kullanılan proxy sınıflarını içerir.
Modüler Yapı ve Modüllerin Birbirleriyle İletişimi
ABP Framework, güçlü bir modüler yapıya sahiptir. Her bir proje, kendi içinde bağımsız bir modül olarak kabul edilebilir ve AbpModule
sınıfından türeyen bir sınıf ile temsil edilir. Modüller, [DependsOn(...)]
niteliği kullanılarak birbirlerine bağımlılıklarını bildirir. Bu, bağımlı modüllerin servislerinin otomatik olarak kaydedilmesini ve doğru sırada başlatılmasını sağlar.
Modüller arası iletişim, genellikle Application.Contracts
katmanında tanımlanan DTO’lar ve arayüzler aracılığıyla gerçekleşir. Ayrıca Event Bus (Bkz. Bölüm 11) mekanizması ile modüller gevşek bir şekilde iletişim kurabilir.
Dependency Injection (Bağımlılık Enjeksiyonu) Yapısı
ABP Framework, .NET Core’un yerleşik bağımlılık enjeksiyonu (DI) sistemini temel alır ve genellikle Autofac gibi gelişmiş DI konteynerleriyle entegre çalışır. Framework, servislerin yaşam döngüsünü (singleton, scoped, transient) yönetir ve bağımlılıkların otomatik olarak çözülmesini sağlar.
[Dependency(ReplaceServices = true)]
gibi nitelikler veyaAbpModule
içindekiConfigureServices
metodu ile servislerin yaşam döngüsü ve implementasyonları kolayca yapılandırılabilir.ITransientDependency
,IScopedDependency
,ISingletonDependency
arayüzlerini implemente ederek sınıflarınızı otomatik olarak ilgili yaşam döngüsü ile DI konteynerine kaydedebilirsiniz.
AutoMapper Entegrasyonu
ABP, AutoMapper kütüphanesini kullanarak DTO’lar ile Entity’ler arasında kolayca dönüşüm yapmayı sağlar. Bu, özellikle uygulama servislerinde veri transferini basitleştirir ve manuel dönüşüm kodunu azaltır. Profile
sınıfları oluşturularak entity-DTO eşleştirmeleri tanımlanır.
Domain-Driven Design (DDD) Prensiplerinin Uygulanması
ABP Framework, baştan sona Domain-Driven Design (DDD) prensiplerini benimser. Bu, iş mantığının (domain logic) açıkça tanımlanmış bir “domain” katmanında merkezileşmesini teşvik eder. Temel DDD kavramları ABP’de şu şekillerde uygulanır:
- Entities (Varlıklar): Kimliği olan ve yaşam döngüsü boyunca değişebilen nesneler.
- Aggregate Roots (Topluluk Kökleri): Bir grup varlığın tutarlılığını sağlayan ana varlık.
- Value Objects (Değer Nesneleri): Kimliği olmayan, sadece değerleri ile tanımlanan nesneler (örn. adres, para birimi).
- Domain Services (Domain Servisleri): Birden fazla varlığı veya değeri içeren iş mantığı için kullanılır.
- Repositories (Depolar): Domain katmanında tanımlanan varlıklara erişimi soyutlar.
Bu katmanlı ve modüler yapı, uygulamanızın daha okunabilir, sürdürülebilir, test edilebilir ve ölçeklenebilir olmasını sağlar.