← Back to list

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ı…

Elif Naz Demir · 2026-06-03 13:32 · 0 claps · 2.4 min read
#dependency-injection #ioc-container #repository-pattern #object-create #entity-framework
Open on Medium ↗
Wiki topics: ☁️ · DevOps & Cloud

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 nesne
  • Scoped → request başına 1 nesne
  • Singleton → 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