Asp.Net Core uygulamalarında konfigürasyon bilgileri appsettings.json dosyasında tutulmaktadır. Bu dosyada tanımlanan değerlere uygulamadaki çeşitli yerlerde ihtiyacımız olacaktır.
Örnek bir appsettings.json dosyasında Google Invisible Recaptcha Site ve Gizli anahtar değerlerini uygulamamızda kullanabilmek amacıyla tutmaktayız.
{ | |
"GoogleInVisibleRecaptcha": { | |
"SiteKey": "YourSiteKey", | |
"SecretKey": "YourSecretKey" | |
}, | |
"AllowedHosts": "*" | |
} |
Aşağıdaki örnek kodda IConfiguration interfacesinden bir configuration nesnesinin enjeksiyonu yapılarak appsettings.json dosyasından GoogleInVisibleRecaptcha sectionundaki SecretKey değerinin alınabilmesi sağlanır.
public class ReCaptchaManager | |
{ | |
private IConfiguration _configuration; | |
public ReCaptchaManager(IConfiguration configuration) | |
{ | |
_configuration = configuration; | |
} | |
public ReCaptchaResponse CheckInvisibleCaptchaValid(string responseFromForm) | |
{ | |
var client = new System.Net.WebClient(); | |
var secretKey = _configuration.GetSection("GoogleInVisibleRecptcha").GetSection("SecretKey").Value; | |
var reply = client.DownloadString(string.Format("https://www.google.com/recaptcha/api/siteverify?secret={0}&response={1}", secretKey, responseFromForm)); | |
return JsonConvert.DeserializeObject<ReCaptchaResponse>(reply); | |
} | |
} |
Bu yazımda değineceğim Options Pattern kullanmadan da konfigürasyon dosyasındaki değerlere yukarıdaki gibi ulaşabiliriz. Fakat bu yol, yazılan kodun tekrarlı olmasına sebep olacak ve temiz kod kavramına ters düşecektir. Ayrıca okunabilirliğini de düşüreceği kanısındayım.
Options Pattern, appsettings.json dosyasında birbiriyle ilişkili konfigürasyon değerlerinin sınıf yapılarını kullanarak strongly-typed yapılar haline getiren bir desendir.
Bu desenin sağladığı sınıf yapısı ile, konfigürasyon dosyasındaki değerlerin nesnede tutulup, dependency injection yöntemi ile istediğimiz yerlerde kullanabilmemizi sağlar. Ayrıca ilişkili konfigürasyon ayarlarının sınıf yapısında oluşturularak Separations of Concerns ilkesine uygun yapıya ulaşabiliriz.
Microsoft'un Options Pattern ile ilgili dokümantasyonu için tıklayınız.
Senaryomuz Google Invisible Recaptcha Site ve Gizli anahtar (SiteKey ve SecretKey) değerlerini appsettings.json dosyasından gerekli yerlerde kullanmak amacıyla bir sınıf oluşturup bu sınıftan bir nesneyi dependency injection ile kullanmak üzerinedir.
Bu patternin uygulama adımları aşağıdaki gibidir.
1-) appsettings.json dosyasından GoogleInVisibleRecaptcha SiteKey ve SecretKey sectionlarına ulaşabilmek için GoogleInVisibleRecaptcha sınıfı SiteKey ve SecretKey sectionları için propertyler tanımladık. Property isimlerinin, eşleşmenin olabilmesi için dosyadaki section adları ile aynı olmasına dikkat edilir.
public class GoogleInVisibleRecaptcha | |
{ | |
public string SiteKey { get; set; } | |
public string SecretKey { get; set; } | |
} |
2-) Sınıfımızı oluşturduktan sonra Startup.cs dosyasındaki ConfigureServices metodunda kullanılacak sınıf adını vererek Configure metodunu ekliyoruz. Parametre olarak sınıf adını verdiğimiz section adını giriyoruz. (GoogleInVisibleRecaptcha)
public class Startup | |
{ | |
public Startup(IConfiguration configuration) | |
{ | |
Configuration = configuration; | |
} | |
public IConfiguration Configuration { get; } | |
// This method gets called by the runtime. Use this method to add services to the container. | |
public void ConfigureServices(IServiceCollection services) | |
{ | |
services.AddMvc(); | |
services.Configure<GoogleInVisibleRecaptcha>(Configuration.GetSection("GoogleInVisibleRecaptcha")); | |
} | |
} |
3-) Controller ya da farklı bir yerde, dependency injection ile enjekte ederek istediğimiz yerde kullanabileceğiz. Bunun için constructor tarafında IOptions<GoogleInVisibleRecaptcha> türünden bir parametre geçerek, parametrenin Value değeri ile GoogleInVisibleRecaptcha türünden nesneye atama yapabiliriz. Value değerine atamayı ikinci adımdaki Configure metodu yapmıştı. Bu şekilde sürekli GetSection kullanmadan oluşturduğumuz nesneyi kullanarak değerleri okuyabiliriz.
public class RecaptchaController : Controller | |
{ | |
private readonly GoogleInVisibleRecaptcha _invisibleRecaptchaOptions; | |
public RecaptchaController(IOptions<GoogleInVisibleRecaptcha> invisibleRecaptchaOptions) | |
{ | |
_invisibleRecaptchaOptions = invisibleRecaptchaOptions.Value; | |
} | |
[HttpPost] | |
public JsonResult CheckInvisibleCaptchaValid() | |
{ | |
var response = HttpContext.Request.Form["g-recaptcha-response"]; | |
var secretKey = _invisibleRecaptchaOptions.SecretKey; | |
var captchaResponse = ReCaptchaManager.CheckInvisibleCaptchaValid(secretKey, response); | |
return Json(captchaResponse); | |
} | |
} |
Özetle Option Pattern ile birbirleriyle ilişkili konfigürasyon değerlerini nesne ile okuyabilmek ve daha temiz bir yapı kurmak için bir teknik olarak kullanabilirsiniz.
Yorumlar
Yorum Gönder