Dependcy Injection (DI) nedir ? Açıklama ve Örnek uygulama.

Biz yazılımcı arkadaşların genelde yazılım geliştirme denince olayı kodlama olarak düşünüp bir anda başlayıp sonunu getiremediğimiz bir çok proje olmuştur. Tasarım sürecine ayrılan zamanın kayıp olduğunu düşünmek yapılan en büyük hatalardan sadece bir tanesi. Programda tasarım sürecinin kısa tutulması, isteklerin ne doğrultuda geleceğinin iyi değerlendirilmemesi sonucunda karmaşık yapılar içerisine girmek, her istek için kodun farklı yerlerini değiştirmek bu süreci böyle devam ettirirken projemizin doğru çalıştığını varsaymak ve devam etmek ilerde çok büyük sorunlara neden olmaktadır.

Dependcy Injection hakkında konuşmadan önce hangi problemleri çözdüğünü konuşalım,

daha sonra örnek bir uygulama ile bu prensibi anlatmaya çalışacağım.Yukarıda bahsettiğim sorunlarla yüzleşmemek için bahsedeceğim yöntemlerden bir tanesi olan Dependcy Inversion ( “SOLID” prensibinin sonuncusu ) programımızın loosely coupled veya decoupled ( gevşek bağlı ) olmasını sağlamaktadır. Yani yazılım içerisinde modüllerin birbiri ile olan sıkı bağlılığının ortadan kaldırılmasını sağlamaktadır. Bu bağlılığı ortadan kaldırırken soyut katmanları kullanacağız.Bu soyut katmanlar birbirine bağlı olan katmanların bağlılığını ortadan kaldırırken bizim referansımız oluyor. Evet, şuana kadar anlattıklarım soyut gelebilir. Örnek üzerinden anlaşılması daha kolay olacaktır.

Örnek Uygulama

Örnek olarak, bir projede bilgilendirme modülü yazmak istiyorsunuz ve bilgilendirme için sizden sadece mail olarak bilgilendirme istenmiş olsun. Klasik olarak bizim yapacağımız aşağıdaki gibi bir kodlama olacaktır. Uygulamayı örnek bir c# console uygulaması üzerinden anlatacağım

    public class Information
    {
        Email InformationSender { get; set; }
               
        public Information(Email email)
        {
            InformationSender = email;
        }
        public void SendInformation()
        {
            InformationSender.Send();
        }
    }

    public class Email
    {
        public void Send()
        {
            Console.WriteLine("Bildirim");
        }
    }
static void Main(string[] args)
        {
            Information information = new Information(new Email());
            information.SendInformation();
            Console.ReadLine();
        }

Program Çıktısı :

result

Yukarıdaki kodu çalıştırdığımızda programımız çalışacaktır. Fakat burada oluşan problem Information sınıfımız Email sınıfımız ile bağlı yani Information sınıfını Email sınıfı olmadan kullanmak mümkün değil. Veya ilerde programa bir başka bilgilendirme sistemi eklemek istediğimizde, örneğin sms bilgilendirmesi, Information sınıfı üzerindeki kod bloklarında düzenleme yapmak kaçınılmaz olacaktır. Email sınıfındaki değişiklikler doğrudan Information sınıfını etkilemekte. Sınıflar arasındaki bu derece sıkı bağlılıklar kod düzenlemesini zorlaştırmakta ve büyük projelerde karmaşıklığa sebep olmakta. Şimdi örnek bir kod bloğu ile dependcy injection’ı anlatmaya çalışacağım. Injection yöntemi olarak constructor injection kullanacağım. Bunun dışında siz isterseniz property injection da kullanabilirsiniz.

    public class Information
    {
        ISender InformationSender { get; set; }
               
        public Information(ISender informationSender)
        {
            InformationSender = informationSender;
        }
        public void SendInformation()
        {
            InformationSender.Send();
        }
    }

    public interface ISender
    {
        void Send();
    }

    public class Email : ISender
    {
        public void Send()
        {
            Console.WriteLine("Email Bildirim.");
        }
    }

    public class Sms : ISender
    {
        public void Send()
        {
            Console.WriteLine("Sms Bildirim.");
        }
    }
        static void Main(string[] args)
        {
            Information mailInformation = new Information(new Email());
            mailInformation.SendInformation();
            Console.WriteLine("----------------------------");
            Information smsInformation = new Information(new Sms());
            smsInformation.SendInformation();
            Console.ReadLine();
        }

result2

Gördüğünüz gibi artık information sınıfımızın diğer hiçbir alt sınıf ile doğrudan bağımlılığı kalmadı. Information sınıfı için tek bağımlılık ISender inteface’i. Information sınıfında ISender interface’ini implemente eden yüzlerce farklı concrete sınıfı kullabiliriz. Projede isteklerin hiçbir zaman sabit kalmaması , genişlemelerin çok olmasını göz önüne alarak Dependcy Injection’ın önemimin ne derece fazla olduğunu göstermekte.

Blogumda ilk makale olmasıda benim için ayrı heycan verici.

Bir başka makale ile beraber olmak üzere hoşçakalın.