DEPENDENCY INJECTION’I IOC CONTAINER OLMADAN ANLAMAK: MANUEL DI’DAN MODERN YAKLAŞIMA
Bu makalemde eğitim sürecim kapsamında üzerinde çalıştığım projem üzerinden örnekler vererek Dependency Injection uygulamasını…
DEPENDENCY INJECTION’I IOC CONTAINER OLMADAN ANLAMAK: MANUEL DI’DAN MODERN YAKLAŞIMA
Bu makalemde eğitim sürecim kapsamında üzerinde çalıştığım projem üzerinden örnekler vererek Dependency Injection uygulamasını derinlemesine inceledim. Öncelikle projede Repository Design Pattern yaklaşımında manuel( IOC Container kullanmadan) Dependency Injection uyguladık. Mantığını anlamamız adına güzel bir örnek oldugunu düşünüyorum. Makalenin ilerleyen kısımlarında IOC Contaıner’a giriş yapacağım. Umarım ilgilenenlere faydası olur. Keyifli okumalar! :)
IOC CONTAINER KULLANMADAN MANUEL UYGULAMAK:
Dependency Injection uygulamasını en basit şekilde anlatacak olursam Constructor Inject olarak bahsederim. Bir sınıf içinde başka bir sınıfın nesnesini kullanmak için o sınıfta , nesnesini kullanmak istediğimiz sınıf türünde field(alan) tanımlarız. Tanımladığımız bu fielda constructor parametre değerini atarız.

Yukarıdaki örnekte CategoryServis sınıfımda ICategoryDal interface metodlarıma erişmek istedim. ICategoryDal türünde filed tanımlamamı yaptıktan sonra constructor metodumda değer atamasını yaptım.
Peki constructorun parametresine nasıl değer gönderilir?
Bir constructor (yapıcı metod), o sınıfa ait nesne örneği oluşturulduğunda tetiklenir. Böylece sınıfın constructor metoduna dışarıdan bir parametre göndermek istersek nesne örneği oluşturmamız gerekir. Nesne örneği oluşturmanın birkaç türü var bu yazıda bahsetmeyeceğim. Bahsedeceğim yol new anahtar kelimesi + constructor kullanmak olacak.
Constructor parametre değerimi de Category Controller sınıfımda aşağıdaki gibi, CategoryServis sınıfımın nesne örneğini oluştururken new() parametresi içinde gönderdim:

Dikkat ettiyseniz parametre değeri olarak ICategoryDal nesnesi için , ICategoryDal interfaceini implemente eden CategoryRepository sınıfımın nesne örneğini gönderebildim. Unutmayalım ki Interface’ten doğrudan instance oluşturulamaz :)
Bağımlılık soyut interface üzerinden olduğu için gevşek bağlılık sağlamış olduk:) Proje üzerinde değişiklik yapıldığında daha az yorulacağız. Hatta daha az bağımlılık için her entity için ayrı ayrı tanımlanan interfaceleri de tek bir interfaceten kalıtım almaları için Generic Interface tanımlaması yapacağım.
Peki…
IOC CONTAINER NEDİR? DEPENDENCY INJECTION(DI) UYGULARKEN NEDEN IOC CONTAİNER KULLANMALIYIZ?
✔ DI = prensip (pattern) ✔ IoC Container = bunu otomatik yapan sistem
ASP.NET MVC ve modern .NET uygulamalarında, sınıfların instance’larını Inversion of Control(Kontrolün Tersine Çevrilmesi) prensibi gereği yönetebilmek için IoC Container kullanılmaktadır.
Geleneksel programlamada, bir sınıf ihtiyaç duyduğu diğer nesneleri (bağımlılıkları) kendi içinde oluşturur. Bu durum sınıflar arasındaki bağı sıkılaştırır (tight coupling) ve kodun test edilmesini, güncellenmesini zorlaştırır.
IoC prensibi ile kontrol merkezi tersine çevrilir:
- Sınıflar bağımlılıklarını kendileri üretmek yerine dışarıdan verilmesini (enjekte edilmesini) bekler.
- Dış yapı (IoC Container / Framework) hangi sınıfın neye ihtiyacı olduğunu bilir ve bu nesneleri arka planda yöneterek ilgili yere yerleştirir
Sağladığı Avantajlar
- Gevşek Bağlılık (Loose Coupling): Sınıflar birbirlerinin somut detaylarına değil, arayüzlere (interfaces) bağımlı hale gelir.
- Kolay Test Edilebilirlik: Bağımlılıklar dışarıdan verilebildiği için bir sınıfı test ederken sahte (mock) nesneler kolayca yerleştirilebilir.
- Esnek Bakım: Sistemde bir nesne değiştiğinde veya yenisi eklendiğinde, o nesneyi kullanan diğer kod bloklarını değiştirmek gerekmez.
Manuel DI
new CategoryService(new CategoryRepository());
DI Container
Framework (IoC container) controller’ı oluştururken constructor dependency’leri otomatik çözer.
public AdminController(ICategoryService service)
{
_service = service;
}
kayıt (program.cs):
services.AddScoped<ICategoryService, CategoryService>();
services.AddScoped<ICategoryDal, CategoryRepository>();
DI container (IoC container), sadece injection değil, aynı zamanda şunları da yönetir:
1. 🔧 Nesne oluşturma (object creation)
Sen new yazmadan kullanırsın:
ICategoryService service
Container şunu yapar:
new CategoryService(new CategoryRepository())
2. 🔗 Bağımlılık zincirini çözme (dependency graph)
Örnek:
CategoryService -> ICategoryDal -> CategoryRepository -> DbContext
Sen hiçbirini oluşturmazsın, container hepsini çözer.
3. ♻️ Lifetime yönetimi
Container şunları kontrol eder:
Transient→ her seferinde yeni nesneScoped→ request başına 1 nesneSingleton→ uygulama boyunca 1 nesne
IOC Container sayesinde sınıf nesnelerinin oluşturulması, silinmesi ve kullanım ömrü gibi yapılandırmalar sağlanarak bu sınıflara olan bağımlılık büyük ölçüde azaltılmakta, yeniden kullanım ve test edilebilirlik basitleştirilmektedir.
메타데이터
- post_id
- f09b1da3072f
- slug
- dependency-injecti̇on-di-mantiği-ve-uygulama-yollari-f09b1da3072f
- url
- https://medium.com/@demirelifnaz9/dependency-injecti%CC%87on-di-manti%C4%9Fi-ve-uygulama-yollari-f09b1da3072f
- canonical_url
- https://medium.com/@demirelifnaz9/dependency-injecti%CC%87on-di-manti%C4%9Fi-ve-uygulama-yollari-f09b1da3072f
- author_url
- https://medium.com/@demirelifnaz9
- status
- ok
- fetched_at
- 2026-07-29 13:30:38