Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

.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.
.NET 6'da WebApplicationBuilder'ı Generic Host İle KarşılaştırmaYukarı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.
.NET 6'da WebApplicationBuilder'ı Generic Host İle Karşılaştırma‘builder’, WebApplicationBuilder türünden bir nesneyi referans ederken,
.NET 6'da WebApplicationBuilder'ı Generic Host İle Karşılaştırma
‘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.

.NET 6'da WebApplicationBuilder'ı Generic Host İle Karşılaştırma

‘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!

.NET 6'da WebApplicationBuilder'ı Generic Host İle Karşılaştırma

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

Bunlar da hoşunuza gidebilir...

3 Cevaplar

  1. Ali Aslan dedi ki:

    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?

    • Gençay dedi ki:

      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…

  1. 11 Aralık 2021

    […] önceki .NET 6’da Yeni Gelen WebApplication/WebApplicationBuilder’ı Eski Generic Host İle Karşılaşt… başlıklı makalemizden de biliyorsunuz ki, Asp.NET Core uygulamalarını oluşturmanın ve ayağa […]

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir