2 Eylül 2009
.Net Compact Framework 3.5 – System.IO.Compression
Bu makalemizde .Net Compact Framework 3.5 ile mobil cihaz uygulama geliştiricilerin kullanımına sunulan ve mobil cihaz uygulamalarında sıkıştırma işlemlerine olanak sağlayan System.IO.Compression namespace’ i içerisindeki sınıfları inceleyecek, örnek bir uygulama geliştiriceğiz.
Bilgisayarların tüm gelişim tarihi boyunca farklı ihtiyaçlar üzerinde birçok metodoloji geliştirilmiş ve tüm bu metodolojiler zamanla standart bilgisayar hayatımıza girmiş bulunmaktadır. İnsanoğlunun bu gelişim sürecinde üzerinde çalıştığı en önemli nokta ise temel olarak byte dizileri olarak adlandırılan veri kümelerini bilgisayar ortamında daha efektif ve daha iyi nasıl depolanacağıdır. Bu noktada araştırıldığında ise zaman içerisinde bu veri kümelerinin taşınılabilirlilik ve depolama noktasında hayatımızı kolaylaştırabilmesi açısından birçok çalışma gerçekleştirilmiş ve bugün birçoğumuzun günlük hayatında farkında olmadan yüzlerce kez kullandığımız yöntemlere dönüşmüştür.
Bu metodolojilerin en başında hepinizin tahmin edebileceği üzere sıkıştırma (zip / unzip) işlemleri gelmektedir. Sıkıştırma mantığına temel olarak bakıldığında böyle bir işlemin gerçekleştirilebilmesi için gereken yazılım kodlanabilmesi için çok yüksek bir matematik bilgisine ve bu matematik bilgisini yazılımsal olarak destekleyebilecek programlama bilgisine sahip olunması gerektiği kolay bir şekilde anlaşılabilmektedir. Sıkıştırma işlemleri tüm gelişim tarihi boyunca çok önemli bir yer kaplamış, farklı algoritmalar üzerinden bugünkü standart olarak kabul edilebilecek ve günlük hayatta yüzlerce kez kullandığımız / kullanıyor olduğumuz halini almıştır. Bugün araştırıldığında en meşhur ve en çok kullanılan sıkıştırma uygulamalarının arka tarafında tarihteki en meşhur sıkıştırma algoritmalarından Deflate Algoritması kullanılmaktadır. Deflate algoritması ile ilgili ayrıntılı bilgiye http://en.wikipedia.org/wiki/DEFLATE_(algorithm) adresinden ulaşabilir, bu algoritmanın arka tarafındaki matematiksel altyapıyı öğrenebilirsiniz.
Bu makalemizde ise bu algoritmaları kullanan sınıfların hazır olarak tanımlandığı System.IO.Compression namespace’ i içerisindeki sınıfları kullanarak mobil cihaz uygulamalarında sıkıştırma işlemlerinin nasıl gerçekleştirilebileceği ile ilgili konuyu ifade edecek ve örnek bir uygulama geliştirilecektir.
Hızlı bir şekilde .Net Compact Framework 3.5 ile mobil cihaz uygulamalarında hayatımıza giren sınıfları tanımaya geçelim.
Öncelikle belirtmemiz gerekirki bu sınıfları masaüstü .net Framework uygulama geliştiricileri .net Framework 2.0 sürümünden beri kullanmakta, kendi uygulamalarında Deflate algoritması üzerinden sıkıştırma işlemleri gerçekleştirebilmektedirler. Biz ise bugün .net Compact Framework 3.5 ile mobil cihaz uygulama geliştiricilerinde hayatına giren bu sınıflarla mobil cihaz üzerinde çalışan ve zip / unzip işlemleri gerçekleştirebileceğimiz bir uygulama geliştireceğiz.
Üstteki resimden de anlaşılabileceği üzere System.IO.Compression içerisinde aslında birbiriyle küçük bir fark dışında tamamen aynı iki adet sınıf bulunmaktadır.
DeflateStream adından da anlaşılabileceği üzere Deflate algoritmasını kullanarak sıkıştırma ve açma işlemi gerçekleştirmeye yarayan altyapıyı içerisinde barındırmaktadır. GzipStream ise yine Deflate algoritmasını kullanmaktadır, fakat içerisine Gzip dosya formatına uygun bazı başlık bilgileri eklemekte, dolayısıyla gzip uzantısına sahip dosyaları açabilecek tüm uygulamalarda açabilecek hale getirmektedir.
Hiç vakit kaybetmeden Visual Studio 2008 üzerinde bir mobil cihaz uygulaması açarak işe başlayalım. Bu noktada belirtmemiz gerekise geliştirilecek olan uygulamanın hedef platformu Windows Mobile 6.0 yüklü dokunmatik özelliğe sahip (Windows Mobile 6.0 Professional) cihazlar olduğundan dolayı ilgili SDK’ yı sisteminize kurmanız gerekmektedir. İlgili SDK ‘ yı http://www.microsoft.com/downloads/details.aspx?familyid=06111A3A-A651-4745-88EF-3D48091A390B&displaylang=en adresinden indirebilirsiniz. Visual Studio üzerinde bir mobil cihaz uygulaması oluşturarak hızlı bir şekilde örnek projemizi geliştirmeye başlayalım.
Projemizin adı MobiZip.
Hedef platformumuz ise Windows Mobile Professional 6 SDK üzerinde .Net Compact Framework 3.5 sürümü olacaktır.
Uygulama ekranını tasarlamaya geçmeden önce hızlı bir şekilde uygulamamızın senaryosunu ifade edelim.
Uygulamanın temel amacı mobil cihaz üzerinde konumlandırılmış bir dosyayı sıkıştırmak ya da belirli koşullar sağlandığı taktirde bu sıkıştırılan dosyayı açıp tekrardan eski haline getirmektir. Bu noktada bu koşulları ifade etmemiz gerekirse ;
Uygulamamızın kullanacak olduğu dosya uzantısı DosyaAdi.mobizip olacaktır. DeflateStream yapısı gereği dosyanın sıkıştırılmadan önceki adı ve boyut bilgisini tutmadığından ve dosyanın eski haline getirilmesi noktasında bu bilgilere ihtiyaç duyulacağından sıkıştırılmış dosyanın yanına uzantısı DosyaAdi.mobizip.info olan bir bilgi dosyası daha oluşturulacaktır. Bu dosya içerisinde arasında | işareti koyularak dosyanın orjinal adı ve sıkıştırılmadan önceki boyutu kaydedilecektir.
Hızlı bir şekilde uygulama ekranını tasarlayalım.
Uygulama ekranına baktığımızda çokta karmaşık bir arayüz olmadığını, ihtiyaçlar noktasında sıkıştırma yada açma işlemi gerçekleştirilecek olan dosyanın seçilebilmesi için gereken 3-4 adet kontrol yerleştirilmiştir. Ayrıca ekran üzerinde görünmeyen ve dosya seçme diyaloğunu temsil eden OpenFileDialog kontrolüde arayüz üzerine yerleştirilmitir. (OfdSelectFile)
Hızlı bir şekilde kod altyapısını oluşturmamız gerekirse ;
Senaryo gereği kullanıcı OpenFileDialog vasıtasıyla sıkıştırılacak yada açma işlemi gerçekleştirilecek dosyayı seçecektir.
... yazan button’ a tıkladığımızda aşağıdaki kod bloğu çalıştırılacaktır.
Yukarıdaki kod bloğundan anlaşılabileceği üzer dosya seçme ekranı üzerinden herhangi bir dosya seçildiğinde bu dosya bilgisi metin kutusu içerisine yazdırılmaktadır.
Bir sonraki aşamada sıkıştırma işlemlerinde kullanacak olduğumuz 3 adet stream obje referansını global’ e yerleştiriyoruz.
Bu noktada açıklamamız gerekirse ; DeflateStream adından da anlaşılabileceği üzere sıkıştırma ya da açma işlemlerini gerçekleştirecek olan Stream objesini temsil etmektedir. FsSource senaryoya göre o an işleme sokulan dosyanın stream’ i FsTarget ise o an senaryoya göre işlem görecek olan dosyanın stream’ ini temsil etmektedir.
Sıra geldi sıkıştırma / açma işlemlerini gerçekleştirecek olan Operate button’ una tıklandığında çalıştırılacak olan kod bloğunu hazırlamaya geldi.
Uygulamamız hangi işlemin yapılacağına (sıkıştırma / açma) seçilen dosyanın türüne bakarak karar verecektir. Eğer seçilen dosyanın uzantısı *.mobizip ise açma, değilse sıkıştırma işlemi gerçekleştirecektir. Aynı zamanda *.mobizip uzantısına sahip olsa bile dosyanın eski haline getirilebilmesi için gereken *.mobizip.info dosyasınıda sıkıştırılmış dosyanın yanında arayacak şayet bulabilirse hata vermeden işlemi tamamlayacaktır.
Operate tuşuna basıldığında ilk olarak dosyanın türünü inceliyoruz ;
Bu if koşulunun else ayağında ise sıkıştırma işlemi gerçekleştirilmektedir.
Hızlı bir şekilde uygulamamıza devam edelim. Eğer seçilen dosya mobizip uzantısına sahip ise açma işleminin yapılacağı ile ilgili kod bloğu çalıştırılmaktadır. Bu kod bloğunda ise ilk olarak ilgili dosyanın bilgilerinin bulunduğu info dosyası aranmaktadır.
Dosya eğer başarılı bir şekilde bulunabilmiş ise dosya içeriği | işaretine göre split edilmekte ve bir diziye aktarılmaktadır.
Bir sonraki aşamada açma işlemi için gereken kodlar yazılmaktadır.
Yazılan kodları sırasıyla incelediğimizde ilk olarak global’ de tanımlanan Stream objelerinin instance’ ları oluşturulmakta ; FsSource açılacak olan dosyayı temsil etmekte, FsTarget ise açıldıktan sonra oluşturulacak olan eski dosyayı temsil etmektedir.
DeflateStream objesinin instance’ ının oluşturulduğu satırda ise ilk parametresinde açılacak olan stream’ a referans, ikinci parametresinde ise gerçekleştirilecek olan işlem seçilmiştir.
Bir sonraki satırda info dosyasının yardımıyla dosyanın açıldıktan sonraki halinin byte dizisini depolayabilecek bir buffer oluşturulmuş, boyut olarakta yine info dosyasının yardımıyla eski dosyanın (sıkıştırılmadan önceki) boyutu atanmıştır.
ds.Read ile başlayan satırda sıkıştırılmış dosyanın tekrardan açılmış hali buffer ‘ a kopyalanmakta,bir sonraki satırda ise buffer içerisindeki açılmış hali FsTarget stream’ i üzerinden yeni oluşturulmuş ve açılmış olan dosyaya yazılmaktadır. İşte bu kadar ! Bu noktadaki en önemli uyarı ise stream’ leri kullandıktan sonra kesin olarak kapatmanızdır. Aksi taktirde dosyalara erişim kısıtlanacak ve hata alınacaktır.
Bir diğer çalıştırılacak olan kod bloğu ise sıkıştırma işlemi için gereken kod bloğudur. Uygulama uzantının *.mobizip olmadığı durumlarda sıkıştırma işlemi gerçekleştirmekte ; bununla birlikte bir info dosyası oluşturmaktadır.
Yukarıdaki kod bloğu incelendiğinde ise aslında bir önceki işlemle karşılaştırıldığında tam ters hareket uygulanmaktadır.
İlk iki satırda sıkıştırılmış ve sıkıştırılacak olan dosyalar ilgili stream’ lere yüklenmekte, bir sonraki aşamada ise dosya bilgilerinin tutulduğu FileInfo değişkeni oluşturulmaktadır.
Daha sonra sıkıştırılacak olan dosyanın verileri Buffer’ a yüklenmekte, ve DeflateStream üzerinden FsTarget isimli stream’ e bu veriler sıkıştırılarak gönderilmektedir.
Bu işlemden sonra *.mobizip.info uzantılı dosya da kaydedilmekte ve işlem tamamlanmaktadır. İsterseniz hiç vakit kaybetmeden uygulamamızı Emulator üzerinde deneyelim.
Uygulamamızı çalıştırdığımızda aşağıdaki görüntüyü elde etmemiz gerekmektedir.
Dosya seçme ekranını açarak daha önceden cihaza kopyaladığımız ve sıkıştırılmaya çok müsait olan bir BMP dosyasını seçiyoruz.
Ve son görünüm,
Operate tuşuna tıkladığımızda uygulama dosyanın uzantısına bakacak ve sıkıştırma işlemi gerçekleştirecektir.
Dosyanın bulunduğu yere gidip baktığımızda dosyanın yanında 2 adet daha dosya görmekteyiz. Bunlardan biri sıkıştırılmış olan dosya (*.mobizip) ve sıkıştırılan dosyanın eski boyut bilgisi ve isim bilgisini tutan *.mobizip.info dosyası.
Dikkat edilecek olursa dosya boyutu neredeyse 20 kat küçülmüştür.
Bir sonraki aşamada OrnekBMP isimli bmp dosyasını siliyoruz.
Ve bu dosyayı sıkıştırıldığı halinden tekrar oluşturuyoruz.
Öncelikle uygulamamızdan mobizip uzantılı sıkıştırılmış dosyayı seçiyoruz.
Operate tuşuna bastığımda ise açma işlemi başarıyla gerçekleştirilmektedir ;
Dosyanın bulunduğu yere tekrar gidip baktığımızda ;
Dosyanın tekrar oluşturulmuş olduğunu görmekteyiz.
İşte bu kadar !
Bu makalede .net Compact Framework 3.5 ile birlikte gelen System.IO.Compression sınıflarını kullanarak bir sıkıştırma / açma işleminin nasıl gerçekleştirilebileceği ile ilgili örnek bir uygulama geliştirdik.
Başka bir makalede daha görüşmek dileğiyle.
1 Eylül 2009
.Net Compact Framework 3.5 – WCF Servislerinin Kullanımı
Bilindiği üzere .net Compact Framework 3.5 sürümünün en heyecan verici yeniliklerinden birtanesi halihazırda kullanılıyor olan WCF servislerine “belirli kısıtlamalarla” erişilmesine verdiği destektir. Windows Communication Foundation, kısa adıyla WCF, .Net Framework 3.0 ile birlikte hayatımıza giren yeni nesil dağıtık uygulama geliştirme iletişim arabirimidir. Birçok dağıtık uygulama geliştirme teknolojisini bünyesinde barındıran WCF, dekleratif konfigürasyon özelliğiyle servis geliştiricilerin hayatını ciddi anlamda kolaylaştırmaktadır. Bu yazımızda hali hazırda kullanıyor olduğumuz basit bir WCF servisine .Net Compact Framework 3.5 kullanılarak geliştirilmiş bir mobil cihaz uygulamasında nasıl ulaşabileceğimizi ve servis çağrılarının nasıl gerçekleştirilebileceğini örneklendireceğiz.
Örneğimize başlamadan önce .Net Compact Framework 3.5 üzerinde desteklenen WCF içeriği hakkında kısaca bilgilenelim. Bilindiği üzere .Net Compact Framework 3.5 üzerinde sınırlı bir WCF desteği verilmektedir. Bu noktada belkide hissedebileceğimiz en büyük eksiklik hali hazırda kullanabiliyor olduğumuz Binding’ lerden sadece basicHttpBinding’ in destekleniyor olmasıdır. Bunun dışında Custom Binding, WindowsMobileMailBinding ve ExchangeWebServiceMailBinding desteklenmektedir. .Net Compact Framework 3.5 üzerinde desteklenen WCF’ in tüm özelliklerine http://blogs.msdn.com/andrewarnottms/archive/2007/08/21/the-wcf-subset-supported-by-netcf.aspx adresinden erişebilirsiniz. Bunun dışında masaüstü uygulamalardan WCF servislerine bağlanmak istediğimizde Visual Studio 2008 üzerinde görsel olarak kullanabildiğimiz NetSvcUtil.exe aracı .Net Compact Framework 3.5’ ta direk desteklenmemekte, http://download.microsoft.com/download/6/2/0/6205ED05-E435-44FC-AA82-B763CA5F8B1A/NetCFSvcUtil.exe adresinden indirebileceğiniz NetCFSvcUtil.exe vasıtasıyla Proxy sınıfları oluşturulabilmektedir.
Hiç vakit kaybetmeden örneğimize geçelim. Örneğimiz 2 projeden oluşmaktadır ; mobil cihaz üzerinden çağrıda bulunacak olduğumuz WCF servisi ve çağrıda bulunacak olan mobil cihaz uygulamamız. İlk olarak WCF servisimizi geliştirelim.
WCF servisimiz için bir Console Application projesi açıyoruz ve System.ServiceModel referansını ekliyoruz.
Projemize ServiceLibrary adında bir klasör ekliyoruz ve klasör içerisine Service Contract’ ımızı tanımlayabilmemiz için bir Interface (Arayüz) ekliyoruz. IMobileService ismini verdiğimiz arayüzümüz içerisine aşağıdaki tanımlamaları yapıyoruz.
Bir sonraki aşamada Service Contract arayüzümüzü implemente ettiğimiz Service sınıfımızı oluşturuyoruz.
Ve sıra geldi konfigürasyona. Projemize App.config dosyasını ekliyoruz ve aşağıdaki servis konfigurasyonunu tanımlıyoruz.
Servis tanımlamasını yaptıktan sonra mobil cihaz uygulamamız üzerinden erişebileceğimiz bir Endpoint tanımlıyoruz. Endpoint’ in Binding parametresi basicHttpBinding değerine sahiptir. Ve son olarak Servis’ i Console uygulamamız üzerinden aşağıda kod bloğu vasıtasıyla başlatıyoruz.
Uygulamamızı başlattığımızda aşağıdaki görünümü elde etmiş olmak durumundayız.
Servis adresini tarayıcımız üzerinden ziyaret ettiğimizde ise ;
Servis metadata erişim sayfasına ulaşabilmekteyiz. Sıra geldi bu servise ulaşacak mobil cihaz uygulamasını geliştirmeye. Hızlı bir şekilde vakit kaybetmeden bir Mobil Cihaz projesi açıyoruz ve ekran üzerine bir metin kutusu ve bir button kontrolü yerleştiriyoruz.
Bilindiği üzere masaüstü uygulamalarından WCF servislerine erişebilmek adına ilgili Visual Studio üzerinde Proxy sınıflarını üreten görsel bir araç bulunmaktadır. Bu araca “Add Service Reference” menü elemanı üzerinden erişebilmektedir. Araç arka tarafta NetSvcUtil.exe aracını çalıştırmakta ve proxy sınıflarını barındıran ilgili çıktıları aracın çalıştırıldığı projeye eklenmektedir.
Araca tıkladığımızda uzaktaki WCF servisine erişecek Proxy sınıflarını oluşturacak aşağıdaki araç açılmaktadır.
Gelelim işin detayına. Böyle bir görsel araç mobil cihaz uygulama projeleri için maalesef bulunmamaktadır. İşin enteresanı standart Visual Studio ile Proxy sınıfını oluşturabileceğimiz NetCFSvcUtil.exe aracıda birlikte gelmemekte, yazının başında belirtilen adresten ayrıca indirilmesi gerekmektedir. Aracın indirilmesinden sonra servisimizi çalıştırıyoruz ve araca aşağıdaki komut değerlerini göndererek konsol üzerinden çalıştırıyoruz.
Ekran görüntüsünden de anlaşılabileceği üzere çalışılan servise bağlanılmış ve iki adet çıktı üretilmiştir. Bu çıktılar varsayılan lokasyona oluşturulmuştur. Bir sonraki aşamada yapmamız gerekenler bu çıktıları kopyalayıp mobil cihaz projemize yapıştırmak ve proxy sınıfını örneklendirerek çalışan servise ulaşmak olacaktır. Dosyaların ikisinide projemize kopyalıyoruz.
Ve button’ a tıkladığımızda aşağıdaki kod bloğunu yazıyoruz.
İşte bu kadar ! Proxy sınıfının bir örneğini oluşturup fonksiyonumu çağırıyoruz. Gerekli koşulları sağlayıp uygulamamızı çalıştırdığımızda ise ;
Hepsi bu kadar ! Mobil cihaz uygulamamız WCF servisi üzerinde tanımlı fonksiyonumuz ile haberleşmekte ve değerler karşı tarafa taşınmaktadır.
Geliştirilen örnek uygulamayı buradan indirebilirsiniz. Bir başka yazıda daha görüşmek üzere.
28 Ağustos 2009
Windows Vista SP2 ve Windows 7 İçin Yeni NetCFSvcUtil !
Merhaba,
Deneyenler ya da ilgilenenler bilecektir, .Net Compact Framework üzerinde halihazırda kullanıyor olduğumuz WCF Service proxy' lerini oluşturmak için "command line" üzerinden çalıştırılan "çok önemli bir araç" bulunmaktadır. NetCFSvcUtil.exe.
Bu araç vasıtasıyla WCF Service proxy' lerini oluşturmakta ve akabinde WCF Service çağrılarını yapabilmektesiniz.
Her nedendir ki bu araç Windows Vista SP2 ve Windows 7 üzerinde çalışmamakta, Proxy generation sürecinde hata vermekte ve çıldırtmaktaydı. Neyseki "uzuun" zamandır güncellenmeyen .Net Compact Framework Team blog' u üzerine 10 ağustos' ta eklenen çok önemli bir blog girdisini paylaşmak istiyorum.
NETCFSvcUtil.exe fix :
"Check out Manish’s blog on NetcfSvcUtil.exe crashing on some operating systems and the uploaded fix for it here."
Evet ! , bu işi "en sonunda" düzeltmişler. 7 Ağustos itibariyle adresinden güncellenmiş NetCFSvcUtil' i indirebilirsiniz.Devamını Oku...
18 Ağustos 2009
.Net Compact Framework 3.5 – LINQ Uygulamaları – Standart Query Operators
Hiç şüphesiz .Net Compact Framework 3.5 ile birlikte gelen “sınırlı” LINQ (Language Integrated Query) desteği .Net Compact Framework managed mobil cihaz uygulama geliştiricilerin uygulama geliştirme sürecini ciddi anlamda kolaylaştıran en önemli yeniliklerin başında ifade edilebilmektedir. .Net Framework 3.5 ile birlikte uygulama geliştirme ortamında yerini bulan ve günümüzde bakıldığında üzerine onlarca “Provider” geliştirilen LINQ, birçok yazılım geliştiricinin yazılım geliştirme sürecini hızlandırmakta, okunması, anlaşılması ve yazılması her zaman daha sevimli ve daha kolay olan “sql-tipi” sorgulama modelini .Net ortamına getirmektedir. .Net Uygulama Geliştirme platformu üzerinde resmi dil olarak kabul edilen C# (C-Sharp) ve VB.NET (Visual Basit .Net) programlama dilleri kullanılarak, bu dillerin compiler (derleyici)’ ları üzerinde yapılan geliştirmeler sonucunda uygulama geliştiriciler birçok farklı “veri setine” “doğal yöntemlerle” ulaşabilmekte ve bu verileri “doğal yöntemlerle” sorgulayabilmektedir. Doğal yöntemler olarak katedilen metoloji, hali hazırda veri sorgulama işlemlerinde kullanıyor olduğumuz select, from, join, where v.b. gibi sorgulama kelimelerinin programatik ortamda kullanılmasıdır. LINQ (Language Integraed Query), temelinde bize bu olanağı sağlamakta, derleyicilere bu yeteneği kazandırmaktadır. Bir diğer bakış açısıyla LINQ, IEnumerable
Örneğin ;
kod satırları string bir dizi üzerinde dizi elemanlarının metinsel uzunluğu 3 karakterden fazla olan elemanları listelemesini öngörmektedir.
LINQ ile iki farklı metodoloji ile sorgulama gerçekleştirebilmekteyiz. Bunlardan ilki yukarıdaki ekran görüntüsünde ifade edilen ve “Query Expression” olarak tabir edilen native keyword’ ler ile sorgulama yapmak, diğeri ise “aslında yukarıdaki yazılanların da derleme zamanında otomatik olarak uygun olan Extension Method’ lara çevrildiği” metot çağrıları ile sorgulama yapmaktır. Örneğin yukarıdaki sorguyu ;
Şeklinde de çalıştırabilmekteyiz.
Evet, LINQ çağrıları derleme anında IEnumerable
Referanslardan ilgili referansı eklemeli ;
Ve System.Linq ‘ i kod ekranına “using” ile tanımlamamız gerekmektedir.
Peki IEnumerable
“LINQ Standart Query Operators” olarak adlandırılan bu fonksiyon seti, temel olarak bir veri seti üzerinde ihtiyaç duyulabilecek neredeyse tüm işlemleri gerçekleştirmeye yarayan “Extension Method" ' lardan oluşmaktadır. Bu setin içideki tüm fonksiyonların ne işe yaradığını http://msdn.microsoft.com/en-us/library/system.linq.enumerable_members.aspx adresinden detaylıca öğrenebilirsiniz.
Bütün bunların dışında yazının başında da belirttiğimiz üzere LINQ’ in bize sunduğu Iqueryable
Hızlı bir şekilde yazımızın ana konusuna dönersek, bu yazımızda .Net Compact Framework 3.5 ile birlikte “artık” desteklenen, mobil cihaz uygulama geliştiricilerin bu platform üzerinde kullanabilecekleri LINQ implemantasyonundan bahsedeceğiz.
.Net Compact Framework 3.5 ile artık masaüstü LINQ’ in “kısıtlı, belirli bir bölümünü” mobil cihaz uygulamaları geliştirirken kullanabilmekteyiz. .Net Compact Framework 3.5 üzerinde sadece ;
Standart Query Operators
LINQ To Dataset
LINQ To XML
desteklenmektedir.
Standart Query Operators
Yazımızın bir önceki bölümünde bahsettiğimiz üzere LINQ içerisinde Standart Query Operators başlığı altında IEnumerable
Hiç vakit kaybetmeden birkaç örnek üzerine çalışalım. Örneğimizde Sql Server Compact Edition 3.5 sürümü üzerinde hazırlanmış Northwind.sdf isimli veritabanı üzerinden Customers tablosuna ait veriler çekiliyor ve çekilen her satır uygulama içerisinde bir Customer entity instance’ ı olarak temsil ediliyor. Bu noktada hazırlanan alt yapıyı örnek kodları indirerek inceleyebilirsiniz.
Entity klasörü içerisindeki Customer sınıfı, veritabanı üzerindeki bir Customer kaydını temsil edecek şekilde modellenmiştir.
Business klasörü içerisindeki Customer sınıfı ise Northwind.sdf üzerinden tüm müşteri kayıtlarını Ilist
Bu noktada kodların tamamına örnek kodları indirerek ulaşabilirsiniz. Verilerin getirilmesinde SqlCe Provider’ ı kullanışmıştır.
Sıra geldi bu verileri çekip, üzerinde sorgulama yapmaya. Bu noktada bize yardımcı olması adına uygulamamıza bir Form ekliyoruz ve Form Load olayı tetiklendiğinde aşağıdaki kod bloğunu çalıştırıyoruz.
Ve verilerimiz artık elimizde. Bu noktadan sonra elimizdeki Customers list’ i üzerinde Standart Query Operators ‘ ı kullanarak birçok işlem gerçekleştirebiliriz. Sonucta IList
Form üzerine bir button yerleştirip bu button’ a tıkladığımızda açılan kod bloğu içerisinde Customers yazıp noktaya basıyoruz ve gerçekleştirebilecek olduğumuz işlemlerin bir listesini görüntülüyoruz.
İşte karşımızda Extension Method’ lar ya da bir diğer deyimiyle Standart Query Operators ! İkonunda aşağı doğru bakan mavi renkli ok işaratei bulunanlar Extension Method olarak ifade edilebilir.
Sıra geldi bu fonksiyonların etinden sütünden faydalanmaya. Bilindiği üzere LINQ üzerinde iki tip sorgulama yöntemi bulunmaktadır. Query Expressions ve Method Calls. Siz, bazı operatörleri method çağrıları şeklinde çağırmak yerine LINQ’ in “doğal yöntemi” ile sorgulayabilirsiniz. Bunu yazımızın başında ifade etmiştik.
Query Expression modelinde hangi keyword’ lerin kullanılabileceğini ise http://msdn.microsoft.com/en-us/library/bb882642.aspx adresinden inceleyebilir, yazdığınız kelimelerin compile time’ da hangi method çağrılarına dönüştürüldüğünü, hangilerini sadece methodlar kullanarak çağırabileceğinizi bu listeden görebilirsiniz. Ayrıca C#’ ta olmayan bazı keyword’ ler VB.Net üzerinde bulunmaktadır. J Microsoft’ un önerisi, okunması her açıdan kolay olan Query Expression’ ları olabildiğince kullanmamızdır. Sonuçta compile time’ da her ikiside aynı IL koduna dönüştürüldüğünden aralarında hiç bir performans farkı bulunmamaktadır. Ayrıca bilindiği üzere Query Expression’ lar çok sınırlı bir keyword listesini desteklemekte. Siz sıkıştığınız noktalarda bu expressionları method çağrıları ile birleştirip hibrit sorgulamalar gerçekleştirebilirsiniz. Örneğin ;
Yukarıdaki kod bloğunda Berlin şehrinde yaşayan müşterilerimizin ContactTitle bilgisini seçtikten sonra normal şartlarda C# üzerinden Query Expression yöntemi ile gerçekleştirilemeyen Distinct çağrısını Extension Method çağrısı ile gerçekleştirmiş bulunmaktayız.
Biraz sorgulama gerçekleştirelim.
Sorguda veri kaynağı üzerinden gelen müşterileri yaşadıkları ülkelere göre grupladık. Gruplamanın sonucunda ise anonim bir tip oluşturduk ve bu tipe 2 adet özellik tanımladık. Hangi şehir bilgisi ve bu şehirde yaşayan müşterilerin sayısı.
Örneğin yukarıdaki sorguda Adres’ i A harfiyle başlayan müşterileri listeledik.
Kısacası elinizdeki verilerin yoğunluğu, aralarındaki ilişkiler ve daha birçok noktayı da göz önünde bulundurarak, .Net Compact Framework 3.5 kullanarak geliştirdiğiniz Mobil Cihaz Uygulamalarında Standart Query Operators olarak ifade edilen bu keyword ve fonksiyonları kullanarak LINQ’ in gücünü hissedebilirsiniz. Bir sonraki yazımızda .Net Compact Framework üzerinde LINQ To Dataset kavramını örneklerle inceleyeceğiz.
Geliştirilen örnek uygulamanın kodlarını buradan indirebilirsiniz.
11 Mayıs 2009
.Net Compact Framework - Çalıştırılan Uygulama Patikası
Merhaba,
.Net Compact Framework ile Windows Mobile uygulama geliştiricilerin çok sık ihtiyaç duyacakları bir bilgiyi paylaşmak istiyorum.
Standart çalıştırılabilir masaüstü uygulamalarında çoğu zaman uygulamanın çalıştırıldığı patikayı ;
kod bloğu ile alabilmekteyiz.
.Net Compact Framework üzerinde böyle bir property (özellik) bulunmamaktadır. .Net Compact Framework üzerinde bu bilgiye aşağıdaki kod bloğu ile ulaşabilirsiniz.
6 Nisan 2009
Windows Mobile Development - Web Semineri
16 Nisan 2009 tarihinde MS Events üzerinden bir web semineri gerçekleştireceğim. Seminerde cep bilgisayarları hakkında temel bir bilgilendirme yaptıktan sonra .Net Compact Framework platformunu kullanarak Windows Mobile kurulu cep bilgisayarlarına yönelik örnek bir uygulama geliştireceğim.
Seminerin detayları aşağıdadır :
Windows Mobile Development
Etkinlik Kimliği: 1032410443
Dil(ler):
Türkçe.
Windows Mobile.
Hedef Kitle(ler):
BDM,BT Uzmanı,Tasarımcı,Teknoloji Karar Vericileri,Yazılım Geliştiricileri. Süre: 60 Dakika
Başlangıç Tarihi:
16 Nisan 2009 Perşembe 15:00 İstanbul, Minsk
Etkinliğe Genel Bakış :
Windows Mobile işletim sistemi üzerinde geliştireceğiniz uygulamalar ile işlerinizi kolaylaştırıp, verimliliğinizi artırabilirsiniz. Windows Mobile ve Microsoft .NET Compact Framework size, geliştirme süreçlerinizi hızlandıracak ve bu süreçlere esneklik katacak en ideal ortamı sunmaktadır. Bu web seminerde Microsoft'un mobil yazılım geliştirme ortamını daha yakından tanıma fırsatı bulacaksınız.
Kayıt İçin :
http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032410443&culture=tr-tr
Outlook Takvimine Direk Eklemek İçin :
Outlook Takvime Ekle !
