Ninject, Gevşek Bağlı Sistemler : Xml

   Gevşek bağlı sistemler geliştirme konusunda önemli bir adım aldığımız önceki makalemde hatırlarsanız size Ninject modülleri ile bağımlılıkları nasıl uygulamanızın dışında tanımlayabildiğinizi sizinle paylaşmıştım. Bu makalemde alternatif bir yöntemle bağımlıkları nasıl xml tanım dosyasından yükleyebileceğinizi anlatacağım.

   Tür bağlamalarınızı her ne kadar Ninject modülleri ile olabildiğince esnek yüklüyor olsak da, bu yöntemin ufakta olsa bir dezavantajı bulunuyor. Bu yöntem ile belirli bir isimlendirme şanlonuna uyan ya da örneğin referans edilen tüm dll’lerde bulunan modüller otomatik olarak yüklenmekte. Bu durumda da, örneğin; kullanıcının seçimleri doğrultusunda farklı tür bağlamaları (veri depoları) kullanabilmeyi oldukça kısıtlamakta.

   Ninject, bu yönteme alternatif olarak tür bağımlılıklarının xml yapılandırma dosyasında tanımlanabilmesine imkan vermekte. Bir Ninject eklentisi olan Ninject.Extensions.Xml yardımıyla tanımlama yapabilirsiniz. Bunun için öncelikle NuGet paketini projemize ekleyelim;

Ninject.Extensions.xml NuGet paketinin yüklenmesi

  Devamında ise projemize yeni bir xml dosyası ekleyelim. Tür bağlama tanımlarını yapacağımız bu xml dosyasının adı önemli olmamakla birlikte ben “DIYapilandirmasi.xml” olarak isimlendirdim. Sonra da bu dosyanın her derlemede çıktı klasörüne kopyalanması için “Copy to Output Directory” değerini Copy Allways yapalım (aslında ‘Copy if newer’ seçeneği de işimizi görecektir).

DIYapilandirmasi.xml dosyasının özellikleri

 

   Şimdi sıra xml yapılandırma dosyamızı hazırlamaya. Her geçerli xml dosyasında olduğu gibi bizim de yapılandırma dosyamızın bir kök element ile başlaması gerekir; ki bizim için bu kök element module olmalıdır;

<?xml version="1.0" encoding="utf-8" ?> 
<module name="DIYapilandirmasi">
</module>

   Dikkat edecek olursanız kök elementimde bir de name özelliği var. Bu özellik modülümün ismini belirtmek için gerekli. Devamında ise artık tür bağlamalarını yapabiliriz. Tür bağlamaları module elementi altında sıralanmış bind elementleri yardımıyla yapılmakta;

<bind service="Com.Enterprisecoding.DependencyInjection.Domain.IVeriDeposu, DependencyInjection.Domain"
          to="Com.Enterprisecoding.DependencyInjection.Imp.XmlDosyaVeriDeposu, DependencyInjection.Imp" />

   En basit haliyle bind elementinde service ve to özellikleri bulunmalıdır. Burada servis talep edilen türü belirtirken, to ise Ninject’in bağlaması gereken türü belirtmektedir. Yukarıdaki örnekte olduğu gibi service ve to özelliklerinde tür adının assembly ile birlikte (assembly qualified) belirtilmesi önemli.

   Bind elementi bu iki özelliğin yanında seçimli olarak henüz değinmediğim toProvider, name, scope özelliklerine de sahip olabilir.

   Önceki makalelerimde paylaştığım basit örneğimizden devam ettiğimizde aşağıdakine benzer basit bir yapılandırma dosyası işimizi görecektir;

<?xml version="1.0" encoding="utf-8" ?>
<module name="DIYapilandirmasi">
  <bind service="Com.Enterprisecoding.DependencyInjection.Domain.IVeriDeposu, DependencyInjection.Domain"
        to="Com.Enterprisecoding.DependencyInjection.Imp.XmlDosyaVeriDeposu, DependencyInjection.Imp" />
  <bind service="Com.Enterprisecoding.DependencyInjection.Domain.IGunlukDeposu, DependencyInjection.Domain"
            to="Com.Enterprisecoding.DependencyInjection.Imp.TextGunlukDeposu, DependencyInjection.Imp" />
</module>

  Yapılandırma dosyasının hazırlanması ardından sıra geldi Ninject’i bu dosya hakkında bilgilendirmek. Bu modül yüklemekten çokta farklı olmayan bu işlem aşağıdaki şekilde load fonksiyonu yardımıyla yapabiliriz;

kernel.Load("DIYapilandirmasi.xml");

   Her ne kadar xml yapılandırması iş görecek düzeyde olsa da, ileri düzey ihtiyaçlara tam olarak yanıt vermediğinin altını çizmeliyim. Öte yandan, kullanıcının seçimlerine göre yerel veritabanına ya da web servislere bağlanarak işlem yapabilen bir uygulamayı kolaylıkla oluşturabilirsiniz. Yapmanız gereken sadece ilgili tür bağlamalarına dair bir yapılandırma dosyası oluşturarak uygulamanın bir sonraki açılışta bu yapılandırma dosyasını okuması…

   Ninject’in en sevdeğim taraflarında birisi olabildiğince esnek tanımlanmış olması. Bir önceki makelemde paylaştığım modül mantığının ya da bu makalemdeki xml mantığının dinamik yükleme ihtiyaçlarınıza karşılık vermemesi durumunda kendi yönteminizi geliştirmeniz mümkün. Bunu için başlangıç noktanız IModuleLoaderPlugin arayüzü olmalıdır.

   En basit anlatımla IModuleLoaderPlugin arayüzü, Ninject’e belirttiğiniz dosya uzantıları için modül yükleme sorumluluğunun yazdığınız kod parçacığında olduğunu belirtmekte.Ninject, ilgili uzantıda bir modülün/dosyanın yüklenmesi talep edildiğinde otomatik olarak yazdığınız kodu çalıştırarak modülleri yüklemenize imkan sunacaktır.

  Bu senaryoda; şifrelenmiş xml ya da gömülü yapılandırma dosyalarından, hatta veri tabanlarından tür bağlama bilgilerini okuyarak işleme koymanız oldukça kolay olacaktır.

Fatih Boy

Ankara'da yaşayan Fatih, bir kamu kurumunda danışman olarak çalışmaktadır. ALM süreçleri, kurumsal veri yolu sistemleri, kurumsal altyapı ve yazılım geliştirme konularında destek vermektedir. Boş zamanlarında açık kaynak kodlu projeler geliştirmeyi ve bilgisini yazdığı makalelerle paylaşmayı seven Fatih, aynı zamanda Visual C# ve Visual Studio teknolojileri konusundan Microsoft tarafından altı yıl üst üste MVP (En Değerli Profesyonel) ödülüne layık görülmüştür. İş hayatı boyunca masaüstü uygulamaları, web teknolojileri, akıllı istemciler gibi konularda Asp.Net, Php, C#, Java programlama dilleri ve MySql, MsSql ve Oracle gibi veritabanı yönetim yazılımları ile çalışmıştır. İngilizce ve Türkçe olarak yayınlanan makalelerini gerek İngilizce bloğunda, gerekse de Türkçe bloğunda bulabileceğiniz gibi web sitesinden de açık kaynak kodlu geliştirdiği yazılımlarına ulaşabilirsiniz. vCard - Twitter - Facebook - Google+

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir