Genişletilebilir Uygulamalar ve Managed Extensibility Framework(MEF)
Günümüzde uygulamaların genişletilebilir olması önemli bir konu. Modüler olarak da nitelendirebileceğimiz bu felsefe ile bir uygulamanın kullanıcıları tarafından kolayca genişletilebilmesi amaçlanır. Hatta akıllı uygulamaların kendilerini bu şekilde genişletmesi de mümkündür.
Modülerliği kazandırmak için kullanabileceğimiz farklı yöntemler vardır. Bunlardan belki de en basiti Interface tiplerini ve Reflection’ı kullanarak uygulamanın standart fonksiyonelliklerini genişletilebilir şekilde dışarıya açmaktır. Basittir ancak geliştiricinin iyi tasarlamasını gerekir ve kod maliyeti yükselebilir.
Pek tabii plug-in tabanlı bir yaklaşım için IoC(Inversion of Control) container’larından da yararlanılabilir. .Net dünyasında Ninject, Windsor Castle, Unity gibi Java dünyasında da PicoContainer, Guice, Spring gibi pek çok IoC container bu noktada devreye girer. Bu bileşenler sayesinde geliştirilen yazılımda bileşenlerin ayrıştırılması ve bağımlılıkların ortadan kaldırılması kolayca uygulanabilmektedir. .Net Framework 4.0 sürümüyle birlikte gelen Managed Extensibility Framework(MEF) alt yapısı ile de bu iş gerçekleştirilebilir.
Genişletilebilir Uygulamalar için Örnekler
Konuyu iyi analiz edebilmek adına gerçek hayat örneklerine bakmamızda da yarar var. Modüler uygulamalara günümüzde pek çok örnek verebiliriz aslında. Plug-in veya extension desteği olan ürünlerin tamamında modüler bir tasarım olduğundan bahsedebiliriz. Photoshop’a kullanıcı bazlı efektlerin yüklenmesinden Warcraft’a yeni oyuncuların ilave edilmesine, Winamp’da yeni bir skin’in yüklenmesinden Visual Studio’da yazılım takımının geliştirdiği bir TFS policy’sinin entegre edilmesine kadar pek çok örnek verebiliriz.
MEF Nedir?
Uygulamalarımızın modüler olması için .Net tarafında kullanabileceğimiz alt kütüphane topluluklarından birisidir. .Net’ in bir parçası olduğu için .Net ile birlikte her yerde kullanılabilir. İşin gerçeği kurumsal uygulamalarda IoC Container’ ların kullanıldığı ama n sayıda nesnenin Bind edilme ihtiyacının bulunduğu senaryolarda MEF kullanımı düşünülebilir.
MEF’in Avantajı
Aslında .Net ile geliştirilmiş ürünlerde MEF kullanımının avantajını dile getirmeden önce Late Binding ve Early Binding kavramlarının bir uygulama yaşam döngüsü açısından ne anlama geldiğine bakmamızda yar var. Aşağıdaki amatör çizim bu konuda biraz fikir verebilir.
Şimdi duruma bir bakalım. Modüler olarak düşünülen bir API tasarımı Windows tarafında başlatıldığında derleyici başlangıçta gerekli olan ne kadar kod varsa yükleyecektir. En azından bu şekilde düşünebiliriz. Bu durumda gerekli kod parçalarına Compiler’ın erken bağlandığından bahsedebiliriz.
Diğer yandan kullanıcı veya uygulamanın kendi seçimlerine göre çalışma zamanında yüklenmesi istenen modüller varsa bunlar geç bağlama(Late Binding) tekniği ile ortama dahil edilebilirler. Bu tip bir sürecin sağladığı pek çok avantaj vardır. Söz gelimi uygulama başlangıçta minimum gereksinim ile belleğe açılır ve yaşamı boyunca kullanıcı seçimine bağlı olarak ek modüllerin yüklenmesi için tekrardan başlatılmasına gerek kalmaz. İşte MEF için bu sürecin .Net API versiyonu olduğunu ifade edebiliriz.(Yani Late Binding desteği olan bir yapı)
Temelde IoC container’lar ile MEF arasında benzerlik olduğu düşünülebilir. Ancak temel bir fark vardır. Neredeyse tüm IoC Container’lar Early Binding tekniğine benzer bir şekilde yüklenirler ve genellikle X nesnesinin sadece bir örneğinin bağlanmasına izin verirler. MEF ise birden fazla nesnenin bağlanmasına olanak sunar.
.Net 4.0 ve sonrasındaki sürümlerde framework’e entegre olarak gelen MEF ile genişletilebilir uygulamalar hazırlamak oldukça kolaylaşmıştır. Kendi blogumda yazdığım bu konudaki aynı içerikli yazımın devamında MEF ile Hello World minvalinde basit bir uygulama örneği de bulunmakta, dilerseniz şu adresten yazının tamamına ve örnek kodlara ulaşabilirsiniz: http://www.buraksenyurt.com/post/managed-extensibility-framework-hello-world.aspx
Ayrıca sevgili Arda Çetinkaya‘nın MEF ile ilgili yazılarını şu etiket altındaki linklerden okuyabilirsiniz: http://www.minepla.net/tag/mef/