Options Pattern deseni sayesinde appsettings.json dosyasındaki kayıtları yapılandırılmış bir şekilde (nesne) ilgili uygulamanın IoC container ına nesne olarak koyacağız. Sonraki süreçlerde ihtiyaç doğrultusunda pratik olacak şekilde dependency injection ı kullanarak talep edebileceğiz. Bu desen bunları sağlamaktadır.
uygulamada bir işlemi yapacağım konfigürasyonel değerleri appsettings.json a yerleştirdik.
Bunu uygulamanın içinde kullanmak istiyorsak. IConfiguration arayüzünden dependency injection vasıtasıyla bu arayüzü talep ediyoruz. Bu arayüz temsil edeceği nesne her neyse o zaten .Net çekirdeğinde mevcut olduğundan dolayı bize gelecek. Gelen bu nesne üzerinden appsettings.json daki herhangi bir konfigürasyonu okuyabiliriz.
typeof yerine generic yapılanmayı da kullanabiliyoruz, elimizdeki T türünden bir class sa şu türde ver diyebiliyoruz ya da T şeklinde bildirebiliyoruz.
Bana MailInfo lazım o yüzden bunu modellememiz lazım.
Tasarladığınız model get fonksiyonunu kullanırken ilgili konfigürasyonu bize yapılandırıp getiriyor, yapılandırmadan kasıt yukarıdaki modeli bize nesne olarak vermesidir. Get fonksiyonunu kullanarak MailInfo türünden bir nesne olarak elde ediyoruz.
Yapılandırma yapılırken dikkat edilmesi gereken nokta property isimleri ile konfigürasyon isimleri aynı olması gerekir.
MailInfo mailInfo = _configuration.GetSection(“MailInfo”).Get<MailInfo>(); bu çalışma neticesinde MailInfo konfigürasyonu içerisindeki tüm bilgileri MailInfo türünden bir nesne ile elde edebiliyoruz. Haliyle MailInfo türünden referansla bunu karşılıyoruz.
Option Pattern burda bize ne getiriyor?
Burdaki yapılandırmayı dependency injection üzerinden tek elden yapmamızı sağlayan bir kolaylık sağlıyor. Her sana MailInfo lazım olduğunda yukarıdaki işlemi yapmak zorunda kalacaksın.
Belirli noktalarda kullandığım konfigürasyonel değerler var ben bu değerleri dependency injection da kullanabilmek istiyorum. İşte dependency injection da direkt nesnel olarak bu değerleri talep edebilmem için benim bu konfigürasyonel yapıları yani appsettings içerisindeki belirli parçaları IoC yapılanmasının container ına bir nesne karşılığında koyabilmem lazım, bunu koyabilmeni ve istediğin zaman çağırabilmeni sağlayan yapılanmaya Options Pattern diyoruz.
ilgili nesneleri IoC nin container ına yerleştiriyorduk.
services.Configure<MailInfo>(Configuration.GetSection(“MailInfo”)); Configure fonksiyonunu al IoC ye MailInfo türünden bir nesne koy demiş olduk.
GetSection da appsettings.json da hangi nesneyi/ayarı(konfigürasyonu hedef gösterecekseniz onun ismini bildiriyoruz. Altındakileri bildirmiş olduğun generic türe dönüşümü yapılıp IoC container ına ilgili nesne verilmiş olacaktır.
Bunu nasıl talep edeceğiz?
Artık Mail ile ilgili herhangi bir konfigürasyonel değere ulaşmak istiyorsak IConfiguration a ihtiyacımız yok.
Sana vermiş olduğum MailInfo türündeki nesne var ya onu bana konfigürasyonel nesneyi getir diyoruz. (public HomeController (IOptions<MailInfo> mailInfo) )
MailInfo da ki nesneye ulaşabilmek için MailInfo _mailInfo referansı oluşturuyoruz.
_mailInfo = mailInfo.Value; _mailInfo ya mailInfo dependency injection, enjekte edilen nesnenin içindeki value yu veriyoruz.
Birden fazla konfigürasyonel değeri startup üzerinden farklı türlerdeki classlara yapılandırıp istediğiniz zaman lazım olanı bu şekilde çağırabilirsiniz.