ASP.NET Core Dependency Injection
0

Table of Contents

Giriş

Dependency Injection (DI), modern yazılım geliştirmede esneklik, sürdürülebilirlik ve test edilebilirlik sağlayan temel bir tekniktir. DI’yi anlayarak ve uygulayarak, geliştiriciler daha yönetilebilir ve ölçeklenebilir uygulamalar oluşturabilirler. Bu makale, DI’nin temel kavramlarını, faydalarını ve ASP.NET Core‘da nasıl kullanıldığını ele almaktadır.

CSharp-icon
C#(C Sharp)

Dependency Injection Nedir?

Dependency Injection, sınıf bağımlılıklarının dışarıdan sağlanmasını sağlayan bir tasarım desenidir. Bu, nesnelerin bağımlılıklarını içsel olarak oluşturmak yerine dışarıdan almalarına olanak tanır. Bu yaklaşım, kontrolün ters çevrilmesi (Inversion of Control, IoC) ilkesini kolaylaştırır; yani, bağımlılıkların oluşturulması ve yönetilmesi kontrolü sınıftan dış bir bileşene veya çerçeveye devredilir.

Dependency Injection’ın Temel Kavramları

Servis Kayıtları

Bağımlılıklar, genellikle Startup.cs veya Program.cs dosyasında bir servis konteynerine kaydedilir. Bu servislerin farklı yaşam döngüleri olabilir:

  • Geçici (Transient): Her talep edildiğinde oluşturulur.
  • Kapsamlı (Scoped): Her istek başına bir kez oluşturulur.
  • Tekil (Singleton): Uygulamanın ömrü boyunca bir kez oluşturulur ve paylaşılır.

Servis Çözünürlüğü

DI konteyneri, bağımlılıkları, ihtiyaç duyulan sınıfların kurucularına enjekte ederek çözer.

Servis Yaşam Döngüleri

Servis yaşam döngülerinin doğru yönetimi, uygulama performansı ve bellek yönetimi için kritik öneme sahiptir. ASP.NET Core, üç ana yaşam döngüsünü destekler:

  • Geçici (Transient): Hafif, durumsuz servisler için kullanışlıdır.
  • Kapsamlı (Scoped): Tek bir istek içinde durumu koruması gereken servisler için idealdir.
  • Tekil (Singleton): Küresel durumu koruyan servisler için uygundur.

Dependency Injection’ın Faydaları

  • Bağımsızlık: Bağımlılıkları enjekte ederek, sınıflar somut uygulamalardan ayrılır, bu da bileşenlerin daha kolay değiştirilmesini sağlar.
  • Test Edilebilirlik: DI, sahte bağımlılıkların kullanımını sağlayarak birim testlerini kolaylaştırır.
  • Sürdürülebilirlik: Bağımlılık değişiklikleri, bağımlı sınıflarda değişiklik gerektirmez, bu da kod değişikliklerinin etkisini azaltır.
  • Esneklik: DI, bağımlılıkların yapılandırılmasını ve yeniden yapılandırılmasını sınıfları değiştirmeden kolaylaştırır.

ASP.NET Core’da Dependency Injection Uygulamak

Servis Kaydı

ASP.NET Core’da, servisler Program.cs dosyasında kaydedilir. İşte bir örnek:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddTransient<IMyDependency, MyDependency>();
builder.Services.AddScoped<IOtherDependency, OtherDependency>();
builder.Services.AddSingleton<IAnotherDependency, AnotherDependency>();

var app = builder.Build();

Servislerin Enjekte Edilmesi

Kayıtlı servisler, kurucu enjeksiyonu kullanılarak kontrolörlere veya diğer sınıflara enjekte edilebilir:

public class MyController : Controller
{
    private readonly IMyDependency _myDependency;

    public MyController(IMyDependency myDependency)
    {
        _myDependency = myDependency;
    }

    public IActionResult Index()
    {
        _myDependency.DoWork();
        return View();
    }
}

İleri Düzey Dependency Injection Teknikleri

Koşullu Kayıt

Bazen servisleri belirli kriterlere göre koşullu olarak kaydetmeniz gerekebilir:

