Asp.Net Core Application Startup - Configure ve ConfigureService Methodları Nedir? Neden Kullanılır?

By Burak Tungut - 16.7.2016 - 3 Yorum - Kategori Asp.Net Core

Selamlar herkese,

Geçen haftaki yazımızda Asp.Net Core'a bir giriş yapmış ve ne gibi özelliklerin bizleri beklediğini incelemiştik. Bugünkü yazımızda Startup sınıfını, Configure ve ConfigureServices method'larını ve ne gibi özelliklere sahip olduklarını inceleyeceğiz.

İncelemeleri yaparken göreceğimiz ve yer yer kullanacağımız bazı tip ve özellikler aslında bu makalenin konusu değil. Bu nedenle ilgili konular hakkında detaylara bu makalede yer vermedim. Ancak bu serinin devamını oluşturacak olan makalelerde, bu konulara ait detayları çok yakında görüyor ve inceliyor olacağız :)

Hatırlarsanız Asp.Net Core Nedir? Ne Gibi Değişiklikler Bizi Bekliyor? başlıklı yazıda boş bir Asp.Net Core uygulaması yaratmış ve Program.cs sınıfını biraz incelemiştik. Yine hatırlarsanız builder pattern ile uygulamayı inşaa ettiğimiz WebHostBuilder tipine ait generic UseStartup method'u mevcut idi. Generic tip ile uygulamamızdaki Startup sınıfını (tipini) alıyordu. Gelin sırasıyla bunları bir tanıyalım;

Startup Sınıfı (Tipi)

Startup sınıfı diye bahsediyoruz ancak ismini Startup harici bir isim ile de değiştirebiliriz. Özelliği bir Asp.Net Core uygulamasının ayağa kalkmasını sağlamak olduğu için yani görevi / işlevi nedeniyle Startup ismini kullanıdığımızı söyleyebiliriz.
Startup sınıfı aslında uygulamanın başlangıç noktası olarak görülebilir. Her Asp.Net Core uygulamasında mutlaka olmalıdır. UseStartup generic method'u kullanılmadan oluşturulmaya çalışılan bir Asp.Net Core uygulaması runtime'da aşağıdaki gibi bir hata ile karşılaşacaktır;

UseStartup methodu olmayan bir Asp.Net Core uygulaması

Yine daha önce Asp.Net Core'un lightweight built-in bir dependency injection ile geldiğini söylemiştik. Instance'ı yerine generic bir method ile Startup sınıfının tipini veriyor olmamızın bir nedeni de bu. Runtime'da DI tool'u bizler için Startup sınıfını ilgili tipten üretir. Yine bu nedenle Startup sınıfının constructor method'unda resolve olmasını istediğimiz ve DI'a register edilmiş tipleri parametre olarak dahil edebiliriz.

Bahsettiğimiz bu tipleri birazdan Configure ve ConfigureServices method'larında kullanıyor olacağız. Bu method'lar ise Startup sınıfının içerisinde bulunması gereken method'lardır. Boş bir Asp.Net Core uygulamasına ait Startup sınıfı aşağıdaki gibidir;

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
    }


    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        loggerFactory.AddConsole();

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.Run(async (context) =>
        {
            await context.Response.WriteAsync("Hello World!");
        });
    }
}

Şimdi bu iki method'u sırasıyla tanıyalım.

ConfigureServices Method'u

ConfigureServices method'u Startup tipi içerisinde ilk çağırılan method'tur. Opsiyoneldir. Yani her Startup sınıfı içerisinde bulunması gerekmez.
Uygulama içerisinde kullanacağımız ve Service olarak nitelendirilen tiplerin kaydedilmesi için kullanılır. Aslında burada bahsettiğimiz Service'ler DI tool'u için register ettiğimiz tiplerin ta kendisidir.

Method'a parametre olarak gelen IServiceCollection tipi aslında ServiceDescriptor tipine ait bir collection'dır. Bu interface içerisinde hiç bir ekstra method içermez. Olduğu gibi IList, ICollection ve IEnumerable'dan implement edilmiştir. Ancak IServiceCollection tipi için onlarca extension method Asp.Net Core içerisinde bulunmaktadır. 

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton(typeof(AppContext));
    services.AddTransient(typeof(AppContext));
}

