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

.NET 8 – WebApplication.CreateBuilder() Metodunun Yeni CreateSlimBuilder() Metoduyla Karşılaştırılması

Merhaba,

Bu içeriğimizde, bir önceki klavyeye almış olduğumuz .NET 8 – Minimal API Ahead of Time(AOT) Compilation Template başlıklı makalemizde incelediğimiz AOT Compilation senaryolarını desteklemek için .NET 8’de tanıtılmış olan WebApplication.CreateSlimBuilder(args) metodunu derinlemesine inceliyor ve değerlendiriyor olacağız. O halde fazla zaman kaybetmeksizin buyurun başlayalım…

CreateSlimBuilder Metodu Nedir? Neden İhtiyacımız Vardır?

Yukarıdaki satırlarda referans ettiğimiz bir önceki makalemizde Minimal API’lar için AOT template’ını incelemiştik. İlgili template’te, builder nesnesi olarak ‘WebApplication’ sınıfının CreateBuilder metodu yerine aşağıdaki gibi CreateSlimBuilder metodunun kullanıldığını görmüştük.

var builder = WebApplication.CreateSlimBuilder(args);
.
.
.

Peki bu metodun diğerinden farkı nedir? diye sorduğunuzu duyar gibiyim… Bu soruya cevap verebilmem için öncelikle AOT compilation neticesinin, JIT compilation’a nazaran daha büyük boyutlu bir çıktı ürettiğini hatırlamamız gerekmektedir. Hatırlamamız gerekmektedir diyorum çünkü bir önceki yazıda bu ve buna benzer birçok detaya temas etmiştik.

Velhasıl, AOT derlemesini kullandığımız uygulamalarda büyük boyutlu çıktıların yaratacağı maliyeti ortadan kaldırabilmek için framework’den ve uygulamanın kendisinden kullanılmayan tüm parçalarının üretilecek çıktıdan kırpılmasını sağlamamız, nihai olarak üretilecek çıktının boyutunu önemli ölçüde azaltacak ve uygulamayı olması gereken, en ideal/makul binary boyuta getirmemize yardımcı olacaktır.

İşte bizler bu fazlalık parçalardan üretilecek çıktının kırpılması işlemini CreateSlimBuilder metodu ile gerçekleştirebiliriz. CreateSlimBuilder metodu, AOT ile uyumlu olmayan veya serverless ve cloud application gibi AOT’nin öne çıktığı uygulamalar için daha az kullanışlı olan bir dizi özelliği kaldırarak, uygulamanın daha yalın bir şekilde derlenmesini sağlayarak küçük boyutlu bir çıktı elde etmemize imkan tanıyan yeni nesil bir fonksiyondur.

CreateSlimBuilder, CreateBuilder fonksiyonunda olduğu gibi uygulamanın başlatılmasını sağlamaktadır amma velakin CreateBuilder‘a nazaran, uygulamayı çalıştırmak için gereken minimum özellikleri baz alarak bu başlatma işlemine odaklanmaktadır. Eee haliyle bu durumda, CreateBuilder metodundaki klasik seyre karşın birçok şeyin/adımın eksik yahut değiştiği anlamına gelmektedir.

CreateSlimBuilder’da CreateBuilder’a Nazaran Neler Değişmiştir? Neler Eksiktir?

CreateSlimBuilder metodunda;

  • Hosting Startup Assemblies dediğimiz, uygulamanın başlatılması ve yapılandırılması için kullanılan özel derlemelerin hiçbiri bu metotta bulunmamaktadır. Bu derlemeler, Asp.NET Core uygulamasının runtime’ında başlatma sırasında belirli işlemleri gerçekleştirmek veya uygulamanın davranışını yapılandırmak için kullanılan; dependency injection, middleware, configuration vs. gibi yapılandırmaları barındırmaktadır. Haliyle CreateSlimBuilder metodu sayesinde bu özelliklerin hemen hemen hepsi derleme neticesinden törpülenmektedir.
  • EventLog log provider, Debug provider ve EventSource provider gibi birçok logging provider yoktur.
  • Uygulamadaki statik varlıkların yüklenmesine yönelik UseStaticFiles gibi destekler yoktur.
  • IIS entegrasyonu bulunmamaktadır.
  • HTTPS desteği bulunmamaktadır.
  • Hızlı HTTP/3 desteği bulunmamaktadır.
  • .vs

Burada IIS desteği, HTTPS, HTTP/3 ve UseStaticFiles vs. gibi özelliklerin kaldırılmasının nedeni, AOT’nin hedeflediği cloud, serverless ve Linux environment gibi senaryolarda genellikle kullanılmamalarıdır diyebiliriz.

Tabi kaldırılan bu özelliklerden bazılarını tekrar eklemek isterseniz bunu aşağıdaki gibi yapabilirsiniz;

.
.
.
builder.WebHost.UseKestrelHttpsConfiguration();
.
.
.
builder.WebHost.ConfigureLogging((webHostBuilderContext, loggingBuilder) =>
{
    loggingBuilder.AddProvider(new MyCustomLoggerProvider());
});
.
.
.

Misal olarak yukarıdaki örnek kod bloğunda, uygulamaya HTTPS desteği eşliğinde logging provider yüklenmesi örneklendirilmiştir.

CreateSlimBuilder Nasıl Implemente Edilmiştir?

