Ahmet Oğuz Koca

Sosyal olaylar.

Entity Framework'te Jenerik Repository kullanımı

Bilindiği üzere büyük ölçekli (multi tier/layer) uygulamalarda DRY (don’t repeat yourself/kendini tekrar etmeme) prensibini etkin şekilde kullanarak proje içindeki kod tekrarlarının önüne geçmek çoğu zaman mümkün olamayabiliyor. Özellikle de veri tabanı merkezli (database centric) uygulamalarda farklı entityler (tablo/class) üzerinde işlemler yaparken sık sık kod tekrarları (çoğu zaman where ve orderby sorguları) yapmak durumunda kalabiliyoruz. Bu durumda da proje sonunda elimizde onlarca benzer fonksiyon ve class’tan oluşan yapılar kalabiliyor. Bu da projelerde hem kodlama (harcanan zaman ve emek) hem de bakım (maintenance) maliyetini arttıran bir faktör olarak karşımıza çıkıyor.

Aslında C# dilinin gelişimi sürecinde dile eklenen yeni yöntem ve isim uzaylarını (namespace) etkin şekilde kullanarak bu tekrarların önüne geçmek mümkün. İlk bakışta dilin temel söz diziminin (syntax) ötesine geçmesinden dolayı okunabilirlik konusunda zorlukları olsa da bir kaç alıştırmadan sonra siz de bu yöntemleri öğrenip projelerinize kolaylıkla entegre edebilirsiniz.

Ben de bu yazıda linq ve jenerikler yardımıyla bir repository sınıf oluşturucak ve modelimizdeki tüm entitylerimiz üzerinde başka bir sınıfa ihtiyaç duymadan istediğimiz işlemleri nasıl yapabileceğimizi anlatıyor olacağım. Konuyu oldukça basit tutmak amacıyla iki farklı sınıf (entity) üzerinde duracağız ancak jenerik repository kullanmanın faydalarının farkına projemizdeki entity sayısı arttıkça daha fazla varabiliriz.


Basitleştirilmiş iki entitymiz şu şekilde olsun

Fazlası...

