.NET 6’da Yeni Gelen WebApplication/WebApplicationBuilder’ı Eski Generic Host İle Karşılaştırma
Merhaba,
Bu içeriğimizde .NET 6 ile Asp.NET Core uygulamalarına gelen WebApplication
ve WebApplicationBuilder
sınıfları üzerine konuşacak ve uygulama oluşturma alternatiflerinden biri olan WebApplication.CreateBuilder
komutu üzerine incelemede bulunuyor olacağız.
İlk olarak, WebApplication
ve WebApplicationBuilder
sınıflarını anlayabilmek için Asp.NET Core mimarisinin .NET 6’ya kadar olan gelişimsel sürecini hasbel kader inceleyerek başlayalım;
Sürüm | |
---|---|
WebHost.CreateDefaultBuilder | Asp.NET Core 2.x |
Host.CreateDefaultBuilder | Asp.NET Core 3.x – 5 |
WebApplication.CreateBuilder | .NET 6 |
WebHost.CreateDefaultBuilder(Asp.NET Core 2.x)
Temelden beri Asp.NET Core mimarisi, klasik Asp.NET Framework mimarisine nazaran ihtiyaç duyulmayan bir özelliğe karşı lüzumsuz maliyeti reddeden bir ideolojiye sahiptir. Haliyle bu mantıkta hareket eden Asp.NET Core, 2.x sürümünde host işlemleri(Program.cs) ile uygulama konfigürasyonlarını(Startup.cs) birbirinden ayırmıştır.
public class Program { public static void Main(string[] args) { BuildWebHost(args).Run(); } public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .Build(); }
Host.CreateDefaultBuilder(Asp.NET Core 3.x – 5)
Yine aynı ideolojiyi devam ettiren Asp.NET Core mimarisi, 3.x sürümünde WebHost
yerine Host
üzerinden yapılandırılarak yoluna devam etmiştir. Bu sürümdeki en etkili özelliklerden biri endpoint routing middleware’inin mimariye dahil edilmesidir.
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }; } }
WebApplication.CreateBuilder(.NET 6)
Asp.NET Core 6’da ise aynı ideoloji söz konusu olsa da temelde konfigürasyon yaklaşımı değiştirilmiş ve ‘Startup.cs’ dosyası kaldırılarak tüm sorumluluk ‘Program.cs’ dosyasına verilmiştir.
Yukarıdaki ekran görüntüsünü incelerseniz eğer .NET 6’da konfigürasyon açısından Top-Level Statements‘in baz alındığı ve böylece uygulamada lüzumsuz kod kalabalığından sıyrılmanın amaçlandığı görülmekte ve arındırılmış bir vaziyette konfigürasyon hizmeti sunulmaktadır. Buradan anlaşılan,
using
ve namespace
gibi gereksiz tanımlamaların yapılması gibi konuya tam olarak aşina olmayanlar için kafa karıştırıcı konseptlerdeki zorunluluklar kaldırılmış ve ferah bir başlangıç ortamı sağlanmıştır.
.NET 6’da ki bu sade konfigürasyon temellerine biryandan da esas konumuz olan WebApplication
ve WebApplicationBuilder
türleri eşlik etmektedir. Özünde bu türler olmaksızın Asp.NET Core 5’de ki generic Host
ile uygulamayı rahatlıkla oluşturabilirdik lakin WebApplication
ve WebApplicationBuilder
türleri ile daha basit ve sade bir yaklaşımla uygulama temellerini atabildiğimiz aşikardır.
Yukarıdaki görsele tekrar göz atarsak eğer Asp.NET Core 6 için 1. satırdaki ‘builder’ ve 9. satırdaki ‘app’ referanslarının oldukça kritik arz ettiğini söyleyebiliriz.
‘builder’,
WebApplicationBuilder
türünden bir nesneyi referans ederken,
‘app’ ise WebApplication
türünden bir nesneyi referans etmektedir.
Böylece ‘builder’ referansı kurucu özellik taşırken, ‘app’ ise kurulmuş hali temsil etmektedir. O yüzden uygulamaya eklenecek olan servisler ‘builder’ üzerinden eklenecek, ihtiyaç olanlar ise ‘app’ üzerinden talep edilecektir. Bunun için her iki referansın ‘Service’ property’sine odaklanmamız yeterlidir.

‘builder.Services’ın türü IServiceCollection
‘dır. Malum, önceden Asp.NET Core tecrübesi olan herkes bilir ki IServiceCollection
bir IoC interface’idir. Haliyle buradan uygulamaya servisler eklenerek, konfigüre edilmektedir. O yüzden ‘builder’ kurucudur!

‘app.Services’ ise IServiceProvider
‘dır. Yani IServiceCollection
‘ın build edilmiş ve içerisinde nesnelerin IoC prensibine uygun bir şekilde dependency injection edilebilir bir vaziyette elde edilmesini sağlayan nesnedir. O yüzden ‘app’ kurulmuştur.
Bunların haricinde ‘appsettings.json’ ya da environment gibi yapılandırma verilerine erişebilmek için builder.Configuration
komutunu, logging işlemleri için ise builder.Logging
komutunu kullanabilirsiniz.
Böylece temel düzeyde WebApplication
ve WebApplicationBuilder
sınıflarını eski generic host yapılanmasıyla karşılaştırmış ve bir nebze de olsa tanımış olduk. Sonraki içeriklerimizde .NET 6’ya dair ilgili konularımızı daha da derinleştirerek, detaylı incelemelerde bulunmaya devam edeceğiz.
İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…
Hocam her şeyin tek bir dosyada toplanması javascript ve python tarzı bir kod sunuyor. OOP ve SOLID düşünüldüğünde bir sıkıntı görüyor musunuz? Yazılım mimarilerinin felsefesi böl yönet değil midir?
Merhaba,
Evet, yazılımda SOLID prensiplerinin böl ve yönet mantığını kapsadığını söyleyebiliriz. Tabi burada bölme ve yönetmeden kasıt, operasyonel olarak farklı davranışların birbirlerini etkilemeyecek şekilde tasarlanması ve mümkün mertebe bağımlılıklardan arındırılmış bir kodun ortaya konmasıdır.
.NET 6’da ise genel anlamda operasyonellikten ziyade uygulama ve host konfigürasyonu açısından tasarlanan ‘Startup.cs’ ve ‘Program.cs’ dosyalarının ayrımı basit bir tercihe dayandığı düşünülmüş ve özünde bu işlemlerin sorumluluğunun daha az ve anlaşılabilir olacak şekilde tek bir dosyaya(Program.cs) yüklenme kararı verilmiştir. Haliyle okunabilirlik açısından kolaylık sunan ve uygulamanın başlangıcındaki hengamenin yüksek oranda sadeleşmesini sağlayan bu yeniliğin, bir yazılımcı açısından hiçte negatif etki yaratmadığı bilakis konfigürasyon çabukluğunu daha verimli bir hale getirdiği için daha tercih edilebilir bir vaziyet sağladığı kanaatindeyim…
Sevgiler…