Makale Özeti

.NET Genişletilebilir uygulamaları bağımlılıkları çalışma anında bulurlar. Çalışma anında oluşan hataları düzeltmek için taşıyıcının durumunu raporlamamız ve gerçek sorunu bulmamaız gerekmektedir. Genişletilebilir uygulamalarda hata yakalamayı inceliyoruz.

Makale

Genişletilebilir Uygulama Yazı Dizisi

  • Genişletilebilir Uygulama Yazma
  • Derinlemesine Genişletilebilir Uygulama Yazma
  • Genişletilebilir Uygulamada Hata Yakalama ve İzleme
  • Problem

    Genişletilebilir (Composite) uygulamalar bir birine bağlı parçalardan oluşmaktadır. Eğer bir parça oluşturulurken parçanın ihtiyaç duyduğu eksik bir bağımlılık var ise uygulama hata alacaktır.

    Yukarıda A örneğinin oluşturulması sırasında önce A'nın bağımlılıkları oluşturuluyor. C parçası [Import] edilmiş fakat uygulama içinde C parçasını [Export] eden her hangi bir kontrat bulunmamaktadır. Çalışma anında A parçasını üretmeye çalıştığımızda C'nin [Export] kontratı olmadığından dolayı hata üretilecektir.

    Hatalar çalışma anında ortaya çıkacağı için oluşan hataları raporlamalı ve temel sorunu bulmalısınız.

    Taşıyıcıyı Yazdırma

    Örneğimize geri dönersek A örneği B ile bağımlı ve B ise C ile bağımlı ama uygulamada C örneğini [Export] eden bir kontrat bulunmamaktadır. Yani aşağıd ki şekilde bir kodlama olduğunu varsayalım.

     [Export ]
     public  class  ClassA 
     {
         [Import ] private  ClassB  _classB ;
     }
     [Export ]
     public  class  ClassB 
     {
         [Import ]
         private  ClassC  _classC ;
     }
     public  class  ClassC 
     {
     }

    Taşıcının içeriğini bir stream örneğine yazdırmak için mef.codeplex.com adresinde ki Microsoft.ComponentModel.Composition.Diagnostics.dll assembly dosyasına ihtiyacınız var. Burada yer alan CompositionInfo ve CompositionInfoTextFormatter sınıfları ile taşıyıcının tüm içeriğini bir stream örneğine aktarabilirsiniz.

     var  compositionInfo = new  CompositionInfo (_aggregateCatalog , _compositionContainer );
     CompositionInfoTextFormatter .Write (compositionInfo, Console .Out );

    Yukarıda bir katalog üzerinde ki tüm tanımlamaları çalışma anında Console yazan kod blogu bulunmaktadır. Örneğimie ait çıktı ise aşağıdaki gibi oluşacaktır.

    Çıktıyı incelersek katalog üzerinde iki tane [Part] bulunduğunu görüyoruz. A için [Export] tanımının ve [Import] B tanımının olduğunu fakat [Import] B tanımının geçersiz olduğunu görüyoruz. Part B için [Primary Rejection] ifadesini görüyoruz bu ifade bize temel sorunun B parçasında olduğunu gösteriyor. B parçasında da [Import] C tanımını görüyoruz. Hatanın detayını okuduğumuzda [Import] C için geçerli bir [Export] kontratının bulunmadığını görmekteyiz. Böylelikle sorunu tesbilt etmiş olduk. C örneğine ait bir [Export] kontratına ihtiyacımız var.

    Sonuç

    Böylelikle genişletilebilir (Composite) uygulama yazma konulu serinin sonuna gelmiş olduk. Katalog ve taşıyıcı kavramlarını gördük. [Export] kontratlarımıza nasıl Metadata etiketleri verileceğini ve bu etiketleri kullanarak ihtiyacımız olan parçaları nasıl bulabileceğimizi gördük. Parçaların hayat döngüsünü yönetmeyi inceledik. Son olarakda genişletilebilir uygulamada hata yakalama özelliklerini inceledik.

    Genişletilebilir uygulama alt yapısı (System.ComponentModel.Composition) bilinen IoC alt yapılarında (Unity, Structure Map,vb ) farklıdır. IoC alt yapıları derleme anında bağımlılıkları bilmektedir. .NET Composition ile bağımlılıklar çalışma anında keşif edilmektedir. Composition bilinmeyen bağımlılıkları yönetirken IoC ile bilinen bağımlılıklar yönetilmektedir.

    Genişletilebilir uygulamalar uzun geliştirme süreci olan projelerde daha çok tercih edilmektedir. Bir sonraki yazı dizisinde genişletileblir MVC 3 uygulaması ve genişletilebilir WCF uygulaması üzerinde durucağız.

    Emre Coşkun

    http://www.emrecoskun.net

    demo