C# Injection Dependency
C# Injection Dependency doğru değişle C# Dependency Injection bu blog yazısının konusudur. Öğrenmenin büyüsü ile eğlenin.
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 C#’da nasıl kullanıldığını ele almaktadır.
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.
C# Injection Dependency
C#’ta Dependency Injection, kurucu enjeksiyonu, özellik enjeksiyonu ve metot enjeksiyonu gibi çeşitli yollarla uygulanabilir. Kurucu enjeksiyonu en yaygın yöntemdir ve bağımlılıklar sınıf kurucusu aracılığıyla sağlanır. İşte bir örnek:
public class MyService
{
private readonly IMyDependency _myDependency;
public MyService(IMyDependency myDependency)
{
_myDependency = myDependency;
}
public void PerformAction()
{
_myDependency.Execute();
}
}
ASP.NET Core Dependency Injection
ASP.NET Core, Dependency Injection için yerleşik destek sağlar ve bağımlılıkların yapılandırılması ve yönetilmesini kolaylaştırır. ASP.NET Core’da Dependency Injection’ın nasıl uygulanacağını öğrenmek için ASP.NET Core Dependency Injection sayfasını ziyaret edebilirsiniz.
Autofac Dependency Injection
Autofac, .NET için popüler bir üçüncü taraf Dependency Injection konteyneridir. Yerleşik DI konteynerine göre gelişmiş özellikler ve esneklik sağlar. ASP.NET Core uygulamasında Autofac kullanmak için, Autofac.Extensions.DependencyInjection paketini yüklemeniz ve Program.cs
dosyasında yapılandırmanız gerekir:
var builder = WebApplication.CreateBuilder(args);
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
builder.Services.AddControllersWithViews();
builder.Services.AddRazorPages();
builder.Host.ConfigureContainer<ContainerBuilder>(containerBuilder =>
{
containerBuilder.RegisterType<MyDependency>().As<IMyDependency>();
});
var app = builder.Build();
Kontrolün Ters Çevrilmesi (Inversion of Control – IoC)
Kontrolün Ters Çevrilmesi (IoC), bağımlılıkların oluşturulması ve yönetilmesi kontrolünün sınıftan dış bir bileşene devredilmesini sağlayan bir ilkedir. Dependency Injection, IoC’yi sağlamanın yollarından biridir. Bu ilke, gevşek bağlı ve kolay test edilebilir kod oluşturulmasına yardımcı olur. Yerleşik ASP.NET Core DI konteyneri veya Autofac gibi IoC konteynerleri, bağımlılıkların yaşam döngüsünü ve çözümlemesini yönetir.
Dependency Injection’da 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): 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.
Bu yaşam döngülerini anlamak, servislerin nasıl oluşturulup yönetileceği konusunda bilinçli kararlar vermenize yardımcı olur.
C# Constructor Injection
Constructor injection bağımlılıkları enjekte etmenin en yaygın ve önerilen yöntemidir. Bağımlılıkları açık hale getirir ve sınıfın gerekli bağımlılıklar sağlanmadan oluşturulmasını engeller. İşte bir örnek:
public class UserService
{
private readonly IUserRepository _userRepository;
public UserService(IUserRepository userRepository)
{
_userRepository = userRepository;
}
public void CreateUser(User user)
{
_userRepository.Add(user);
}
}
İleri Düzey Dependency Injection Teknikleri
Koşullu Kayıt
Bazen, belirli kriterlere göre servisleri koşullu olarak kaydetmeniz gerekebilir. Bu, servis kaydı sırasında koşullu mantık kullanılarak gerçekleştirilebilir:
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. Bu, farklı bağlam veya koşullara dayalı olarak farklı uygulamaların gerektiği durumlarda kullanışlıdır:
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. Bu, middleware’in her istek için çözülmüş kapsamlı bağımlılıklara sahip olmasını sağlar:
public async Task InvokeAsync(HttpContext context, IMyScopedService scopedService)
{
scopedService.DoWork();
await _next(context);
}
Dependency Injection İçin Best Practices
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 sınıfı yeniden düzenleyin.
Constructor Injection Tercih Edin
Kurucu enjeksiyonu, bağımlılıkları açık hale getirir ve kodun anlaşılmasını ve sürdürülebilirliğini kolaylaştırır.
Arayüz İçin Tasarım Yapın
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. Bu, kaynakların yönetimi ve bellek sızıntılarının önlenmesi açısından önemlidir.
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 (DI), C# dilinde 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 ve kontrolün ters çevrilmesi (IoC) ilkesini kolaylaştırır.
C# Dependency Injection örneği, sınıfların bağımlılıklarını dışarıdan almasını gösterir. Örneğin, MyService
sınıfı bir IMyDependency
bağımlılığına sahiptir ve bu bağımlılık kurucu yöntemi aracılığıyla sağlanır.
C# Console App Dependency Injection, konsol uygulamalarında bağımlılık enjeksiyonu yapmayı içerir. Bu, servislerin DI konteynerine kaydedilmesi ve ardından konsol uygulamasında çözülmesi ile gerçekleştirilir.
C# Class Library Dependency Injection, sınıf kütüphanelerinde bağımlılık enjeksiyonu uygulamayı ifade eder. Bu, kütüphanedeki sınıfların bağımlılıklarını dışarıdan almasını sağlar, böylece bağımlılıklar değiştirilebilir ve test edilebilir hale gelir.
C# Static Class Dependency Injection, statik sınıflara bağımlılık enjeksiyonu yapmayı zorlaştırabilir. Ancak, genellikle statik sınıfların bağımlılıklarını enjekte etmek için alternatif yöntemler kullanılır, örneğin, bağımlılıkların statik özellikler aracılığıyla sağlanması gibi.
Kısacası statik özellikler static classlara aktarılabilir.
C# Unit Test Dependency Injection, birim testlerinde bağımlılık enjeksiyonu kullanmayı içerir. Bu, test edilen sınıfın bağımlılıklarının sahte nesneler veya özel test bağımlılıkları ile değiştirilmesini sağlar.
C# Web API Dependency Injection, web API projelerinde bağımlılık enjeksiyonu uygulamayı ifade eder. Bu, API denetleyicilerinin ve servislerinin bağımlılıklarını DI konteyneri aracılığıyla çözmesini sağlar.
C# Dependency Injection Framework, bağımlılık enjeksiyonunu destekleyen bir çerçevedir. ASP.NET Core, Autofac gibi çerçeveler bağımlılık enjeksiyonunu yönetir ve uygulamanın farklı bölümlerinin daha esnek ve test edilebilir olmasını sağlar.
C# Dependency Injection Container, bağımlılıkları kaydeden ve çözen bir yapıdır. ASP.NET Core’un yerleşik DI konteyneri veya Autofac gibi üçüncü taraf konteynerler kullanılarak bağımlılıklar yönetilir.
C# Minimal API Dependency Injection, minimal API projelerinde bağımlılık enjeksiyonu uygulamayı ifade eder. Bu, minimal API yapılandırmalarının ve servislerinin DI konteyneri aracılığıyla yönetilmesini sağlar.
Results
#1. Dependency Injection (DI) nedir?
#2. ASP.NET Core’da hangi metod Dependency Injection ile servisleri kaydeder?
#3. Autofac nedir?
#4. Constructor Injection nedir?
#5. Hangi servis yaşam döngüsü, her istek başına bir kez servis oluşturur?
#6. C# Console App Dependency Injection nasıl uygulanır?
#7. C# Class Library Dependency Injection nedir?
#8. C# Static Class Dependency Injection mümkün mü?
#9. C# Unit Test Dependency Injection nasıl kullanılır?
#10. C# Web API Dependency Injection nedir?
İç ve Dış Bağlantılar
Dependency Injection hakkında daha fazla bilgi için aşağıdaki kaynakları inceleyebilirsiniz:
- Dependency Injection in ASP.NET Core
- C# Injection Dependency