Daha önce bir DI tool'u kullandıysanız bu method isimleri size çok yakın gelecektir. Bu extension method'lar ServiceCollectionServiceExtensions tipi içerisinde bulunmaktadır.
Asp.Net Core'un bu konudaki genel yaklaşımı extension method'lar yazılması üzerine. Bunun nedenine çok açık ve net.

Biz boş bir Asp.Net Core uygulaması yarattık. Bu halilyle MVC ya da Web API gibi framework'ler şu anda uygulamaya dahil edilmiş durumda değil. İstersek MVC'yi projemize dahil edebiliriz. Bu durumda bir Service olarak MVC'yi register etmemiz lazım. Bunun için de AddMvc adlı bir extension method yazılmıştır. Ancak bu method sadece MVC ile yazılan uygulamaları ilgilendireceği için ilgili kütüphane içerisine eklenmiştir.

Aynı zamanda Asp.Net Core içerisinde yine built-in gelen Configuration'ları kullanacağımız yerde burasıdır. Gördüğümde çok etkilendiğim bu harika özelliği başka bir makale ile sizlerle paylaşıyor olacağım. Yine orada da bu konuya değiniyor olacağız.

Configure Method'u

ConfigureServices method'undan sonra tetiklenen Configure method'u yarattığımız Asp.Net Core uygulamasına ait pipeline'ı kurguladığımız kısımdır. Daha önceki yazıda bahsettiğimiz Middleware component'ler pipeline'a burada dahil edilirler. Örnek vermek gerekirse MVC özelliği eklemek istediğimiz bir Asp.Net Core uygulamasında ConfigureServices method'unda AddMvc methodunu çağırmalıydık. Yine MVC'e ait Routing, Filtering gibi özellikleri ise bu method'ta bildiriyor olmalıyız.

 

Asp.Net Core da bir MVC uygulaması yaratmak ve konfigüre etmenin nasıl olacağı ile ilgili bir makaleyi ilerleyen haftalarda yazıyor olacağım. Bu konuya yine o makalede detaylıca deyineceğiz.

 

Configure method'u parametre ile IApplicationBuilder tipini almak zorundadır. IHostingEnvironment ya da ILoggerFactory gibi tipler ise opsiyonel olarak eklenebilir. Startup method'u DI ile yaratıldığı ve içerisindeki method'lar yine DI ile invoke edildiği için parametrelerde DI içerisindeki herhangi bir Service'e yer verebiliriz. Yani pipeline'ın önceki safhalarında bir Service register ettiysek, bu tipi Configure method'una parametre ile geçebilir ve runtime'da resolve edilmesini sağlayabiliriz.

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    app.Run(async (context) =>
    {
        await context.Response.WriteAsync("Hello World from " + env.EnvironmentName + " environment.");
    });
}

Örnek olarak yukarıdaki gibi bir Configure method'u ve pipeline dizayn edebiliriz. Bu şekilde dizayn edilen bir pipeline'da bu uygulamaya nasıl request geldiği farketmeksızın Hello World from Development environment ya da Hello world from Staging environment gibi bir response ile karşılaşırız. 

IHostingEnvironment Asp.Net Core'un Enviorment hakkında ki bilgiler için tasarladığı bir tiptir. Bu tipin tüm özelliklerine sonraki yazılarda deyineceğiz.

IApplicationBuilder tipi içerisindeki Run method'u ya da extension methodlardan Use method'u yine middleware konuları olduğu için bu yazıda detaylıca deyinmeyeceğiz.

Startup sınıfı ve içerdiği method'lar hakkında söyleyebileceklerimiz bunlar. Yazının başında ilettiğim gibi detay vermediğimiz ve makalenin konusu dahilinde olmayan diğer kısımları sonraki makalelerimize bırakıyorum.

Esen kalınız.

Burak Bey Çok güzel bir yazı dizisi olmuş ancak devamı gelmeyecek gibi kötü bir izlenim uyandı bende. Eğer kitabını çıkartırsanız almakta tereddüt etmeyeceğim.
Yorum Bırak

Facebook
Son Yorumlar