Linq aracılılığıyla basit bir DRY (don't repeat yourself) yöntemi

Programlama dünyasında aynı veya benzer amacı taşıyan kod bloklarının uygulamanızın farklı yerlerinde defalarca yer alması istenen bir durum değildir (don't repeat yourself). Özellikle çok katmanlı uygulamalarda bu problemden kaçınmak malesef oldukça zor olabilmekte. Bugün bir projenin kaynak kodları üzerinde araştırma yaparken programcının bu sorunun üstünden gelmek için güzel bir yöntem izlediğini gördüm ve sizlerle de paylaşmak istedim. Ben burada konuyu mümkün olduğu kadar basit tutmak amacıyla çok küçük bir örnek ile konuyu anlatmaya çalışacağım. 

Şekildeki gibi bir Member Class'imiz olsun

 

Öncelikle DB üzerinde işlem yaptığımız bir Reposiyory class'imiz olsun (örnekte MemberRepository) Class'imiz ile site üyelerimiz arasında isim ve email adreslerini kullanarak arama yapıyoruz.

İlk iki fonksiyonumuzda klasik yöntemle iki ayrı fonksiyon oluşturuyoruz. Bunlardan birincisi ile Nick üzerinden ikincisinde ise email adresi üzerinden ilgili kullanıcının veritabanımızda yer alıp yer almadığını kontrol ediyoruz. Üçüncü fonksiyonumuzda ise Linq expression'lar arayıcılığıyla daha esnek bir GetMember fonksiyonu oluşturuyoruz ve hangi parametre üzerinden arama yapılacağını sınıf örneğini oluşturan client kodumuza bırakıyoruz. Bu sınıf üzerinden işlem yapan istemci kodlarımız ise şöyle

Görüldüğü üzere linq expression ile oluşturduğumuz GetMember fonksiyonumuz sayesinde kod tekrarından kurtulmuş olduk ve uygulamamıza müthiş bir esneklik kattık. Nick ve EMail Adresinin yanında aynı fonksiyon sayesinde Member Class'imizin bir çok fieldi üzerinde arama işlemi yapabileceğimizi de unutmayalım. Ben burda sadece where fonksiyonu üzerinden örnek yaptım ancak tahmin edebileceğiniz üzere order sorgularından group'lama işlemelerine kadar bir çok yerde bu esnekliği siz de kullanabilirsiniz. Görüş ve önerilerinizi yorum olarak bırakabilirsiniz. Kolay kodlamalar...

Asp.Net MVC3'te Recaptcha (güvenlik kodu) kullanımı

Asp.net MVC3 projelerinizde form alanlarınız için güvenlik kodu uygulamasına ihtiyaç duyarsanız, NuGet üzerinden Microsoft-Web-Helpers dağıtımıyla dağıtılan google'ın recaptcha uygulamasını kullanabilirsiniz.

Projenize Recaptcha eklemek için öncelikle Nuget'ten "microsoft-web" araması yapıp resimdeki paketi projemize dahil ediyoruz.

Daha sonra captcha uygulamamıza sayfalarımızdan direkt olarak ulaşabilmek için web.config dosyamıza Microsoft.Web.Helpers namespace'imizi ekliyoruz.


Sadece bir tek formda ihtiyaç duyorsanız ilgili sayfada using ile de referans da verebilirsiniz.

Daha sonra kendimize http://www.google.com/recaptcha üzerinden bir hesap açıyor ve Domain alanına ilgili alanadını girdikten sonra bize sağlanan private ve public key değerlerini projemizde kullanmak üzere saklıyoruz. Formumuzda captcha alanını göstermek için form taglarımızda istediğimiz alana bu kodları giriyoruz.

Form verilerimizi aldığımız Controller'imizde bu kodlarla girilen değeri kontrol ediyoruz

Asp.net MVC ile GooglePlus Api kullanımı

Google bu hafta içinde Google+ (google plus) için API desteğini kısıtlı özelliklerle de olsa açınca bende .net developerlar için basit bir client yazma gereği duydum.  Google'ın API'ye ek özellikler eklemesiyle birlikte paylaştığım kodları geliştirmeyi planlıyorum. Görüş ve önerilerinizi benimle paylaşırsanız kodların geliştirilmesine katkıda bulunabilirsiniz.

Şu an paylaştığım kodlarda Oauth2 ile yetki alıp bu yetkiyi kullanarak basit bir get sorgusu yapıyoruz. Bir çok arkadaşın konuya yabancı olduğunu düşünerek adım adım ilerleyeceğimiz bir yazı hazırladım.

Adım 1. API Başvurusu

Öncelikle Google'ın kendi uygulamaları için sağladığı API'lere erişim için Google Console aracılığıyla bir API projesi başlatıyoruz Link => https://code.google.com/apis/console

 Fazlası...

Asp.net MVC projelerinde ViewModel kullanımı.

 

Asp.net MVC'de Controller sınıflarınızdan view sayfalarınıza istediğiniz nesneleri geçebilmeniz için bir çok yöntem olsada (viewbag, viewdata, entity classları v.s.) kanımca bu imkanların efektif olarak kullanımı neredeyse mümkün değil. Özellikle çalışma zamanı sırasında tip dönüşümü hatalarından ve controller'da bu bilgileri doldurma sırasından oluşan problemlerden (null değer v.s.) dolayı dynamic viewbag yapısı zamanla sadece çile kaynağı haline gelebiliyor. Özellikle unit testing kullanmıyorsanız view tarafında oluşan hataları gidermek proje geliştirme sürecinizin büyük bir bölümünü oluşturabiliyor.

Bütün bu problemlerin üzerinden gelebilmek amacıyla çeşitli tasarım desenlerinden kotarımlar yaparak bir yapı geliştirdim ve bu yapı sayesinde proje geliştirme sürecimi hayli kısaltabildim. Aslen bu yapı endüstri standartlarına çok uygun olmasada özellikle hızlı projeler geliştirmek adına size de bir çok avantaj sağlayabileceğinden sizlerle paylaşmak istedim. Açıklamamı fazla uzatmadan direkt ilgili kodları paylaşıyorum.

 

Öncelikle bütün ViewModel'lerimizi türeteceğimiz bir ViewModel classi oluşturuyoruz. 

http://pastebin.com/ehdsFwtT

 

Bir eticaret sitesi anasayfası yaptığımızı varsayaraktan basit bir AnasayfaViewModel Class'i oluşturuyoruz. 

Class'in içinde view tarafınfa ihtiyaç duyacağımız çeşitli classların liste tipinde örnekleri bulunuyor

http://pastebin.com/vPNFpv1M

 

Controller da ViewModel içinde tanımladığımız listelerimizi dolduruyoruz. 

http://pastebin.com/wD8QXxBT

 

View'imize geçtiğimiz ViewModel class'imiz üzerinden ihtiyaç duyduğumuz işlemleri gerçekleştiriyoruz.

http://pastebin.com/zrp8Jdkk

 

Pastebin üzerinden verdiğim kodlara gerekli açıklama satırlarını ekledim ancak sorularınız olursa bana sosyal medya kanalıyla ulaşabilirsiniz.

twitter.com/aokocax ,friendfeed.com/aokocax

 

 

 

Linq ile RSS feed okuma

Linq kullanarak RSS okumak için aşağıdaki kod blogunu kullanabilirsiniz, RSS standartlarında "link" tagiyla içeriğin URL adresine ulaşabiliyorken feedburner gibi servislerde <feedburner:origLink> tagiyla orjinal URL adresini alabiliyoruz bu yüzden kodlar feedburner'a göre optimize edilmiştir.

            XDocument XD = XDocument.Load("http://www.rssaddress.com/address.rsss);

            var x = (from it in XD.Descendants("item")
                     orderby DateTime.Parse(it.Element("pubDate").Value) ascending
                    //  where DateTime.Parse(it.Element("pubDate").Value) > datetime
                     select it.Elements()).ToArray();

                foreach (var itemx in x)
                {

                        string Title="";Link="";DateTime pubDate;

                        foreach (var itemsub in itemx)
                        {

                            if (itemsub.Name == "title")
                            {
                               Title=itemsub.Value;
                            }

                            if (itemsub.Name == "pubDate")
                            {
                                pubDate = DateTime.Parse(itemsub.Value);

                            }
                            if (itemsub.Name == "link")
                            {
                                Link = itemsub.Value;
                            } // feedburnerservisi kullanılmaktaysa direkt URL Addresini almak için bu blokla origLink'i alıyoruz, tag yoksa exception fırlatmaz
                            if (itemsub.Name == "{http://rssnamespace.org/feedburner/ext/1.0}origLink")
                            {
                                Link = itemsub.Value;
                            }
                        }

              }

 

İyi kodlamalar

 

 

Entity Framework ile ilişkili tablolardan kayıt silme

A relationship is being added or deleted from an AssociationSet 'FK_Table2_Table1'. With cardinality constraints, a corresponding 'Table2' must also be added or deleted.

Bu aralar projelerimde EF kullanıyorum ve muhtemelen Frameworkta bulunan bir hatadan kaynaklanıyor olacak ilişkili tablolardan kayıt silerken yukardaki hatayı alıyorsunuz. Ben kendi modelimde 1:Many:1 ilişkili bir kaydı silmeye çalıştığımda bu hatayı aldım.
Bu sorunu çözmek için internette yaptığım araştırmalar sonucunda yapılması gereken üç farklı adım olduğunu buldum. EF framework'u projelerinde kullanacak arkadaşlar için bu üç küçük adımı anlatmanın faydalı olacağına inandığım için sizlerle paylaşmak istedim.
Fazlası...

Visual Studio 2010 ve .net Framework 4.0 CTP leri hazır.



MSDN tv’de (Channel 9) yayınlanmaya başlayan yeni bir video serisi ile visual Studio 10 (2010) ve .net Framework 4.0 daha yakından görmek isteyenler için güzel bir fırsat sunuluyor. Videolarda ilgili sitelerden gerekli olan CTP (Community Technology Preview) dosyalarının nasıl indireleceğinden ve Virtual PC ayarlarını nasıl yapılması gerektiğine kadar bütün bilgiler mevcut. Videolara ve MSDN (Channel 9) altında oluşturlan bölüme ulaşmak için linkleri takip ediniz.

Video Episode 1 Visual Studio 2010 CTP VPC Ayarları

Video Episode 2 Visual Studio 2010

Video Episode 3 Asp.Net Web Form 4.0

MSDN Channel 9 [10-4] Bölümü

Ado.Net Entity Framework Başvuru Kaynakları

Microsoft’un .Net Framework 3.5 SP1 ile release ettiği Ado.NET’in yeni gözdesi Entity Framework hakkında bilgi edinebileceğiniz bazı kaynaklar;
Not: EF Teknolojisi yeni olmasından dolayı şimdilik yeterli sayıda yerli kaynak bulmak mümkün olmuyor bundan dolayı Türkçe kaynakları başka bir yazıda derleyip toplamak üzere buraya almadım.

Resmi Ado.NET Blog’u
http://blogs.msdn.com/adonet/

MSDN EF Başlangıç Sayfası
http://msdn.microsoft.com/en-us/data/aa937723.aspx

MSDN EF Forumu
http://social.msdn.microsoft.com/forums/en-US/adodotnetentityframework/threads/

MSDN EF Dokümanları
http://msdn.microsoft.com/en-us/library/bb399572.aspx

DNRTV Tanıtım Videoları
http://www.dnrtv.com/default.aspx?showNum=117
http://www.dnrtv.com/default.aspx?showNum=118

Julia LERMAN Ado.NET EF kitabı (Rough CUTS)
http://my.safaribooksonline.com/9780596156244

www.asp.net EF Video Dersleri
http://www.asp.net/Learn/3.5-videos/video-300.aspx
http://www.asp.net/Learn/3.5-videos/video-500.aspx
http://www.asp.net/Learn/3.5-videos/video-299.aspx
http://www.asp.net/learn/3.5-SP1/video-245.aspx