CodeBlanks Logo Icon CodeBlanks

Özet - DI

C# kursu · İleri seviye · Ders 60/83

ServiceCollection ve lifetime'ları birleştirerek basit bir servis kayıt sistemi yazarsın.

Özet - DI

Bu grupta DI temellerini, constructor injection'ı, ServiceCollection'ı ve Singleton, Scoped, Transient lifetime'larını öğrendin. Bunları birleştirerek basit bir servis kayıt sistemi kurabilirsin.

Önce birden çok servisi kaydedip çözeceksin, sonra Singleton ve Transient davranışlarını yan yana göreceksin. Bu, gerçek uygulamalardaki DI kullanımının özetidir.

Uygulama Çoklu servis kaydet ve çağır

Main içinde var services = new ServiceCollection(); ile kapsayıcı oluştur. services.AddSingleton<ILogger, ConsoleLogger>(); ve services.AddSingleton<ICounter, StaticCounter>(); ile iki servisi singleton kaydet. var provider = services.BuildServiceProvider(); ile sağlayıcı kur. var logger = provider.GetRequiredService<ILogger>(); ve var counter = provider.GetRequiredService<ICounter>(); ile çöz. logger.Log(counter.Next().ToString()); ile çağır.

Örnek çözümü göster
services.AddSingleton<ILogger, ConsoleLogger>(); services.AddSingleton<ICounter, StaticCounter>(); var provider = services.BuildServiceProvider(); var logger = provider.GetRequiredService<ILogger>(); var counter = provider.GetRequiredService<ICounter>(); logger.Log(counter.Next().ToString());
Örnek çözüm:
using System;
using Microsoft.Extensions.DependencyInjection;

interface ILogger { void Log(string msg); }
interface ICounter { int Next(); }

class ConsoleLogger : ILogger
{
    public void Log(string msg) => Console.WriteLine(msg);
}

class StaticCounter : ICounter
{
    private int _count;
    public int Next() => ++_count;
}

class Program
{
    static void Main()
    {
        var services = new ServiceCollection();
        services.AddSingleton<ILogger, ConsoleLogger>();
        services.AddSingleton<ICounter, StaticCounter>();
        var provider = services.BuildServiceProvider();
        var logger = provider.GetRequiredService<ILogger>();
        var counter = provider.GetRequiredService<ICounter>();
        logger.Log(counter.Next().ToString());
    }
}

Uygulama Transient davranışını göster

Main içinde var services = new ServiceCollection(); ile kapsayıcı oluştur. services.AddTransient<ICounter, Counter>(); ile ICounter'ı transient kaydet. var provider = services.BuildServiceProvider(); ile sağlayıcı kur. var c1 = provider.GetRequiredService<ICounter>(); ve var c2 = provider.GetRequiredService<ICounter>(); ile iki kez çöz. Console.WriteLine(c1.Next()); ve Console.WriteLine(c2.Next()); ile çağır.

Örnek çözümü göster
services.AddTransient<ICounter, Counter>(); var provider = services.BuildServiceProvider(); var c1 = provider.GetRequiredService<ICounter>(); var c2 = provider.GetRequiredService<ICounter>(); Console.WriteLine(c1.Next()); Console.WriteLine(c2.Next());
Örnek çözüm:
using System;
using Microsoft.Extensions.DependencyInjection;

interface ICounter { int Next(); }

class Counter : ICounter
{
    private int _count;
    public int Next() => ++_count;
}

class Program
{
    static void Main()
    {
        var services = new ServiceCollection();
        services.AddTransient<ICounter, Counter>();
        var provider = services.BuildServiceProvider();
        var c1 = provider.GetRequiredService<ICounter>();
        var c2 = provider.GetRequiredService<ICounter>();
        Console.WriteLine(c1.Next());
        Console.WriteLine(c2.Next());
    }
}

Kendini test et

  1. AddSingleton ne yapar?

    • Her istekte yeni örnek üretir
    • Her kapsam için ayrı örnek verir
    • Yalnızca hata ayıklama yapar
    • Uygulama boyunca tek örnek verir
    Cevabı göster

    Uygulama boyunca tek örnek verir — Doğru. AddSingleton uygulama boyunca tek örnek verir.

  2. Lifetime'ı örnek sayısına eşle

    Singleton
    1 (uygulama)
    Scoped
    1 (kapsam)
    Transient
    Sınırsız (her çağrı)
    AddSingleton
    Kayıt metodu

İleri seviye bölümündeki tüm dersler