MEF (Managed Extensibility Framework) de neymiş?

Dostlarım merhaba;

Meraklı her yazılımcı, yeni bir teknoloji ile karşılaştığında şöyle bir yerlere (belki de sadece zihnine) notlar alır, neyi nasıl öğrenmesi gerektiğini planlar ve bazen benim yaptığım gibi bunların hepsini unutur (yoksa üşenir mi?). Efendim, .NET 4.0 ilk duyurulduğunda, yeni ne var diye oradan buradan birşeyler araştırırken MEF diye yeni bir framework geliştirildiğini okumuştum. O an çok merak ettim ama, sonradan zamanın mı olmadı nedir, unuttum gitti. Ama bu unutkanlık, bir hafta önce, yerini hatırlamaya bıraktı (vay be çok edebi cümle oldu). Araştırdım öğrendim ve sonunda bu konu hakkında bir yazı yazmaya karar verdim.

Yazılımcılık açısından içinde bulunduğumuz çağ, öncekilere göre çok daha büyük uygulamaların hayata geçirildiği bir çağ. Böyle olması elbette normal, çünkü artık yazılım kullanan araçlar yalnızca bilgisayarlar değil. Ceplerimizde akıllı telefonlar, touch-pad’ler her yerden internete erişimimiz var. Hal böyle olunca da uygulamalar gittikçe büyüyor. Peki büyüdükçe karşınıza çıkabilecek sorunlar da artmıyor mu? Kesinlikle! Bu sorunlardan en büyüğü, uygulamanızın genişletilebilir olması gerektiği. Nedir bu “genişletilebilirlik”? Önce bunun üzerinde duralım.

Eğer büyük bir uygulama geliştiriyorsanız; demek ki hedefiniz, uzun bir süre sektörde kalmak J. Bu durumda, uygulamanız, gelecekte oluşabilecek ihtiyaçlar doğrultusunda sürekli değişebilir ve gelişebililir olmalı. İşte bu kurala genişletilebilirlik (extensibility) diyoruz.

Tahmin edeceğiniz gibi, bu sorunun giderilmesi için şimdiye dek birçok yöntem kullanıldı. .NET Framework tarafında kullanılan yöntemlerden biri Reflection tekniği ile Plug-in yapısı oluşturmaktı. Bu yöntemde ana uygulamanız, dışardan plug-in yükleyebilmek için uygun hale getirilir ayrıca uygulamanıza eklenebilecek plug-in’leri standart hale getirmek için bir SDK kütüphanesi hazırlanır. Kullanıcı, uygulama geliştiriciden aldığı plug-in’in (muhtemelen .dll dosyası) yolunu uygulamaya gösterir ve hokus pokus! Plug-in artık aktiftir.

Yazımın konusu reflection değil. Ama küçük bir tanım yapmadan da geçemeyeceğim; bir tipin assembly’sine çalışma-zamanında (run-time) ulaşarak, o tipin bütün üyelerini (özellik,metod,alan,olay) görebildiğimiz ve hatta kullanabildiğimiz bir tekniktir reflection. Haliyle bu tanımdan sonra, plug-in yöntemindeki ana uygulamanın nasıl yazıldığını daha iyi anlarsınız.

Ancak, reflection tekniğinin Plug-in yapısında dezavantajları da vardı. Bunlardan en önemlisi ise, SDK yazmanın hiç de kolay olmadığıydı.

Bu noktada durup, genişletilebilirlik konusunda basit bir örnek vererek konuyu kapatalım. Diyelim ki Tetris uygulaması yazıyorsunuz ve şunu istiyorsunuz: oyuncular, kendi tuğlalarını tasarlayıp oyuna dahil edebilsinler. İşte bu noktada diyoruz ki, bu uygulama genişletilebilir olmalı.

İşte MEF (Managed Extensibility Framework – Yönetilebilir Genişletilebilirlik Çerçevesi), bu soruna çözüm olmayı uman yeni bir Microsoft teknolojisi. Aşağıdaki şekilde, MEF’in temel yapısını görüyorsunuz:

Diyagramı okumaya sondan başlayalım. Import ve Export, Part olarak isimlendirilen birer yapı. Import, “ben genişletilebilir bir alanım” derken, Export ise “ilave edilecek” alan benim diyen kısım. Bu part’lar aynı namespace altında bulunabileceği gibi, farklı projeler altında da bulunabilirler. Ne olursa olsun, Import ve Export nesneleri, CompositionContainer nesnesi üzerinde bulunmak zorundadırlar. Aslında bu bahsettiğimiz iki nokta temel MEF için yeterli bir adım.

Sözü fazla uzatmadan basit bir örnek yapalım ve sizi MEF ile tanıştırmış olalım.

Örneğimiz bir Console Application ve adı da “HelloMEF” olsun.

İlk olarak Açtığım projeye, Extension1 isminde bir class ekledim. Adı üzerinde, bu class ana uygulamaya run-time’da eklenecek bir eklenti. Ardından projeme System.ComponentModel.Composition referansı ekliyorum (Projeye sağ click->Add Reference) .

Burada geçen [Export] attribute’u nesnenin hangi özelliğinin veya alanının ilave edileceğini (plug-in gibi düşünülebilir) belirtiyor. Yani biraz daha türçeleştirirsek; “Extension1 sınıfının Message özelliği, uygulamayı genişletecek bir özelliktir” demiş oluruz.

İkinci class olarak da MEFTest isimli bir class ekliyorum ve aşağıdaki hale getiriyorum:

Yukarıda gördüğünüz class’da yer alan MerhabaMef() metodunu biraz inceleyelim dilerseniz. Öncelikle hem Import hem de Export part’larını yerleştirmek üzere CompositionContainer nesnesi oluşturdum. Fakat part’ları tasiyici nesnesinin üzerine atabilmeniz için, bir grup oluşturmalısınız. Sonuçta hangi Import ile hangi Export’un birbiriyle uyumlu olduğunu siz biliyorsunuz. İşte bu grubu CompositionBatch nesnesi üzerinde oluşturacağız. Dolayısı ile part’ları burada batch nesnesine ekledim.

Son olarak, tasiyici nesnesinin Compose metodu ile grubu tasiyiciya ekledim. Ardından da genişletilebilir Mesaj özelliğini ekranda göstermesini istedim.

 

Ve Main Metodumu yazdım:

İşte sonuç:

Uygulama çalıştığında compiler, Export olarak belirttiğiniz Message özelliğini Import olarak belirttiğiniz Mesaj özelliği ile değiştirebildi. Görüldüğü gibi genişletibilirlik MEF ile biraz daha kolaylaştırıldı.

Bir sonraki makalede görüşmek dileğiyle sevgili dostlar..

2 thoughts on “MEF (Managed Extensibility Framework) de neymiş?

Leave a Reply