if (someCondition)
{
    builder.Services.AddSingleton<IService, ServiceImplementationA>();
}
else
{
    builder.Services.AddSingleton<IService, ServiceImplementationB>();
}

Anahtarlı Servisler

Anahtarlı servisler, aynı arayüzün birden fazla uygulamasını anahtarla ayırt edilebilir şekilde sağlar:

builder.Services.AddKeyedSingleton<ICache, BigCache>("big");
builder.Services.AddKeyedSingleton<ICache, SmallCache>("small");

Middleware İçinde Kapsamlı Servislerin Enjeksiyonu

Kapsamlı servislerin middleware içine enjeksiyonu, Invoke veya InvokeAsync yöntemleri kullanılarak yapılabilir:

public async Task InvokeAsync(HttpContext context, IMyScopedService scopedService)
{
    scopedService.DoWork();
    await _next(context);
}

Dependency Injection Nelere Dikkat Edilmeli

  • Aşırı Enjeksiyondan Kaçının: Bir sınıfın çok fazla bağımlılığı varsa, bu sınıfın çok fazla sorumluluğa sahip olduğunu gösterebilir. Tek Sorumluluk İlkesi’ne (Single Responsibility Principle) uygun olarak yeniden düzenleyin.
  • Kurucu Enjeksiyonu Tercih Edin: Bağımlılıkları açık hale getirir ve kodu daha anlaşılır ve sürdürülebilir kılar.
  • Arayüz için Tasarım: Esneklik ve test edilebilirliği artırmak için somut uygulamalardan ziyade soyutlamalara (arayüzlere) bağımlı olun.
  • Servisleri Doğru Şekilde Bertaraf Edin: IDisposable’ı uygulayan servislerin DI konteyneri tarafından doğru şekilde bertaraf edildiğinden emin olun.

Sonuç

Dependency Injection, yazılım geliştirmeye birçok fayda sağlayan güçlü bir tasarım desenidir. ASP.NET Core’da DI’yi kullanarak geliştiriciler, daha modüler, test edilebilir ve sürdürülebilir uygulamalar oluşturabilirler. DI’nin temel kavramlarını ve en iyi uygulamalarını anlamak, sağlam ve ölçeklenebilir yazılım çözümleri geliştirmeye yardımcı olacaktır.

Dependency Injection
Dependency Injection

Dependency Injection (Bağımlılık Enjeksiyonu) nedir?

Dependency Injection (DI), sınıf bağımlılıklarının çözülmesi için bir tasarım desenidir. Bu desen, nesnelerin bağımlılıklarını içsel olarak oluşturmak yerine dışarıdan almalarını sağlar, böylece kontrol ters çevrimi (Inversion of Control, IoC) sağlanır.

Dependency Injection modern yazılım geliştirmede neden önemlidir?

Dependency Injection, esneklik, sürdürülebilirlik ve test edilebilirlik sağlar. Sınıfların bağımlılıklardan ayrılmasına yardımcı olur, bileşenlerin daha kolay değiştirilmesini sağlar ve etkili birim testleri yapılmasını sağlar.

Dependency Injection’ın temel kavramları nelerdir?

Servis Kaydı: Bağımlılıkların bir servis konteynerinde kaydedilmesi.

Servis Çözünürlüğü: Bağımlılıkların, sınıfların kurucularına enjekte edilerek çözülmesi.

Servis Yaşam Döngüleri: Servis yaşam döngülerinin (Geçici, Kapsamlı, Tekil) performans ve bellek yönetimi için yönetilmesi.

ASP.NET Core’da servisler nasıl kaydedilir?

ASP.NET Core‘da servisler, Program.cs dosyasında AddTransient, AddScoped ve AddSingleton gibi yöntemler kullanılarak kaydedilir.

Örnek:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddTransient();

builder.Services.AddScoped();

builder.Services.AddSingleton();

var app = builder.Build();

ASP.NET Core’da servisler nasıl enjekte edilir?

Kayıtlı servisler, kurucu enjeksiyonu kullanılarak kontrolörlere veya diğer sınıflara enjekte edilir.

Örnek:

ASP.NET Core’da desteklenen servis yaşam döngüleri nelerdir?

