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ı...

BlogEngine 2.5 kurulumunda .cshtml hatası.

Bugün dotnetblogengine blog'umu 1.6 'dan 2.5'e taşıdıktan sonra yeni versiyondaki .cshtml uzantılı dosyalara erişmeye çalıştığımda IIS,  "HTTP Error 404.7 - Not Found" hatası veriyordu. Hatanın detayını iyi okumayıp bir çok mime ve isapi numarası denedikten sonra sorunun IIS 7.5'te varsayılan olarak .cshtml uzantılı dosyalara erişimin kapalı olduğunun aklıma gelmesi ve IIS'te gerekli ayarı yapmamın ardından problemim çözüldü. Benzer durumda olan arkadaşlar için yapılması gerekenleri paylaşayım istedim.

 

 

IIS'te ilgili sitenin detay bölümünden Request Filtering'i seçiyioruz

 

.cshtml dosyalarına getirilen kısıtlamayı "Remove ile kaldırıyoruz"

 

 

Not: MVC projelerinizde cshtml dosyalarını direkt erişime açmanız güvenlik sorunlarına sebep olabilir bundan dolayı bunu sunucu bazında değil sadece blogengine kurduğunuz websitesi için yapmalısınız.