vNext kavramı ile tanıştığımız Microsoft’un farklı işletim sistemlerinde de çalışan yeni framework’ü .NET Core ile ilgili önceki yazılarda birşeyler paylaşmaya çalışmıştım hatırlarsanız. Önümüzdeki günlerde RC1, 2016’nın ilk çeyreğinde de RTM versiyonun çıkması planlanan bu framework’e ben de ilerleyen zaman içerisinde biraz daha değinmek istiyorum. Bu zamana kadar çok fazla değinmek istemedim çünkü hala gelişmekte olan ve tam stabil halini almış bir versiyon henüz yok. Ama yavaş yavaş RTM’e yaklaştığımız için, yavaş yavaş ben de karalayabilirim sanırım artık.

.NET Core, Microsoft tarafından açık kaynak olarak geliştirilen, dışarıdan da katkı alan bir framework. Dolayısıyla tüm gelişme anına tanıklık edebiliyorsunuz. GitHub‘dan takip edip, siz de katkıda bulunabilirsiniz. Bunu özellikle hatırlattıktan sonra .NET Core içindeki Dependency Injection(DI) kavramından bahsetmeye çalışacağım. DI, .NET Core’un bir parçası olarak, ASP.NET 5’in de temel bir bileşeni olarak karşımıza çıkıyor. Tüm framework içerisindeki bağlılıkları yönetmek ve geliştirmek bu yeni yaklaşım ile beraber daha kolay bir hal alıyor. Kısaca ve basitçe yeni DI yaklaşımı ile .NET Core’da, tek bir yerde uygulamamızın bağlılıkları yönetebiliyoruz.  Farklı DI bileşenlerini de, bu yapının yerine geçebilecek şekilde kullanabiliyoruz tabi ki.

.NET Core içinde DI yapısı, Service Locator tasarım kalıbı ile tasarlanmış. Microsoft.Framework.DependencyInjection.IServiceCollection arayüzünden geliştirilen ServiceCollection üzerinden bağlılıklar oluşturuluyor. Uygulamalardaki bağlılıkları, uygulamaların kullandığı servisler olarak düşünebilirsiniz yani.

            var services = new ServiceCollection();

ServiceCollection sınıfı ile servisleri, yaşam döngülerine göre ekleyebiliyoruz.

            services.AddTransien<IUserService>(s=> new UserManagementService());
            services.AddInstance(typeof(IUserService),new UserManagementService());
            services.AddScoped(typeof(IUserService),s=> new UserManagementService());
            services.AddSingleton(typeof(IUserService),s=> new UserManagementService());

Bağlılıkları 4 tane farklı yaşam döngüsü ile tanımlayabiliyoruz.

  • AddTransient: Her seferinde bağlı nesnenin tekrar yaratılmasını sağlar
  • AddSingleton: Bağlı nesneye erişildiğinde tek bir nesne yaratılmasını sağlar
  • AddInstance: Her nest çağrısında, tanımlanan nesneyi sağlar
  • AddScoped: ServiceCollection’nın kapsamına göre nesnenin yaratılmasını sağlar.

Bu yaşam döngülere göre oluşturulan nesnelere; daha doğru isim ile servislere, IServiceProvider arayüzünden geliştirilen sağlayıcı sınıfı ile ulaşabiliyoruz.


            IServiceProvider provider = services.BuildServiceProvider();
            
            IUserService userService = provider.GetService<IUserService>(); 
            var userName = userService.GetUserName();

Yine tabi ki kendi sağlayıcı sınıfımızı yazmak mümkün. Sağlayıcı sınıfından gelen GetService() metodu ile bağlı olan nesneye/servise erişebiliyoruz.

VS Code

DI yeni ASP.NET 5 ve MVC 6’da built-in bir özellik olarak karşımıza çıkıyor. MVC tarafında çeşitlik konfigürasyon yöntemleri ile web uygulamalarındaki bağlılıkları yönetmek oldukça kolaylaşıyor. Bu yazıda bahsettiğim konunun örnek kodunu GitHub’a ekledim, buradan eklemeler ve düzenlemeler yapabilirsiniz diyerekten bitirelim.Bu giriş yazısı ile umarım biraz merak uyandırmayı başarmışımdır.

Bu yazıyı CoreCLR’ın Beta8 versiyonu ile yazdım. Bu versiyondan sonra Microsoft.Framework.DependencyInjection.* namespace’i Microsoft.Extensions.DependencyInjection.* olarak değişiyor.