Mimari (IT)Backend geliştirici

Bağımlılıkların yaşam döngüsünü karmaşık bir uygulamanın mimarisinde nasıl organize edersiniz?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Bağımlılıkların yaşam döngüsünü yönetmek, uygulama bileşenlerinin birbirinden bağımsız ve kolayca test edilebilir şekilde yaratılmasını, başlatılmasını, güncellenmesini ve yok edilmesini organize etmektir. Bunun için genellikle IoC konteynerleri (Kontrol Tersine Çevirme) ve Bağımlılık Enjeksiyonu (DI) şablonu kullanılır.

IoC konteyneri şunları sağlar:

  • Obje (bileşen) yaratmayı ve bağlamayı otomatik olarak gerçekleştirir.
  • Her objenin yaşam süresini (scope) yönetir (singleton, transient, scoped).
  • Test ve ölçeklenebilirlik için bileşenlerin kolayca değiştirilmesini sağlar.

Microsoft.Extensions.DependencyInjection kullanarak C# örneği:

public interface IMessageSender { void Send(string msg); } public class EmailSender : IMessageSender { public void Send(string msg) { /* e-posta gönderimi */ } } // Bağımlılıkların kaydı var services = new ServiceCollection(); services.AddScoped<IMessageSender, EmailSender>(); // Örneğin alınması var provider = services.BuildServiceProvider(); var sender = provider.GetService<IMessageSender>(); sender.Send("Merhaba!");

Anahtar özellikler:

  • Bağımlılıkları net bir şekilde ayırmaya ve mimarinin gelişimini hızlandırmaya olanak tanır.
  • Bağımlılıkların değiştirilmesi (mocks) yoluyla bileşenlerin test edilmesini kolaylaştırır.
  • Bileşenler arasında zayıf bağlılık sağlamaya yardımcı olur.

Kandırmaca Soruları.

Bağımlılık Enjeksiyonu (DI) ile Servis Yerleşimcisi (Service Locator) şablonu arasındaki fark nedir ve neden Servis Yerleşimcisi anti-patern olarak kabul edilir?

Servis Yerleşimcisi, bağımlılıkların belirgin olarak aktarımını ihlal eder, kodu daha az şeffaf hale getirir. Derleyicinin bağımlılıkların doğruluğunu kontrol etmesi için DI'yı yapıcı veya yöntemler aracılığıyla kullanmak daha iyidir.

// Kötü: Servis Yerleşimcisi var sender = ServiceLocator.Get<IMessageSender>(); // İyi: DI aracılığıyla public class MyService { public MyService(IMessageSender sender) { ... } }

Singleton deseni ile DI konteynerindeki Tek Örnek (Single Instance) yaşam süresi arasındaki fark nedir?

Singleton deseni elle uygulanır ve konteynerden bağımsızdır; Tek Örnek, konteynerden bir örnek sağlar, bu da birim testleri ve genişleme için daha güvenlidir.

Tüm sınıflarda, basit yardımcı sınıflar bile, bağımlılıkları enjekte etmek gerekli mi?

Hayır. Bağımlılığı olmayan veya zayıf bağlı yardımcı sınıflar (örneğin, matematik sabitleri sınıfı) için DI eklemek anlamlı değildir; bu, koda fayda sağlamadan karmaşıklık katmanıdır.