Asp.Net Core’da Feature Management

Engincan Veske
SDTR
Published in
3 min readApr 24, 2021

Herkese merhaba,

Bu yazımda .Net Core uygulamalarında kullanabileceğimiz Feature Management (Feature Flag) yapısından bahsedeceğim.

From https://blog.optimizely.com/2017/10/18/feature-management/

Feature Management

Feature Management, .Net Core uygulamalarında; uygulamaya ait özelliklerin dinamik olarak herhangi bir kod bloğunu değiştirmeye gerek duymadan, açılıp/kapatılmasına (enable/disable) olanak sağlayan bir tekniktir.

Örneğin, yeni geliştirilen bir özelliğin veya uygulamanın beta sürümünün belirli bir tarih aralığında aktif-pasif olması sağlanabilir.

Microsoft’un Azure takımı, bu ilgili Feature Toggle (veya Feature Flags) tekniğini bir kütüphane geliştirerek(Microsoft.FeatureManagement adı altında) kullanıma sundu. (Bu sebeple ilgili Feature Flags dökümanı Azure’un dökümanları arasında bulunuyor.)

Feature Management yapısının kısa bir tanımını yaptıktan sonra basit bir uygulama yaparak bu yapının nasıl kullanıldığına bakalım.

Basit Bir Uygulama

(Uygulamanın kaynak kodlarına https://github.com/EngincanV/Feature-Management adresinden ulaşabilirsiniz.)

Razor page uygulaması oluşturarak kodlamaya başlayalım. (.Net 2.x ten itibaren istediğiniz sürümü kullanabilirsiniz.)

Razor Page uygulaması oluşturma (Rider IDE üzerinden)

İlk olarak ilgili web uygulamamıza Microsoft.FeatureManagement paketini kurmamız gerekiyor. İlgili paketi uygulamamıza kurduktan sonra gerekli yapılandırmaları gerçekleştirelim.

Startup.cs içerisindeki ConfigureServices methoduna, gerekli servislerimizi DI container’ına eklemesi için services.AddFeatureManagement()satırını ekleyerek ilgili yapılandırma işlemlerini gerçekleştirmiş olduk. Artık uygulamamıza Feature Flag’lerini ekleyebiliriz.

  • FeatureManagement kütüphanesinin ilgili “Feature Flagleri” görebilmesi için appsettings.json içerisinde “FeatureManagement” adı altında bir bölüm oluşturarak, ilgili özellikleri tanımlamamız gerekiyor.

Not: FeatureManagement kütüphanesi ilgili Feature Flag değerlerini .Net Core’un Configuration sağlayıcıları tarafından okuyor. İlgili enable-disable işlemlerini gerçekleştirebileceğiniz herhangi bir configuration provider ile de bunu belirtebilirsiniz. Biz burada ilgili değeri appsettings.json üzerinden belirterek kodlamaya devam edelim.

Uygulamamızı çalıştırdığımızda şuan bu şekilde bir görüntü ile karşılaşıyoruz. Burada ilgili Feature Flag’imizi kullanarak, preview versiyon olması durumunda kullanıcılarımıza yeni bir mesaj sunabiliriz. Bunu yapmak için Index.cshtml.cs dosyamızı açalım ve aşağıdaki gibi düzenleyelim.

Burada appsettings.json üzerinde tanımlamış olduğumuz Feature Flag’in enable veya disable olma durumuna göre ilgili mesajı anasayfada göstermek için tanımlamış olduk. İlgili feature’in aktif veya pasif olduğunu kontrol edebilmek için IFeatureManager interface’ini injecte ederek IsEnabledAsync methodunu kullanabiliriz. İlgili kontrolü yaptıktan sonra bu değişkeni anasayfamızda göstermek için Index.cshtml dosyasını düzenleyelim.

İlgili değişikliklerden sonra anasayfamızda ilgili Feature Flag değerinin aktif olması durumunda aşağıdakine benzer bir görüntü elde etmemiz gerekiyor.

Burada ilgili Feature Flag’in aktif veya pasif olma durumunu Razor Page üzerinde ilgili IFeatureManager interface’ini injecte edip IsEnabledAsync methodunu çağırararak veya feature tag-helper’ını kullanarak ta gerçekleştirebiliriz.

Not: Feature tag-helper’ını kullanabilmek için Microsoft.FeatureManagement.Mvc.TagHelpers paketinin uygulamaya eklenmiş olması gerekiyor.

Burada uygulamamız çalışmakta iken, appsettings.json dosyasına giderek IsPreviewVersion feature’ını false olarak değiştirip, anasayfayı yeniler isek ilgili feature’ın dinamik olarak disable hale geldiğini görebiliriz.

IsPreviewVersion Feature’ı disable edilince Anasayfa

TimeFilterWindow İle Belirli Tarih Aralığında İlgili Feature’ı Kullanma

Feature Management sistemini built-in Action Filter’lar ile de kullanabiliriz. Yapmış olduğumuz örnek uygulamada ilgili özellik belirli bir tarih aralığı kontrolü yapmayarak sadece ilgili özelliğin aktiflik-pasiflik durumuna göre kullanılmaktadır. TimeFilterWindow filter’ı sayesinde ilgili özelliğin belirli tarihler arasında aktif kalmasını sağlayabiliriz. Bunun için ilk olarak appsettings.json dosyamızı düzenleyelim.

İlgili süre aralığını belirttikten sonra, Startup.cs içerisinde kullanacağımız ilgili Action Filter’ı belirtmemiz gerekiyor.

İlgili Feature Filter’ı tanımladıktan sonra, artık ilgili özellik sadece belirlenen zaman aralıklarında aktif olacaktır.

Custom Feature Filter Oluşturma

Feature Management kütüphanesi üzerinde kullanılan built-in Feature Filter’lar dışında custom olarak da yeni Feature Filter’lar oluşturulabilir. Bunu yapmak için tek yapılması gereken oluşturulan ilgili sınıfı IFeatureFilter interface’inden kalıtım alması. Detaylı bilgi için bu makaleyi inceleyebilirsiniz.

--

--