ASP.NET Core üç ana servis yaşam döngüsünü destekler:

Geçici (Transient): Her talep edildiğinde oluşturulur. Hafif, durumsuz servisler için kullanışlıdır.

Kapsamlı (Scoped): Her istek başına bir kez oluşturulur. Tek bir istek içinde durumu koruması gereken servisler için idealdir.

Tekil (Singleton): Uygulamanın ömrü boyunca bir kez oluşturulur ve paylaşılır. Küresel durumu koruyan servisler için uygundur.

Dependency Injection kullanmanın faydaları nelerdir?

Bağımsızlık: Sınıflar somut uygulamalardan ayrılır.

Test Edilebilirlik: Sahte bağımlılıkların kullanımını sağlayarak birim testlerini kolaylaştırır.

Sürdürülebilirlik: Bağımlılık değişiklikleri, bağımlı sınıflarda değişiklik gerektirmez.

Esneklik: Bağımlılıkların yapılandırılmasını ve yeniden yapılandırılmasını kolaylaştırır.

ASP.NET Core’da servisler nasıl koşullu olarak kaydedilir?

Servisler belirli kriterlere göre koşullu olarak kaydedilebilir.

Örneğin:

ASP.NET Core’da middleware içinde kapsamlı servisler nasıl enjekte edilir?

Kapsamlı servisler middleware içine Invoke veya InvokeAsync yöntemleri kullanılarak enjekte edilebilir.

Örneğin:

Dependency Injection kullanımı için en iyi uygulamalar nelerdir?

Aşırı Enjeksiyondan Kaçının: Çok fazla bağımlılığı olan sınıfları yeniden düzenleyin.

Kurucu Enjeksiyonu Tercih Edin: Bağımlılıkları açık hale getirir ve kodu daha anlaşılır kılar.

Arayüz için Tasarım: Soyutlamalara (arayüzlere) bağımlı olun.

Servisleri Doğru Şekilde Bertaraf Edin: IDisposable’ı uygulayan servislerin doğru şekilde bertaraf edildiğinden emin olun.

Dependency Injection test edilebilirliği nasıl artırır?

DI, geliştiricilerin sahte bağımlılıkları sınıflara enjekte etmesine olanak tanıyarak, bileşenleri izole edip test etmeyi kolaylaştırır.

Dependency Injection’da Inversion of Control (IoC) ilkesi nedir?

Inversion of Control (IoC), bağımlılıkların oluşturulması ve yönetilmesi kontrolünün sınıftan dış bir bileşene veya çerçeveye devredilmesini sağlayan bir ilkedir.

By addressing these frequently asked questions, developers can gain a deeper understanding of Dependency Injection and its practical applications in ASP.NET Core, leading to more efficient and maintainable software development.

//ASP.NET Core'da servisler nasıl enjekte edilir?
public class MyController : Controller
{
    private readonly IMyDependency _myDependency;

    public MyController(IMyDependency myDependency)
    {
        _myDependency = myDependency;
    }

    public IActionResult Index()
    {
        _myDependency.DoWork();
        return View();
    }
}
//ASP.NET Core'da servisler nasıl koşullu olarak kaydedilir?
if (someCondition)
{
    builder.Services.AddSingleton<IService, ServiceImplementationA>();
}
else
{
    builder.Services.AddSingleton<IService, ServiceImplementationB>();
}
//ASP.NET Core'da middleware içinde kapsamlı servisler nasıl enjekte edilir?
public async Task InvokeAsync(HttpContext context, IMyScopedService scopedService)
{
    scopedService.DoWork();
    await _next(context);
}

Results

Share your score!
Tweet your score!
Share to other

#1. Dependency Injection (DI) nedir?

#2. ASP.NET Core’da servisler hangi dosyada kaydedilir? (.NET 6 ve üst sürümlerde)

#3. Hangi servis yaşam döngüsü küresel durumu koruyan servisler için uygundur?

#4. Dependency Injection kullanmanın başlıca faydalarından biri nedir?

#5. ASP.NET Core’da middleware içinde kapsamlı servisler nasıl enjekte edilir?

Finish

Referal:

https://learn.microsoft.com/en-us/dotnet/core/extensions/dependency-injection

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir