ASP.NET Core — IConfigureOptions Ile Dinamik Option Pattern Kullanımı

Engincan Veske
SDTR
Published in
4 min readMay 19, 2021
Fotoğraf kaynağı: (http://www.canertosuner.com/post/asp-net-core-uygulamalarinda-farkli-di-ioc-containerlar-nasil-kullanilir)

Herkese Merhaba,

Bu yazımda IConfigureOptions interface’ini kullanarak ASP.NET Core’da uygulamalarımızdaki ayarları nasıl gecikmiş (deferred configuration) bir şekilde şekilde tanımlayabileceğimizi anlatacağım.

Geliştirmekte olduğum bir uygulamada, ilgili web-sitesinin linklerinin daha iyi indekslenmesi ve SEO açısından daha verimli skorlar üretmesi için sitemap.xml dosyasının eklenmesinin iyi sonuçlar vereceğini düşünerek, eklemeye karar verdim. Daha sonra ise uygulamaya ekleyecek olduğum sitemap.xml ve robots.txt dosyalarını basit bir şekilde yapılandırabileceğim paketlerin olup olmadığına göz gezdirirken Winton.AspNetCore.Seo isimli bir paket ile karşılaştım. Bu paket sayesinde basit bir şekilde ilgili url’leri belirterek sitemap.xml dosyasını uygulamama ekleyebiliyordum.

Daha sonra ilgili paketin dökümanlarını inceleyerek basit bir şekilde /sitemap.xml route’unda statik olarak ilgili websitesinin url’lerini görüntüleyebiliyordum. Bu işlemi gerçekleştirirken,

Basit bir web uygulaması oluşturdum ve ardından Winton.AspNetCore.Seo paketini ilgili web projesine kurarak gerekli ayarları yapmaya başladım. İlk olarak appsettings.json dosyasında /sitemap.xml route’unda gözükmesini istediğim linklerle tanımladım. Aynı şekilde robots.txt dosyası içinde ayarlar yapabilmek mümkün.

appsettings.json

Daha sonra ise Startup.cs dosyasında ConfigureServices methodunu aşağıdaki gibi güncelledim. Bu sayede ilgili paketi kullanabilmek için gerekli olan bağımlılıkların tanımlanması (dependency registration) işlemini gerçekleştirdim.

Startup.cs

Daha sonra uygulamayı çalıştırıp /sitemap.xml ve /robots.txt route’larına gittiğimde appsettings.json’da tanımlamış olduğum şekilde ilgili linklerin listelendiğini gördüm.

Robots.txt ve Sitemap.xml

Basit bir yapılandırma ile bu işlemleri gerçekleştirdikten sonra, benim gerçekleştirmek istediğim senaryoya değinebilirim.

Benim bu noktada gerçekleştirmek istediğim, uygulamamda ilgili linkleri dönen servisi çağırarak ilgili linkleri elde etmek ve “Option Pattern” sayesinde ilgili linkleri /sitemap.xml dosyasında listeleyerek arama motorlarının ilgili linkleri daha iyi indeksleyebilmesini sağlamak.

İlk aklıma gelen uygulama şekli: İlgili servisi ConfigureServices methodu içinde çağırıp, bunu yaparken bir şekilde IServiceProvider’a erişmem ve ilgili servisi resolve ederek (servisleri kullanabilmek için) o servisin methodlarını çağırmam ve son olarak da services.AddSeoWithDefaultRobots(options => { … }) methodunu tanımladığım yerde options olarak bu linkleri belirtmem gerekiyordu.

Startup.cs

Bu durumda ilgili methodu incelediğimizde, ana amacı ilgili bağımlılıkları container’a kaydetmek (dependency registration) olan ConfigureServices methodunun tanımı dışına çıkıldığını ve ayrıca gereksiz kod kalabalığı oluştuğunu görebiliyoruz. Bu noktada başka bir çözüm yolu bulmam ve ilgili Option’ları Dependency Registration işlemleri bittikten sonra gerçekleştirmem gerektiği fikrine vardım (diğer bir deyişle geciktirilmiş yapılandırma (referred configuration)).

Daha sonra bu konu hakkında araştırma yaparken Andrew Lock’un bir makalesine denk geldim. Makale’yi detaylı bir şekilde inceleyince gerçekleştirmek istediğimiz senaryo farklı olsa bile aynı durum ile karşılaştığımızı (aynı sonuca vardığımızı) gördüm ve IConfigureOptions interface’i ile karşılaştım. Bu interface’i incelediğimde benim gerçekleştirmek istediğim durumu sağladığını yani istediğim servisleri enjekte ederek, belirlediğim Options’lara elde ettiğim sonuçları basit bir şekilde tanımlayabileceğimi gördüm. Ve ilgili refactoring işine başladım.

Bunun için ilk olarak SeoConfiguration adında bir sınıf tanımlayarak, IConfigureOptions<SeoOptions> interface’ini aşağıdaki gibi implemente ettim.

SeoConfiguration.cs

Burada dikkat edecek olursanız IServiceProvider interface’i ile uğraşarak ilgili bağımlılıkları resolve etmek ile uğraşmıyoruz. Basit bir şekilde Constructor Injection yapıyoruz ve geri kalanını framework hallediyor. Configure methodunu incelediğimizde parametre olarak ilgili option’ı (SeoOptions) aldığını görüyoruz. Bu method ta ilgili url’leri servisimizden çekerek, bu option’a değer olarak atıyoruz. Bu sayede ilgili ayarları yapılandırmış oluyoruz.

Yapmamız gereken son şey, oluşturmuş olduğumuz SeoConfiguration sınıfının deferred configuration (geciktirilmiş yapılandırma) olarak bir Options’ın değerini ilgili dependency registration işlemlerinden sonra yapılması gerektiğini uygulamamıza bildirmek. Bunun için Startup.cs dosyamızı aşağıdaki gibi güncelleyebiliriz.

Startup.cs (ConfigureServices)

Burada bir nevi, “SeoOptions sınıfının kullanılması gerekene kadar ilgili yapılandırmaları ertele ve kullanılması gerektiğinde ilgili yapılandırmaları benim tanımlamış olduğum sınıf üzerindeki (burada SeoConfiguration) Configure methodunda gerçekleştirilen işlemlere göre gerçekleştir” demiş oluyoruz.

Artık uygulamamızı çalıştırabilir, /sitemap.xml ve /robots.txt route’larına giderek sonucu görebiliriz.

Robots.txt ve Sitemap.xml

Görebileceğiniz üzere artık ilgili url’leri dinamik bir şekilde tanımlayarak büyük bir yükten kurtulmuş oluyoruz. Ayrıca IConfigureOptions interface’i sayesinde ConfigureServices methodunda tanımlamamız gereken (ilk çözüm) kod parçacıklarından da kurtulmuş oluyoruz.

Okuduğunuz için teşekkürler. Umarım faydalı olmuştur.

Referanslar

--

--