Yine bir MEF yazısı…Bu sefer MEF’in kullanım alanlarını inceleyerek MEF’in gerçekten faydalı olabileceğini biraz daha net bir şekilde kavramaya çalışacağız. Bir önceki yazımda, Asp.Net MVC Framework’de “Controller” kavramını basitçe özetleyerek kendi çapımda anlatmaya çalışmıştım. Ne kadar faydalı oldu bilemeyeceğim ama bu sefer de, Asp.Net MVC Framework’de MEF’i nasıl uygulayabiliriz bunu anlatmaya çalışacağım.
Başlıyoruz…
Asp.Net MVC uygulaması olarak, Visual Studio’da proje olarak gelen Asp.Net MVC projesini kullanıyor olacağız. Baştan bir MVC uygulaması yazmaya şimdi gerek yok, hazır yazılmışı olduğunu farz ederek bu proje şimdilik işimizi görecektir.
Aşağıdaki gibi bir proje yapımız olduğuna göre, tam olarak ne yapacağız buna geçelim. Amacımız MEF’in esnekliğini kullanarak Asp.Net MVC uygulamamızı esnetmek. Yani takıp çıkarabileceğimiz, bir birinden bağımsız bileşenler ile uygulamamıza genişletebilir bir yapı yapmak. Bu noktada takıp çıkarabileceğimiz bileşenler derken bunların “Controller”lar olduğunu belirtmekte fayda var sanırım.
“Controller”ların takıp çıkarılması olayını biraz daha açıp, “Controller”ların ayrı *.dll’ler şeklinde Asp.Net MVC uygulamamıza entegre olabilen bileşenler demek sanırım daha açık olacaktır.
Önce “Controller”ımızı yapalım…
Takıp çıkarılabilen bir “Controller” için Visual Studio’da yeni bir “Class Library” projesi yapmamız gerekmekte. Bu projenin çıktısı bizim MVC uygulamamıza dışardan ekleyebileceğimiz “Controller”ımız olacak. Projemizin aşağıdaki gibi bir yapısı olması gerekmekte. (Not: Poll ismini bu örnekte anket yaptığımızı farz ederek koydum)
Index.asp’miz View tarafımız *.cs dosyamız ise “Controller”ımız olacak. Aşağıdaki kod örneği de şimdilik yeterli olacaktır.
using System.Text;
using System.Web.Mvc;
using System.ComponentModel.Composition;
using Common;
namespace Plugins.Poll
{
[Export("MVCController",typeof(IController))]
[PluginMetadata("Poll", "1.0", "Arda")]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class Poll : Controller
{
public ActionResult Index()
{
return View("~/Plugins/Views/Poll/Index.aspx");
}
}
}



