İçeriğe geç →

Plug-in Tabanlı Uygulama Geliştirme ve Hesap Makinesi Örneği

Neden plug-in tabanlı uygulama geliştirmeye ihtiyaç duyarız?

Biz yazılımcıların karşılaştıkları en büyük sorunlardan birisi, bitirmiş olduğumuz bir uygulamanın üzerine ek bir özellik istenmesidir. Şahsen bu beni delirten bir şey. 🙂
İşte bu tarz durumların önüne geçmemizi sağlayan etmenlerden birisidir plug-in tabanlı uygulama geliştirme. Bu yoldaki en büyük dostumuz Reflection namespace’idir.

Kısaca Reflection’dan bahsetmek gerekirse nesneler ile ilgili çalışma zamanında nesneye ait property ve metotlara erişebilmemizi ve metotları çağırabilmemizi sağlar.

Şimdi konumuza Hesap Makinesi örneğimizle devam edelim.

Projemiz kısaca: İşlem fonksiyonları plug-in olarak tasarlanacak bir hesap makinesi olacaktır.

Öncelikle projemiz 3 parçadan oluşacaktır.

  • Contracts (Hesap makinemize plug-in geliştirirken Application Domain’ler arası plug-in komutlarımız için ana interface tanımlamamız)
  • MainAppicationDomain (Hesap makinesi uygulamamız ve Plug-in’leri çalıştıracak olan proje yer alacak)
  • PlugInApplicationDomain (Eklenmiş olan plug-in’leri tarayıp kendi ApplicationDomainin’de instance’larını türetip MainApplicationDomain’imize gönderecek olan PlugInEngine projemiz yer alacak)

Öncelikle Contract’ımız için Contracts isminde yeni bir klasör ekleyip içerisine GG.PlugInTabanliHesapMakinesi.Contracts isimli bir ClassLibrary projesi ekliyorum. İçerisine ICalculationCommand isimli bir interface tanımlıyorum.

Evet contract’ımız hazır durumda.
Şimdi sıra geldi PlugInApplicationDomain‘imizi oluşturmaya.

Yine öncelikle projemize PlugInApplicationDomain isminde bir klasör daha ekleyerek içerisine GG.PlugInTabanliHesapMakinesi.PlugInEngine isimli bir ClassLibrary projesi daha ekleyerek GG.PlugInTabanliHesapMakinesi.Contracts projemizi referans olarak ekliyorum.

Bu proje plug-in’lerimiz tarayıp ICalculationCommand contract’ımızdan inherit alan assembly’lerimizi bulup instance’lerini üretip MainAppicationDomain ‘imize gönderecek olan class’ımız yer alacaktır.

GG.PlugInTabanliHesapMakinesi.PlugInEngine projemizin içerisine CalculationCommandCommunicator isimli bir class ekliyorum ve MarshalByRefObject, ICalculationCommand interface’lerinden türetiyorum.

Bu class’ımızın amacı: Geliştireceğimiz olan plug-in’lerin sarmalanıp serialize hale getirilip (MarshalByRefObject aracılığı ile) farklı bir ApplicationDomain‘de instance’sının ve metotlarının kullanılmasını sağlayacaktır.

İşin özünde orjinal nesnemizmiş gibi davranan Transparent Proxy‘ler var aslında. Bu sayede uygulamamız için Plug-in geliştiricilerimiz extradan MarshalByRefObject‘den türeyen nesnelere ihtiyaç duymayacaktır sadece Contract’ımız yeterli olacaktır. Aksi durumda onlara contract’ımız haricinde MarshalByRefObject’den de türetmelerini söylemek pekte hoş bir durum olmayacaktır, eminim. 🙂

Şimdi class’ımıza bir göz atalım:

CalculationCommandCommunicator class’ımızıda tamamlamış olduk.

Şimdi sıra geldi plug-in’lerimizi bulup instance’larını türetip bir liste halinde MainApplicationDomain’imize gönderecek olan PlugInEngine class’ımızı oluşturmaya.

PlugInEngine sınıfımızıda MarshalByRefObject’den türeterek hazırlamış olduk.

Şimdi sıra geldi şu bahsedip durduğumuz meşhur MainApplicationDomain’imizi oluşturmaya. 🙂 Hemen MainApplicationDomain isminde bir klasör daha ekleyerek içerisine GG.PlugInTabanliHesapMakinesi.PlugInStarter isimli bir ClassLibrary projesi daha ekliyorum. GG.PlugInTabanliHesapMakinesi.Contracts ve GG.PlugInTabanliHesapMakinesi.PlugInEngine projelerini referans olarak eklemeyide unutmayalım. 🙂
Bu proje plug-in’lerimiz için olan PlugInApplicationDomain ‘imizi bazı yetkilerle oluşturacak ve tanımlı plug-in’leri hesap makinesi uygulamamıza dahil edecektir.

Hemen GG.PlugInTabanliHesapMakinesi.PlugInStarter isimli library’mize PlugInStarter isimli bir class ekliyorum ve kodlara bir göz atalım:

PlugInStarter class’ımızıda hazırlamış olduk.

Şimdi sıra geldi yine MainApplicationDomain klasörü içerisinde UI katmanımızı hazırlamaya. Hemen bir GG.PlugInTabanliHesapMakinesi.WinUI isminde bir Windows Application projesi ekliyorum GG.PlugInTabanliHesapMakinesi.Contracts ve GG.PlugInTabanliHesapMakinesi.PlugInStarter projelerini referans olarak ekleyip UI formunu aşağıdaki şekilde tasarlıyorum.

WinUIHesapMakinesi
Sayı 1 ve Sayı 2 kısımlarına işlem yapacağımız arg1 ve arg2 gelecek, sağ tarafdaki ListBox’a ise Command’larımız gelecek yani plug-in’lerimiz.

Hemen ilgili formumuzun kod tarafına bir göz atalım:

İşte bu kadar. PlugInStarter aracılığı ile ilgili plug-in’lerimiz listemize ekleniyor ve Execute metotumuz aracılığı ile kullanılabilir bir hale geliyor. Uygulamamız neredeyse tamam. 🙂 Geriye sadece örnek bir plug-in tasarlamak kaldı. Hiç fonksiyonsuz bir hesap makinesi işimize yaramayacaktır galiba. 😛

Şimdi solution’umuza PlugIns isimli bir klasör daha ekleyerek ABCSirketi.ToplamaPlugIn isimli bir ClassLibrary daha ekliyorum. (Sanki başka bir firma tarafından geliştirilmiş gibi bir plug-in :))

İlgili plug-in’i geliştirebilmeleri için dağıttığımız Contract‘ımız referans olarak ekleniyor. Hemen ToplamaIslemi isminde bir class oluşturuyorum ve ICalculationCommand interface’mizden türetiyorum.

Kodlarımıza bakmadan önce ilgili ABCSirketi.ToplamaPlugIn projemizin derlendiğinde output klasörünü çalışmamız sırasında kolaylık olması açısından PlugInEngine’imizin plug-in’lerimizi bulmak için baktığı GG.PlugInTabanliHesapMakinesi.WinUI klasörü altındaki bin/PlugIns yolunu output klasörü olarak belirliyorum.

outputPlugIns
Plug-in’imizin kodlarına şimdi bir bakalım:

İşte bu kadar.
Artık ToplamaPlugIn’imizi derlediğimizde ilgili assembly’miz GG.PlugInTabanliHesapMakinesi.WinUI altındaki bin/PlugIns yoluna derlenecektir.

Artık plug-in tabanlı hesap makinemiz çalışmaya hazır! Ben çalıştırıyorum ve ilgili toplama işlemini deniyorum 🙂

hesapmakinesi

Görüldüğü gibi uygulamamız başarıyla çalışıyor plug-in tabanlı. 🙂
Plug-in tabanlı uygulama geliştirmede kendimi geliştirmemde çok faydası olan Sayın Mustafa Tahir Çakmak hocamada teşekkürü bir borç bilirim. 🙂

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

İlgili proje’nin çalışır hali ektedir.

GG.PlugInTabanliHesapMakinesi

 

Bu makale toplam (1964) kez okunmuştur.

8
0



Kategori: .NET

2 Yorum

  1. Plug-in tabanlı uygulama geliştirmeyle alakalı ne zamandır düzgün bir örnek bulamıyordum. Ellerinize gökhan bey mükemmel bir yazı olmuş. Devamını bekliyoruz sitenizin takipçisiyim artık

  2. Halil Halil

    mükemmel, anlatmaya gerek yok.
    görüyorsunuz, ben bişey demiyorum

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*

This site uses Akismet to reduce spam. Learn how your comment data is processed.