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)