Merhaba
arkadaşlar. Makalemizde OOP mimarisini kullanarak Adventureworks veri
tabanımızda bulunan person.contact tablomuzdan bazı verilerimizi çekeceğiz ama ilk önce biraz OOP mimarisinden
bahsedelim.
OOP
mimarisinde 3 adet ana katmanımız vardır.
Data
Access layer: Bu katman sadece database işlemleri ile uğraşan katmanımızdır. Bu
katmana gelen data, temiz data olarak kabul edilir ve gelen data üzerinde
ilgili olan tablomuzda insert, delete, update işlemlerimizi
gercekleştiririz ya da databaseimizdeki
bir tablomuzdan veri çekeriz ve bu veriyi işlemeden direkt bir üst katmana göndeririz.
Uygulamamız içerisinde bu katmanımızın adı Dal.cs olarak geçecektir .
Business
Layer: Adından da anlaşılacağı gibi bu
katmanımız iş katmanıdır. Bu katmanımız, sunum katmanından (birazdan
inceleyecegiz ) gelen verilerin düzenlendiği katmandır. Bu katman
içerisinde veriler üzerinde düzenleme işlemleri yapılır. Ara katmandır. Uygulamamız
içerisinde bu katmandan datayonetim.cs diye bahsedeceğiz.
Presentation
Layer: Sunum katmanımızdır. Uygulamayı kullanacak olan kullanıcının gördüğü
katmandır. Bu bir Windows form da olabilir, bir Web uygulamasındaki herhangi
bir aspx dosya da olabilir. Bu katmanda yapılan işlem, datayonetim adını verdiğimiz
katmandaki metotlarımızı çağırmak ve kullanmak olacaktır.
Şimdi,
yazacağımız uygulama hakkında biraz bilgi sahibi olalım. Amacımız
adventureworks veri tabanı içerisindeki person.contact ve humanresources.employee
veri tabanına bir inner join işlemi gerceklestirip personellerin adını, soyadını,
cinsiyetini ve evlilik durumlarını getirmek olsun .
İlk
önce SQL sorgumuzu inceleyelim.
Select
pc.firstname,pc.lastname,(case he.gender when 'M' then 'Bay' when 'F' then
'Bayan' end ) as [Cinsiyet],he.maritalstatus from person.contact pc inner join humanresources.employee
he on pc.contactid = he.contactid
Yukarıdaki
sorgumuzda inner join işlemi ile iki tablomuzu contact id’leri ile birbirine bağladık. Burada
bir adet case işlemi de yaptık. Gender yani cinsiyet kısmında M ise bay, F ise
bayan yazmasını istedik.
C
Sharp tarafında da kapsülleme ile evlilik durumu M olanlara “Evli”, S olanlara “Bekar”
diyelim. ( Kapsülleme ile bunu yapabiliriz )
İlk
önce tipimizi yazalım.
personel.cs
-------------
using
System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace
OOP
{
class Personel
{
public string PersonelAdi{
get; set; }
public string PersonelSoyadi { get;
set; }
public string PersonelCinsiyet {
get; set; }
string _personelmedenihali;
public string PersonelMedeniHali
{
get { return
_personelmedenihali; }
set
{
if (value == "M")
_personelmedenihali = "Evli";
else
_personelmedenihali = "Bekar";
}
}
public override string ToString()
{
return
string.Format("Personel Adı {0} Soyad {1} Cinsiyet {2} Medeni Hali
{3}", PersonelAdi,
PersonelSoyadi, PersonelCinsiyet, PersonelMedeniHali);
}
}
}
Yukarıda
personel.cs adında personel tipimizi oluşturduk. Tüm fieldlarımızı hızlı
property tanımlama ile yaptık. Yalnız PersonelMedeniHali adını verdiğimiz
propertymizi 2.0 mantığı ile tanımladık. Bunun nedeni, burada kapsülleme yapma isteğimizin
olması. Hızlı property tanımı ile bu işlemi yapamayız. Uygulama içerisinde, bu
sekilde bir kapsüllemeye ihtiyacımız olduğunda 2.0 tekniği ile kapsülleme
işlemini yaparız. Hızlı property tanımıyla ise sadece get veya set bloklarımızı
private yapar saklarız.
Şimdi
katmanlarımıza geçelim.
İlk
katmanımız veri tabanı ile uğraşan katmanımız.
Dal.cs
--------
using
System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
namespace
OOP
{
class Dal
{
SqlConnection Con;
SqlCommand Cmd;
public Dal()
{
Con = new
SqlConnection("data source = .; initial catalog = AdventureWorks;
integrated security = true");
}
// Bağlantı durumumuzu kontrol eden ve duruma göre bağlantımızı açıp kapatacak olan
metodumuzu yazalım.
public void BaglantiKontrol()
{
if
(Con.State == System.Data.ConnectionState.Closed) // eger sql ile aramdaki
baglantı kapalı ise
{
Con.Open(); // ilgili baglantıyı ac
}
else //
degil ise
{
Con.Close(); // kapat
}
}
public SqlDataReader PersonellerimiAl()
{
Cmd = new SqlCommand(@"Select
pc.firstname,pc.lastname,
(case he.gender when 'M' then 'Bay' when 'F' then 'Bayan' end ) as
[Cinsiyet],he.maritalstatus from person.contact pc inner join
humanresources.employee he on pc.contactid = he.contactid", Con);
BaglantiKontrol();
// Bağlantımızı kontrol ettirdik ve bağlantı durumumuza göre işlemlerimizi
yaptırdık.
return
Cmd.ExecuteReader(); // Executereader metodu, sqldatareader tipinden
donmektedir. Metodumuz zaten sqldatareader tipinden veri geri dondurucegi icin
direkt olarak burada return dedik.
}
}
}
Yukarıdaki
Dal.cs sınıfımızda ilgili veri tabanı işlemlerimizi gerçekleştirdik. İİk önce
yapıcı metodunda SqlConnection tipimizin bağlantı yolunu üzerine almasını sağladık.
Sonra Baglantikontrol adında bir metot yazdık ve SQL ile aramızdaki duruma göre
bazı işlemler yapmasını istedik. (Bu işlemler SQL ile aramızdaki bağlantı
kapalı ise aç, açık ise kapat seklindedir.) Daha sonra PersonellerimiAl adını verdiğimiz
metot sayesinde SqlCommand yani SQL Server üzerinde çalışmasını istediğimiz SQL
cümlemizi yazdık ve ExecuteReader metodu ile bize gelen resultı SqlDataReader
tipinde metodumuzdan geri döndürdük.
Dal
sınıfımız gelen result (sonuc) üzerinde
herhangi bir işlem yapmadı. İlgili list tipine verilerimizi alma
görevi tabii ki datayonetim katmanımın işi.
datayonetim.cs
------------------
using
System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
namespace
OOP
{
class Datayonetim
{
SqlDataReader Okuyucu;
Dal databaseislemlerim;
public Datayonetim()
{
databaseislemlerim = new Dal();
}
public List PersonellerimAl()
{
Okuyucu =
databaseislemlerim.PersonellerimiAl();
List Personellerim = new List();
while
(Okuyucu.Read())
{
Personellerim.Add(new Personel()
{
PersonelAdi = Okuyucu.GetString(0),
PersonelSoyadi = Okuyucu.GetString(1),
PersonelCinsiyet = Okuyucu.GetString(2),
PersonelMedeniHali = Okuyucu.GetString(3).ToUpper(),
});
}
Okuyucu.Close();
databaseislemlerim.BaglantiKontrol();
return
Personellerim;
}
}
}
Datayonetim
katmanımızda dal katmanımızdan gelen SqlDataReader nesnemiz içindeki resultı
bir koleksiyona alma işlemini yaptık yani verimizi yönettik. datayonetim ara katmandı;
sunum katmanından gelen verilerin kontrollerinin yapıldığı ya da dal sınıfından
gelen verilerin ayarlandığı katmandı. O nedenle, bu katmanda biz SqlDataReader
olarak gelen verimizi bir koleksiyon içerisine bastık ve geriye bir adet
list koleksiyon döndürdük.
Şimdi
sunum katmanımıza geçelim ve bize gelen bu koleksiyonun listesini alalım.
Program.cs
---------------
using
System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace
OOP
{
class Program
{
static void Main(string[] args)
{
Datayonetim
Yonetim = new Datayonetim();
List Personellerim = Yonetim.PersonellerimAl();
foreach (var
item in Personellerim)
{
Console.WriteLine(item);
}
}
}
}
Sunum
katmanımız olan program.cs bölümünde yaptığımız tek işlem datayonetim
katmanımızdan PersonellerimiAl metodunu cağırmak. Zaten metodumuz bize list
koleksiyonu dönmekte idi. İlgili koleksiyonu bu katmanda aldık ve foreach ile
yazdırdık.
Uygulamamızı
çalıştıralım.
Evet
arkadaslar, uygulamamızın sonuna geldik. Makalemiz içerisinde kodlarımızı
yazarken bir iş dağılımı yaptık ve her class’ın bir görevi vardı. Kısaca
hatırlayalım.
Dal:
Sadece veri tabanı islemlerine bakan departman.
Datayonetim: Daldan gelen veya sunum katmanından gelen veriler üzerinde istediğimiz
düzenlemeyi, kontrolü yaptığımız departman.
Sunum Katmanı program.cs : Kullanıcının gördüğü veri girişi yaptığı katman.
Personel.cs: Uygulama içerisinde kullandığımız n tane tipten sadece bir tanesi.
.Net
ile kalın.