Şimdi CreateSlimBuilder metodunu, mevcut olan CreateBuilder metoduyla karşılaştırarak, nasıl implemente edildiğini inceleyelim.

Malumunuz WebApplicationBuilder, .NET Core’un önceki sürümlerinde sunulan IHostBuilder ve IWebHostBuilder interface’lerinin üzerine inşa edilerek, .NET 6 ile gelmişti. Yani önceki sürümdeki kullanıma yine oldukça benzerlik göstermekteydi. Ee benzer mantıkla CreateSlimBuilder‘da CreateBuilder‘a çok benzerlik göstermekte ve geriye WebApplicationBuilder nesnesi döndürmektedir.

public sealed class WebApplication : IHost, IApplicationBuilder, IEndpointRouteBuilder, IAsyncDisposable
{
    .
    .
    .
    public static WebApplicationBuilder CreateBuilder(string[] args) =>
        new(new() { Args = args });
    .
    .
    .
    public static WebApplicationBuilder CreateSlimBuilder(string[] args) =>
        new(new() { Args = args }, slim: true);
    .
    .
    .
}

Görüldüğü üzere, bu metotların tek küçük nüansı WebApplicationBuilder sınıfının farklı constructor’larını çağırmalarıdır. CreateSlimBuilder metoduna bakarsanız eğer ekstradan bir ‘slim’ parametresinin değerini ‘true’ olarak vermekle yetinmektedir. Şimdi bizler zahiren bu küçük dokunuşun batıni boyutuna aşağıdaki gibi göz atarsak eğer biraz şaşırtıcı şekilde farklılık arz ettiğini gözlemlemiş olacağız.
.NET 8 - WebApplication.CreateBuilder() Metodunun Yeni CreateSlimBuilder() Metoduyla KarşılaştırılmasıBu görülen kod farkının nedeni, ‘slim’ parametresinin kullanılmadığı constructor’ın buradaki işlerin çoğunu diğer helper metotlara devretmesinden kaynaklanmaktadır. ‘slim’ parametreli constructor’da ise ihtiyaç duyulmayan özelliklerin çıkarılması durumu söz konusudur. Ha koda şöyle göz atarsanız eğer esasında iki ana değişikliğin var olduğunu göreceksiniz;

  • ‘slim’ parametreli constructor’da new HostApplicationBuilder(...) yerine CreateEmptyApplicationBuilder() metodu çağrılmaktadır.

        internal WebApplicationBuilder(WebApplicationOptions options, Action<IHostBuilder>? configureDefaults = null)
        {
            .
            .
            .
            _hostApplicationBuilder = new HostApplicationBuilder(new HostApplicationBuilderSettings
            {
                Args = options.Args,
                ApplicationName = options.ApplicationName,
                EnvironmentName = options.EnvironmentName,
                ContentRootPath = options.ContentRootPath,
                Configuration = configuration,
            });
            .
            .
            .
        }
    
        internal WebApplicationBuilder(WebApplicationOptions options, bool slim, Action<IHostBuilder>? configureDefaults = null)
        {
            .
            .
            .
            _hostApplicationBuilder = Microsoft.Extensions.Hosting.Host.CreateEmptyApplicationBuilder(new HostApplicationBuilderSettings
            {
                Args = options.Args,
                ApplicationName = options.ApplicationName,
                EnvironmentName = options.EnvironmentName,
                ContentRootPath = options.ContentRootPath,
                Configuration = configuration,
            });
            .
            .
            .
        }
    
  • Yine ‘slim’ parametreli constructor’da ConfigureWebHostDefaults metodu yerine ConfigureSlimWebHost metodu çağrılmaktadır.
        internal WebApplicationBuilder(WebApplicationOptions options, Action<IHostBuilder>? configureDefaults = null)
        {
            .
            .
            .
            bootstrapHostBuilder.ConfigureWebHostDefaults(webHostBuilder =>
            {
                // Runs inline.
                webHostBuilder.Configure(ConfigureApplication);
    
                InitializeWebHostSettings(webHostBuilder);
            },
            options =>
            {
                // We've already applied "ASPNETCORE_" environment variables to hosting config
                options.SuppressEnvironmentConfiguration = true;
            });
            .
            .
            .
        }
    
        internal WebApplicationBuilder(WebApplicationOptions options, bool slim, Action<IHostBuilder>? configureDefaults = null)
        {
            .
            .
            .
            bootstrapHostBuilder.ConfigureSlimWebHost(
                webHostBuilder =>
                {
                    AspNetCore.WebHost.ConfigureWebDefaultsSlim(webHostBuilder);
    
                    // Runs inline.
                    webHostBuilder.Configure(ConfigureApplication);
    
                    InitializeWebHostSettings(webHostBuilder);
                },
                options =>
                {
                    // We've already applied "ASPNETCORE_" environment variables to hosting config
                    options.SuppressEnvironmentConfiguration = true;
                });
            .
            .
            .
        }
    

Bu kodlardaki yapılan farkları tam olarak anlayabilmek için GitHub üzerinden tüm kodlara uzun uzadıya göz atmakta fayda vardır. Biz CreateSlimBuilder metodunun varlık sebebini ve zaten mevcudiyette olan CreateBuilder‘a nazaran hangi farkları getirdiğini masaya yatırmakla yetinecek ve bu içeriğimizi burada noktalayacağız.

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir