Cidden çok hoşuma gitti…Resmin adı: Dolmabahçe, yapan 4 yaşında bir çocuk…
Önceki yazılarımdan bir tanesinde hatırlarsanız MEF’e giriş yapmıştık. Çok basit bir uygulama ile MEF’in nasıl işlediğini anlatmaya çalışmıştım.
Bu yazımda biraz daha derin konulara girip, “extension”larımıza(MEF’de ki adı “Part” oluyor) nasıl kendi “metadata” bilgilerimizi verebileceğimizi anlatmaya çalışacağız. Öncelikle neden böyle bir şeye ihtiyaç duyuyoruz, buna bir bakalım.
MEF ile geliştirdiğimiz bir uygulamayı doğası gereği esnek bir yapıda oluyor. Bu esnekliği MEF sağlıyor bize. Kendi yarattığımız arayüzlerden türeterek uygulamıza MEF Part’ları katabiliyoruz. Ama uygulamamızın sadece arayüzlerden türeyen “Part”lar ile esneklik kazanıyor olması bazen istenmeyen bir şey olabilir. Mesela IPlugin diye bir arayüzümüz var diyelim. Ana uygulamamız, bu arayüzden türeyen nesneleri kendi içinde çalıştırabiliyor olsun. IPlugin arayüzünü kullanarak kötü niyetli biri uygulamamızda kötü şeyler yapabilir. Bundan dolayı uygulamamızda “metadata” diye adlandırabileceğimiz ekstra içerik sağlayan özellikleri kullanmakta fayda var. Bu sayede IPlugin arayüzünden türeyen nesneleri kontrol edebiliriz. Ve uygulamamız için geçerli olmayan “metadata”ları uygulamamızın çalıştırmasını engelleyebiliriz.
Peki kendi geliştirdiğimiz “Part”lara kendi “metadata”larımızı nasıl ekleyeceğiz?
Çok basit…Öncelikle kendi “metadata”mızın ne gibi bilgiler içereceğini tanımlamamız lazım. Bunun için bir “interface” ya da “class” kullanabiliriz. Ama ben “interface”i seçeceğim bu örnekte. Aşağıdaki gibi bir kod işimizi görecektir.
9 //"Metadata"mızın içeriğni belirliyoruz.
10 //Ne gibi bilgiler tutabileceğimizi istediğimiz gibi tanımlayabiliriz.
11 public interface IPluginMetaData
12 {
13 string Name { get; }
14 string Version { get; }
15 string Author { get; }
16
17 }
Daha sonra bu arayüzü kullanan bir “Attribute” yaratmamız gerekmekte ki, geliştireceğimiz “Part”lara bu “metadata” özelliğini verebilelim. Bunun içinde aşağıdaki gibi bir kod işimizi görecektir.
21 //ExportAttribute tipinde, "Attribute" tanımlıyoruz ki
22 //Yaratacağımız Part’da bu "Attribute"u kullanabilelim
23 //Burda önemli olan constructor’da base’i çağırıp
24 //ExportAttribute’da hangi arayüz ile tanımlama yapacağımızı belirtmek.
25 [MetadataAttribute]
26 [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
27 public class PluginMetadataAttribute : ExportAttribute
28 {
29 public PluginMetadataAttribute(string name, string version,string author)
30 : base(typeof(IPluginMetaData))
31 {
32 Name = name;
33 Version = version;
34 Author = author;
35
36
37 }
38
39 //IPluginMetaData arayüzünde ki özellikleri burada da tanımlıyoruz
40 //Hepsini tanımlama zorunda değiliz.Tanımlamadıklarımız varsayılan
41 //değerleri ile gelecektir.
42 public string Name { get; set; }
43 public string Version { get; set; }
44 public string Author { get; set; }
45
46 }
47
Artık yaratacağımız “Part”lar için kendi tanımlamamızı yapabileceğimiz “metadata” yapısına sahibiz. Şimdi tek yapmamız yaratacağımız “Part”da bu “metadata” özelliğini kullanmak.Bunun için de aşağıdaki gibi bir kod bloğu kullanmamız yeterli olacaktır.
48 [Export(typeof(IPlugin))]
49 [PluginMetadata("İlk Plugin", "1.0", "Arda")]
50 [PartCreationPolicy(CreationPolicy.NonShared)]
51 public class FirstPlugin : IPlugin
52 {
53
54 }
Dikkat ederseniz “PluginMetadata”, “Attribute”u bizim kendi yarattığımız “attribute” sınıfı.
İlerleyen yazılarda da bu “metadata” bilgilerini nasıl okuyup, MEF’de nasıl “Import” işlemi yapabiliyoruz bunu anlatıyor olacağım.Şimdilik bu kadar…
Visual Studio 2010′ da projenizde ki System.Core referansını kaldırdığınızda ve bir şekilde tekrar eklemeye çalıştığınızda aşağıdaki gibi bir hata alıyor olacağız.
Hata bize bu referansın otomatik olarak zaten referans olarak eklendiğini/ekleneceğini söylüyor. Peki ne demek bu? Visual Stuio 2010’da projelerin referansları “build” sırasında belirleniyor. Bazı referanslar ise her koşulda otomatikman “build” sırasında ekleniyor. Yani silseniz bile, aslında Visual Studio 2010 için silmiş olmuyorsunuz. Bu Visual Studio 2010 ile beraber gelen bir değişiklik. IDE’nin bazı özelliklerini kullanabilmek adına.
Peki System.Core’u bir şekilde sildik ve eklememiz lazım, ne yapacağız?
Bunun için öncelikle proje üzerine sağ tıklayıp “Unload Project” dememiz gerekmekte. Dağa sonra tekrar projenin üzerine sağ tıklayıp projeye “Edit…” dememiz gerekmekte. Bu işlemden sonra karşımıza proje dosyamızın içeriği XML şeklinde açılıyor olacaktır.
Referansların eklendiği kısma;
<Reference Include=”System.Core” />
ifadesini ekleyip, “Save” dedikten sonra, tekrardan projeye sağ tıklayıp “Reload” dediğimiz zaman System.Core referansının projemize eklendiğini görebiliriz.
Bu konu ile ilgili “bug” olarak girilen bazı şeyler ile karşılaştım. “Visual Studio Platform” ekibinden ilginç cevaplar dönmüş.
…………………
Unfortunatley, we are at a point in the cycle where we cannot change the UI. As such, I am resolving this bug as Postponed so that we can look at this again in a future release.
…….
So, in this case, we would want to prevent you from removing the reference in the first place.
Since we just release the RC (Release Canidate), we are too late to make any changes of this size at this point, as it would require a large amount of testing, and could introduce regressions in the code. As such, we have postponed the bug so that we can take a look at this for a future release.
RTM’de bu konu ile ilgili bir gelişme yok, sanırım ilerleyen zaman içerisinde Service Pack ile çözülecek diğer sorunlar arasında bunun iyileştirmesi de olur. Bu noktada paylaşmak istediğim bir nokta daha var aslında. Yukarıda ki açıklamadan da anlaşıldığı üzere Microsoft’un geliştirme süreçlerinin ne kadar düzgün işletildiği. Belli bir aşamaya gelmiş bir üründe ki sorunun önceliklendirilmesi yapılıp, ona göre çalışma planlanıyor bunu anlayabiliyoruz…Düşünelim bakalım beraber bu konu üzerinde…(:
patterns & practices ekibinden uzun süredir beklenen haber geldi. Microsoft Enterprise Library 5.0 versiyonu son halini alıp yayınlandı. Bu adresten kütüphanenin kurulum dosyalarını ve kaynak kodlarını indirip, kendi geliştirmekte olduğunuz uygulamalarda kullanabilirsiniz.
Ayrıca ayrıntılı bilgi ve dökümantasyon için de MSDN sayfasına göz atmanızı tavsiye ederim.
Team Foundation Server 2010’a, Visual Studio 2008 ile bağlanarak, geliştirme ortamımızı(IDE) değiştirmeden, TFS 2010’nun nimetlerinden faydalanabiliyoruz. Bunun için öncelikle bu adresten Visual Studio 2008 için “Forward Compatibility Update”i indirmemiz gerekmekte. İndirdiğimiz bu güncellemeyi kurduktan sonra Visual Studio 2008’den Team Explorer ile TFS 2010’a bağlanabiliyoruz. Ancak küçük bir nokta daha var dikkat etmemiz gereken.
TFS 2010’daki yapı, önceki TFS versiyonlarına göre fark gösterdiğinden, TFS server’a bağlanırken kullandığımız “path”i biraz modifiye etmemiz gerekmekte.
http://[tfsserver]:[port]/[vdir]/[projectCollection]
Yukarıdaki yapıda yazacak olursak, Visual Studio 2008 ile TFS 2010’a rahatça bağlanabiliyor olacağız…Ne güzel değil mi (: