Arda Çetinkaya Yazılım ve arada kendim ile ilgili karaladıklarım…

Çok hoşuma gitti, www.smbc-comics.com‘den çaldım…

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");
        }
    }

}

Devam…

Asp.Net MVC nedir, ne değildir yazısı olmayacak bu baştan söylemekte fayda var sanırım.  Asp.Net MVC Framework’ün arka tarafında olan bir kaç işlemi anlamaya çalışacağız. Öncelikle Asp.Net MVC Framework, IHttpHandler arayüzünden türeyen MVCHandler ve çevresinde dönen, Asp.Net Framework’ü kullanılarak geliştirilen ayrı bir framework. Aslında Amerika’nın yeniden keşfedilmesini sağlayan bir kavram(!) ya da Mars’a roket göndermemize yardım eden bir teknoloji değil.

Asp.Net’deki IHttpHandler arayüzü, web ortamında, gelen “request”leri,yada içerikleri(context) kontrol etmemizi ve “response”ları yaratmamızı sağlayan bir arayüz. Eminim bir çoğumuz kendi “Handler”larımızı bazen yazma gereği duymuşuzdur. Asp.Net MVC Framework de belli amaçlara ulaşmak için Microsoft’un kendi “Handler”larını yazması ile ortaya çıkıyor işte. Kaynak kodlarına baktığımız zaman zaten bunu daha iyi anlayabiliyoruz.

Şimdi Asp.Net MVC Framework, gelen bir HTTP request’ini alıyor, kendi yorumlayabileceği yapıya dönüştürüp(ki burası da Routing mekanizması oluyor aslında), kendi içinde işliyor. Bu noktada da karşımıza “Controller” kavramı çıkıyor. Kendi içinde işlediği nokta bu “Controller” kısmı oluyor. Daha sonra da bu “Controller” kavramı “View”leri oluşturuyor. Hatırlarsanız az önce IHttpHandler’ın “response”ları yaratmamıza yardım ettiğini söylemiştim. Buna şimdi ek olarak da, IHttpHandler’ın daha doğrusu, bu arayüzden türeyen MVCHandler’ın “Controller”ların yaratılmasını sağladığını söylemek istiyorum. Yaratılmasını sağlıyor dedim dikkat ederseniz. Yani direk kendi yaratmıyor. Bu nokta çok önemli.

Asp.Net MVC Framework’de “Controller”ların yaratılmasını “DefaultControllerFactory” sağlıyor. Evet, tahmin ettiğiniz gibi bir tasarım kalıbı…DefaultControllerFactory, CreateController() metodu ile request sonucu oluşan içeriği(context) alır ve ilgili “Controller” sınıfını oluşturur. Asp.Net MVC Framework’de bu DefaultControllerFactory’nin oluşmasını, ControllerBuilder objesi sağlar.

Şimdi yavaş yavaş biraz daha eğlenceli yerlere geliyoruz aslında. Asp.Net MVC Framework, bize bu “Controller” yapısına gerektiğinde müdahale etmemiz için çeşitli metodlar ve arayüzler sunuyor. DefaultControllerFactory’nin de türediği IControllerFactory arayüzü bunlardan biri. Bu arayüzden kendi ControllerFactory’lerimizi yaratabiliriz. Dolayısıyla kendi “Controller”larımızı yaratabiliriz. Bu sayede “Controller”larda ortak operasyonları gerçekleştirebiliriz. Yukarıda bahsettiğim CreateController() metodu da bu arayüzden geliyor. Bu metod RequestContext tipinde  bir değer alıyor. Bu sunucuya yaptığımız “request”in anlamlı hale geldiği objemiz oluyor. Bir diğer parametre de adından da anlaşıldığı üzere “Controller”ın ismi…

İlerleyen yazılarda kendi kontrol fabrikamısı(:)) yaratıyor olacağız ve bütün bu laf kalabalığını biraz daha anlamlı hale getireceğiz.

Umarım kafalar fazla karışmamıştır. Bu kavramları bilmek gerekli mi diye sorabilirsiniz, ya da gerekli olmadığını savunabilirsiniz…Ama küçük bir proje için derinlere dalıp, biraz debelenmem gerekti. Sonuçlarını da paylaşma gereği hissettim. Önümüzdeki yazılarda bu kavramları kod örnekleri ile daha da anlamlı kılıyor olacağım. Şimdilik bu kadar…

Team Foundation Server(TFS) 2010’nun WSS tarafındaki “dashboard”unda;

“Default value or value provided for the report parameter ‘StateParam’ is not a valid value. (rsInvalidReportParameter)”

şeklinde bir mesaj ile karşılaşıyor olursak, yapmamız gereken küçük bir kaç şey var. Öncelikle bu hatayı, Reporting Service’in raporları doğru oluşturamamasından dolayı aldığımızı söylemekte fayda var sanırım. Bunun da nedeni, TFS üzerinde oluşturduğumuz bir projeyi silip, aynı isimle farklı bir proje oluşturmamız olabiliyor. Ama bunun da temelinde ve genel olarak bu hatanın arkasında Reporting Services’in beraber çalıştığı Analysis veritabanında rapor için ilgili bilgilerin toplanamaması. Peki çözümü ne?

TFS 2010 ile arka tarafta çalışan yeni bir kaç web servis geldi. Bunlar TFS 2010’nun kendi içinde ki bazı operasyonları yönetebilmek ve TFS’in dışardaki sistemler ile iletişimini sağlamak için bir kaç web servis. Bu web servislerden birini kullanarak yukarda bahsetmiş olduğum hatayı çözüyor olacağız.

Bunun için TFS’in yüklü olduğu bilgisayarda “http://[Team Foundation Server adresi]:8080/tfs/TeamFoundation/Administration/v3.0/WarehouseControlService.asmx” adresine gitmemiz gerekmekte. TFS’in yüklü olduğu bilgisayarda bunu yapıyor olmamız çok önemli.

Bir çok farklı web metodu karşımıza çıkıyor olacaktır. Bunlardan “ProcessAnalysisDatabase” metoduna tıklayıp aşağıdaki gibi “Full” ifadesini processingType parametresinin değeri olarak yazmamız gerekmekte.

Invoke dediğimiz de True ifadesini alıyor olmamız gerekmekte. TFS 2010’un “dashboard”u bu işlemden sonra kontrol ettiğimizde sorunun düzelmiş olduğunu görüyor olacağız…

Her ne kadar yazılım ile uğraşan bizlerin az biraz ingilizcesi olsa da, bazen türkçe kaynak okuyor olmak, bazı şeyleri daha iyi anlamaya yardımcı olabiliyor. Ne yazık ki bu noktada da biraz kıtlık çekiyoruz…Bu kıtlık ortamında beğendiğim ve paylaşmak istediğim bazı yazıları paylaşmak istedim. Bir kuplesini aşağıda bulabilirsiniz. Boş zamanlarınızda mutlaka göz atmanınızı öneririm.

Zaman zaman bu tarz link paylaşımlarında bulunuyor olacağım. Tabi her zaman teknik konular içeren linkler de olmayacak (: