Interface-Reflection Kardesligi:) Plug in uygulamasi

Yazar: Sinan BARAN
Kategori: .NET Framework
Eklenme Tarihi: 23.8.2009 10:01:22



Merhaba Arkadaslar bugünkü makalemizde interface ve reflectionlara deyinerek bir plug’in uygulaması yazacağız.

Merhaba Arkadaslar bugünkü makalemizde  interface ve reflectionlara deyinerek bir plug’in uygulaması yazacağız.

Neden Interface yapısı kullanacağız?  Sorusunu duyar gibiyim

Örneğin FireFox  tarayıcısı için eklenti geliştireceğiz  akla gelen sorular

 

Neye göre eklenti geliştireceğiz?

Neye göre kodumuzu yazacağız?

Yazmış oldugmuz kodu Program nasıl okuyacak?

Kötü amaçlı uygulama yazarsam ne olacak program buna uyum sağlayabilecek mi?

FireFox’un sorunu diyenler olabilir ama Firefox sizin olabilirdi devam edelim...

Yapacağımız projeye rehber olabilecek bir yol düşünmek lazım. Akla gelecek ilk olan yapı OOP’nin en önemli yapılarından birisi olan Interface yapısı öne çıkıyor.Çünkü Interface yapıları temsil edeceği class’lar için birer rehberdir… İşte uygulamanın bizim olduğunu düşünürsek, yazılımcıların bu uygulama için eklenti geliştireceği ve onlara yol gostericek bir Interface yaratmamız gerekiyor ki yazılımcılar bu Interface yapısını Implements ederek neler yapabileceğini hakkında fikir sahibi olsunlar  ve Interfaceimin sahip olmuş olduğu özellikler hakkında bilgim olduğu için yazılımcının yapmış olduğu eklentinin hangi özelliklere sahip olduğunu Arayuz sayesinde biliyorum Şimdi projemiz bir arama motoru Projesi olsun. Herkes kendi  web sitesi için bir arama eklentisi yaparak bizim projemizde kullanabilsin…Yavaş yavaş örneğimize  bağlıyalım


Evet, projemizi bu şekilde tasarladık

Projemizde Buttan  (btnArama)

Üst images (PictureBox1)

Sağ Tarafı FlowLoyutPanel (Eklentiler içerisindeki Name özellikleri ile RadioButton oluşturacağım FlowLoyut panel içerisine eklenen kontrolleri otomatik hizalar)

Ve TextBoxt (txtArama)

 

2 Adet Proje göruüyorsunuz.

Arama Motoru Projesi benim Ana Projem bu proje için eklenti geliştirilecek 

DeveloperRehberInterface Projesi   için geliştirilecek eklenti özellikleri

    public interface IMotor

    {

        string Name { get;  }

        string ImagesURL { get;  }

        string SearchURL { get; }

        string Description { get;}

    }

Evet, ben biliyorum ki proje için yapılacak eklentilerde name, ImagesURL, SarchURL, Description propertileri var. O halde ben bu interface'i projeme’de ekleyip bu interface propertilerini gerekli olan kısımlara kullanacağım geriye kalan eklentileri Assamby’ye yükleyerek içerisindeki Class değerlerini IMotor Interface’ine aktarmak

Evet, eklentileri yapalım şimdi 

public class SinanBARAN : IMotor

    {

        private string _Description = "SinanBARAN.com Arama Motoru";

        private string _ImageURL = @"http://www.isletmekulubu.org/UserFiles/Image/Faaliyet/AnaFoto/bilgeadam200307.jpg";

        private string _Name = "SinanBARAN";

        private string _SearchURL = "http://sinanbaran.com/search.aspx?q=";

     

        #region IMotor Members

        public string Description

        {

            get{return _Description;}

        }

        public string ImagesURL

        {

            get{return _ImageURL;}

        }

        public string Name

        {

            get{return _Name;}

        }

        public string SearchURL

        {

            get{return _SearchURL;}

        }

        #endregion

    }

Evet, yeni bir Class Libary Projesi açtım ve  verilen DLL’ ekledim. Daha Sonra DLL içerisindeki IMotor Interface’ı implements ettim ve verilen özelliklere değerleri atadım. Bu kadar. 

 

3 adet farklı Class Libary Projesi oluşturdum ve her projeye eklemıs olduğum DLL içerisinde IMotor interface’sınden implements edildi. Yapmam gereken sadece özellikleri vermem yukarıdaki gibi.

 

  • SinanBARAN:IMotor
  • Google:IMotor
  • Yahoo:IMotor

 

 

 

Daha sonra bu projelerin oluşturmuş olduğu DLL’leri    ana projemin rot’unda bir klasöre atmam yeterli olacaktır.

Proje Load’inda bu klasör içerisinde bütün DLL’L eri Assembly’e  yükleyeceğim daha sonra (System. Reflection) içerisindeki Class’larin “IMotor” Interface’ınden implements edilip edilmediğini öğrenerek işleme tabi tutacağım, Class’ın  işlem için uygun olup olmadıgnı tespit edeceğiz.

List<IMotor> list = new List<IMotor>();

Global bir IMotor GenericList  oluşturarak. Assamblye yüklediğim her Class’in CreateInstance alarak List içerisine ekliyorum.

private void Form1_Load(object sender, EventArgs e)

        {

            string path = Application.StartupPath + "/Eklentiler";

            string[] Dosyalar = Directory.GetFiles(path);

            for (int i = 0; i < Dosyalar.Length; i++)

            {

                Assembly asm = Assembly.LoadFrom(Dosyalar[i]);

                Type[] tip = asm.GetTypes();

                foreach (Type item in tip)

                {

                    if (item.GetInterface("IMotor") != null)

                    {

                        IMotor Sinif = (IMotor)asm.CreateInstance(item.FullName);

                        list.Add(Sinif);

                    }

                }

            }

            MotorlariDoldur();

        }

private void MotorlariDoldur()

        {

            foreach (IMotor item in list)

            {

                RadioButton rnd = new RadioButton();

                rnd.Text = item.Name;

                rnd.Click += new EventHandler(rnd_Click);

                this.flowLayoutPanel1.Controls.Add(rnd);

            }

        }

IMotor motor = null;

        void rnd_Click(object sender, EventArgs e)

        {

            foreach (IMotor item in list)

            {

                if (item.Name == ((RadioButton)sender).Text)

                {

                    motor = item;

                    btnArama.Text = item.Name;

                    ImagesEkle(item);

                    label1.Text = item.Description;

                }

            }

        }

        private void ImagesEkle(IMotor item)

        {

            WebRequest r = WebRequest.Create(item.ImagesURL);

            WebResponse wr = r.GetResponse();

            Stream str = wr.GetResponseStream();

            pictureBox1.Image = Image.FromStream(str);

        }

        private void btnArama_Click(object sender, EventArgs e)

        {

            System.Diagnostics.Process.Start(motor.SearchURL + txtArama.Text);

        }

Evet, Interface’in kullanım alanlarından 1 tanesi  gerçekten çok önemli ve zevkli bir konu.

 

       PROJE

AramaMotoru.rar (53,46 kb)

 

   EKLENTILER

SinanM.rar (12,47 kb)

YahooMotor.rar (12,44 kb)

GoogleArama.rar (12,81 kb)


Sinan BARAN

Sinan BARAN 2007 yılından itibaren .Net teknolojisi ile çalışmalarda bulunmaktadır.Birçok  orta ve ileri düzey projelerde yeralmıştır.Sinan BARAN şu anda BilgeAdam Bilgi Teknolojileri Akademisinde Yazilim Eğitmeni olarak çalişmaktadır.
Bu makaleye ilk yorum yapan siz olun.

Yorumunuz