Geleneksel programlama dillerine göre bir çok yönden farklılık gösteren Javascript dilinde nesne oluşturma fonksiyonlar yardımıyla yapılır. Javascript dilinde, function tipleri normal programlama dillerindeki class benzeri işlev görür. Bir function tipinden yeni bir nesne oluşturmak için newanahtar sözcüğü kullanılır. function tipine dışarıdan gönderilen argümanlar arguments isimli bir iç değişkende tutulur. Aşağıdaki örnek, bir fonksiyona gönderilen argümanları listeleme işlemini göstermektedir.
function f(){
return arguments;
}
console.log(new f()); // Ekrana [] yazar.
console.log(new f(1,2)); // Ekrana [1,2] yazar.
console.log(f(1,2)); // Ekrana [1,2] yazar.
Ekrana yazım şekilleri her ne kadar Array tipinde görünse bu diziler Array nesnesinin özelliklerini taşımazlar. Yani:
function f(){
return arguments;
}
console.log(f(1,2) instanceof Array); // Ekrana false yazar.
Çünkü oluşturulan nesneler Array tipinin push, pop, slice benzeri prototype özelliklerini taşımazlar. Bir fonksiyonun arguments üyesini Array tipine dönüştürmek için Array.prototype.slice.apply(arguments) şeklinde kullanmak gerekmektedir. Bu şekilde kullandığımızda, nesne içerisindeki argümanlar Array tipine dönüştürülmüş olur. Yani bu yöntem ile Array olmayan fakat ona benzeyen nesneleri Array tipine dönüştürür.
function f(){
return arguments;
}
console.log(Array.prototype.slice.apply(f(1,2)) instanceof Array)
// Ekrana true yazar.
Bu özellikler Javascript dilinde ileri seviye işlemlerde önem arz etmektedir. Örneğin kütüphaneler oluştururken bizim sınıflarımızı kullanan kullanıcıların gönderdiği parametreleri bu şeklide alıp değerlendirmek durumunda kalabiliriz. Açık kaynak javascript kütüphanelerini inceleyerek dilin daha fazla özelliğini kavramak mümkündür.
Javascript programlama dili, geleneksel programlama dillerindeki gibi gelişmiş özelliklere sahip olmasa da nesneye yönelik programlama açısından son derece esnek bir yapıya sahiptir. Bu yazıda nesneye yönelik programlamada önemli bir yer tutan class yapısını incelemeye çalışacağız.
Javascript dilinde class benzeri tanımlamalar fonksiyonlar yardımıyla yapılmaktadır. Class benzeri diyorum çünkü geleneksel programlama dillerindeki gibi class tanımlamak için özel bir yöntem yoktur. Her fonksiyon bir class olarak değerlendirilebilir ve her fonksiyonun newanahtar sözcüğü ile bir nesnesi oluşturulabilir.
1-Fonksiyon Tanımlamak
Normal bir Javascript fonksiyonu tanımlayarak aşağıdaki gibi bir class oluşturabiliriz.
Yukarıda tanımlanan bir constructor fonksiyondur. Aynı zamanda class olarak değerlendirilir. Bu class tipinde bir nesne aşağıdaki gibi oluşturulabilir.
var map = new Map("myMap");
map.version = 1.1.1;
map.zoomin();
2-Anti Pattern
Yukarıda tanımlama da zoomIn metodu Map calss dışında ayrı bir şekilde tanımlandığından bir anti pattern oluşmaktadır. Kodun çalışması açısından hiç bir sorun yoktur. Ancak dışarıda tanımlanan her metod, global namespace içerisinde yer alacağından başka bir amaçla aynı isimde (zoomIn) bir metod tanımlandığında bu durum bir isim karışıklığına sebep olacaktır. Bu tür kirliliklerin önüne geçmek adına ihtiyaç duyulan metodlar constructor fonksiyonların içerisine tanımlanmalıdır.
Bu şekilde bir tanımlama kodda her hangi bir değişikliğe sebep olmayacaktır.
3-Metodların Prototype Şeklinde Tanımlanaması
2. maddede olduğu gibi metodları constructor fonksiyon içerisine tanımlayarak anti pattern oluşumundan kurtulmak mümkündür. Ancak bu durumun karşımıza çıkardığı bir dezavantaj vardır. Her nesne oluşturulduğunda zoomin() metodu yeniden oluşturulacaktır. Bu dezavantajı ortadan kaldırmak için zoomin() metodu prototype olarak tanımlanmalıdır.
Şu ana kadar olan bölümlerde constructor fonksiyonlar yardımıyla sınıf simülasyonları olşuturduk ve newanahtar sözcüğü ile bu constructor fonksiyonlardan nesneler oluşturduk. Bu bölümde doğrudan nesneler tanımlamayı inceleyeceğiz.
Javascript dilinde doğrudan nesne tanımlamak object literal olarak geçer. Doğrudan oluşturulan nesnelerden newanahtar sözcüğü ile tekrardan nesneler oluşturulamaz. Doğrudan bir nesne oluşturmak:
var obj = {};
veya
var obj = new Object();
şeklinde yapılabilmektedir.
Dizler için doğrudan nesne oluşturmak:
var arr = [];
veya
var arr = new Array();
şeklinde yapılır.
Herhangi bir sınıf tanımlamadan Map nesnesini doğrudan oluşturmak mümkündür.
Burada tanımlanan constructor fonksiyonunun önünde newanahtar sözcüğü kullanıldığında doğrudan bir nesne oluşturulmuştur.
Böylece Javascript dilinde class ve doğrudan nesne kavramını ve bu türlerin nasıl tanımlandığını ve kullanıldığını incelemiş olduk. Bir sonraki makalede görüşmek üzere.
Bu yazıda Windows işletim sistemini kullanırken sıklıkla başvurduğum ipuçlarını sizlerle paylaşmak istedim. Microsoft işletim sistemlerinde bütünlüğü sağlamak adına klavye kısayolları ve işletim sistemi ayarları standarttır. Bu standartlar bize hız kazandırmak için geliştirilmektedir. Şimdilik aklıma gelen ipuçlarını paylaşıyorum, yenileri olduğunda yazıyı güncellemeye çalışacağım.
1- Pencere Ön İzleme Kısayol Tuşu Alt+P
Bir pencere açıkken Alt+P tuşları ile pencere içindeki dosyaların ön izlemesi yapılabilir.
Pencere ön izleme
2- Pencereyi Konumlandırma Window+Yön Tuşları
Window + Left Aktif pencereyi ekranın sol yarım köşesine konumlandırır.
Window + Right Aktif pencereyi ekranın sağ yarım köşesine konumlandırır.
Window + Top Aktif pencereyi tam ekran yapar.
Window + Down Aktif pencereyi minimize eder.
Window yön tuşları
3- Ekran Büyüteç Aracı Window+Artı Tuşu
Window ile birlikte artı tuşuna bastığımızda ekrana bir büyüteç penceresi gelir. Bu pencere açıkken Window+ veya Window- ile ekran boyutunu ayarlamak mümkündür.
Büyüteç kısayolu
4- Pencerelerin Ekran Ön İzlemesi Window+T Tuşu
Açık pencerelerin windows ortamında küçük helde ön izlemelerini görüntülemek için Window+T tuşunu kullanabilirsiniz.
Ön bakış
5- Adım Kaydedicisi psr.exe
Windows Başlat menüsündeki arama satırına psr.exe yazıp enter’a basarak hata kaydediciyi çalıştırabilirsiniz. Kaydı başlatın, bilgisayarınızı kullanın ve hata olduktan sonra kaydı bitirip, HTML slayt gösterisini istediğiniz kişiyle paylaşın.
Adım Kaydedicisi
6- Boş sürücüleri gizleme ayarı
Klasör seçeneklerinden Boş sürücüleri sakla seçeneğinin işaretini kaldırarak, Bilgisayarım penceresinde görünen boş sürücüleri görünmez yapabilirsiniz.
Boş sürücüler
7- Bilgisayarım Penceresi Kısayolu Window+E Tuşu
8- Windows’u KilitlemeWindow+L Tuşu
9- Açık Pencereler Arasında Gezinme Alt+Tab Tuşu
10- İnternet Tarayıcısında(IE, Chrome, Firefox), Tab Pencereleri Arasında Geçiş için Ctrl+Tab Tuşu
11- Tüm pencereleri küçültüp masa üstüne geçmek için window+D tuşu
MSMQ teknolojisi ile alakalı bir önceki yazıda MSMQ tanıtımını yapmış ve Windows işletim sistemlerine nasıl dahil edildiğini incelemiştik.
Bu yazıda ise mesajların MSMQ kuyruğuna nasıl yazıldığını ve kuyruktaki mesajların nasıl okunduğunu incelemeye çalışacağız.
Öncelikle mesaj nedir bundan bahsedelim. MSMQ teknolojisindeki mesaj kavramı aslında bir programlama dili ile oluşturulan nesnelerin serileştirilmiş halleridir. Bir nesne binary veya xml gibi formatlarda serileştirilebilir. Serileştirilmiş nesneler MSMQ gibi mesaj tabanlı iletişim ortamlarında mesaj olarak değerlendirilir.
MSMQ sisteminde mejsalar kuyruk denilen bir dizgede tutulur. Kuyruklar günlük hayattaki posta kutularına benzer. Postacı gelip zarfı posta kutusuna bırakır. Daha sonra ev sahibi gelip kutudaki zarfı açarak mesajı okuyarak ne yapacağını anlar ve gereğini yapar.
C# programlama dili ile MSMQ kuyruğundaki mesajları yönetmek mümkündür. Windows işletim sisteminde MSMQ kuyruğunu bilgisayar yönetimine girerek Private Queue seçeneğinden görüntüleyebiliriz.
MSMQ
.Net Framework içerisinde System.Messaging namespace altında mesaj trafiğini yönetebilecek tipler bulunmaktadır.
MessageQueuetipine ait üyeler yardımıyla sistemde bir kuyruk mevcut mu diye kontrol edilebilir, mevcut değilse yeni kuyruk oluşturulabilir. Mevcut kuyruğa bir mesaj eklenip, kuyruktan bir mesaj alınabilir. Aşağıdaki örnek kod ile kuyruğa mesaj yazma işlemi gerçekleştirilmektedir.
MessageQueue messageQueue = null;
if (MessageQueue.Exists(@".\Private$\EmailQueue"))
{
messageQueue = new MessageQueue(@".\Private$\EmailQueue");
}
else
{
// Kuyruk oluştur.
MessageQueue.Create(@".\Private$\EmailQueue");
messageQueue = new MessageQueue(@".\Private$\EmailQueue");
}
messageQueue.Send("Bu ilk bir MSMQ mesajıdır", "Title");
Kuyruktaki mesajları okumak senkron veya asenkron şekilde yapılabilmektedir. MessageQueuetipine ait aşağıdaki metodlar:
BeginPeek()
BeginReceive()
asenkron şekilde mesajları okumaya olanak sağlar. bu mesajların override edilmiş şekilleri burada mevcuttur.
BeginPeek() metodu çağrılmadan önce PeekComplated event handler oluşturmak gerekir ki okunan mesajın içeriğine erişebilelim. Aynı şekilde BeginReceive() metodu çağrılmadan önce ReceiveComplated event handler oluşturmak gerekir. BeginPeek() ile alınan mesajlar kuyruktan silinmezken BeginReceive() ile okunan mesajlar kuyruktan silinir. Bu fark, süreçleri yönetmek açısından önemlidir. Aşağıdaki örnek kod, tek bir mesajın kuyruktan asenkron olarak alınmasını sağlar. BeginReceive() kullanıldığı için alınan mesaj kuyruktan silinecektir.
MessageQueue messageQueue = null;
if (MessageQueue.Exists(@".\Private$\EmailQueue"))
{
messageQueue = new MessageQueue(@".\Private$\EmailQueue");
messageQueue.ReceiveCompleted += new
ReceiveCompletedEventHandler(EmailReceived);
messageQueue.BeginReceive();
}
private static void EmailReceived (Object source,
ReceiveCompletedEventArgs asyncResult)
{
MessageQueue mq = (MessageQueue)source;
Message m = mq.EndReceive(asyncResult.AsyncResult);
Console.WriteLine("Message: " + (string)m.Body);
}
MessageQueuetipinde senkron bir şekilde mesaj almak için aşağıdaki metodları kullanılabilir:
Peek()
Receive()
GetAllMessages()
Yani Peek() veya Receive() metodu çağrıldığında kuyruktan bir mesaj gelene kadar başka işleme geçilmez. Oysa asenkron metodlarda BeginPeek() veya BeginReceive() komutlarından sonra başka işlem varsa onlar yürütülebilmekteydi.
GetAllMessages() metodu kuyruktaki tüm mesajları getirmek için kullanılır.
MessageQueue queue = new MessageQueue(@".\Private$\EmailQueue");
Message[] msgs = queue.GetAllMessages();
foreach(Message msg in msgs)
{
Console.WriteLine(msg.Body);
}
Mesaj kuyruğuna bir text yerine bir nesneyi göndermek mümkündür. Bu işlem için öncelikle serileştirilecek olan tipin belirlenmesi gerekmektedir. Serileştirilecek olan tip aşağıdaki şekliyle Email adında belirlenmiş ve [Serialize] attribute ile imzalanmıştır.
[Serialize]
public class Email{
public string From {get; set;}
public string To {get; set;}
public string Body {get; set;}
}
Bu nesnenin bir örneğini kuyruğa eklemek için aşağıdaki gibi bir yöntem izlenir.
Email mail = new Email{
From = "sender@mail.com",
To = "receiver@mail.com";
Body = "Merhaba bu bir test mesajıdır.";
};
MessageQueue messageQueue = null;
if (MessageQueue.Exists(@".\Private$\EmailQueue"))
{
messageQueue = new MessageQueue(@".\Private$\EmailQueue");
}
else
{
// Kuyruk oluştur.
MessageQueue.Create(@".\Private$\EmailQueue");
messageQueue = new MessageQueue(@".\Private$\EmailQueue");
}
Message message = new Message();
message.Formatter = new BinaryMessageFormatter();
messageQueue.Send(message);
Temel olarak MSMQ mesaj yönetimi bu şekilde yapılmaktadır. Buradaki örnekler yazma ve okuma işlemlerini gösteren tek bir uygulama gibi anlaşılabilir. Ancak dağıtık mimarilerde kuyruğuna yazım işlemini bir uygulama yaparken, kuyruğu sürekli kontrol etme işlemini işletim sistemine bağlı bir servis sağlıyor olabilir. Ya da zamanlanmış görev mantığı ile çalışan bir client uygulama da kuyruktaki mesajları okuyarak gerekli görevleri yerine getirebilir. Senaryoları tasarlamak tamamen ihtiyaca ve beceriye kalmıştır.
Microsoft Message Queuing ya da kısa adıyla MSMQ teknolojisi, aralarında sürekli bir bağlantı gerektirmeyen dağıtık sistemlerde uygulamaların emniyetli bir şekilde iletişim kurmalarını sağlayan bir protokoldür.
Dağıtık sistemlerde çalışan bir uygulama MSMQ üzerinde kuyruğa bir mesaj gönderir ve sıradaki işlemlerden kendi iç sürecini işletmeye devam eder. Sistemde bu mesaja ihtiyacı olan diğer bir uygulama bu kuyruğa giderek ilgili mesaj varsa alır ve kendi sürecini başlatır. Aşağıdaki resimde bu durum bir grafik üzerinde ifade edilmiştir.
MSMQ
Bu sayede birbirinden bağımsız çalışan iki ayrı sistem, birbirlerini beklemeden görevlerini yerine getirebilmektedir.
Örneğin bir web sitesi üzerinde yapılan işlemler sonrasında kullanıcı bilgilendirme amaçlı E-Posta gönderiliyor olsun. E-Posta gönderme işlemi ayrı bir mail sunucu üzerinden yapılacaktır. Kullanıcı, bir üyelik formunu doldurup gönderdikten sonra sürecin tamamlanmasını beklemeye başlar. Bu aşamada form bilgileri veri bankasına yazılır ve kullanıcıya bir bilgilendirme mesajı gönderilir. Ancak E-Posta sunucusu geç yanıt verirse veya arızalı durumda ise kullanıcının kayıt süreci yarım kalacaktır ve eksik bir işlem yapılmış olacaktır. Bunun sebebi web uygulamasının, ayrık bir sistem olan E-Posta sunucusuna bağımlı olmasıdır. Bu gibi durumları garanti altına alabilmek için kullanıcıya gönderilecek olan E-Posta bilgileri kayıt sürecinde MSMQ sistemi üzerinde kuyruğa eklenir. Bir başka uygulama bu kuyruğu kontrol ederek E-Posta gönderme işlemlerini gerçekleştirir. Yani iki ayrık sistem birbirinden izole hale getirilerek çalışma süreçleri birbirini etkilememiş olur.
MSMQ teknolojisinin kullanım amacı, dağıtık sistemlerde asenkron ve birbirinden bağımsız süreçler oluşturarak performans artışı sağlamaktır. Dağıtık sistemde çalışan bileşenlerden bir veya birkaçının devre dışı kalması durumunda sistemin iç süreçlerinin devam edebilmesi garanti altına alınabilmektedir. Ağa sürekli bağlı olmadan yürütülen işlemlerde sonuçlar sisteme mesaj şeklinde aktarılabilir ki buna sahada satış yapmak için kullanılan uygulamalar örnek verilebilir.
Kullanım alanları:
Kritik öneme sahip uygulamalar. Örneğin E-Ticaret, Bankacılık gibi.
İş akışlarının oluşturulduğu uygulamalar.
Gömülü sistemler.
Sahada satış, sipariş uygulamaları.
MSMQ teknolojisi işletim sistemi üzerinde Windows özelliği olarak gelmektedir. İsteğe bağlı açılabilen bir özelliktir. Kişisel bilgisayar ve sunucu işletim sistemlerine göre birçok versiyona sahiptir. Aşağıdaki listede işletim sistemi türlerine göre MSMQ versiyonlarının gelişimi sunulmuştur.
MSMQ Versiyonları:
MSMQ 1.0, Microsoft Windows NT, Windows 95, 98 sürümleri üzerinde çalışan versiyondu.
MSMQ 2.0, Microsoft Windows 2000 üzerinde çalışan versiyon.
MSMQ 3.0, Microsoft Windows XP Professional ve Server 2003 ailesi üzerinde çalışan versiyondur.
MSMQ 4.0 Windows Vista ve Windows Server 2008 üzerinde çalışır.
MSMQ 5.0 Windows 7 ve Windows Server 2008 R2 üzerinde çalışır.
MSMQ 6.0 Windows 8 ve Windows Server 2012 üzerinde çalışır.
MSMQ 6.3 Windows Server 2012 R2 üzerinde çalışır.
Windows 7 veya Windows 8 gibi kişisel işletim sistemlerinde MSMQ özelliğinin açılması Denetim Masası -> Programlar ve Özellikleri -> Windows Özelliklerini Aç veya Kapat linkinden açılan pencereden yapılmaktadır.
Windows 8 MSMQ
Windows 2008 veya 2012 gibi sunucu işletim sistemlerinde ise Server Manager -> Features -> Add Feature linkinden açılan pencereden seçerek yapabiliriz.
Windows 2008
MSMQ özelliği işletim sistemine eklendikten sonra Bilgisayar Yönetimi menüsünden görüntülenebilmektedir.
Mekansal veri depolayabilen veri tabanlarında SRID değerlerini listelemeyi ve herhangi bir tabloya ait geometri alanının SRID değerini güncellemeyi bir önceki yazımızda incelemiştik.
Oracle, PostGIS ve MsSQL gibi sık kullanılan veritabanlarında varsayılan olarak gelen bir çok SRID değeri mevcuttur. Bu SRID değerleri dünyada çok bilinen referans sistemlerine aittir. Ancak bazı ülkeler bu referans sistemleri yerine kendi özel referans sistemlerini kullanmayı tercih etmektedirler. Dolayısıyla bu özel referans sistemleri Çok bilinen SRID listesine dahil olmayabilir. Bu gibi durumlarda özel mekansal referansları veritabanlarına kendimiz eklemek durumunda kalırız.
Spatial Reference sitesi üzerinde aradığımız referansları bulabilmek mümkündür. Bu yazıda ki örnekte ülkemizde kullanılan IRTF96 koordinat sisteminin PostGIS veritabanına nasıl tanımlandığını inceliyor olacağız. Buradan ITRF96 projeksiyona ait bilgilere ulaşabilmek mümkündür.
PostGIS veritabanına ITRF96 koordinat sistemini tanıtabilmek için aşağıdaki SQL komutunu kullanmak yeterli olacaktır.
Coğrafi bilgi sistemleri uygulamalarında veritabanı içerisinde tutulan veriler, metinsel boyutunun yanında coğrafi boyutu yönünden de ele alınmaktadır. Coğrafi veya konumsal veya mekansal olarak adlandırılan verileri depolamak bu verilerin bazı özelliklerini bilmeyi ve kullanabilmeyi gerektirmektedir.
Bu yazıda coğrafi verilerin SRID özelliğini konu edinmiş olacağız. SRID açılımı “Spatial Reference System Identifier” ve Türkçe meali “Mekansal Referans Sistem Tanımlayıcısı” olan bir kavramdır. SRID coğrafi veri tutan tablolardaki geometri alanlarına ait projeksiyon sistemlerini belirtmek için kullanılan sayısal bir kimlik numarasıdır.
Bu yazıdaki örnek uygulamalar piyasada şu anda kullanılan popüler veritabanlarından Oracle, Postgresql veya MsSQL tabloları üzerinde bulunan geometri sütunlarının SRID özelliklerini belirlemek şeklinde olacaktır.
Bir veritabanında bulunan SRID listesini görebilmek için farklı veritabanlarına göre aşağıdaki komutlar kullanılmaktadır.
Oracle
SELECT * FROM sdo_coord_ref_sys
PostGIS
SELECT * FROM spatial_ref_sys
MsSql
SELECT * FROM spatial_reference_systems
SRID Listesi
Bir veritabanı tablosundaki geometri alanının SRID değerini değiştirmek için aşağıdaki komutlar kullanılmaktadır. Aşağıdaki örnekte tablo adı “roads” ve geometri alanının adı “geom” şeklinde düzenlenmiştir.
Oracle
UPDATE roads T
SET T.geom.SDO_SRID = 4326
WHERE T.geom IS NOT NULL
PostGIS
SELECT UpdateGeometrySRID('roads','geom',4326);
MsSQL
UPDATE dbo.roads SET geom.STSrid = 4326;
Artık “roads” tablosunun “geom” alanı için SRID değeri 4326 olarak düzenlenmiş oldu. SRID değeri düzenlenmemiş olan tablolar için varsayılan değer boş veya sıfır olacaktır. Bu durumda verilerin kullanılması için her defasında dönüşüm yapmak zorunda kalabiliriz. Verilerimizi Google, Bing veya Yandex gibi haritalarda kullanmayı planladıysak bu haritaların SRID değerlerini bilmemiz ve geometri alanlarımızı bu değer ile güncellemeliyiz.
Bu yazıda System.Linq kütüphanesinden faydalanarak rastgele şifre üretmenin ne kadar pratik ve basit olduğunu inceleyeceğiz. Bu pratik çözüme burada rastladım ve herkese faydalı olacağını tahmin ederek paylaşmak istedim.
var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
var random = new Random();
var result = new string(
Enumerable.Repeat(chars, 8)
.Select(s => s[random.Next(s.Length)])
.ToArray());
Enumerable.Repeat fonksiyonunun syntax düzeni şu şekildedir:
public static IEnumerable<TResult> Repeat<TResult>(
TResult element,
int count
)
Çalışma şekli ise TResult türünde Count kadar tekrar eden bir yığın üretecek şekilde ayarlanmıştır. Örneğin 15 tane “Okul” sözcüğü üret şeklide çalışır.
Yukarıdaki şifre üretmek için oluşturulan örnekte bizim verdiğimiz bir diziden her defasında rastgele bir karakter çekildiği için tekrarlı veri yığını oluşmuyor. Sonuç olarak count değeri kadar karakter içeren bir şifre oluşturabiliyoruz.
Asp.Net Web Api uygulamalarında action metodlar tarafından JSON formatında sunulan nesneler, C# ile oluşturulan nesnelerin özellikleri şeklinde oluşturulurlar. Yani C# tarafında oluşturduğumuz bir Product tipi şu şekilde olsun.
public class Product
{
public string Name { get; set; }
public string Price { get; set; }
}
Bu tipe ait bir nesneyi veya nesne gurubunu Web Api ile dışarı sunmak için:
public class ProductController:ApiController
{
public IEnumerable<Product> Get()
{
return new List<Product>
{
new Product{CategoryName = "Notebook", ListPrice = "1250 TL"},
new Product{CategoryName = "Tablet", ListPrice = "850 TL"},
new Product{CategoryName = "Monitor", ListPrice = "350 TL"}
};
}
}
Şeklinde bir Controller oluşturabiliriz. Bu şekilde uygulamamızın vereceği cevabı inceleyecek olursak:
Sonuç-1
Kategori isimleri CategoryName şeklinde, fiyarlar da ListPrice şeklinde büyük harfle başlatılmış şekilde görünmektedir. Çünkü bu serileştirme işlemi C# ile oluşturduğumuz Product tipinin property üyelerine göre yapılmıştır. Diğer bir deyişle sınıfta belirlediğimiz property isimleri nasıl yazılmış ise JSON property isismleri de aynı şekilde olşuturulmuştur.
Ancak Javascript tarafında gelenek olarak nesne isimleri küçük harfle başlayan ve CamelCasing yapısına uygun olarak kullanılmaktadır. Bu işlemi Newtonsoft.Json.Serialization kütüphanesi bizim yerimize gerçekleştirebilmektedir. Bunun için WebApiConfig dosyasında bir düzenleme yapmak gerekmektedir.
public static void Register(HttpConfiguration config)
{
var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();}
Visual Studio geliştirme aracında yeni proje oluşturma seçenekleri arasında proje türüne göre oluşturulmuş hazır şablonlar bulunmaktadır. Sunulan seçenekler Class Library, Console Application, Asp.Net, WCF v.s gibi uzayıp gider. Seçtiğimiz proje türüne göre bir çalışma ortamı otomatik olarak hazırlanır.
New Project Seçenekleri
Ancak birbirine benzer projeler oluştururken solution içerisine sürekli aynı proje türlerini seçerek oluşturmak zorunda kalırız.
Örneğin bir web projesi için her defasında arayüz katmanı, veri katmanı, test katmanı gibi proje türleri seçilerek işleme başlanabilir. Bunun dışında da katmanlar vardır ama bu yazıda basit olarak üç katmanı ele almak anlaşılırlık açısında uygun olacaktır.
Bu gibi durumlarda kendi proje şablonumuzu olşuturabilirsek işimiz biraz daha kolaylaşmış olacaktır. Yapmamız gereken şey öncelikle bir solution oluşturarak gerekli proje türlerini bu solution içerisine dahil etmek olacaktır.
Solution
Bu proje şeklini bir şablon haline getirmek için File->Export Template seçeneğini seçerek ilerleyebiliriz.
Export Template
Bu işlemin ardından My Exported Templates içerisine DataLayer.zip şeklinde bir dosya oluşturulduğunu görebiliriz. Bu solution içerisindeki tek bir katmana ait şablondur.
MyTemplate.vstemplate içerisinde oluşturduğumuz şablona ilişkin bilgiler bulunmaktadır. İçeriği xml şeklindedir ve istediğimiz şekilde düzenleyebiliriz. Bu işlemi solution içerisindeki tüm projelere uygulayıp oluşan *.zip dosyalarını tek bir şablon içerisinde birleştirebiliriz.
Export Template işlemi ile tüm projelere ait şablonları oluşturup *.zip dosyalarını bir klasöre çıkartalım.
Template Şablonları
Klasörlerin yanına Root.vstemplate şeklinde bir dosya oluşturmamız gerekmektedir. Adının ne olduğu önemli değildir. Önemli olan *.vstemplate uzantısına sahip olmasıdır. İçerik bilgisi ise şu şeklide olmalıdır.
Roor.vstemplate
TemplateContent içierisindeki ProjectCollection bölümünde daha önce tek tek oluşturduğumuz proje şablonlarını listeliyoruz. Icon olarak belirlediğimiz template.png dosyasını da aynı klasör içine kaydetmemiz gerekmektedir. Son olarak bu klasörü zip şeklinde sıkıştırarak kaydetmemiz gerekmektedir.
Template.zip
Artık oluşturduğumuz My Web Template.zip dosyasını Visual Studio Project Templates içerisine taşıyarak çalışır hale getirebiliriz.
Şimdi Visual Studio ortamında yeni proje eklemeyi deneyelim. Proje adını da ETicaret olarak belirleyelim.