Bir Araç Muayene Macerası ve Öğrendiğim Bir Sürü Şey

Merhabalar.

Geçenlerde Kia marka aracımı muayeneye götürdüm. Koltuk sayısından dolayı muayeneden kaldım. Gerekçe -genel bir problem olan-ruhsatta ve “sistem”de 5 koltuk yazması ama araçta 4 emniyet kemeri olması.
Emniyete giderek halletmem gerektiğini söylediler.

Doğal olarak süreci öğrenmek için Google’a başvurdum. (2013 veya 2014 tarihli) Bir sözlük veya blog yazısından Emniyet’ten randevu almam gerektiğini ve 67 lira gibi bir ücret mukabilinde halledebileceğimi öğrendim.

Uğraşanlar (İstanbul’da) Emniyet’ten randevu almanın eziyetini bilir. Her neyse evime yakın olan Bahçelievler Emniyet’te yer bulamadığım için Bağcılar’a randevu aldım. Gittiğimde ilgili işlem için randevuya gerek olmadığını ve aracın belgelerinin Esenler Emniyet Müdürlüğü’nde olduğunu dolayısıyla oraya gitmem gerektiğini öğrendim.

Akabinde Esenler’e yollandım. Oradaki memur arkadaştan da dosyamda “Araç Uygunluk Belgesi” diye bir belgenin olmadığını, koltuk sayısının değişmesi için bu belgenin gerektiğini ve Kia bayisinden alabileceğimi öğrendim.

Sonrasında Emniyet binasında oturacak bir yer bulup sağı solu aramaya başladım.

İlk etapte 2 tane Kia bayisini aradım. İlk bayiden bu belgeyi kendilerinin çıkaramadıklarını, Gebze/Şekerpınar’daki Çelik Motor’un merkezinden alabileceğimi söylediler. Çelik Motor’u ilk aramamda ulaşamadım.

İkinci bayiyi aradığımda muamelecilerine yönlendirdiler. İlgili arkadaştan da -sağolsun- 250 liraya bu belgeyi çıkaracağını öğrendim.

Bu defa da “workaround” bir çözüm olan, araca sanayide 5. emniyet kemerini monte ettirme seçeneğini düşünmeye başladım. Onun için de bir maliyete araştırması yaptım: Sanayiden aracı görmeleri gerektiğini, 50 ila 170 lira bir meblağa mal olacağını öğrendim.

Efendime söyleyeyim.. Ondan sonra Çelik Motor’u bir kez daha arayıp Kia menüsüne bağlandım. Oradan da direkt Kia’nın müşteri hizmetlerini aramam gerektiğini öğrendim. Orayı arayınca sağolsunlar belgeyi kendilerinin hazırlayıp kargoyla göndereceklerini söylediler(öğrendim).

Bunca badireden sonra ücret ödemeden belgeyi temin edecek olmanın huzuruyla Emniyet’ten çıkıp aracımı parkettiğim yere gittiğimde yerinde olmadığını gördüm. Oradaki bir dükkandan “aracın çekildiğini, 5 dakikalık mesafede felanca yerde” olduğunu öğrendim.

Arkadaşın 5 dakikasının benim 15 dakikama tekabül ettiğini de öğrenerek otoparkı buldum. 90 tl çekici ücreti ve 12 tl otopark ücreti mukabilinde aracı kurtardım ama henüz cezanın ne kadar olduğunu öğrenemedim.

Neyse en son kargoyla belgemi alınca tekrar Emniyet’e gittim. Bu defa yoğurdu üflemeyi öğrenip, aracı Emniyet’in alt tarafındaki açık otopark 5 lira karşılığında bıraktım.

Ruhsat parasını da vermeye hazırlanımışken, memur arkadaştan “sadece bilgisayardan bir değişiklik yaptığını, bunun yeterli olduğunu ve ruhsatı yenilemeye gerek olmadığını” öğrendim. Dolayısıyla en başta internetten öğrendiğim şeylerin doğru olmadığını da öğrendim.

Kendinize çook iyi bakın.

 

 Bu sayfa 341 kez görüntülendi

Yazılımcılar ve İşsizlik

TÜİK’in son açıkladığı(16.01.2017 tarihinde) verilere göre işsizlik oranı bir önceki seneye göre %1,3 artarak %11,8 olmuş. Verilere daha detaylı bakınca tarım dışı işsizlik oranının 1,5 puanlık artış ile %14,1 , genç nüfustaki (15-24 yaş) işsizlik oranının 1,9 puanlık artış ile %21,2; 15-64 yaş grubundaki oranın ise 1,3 puanlık artış ile %12 olduğu görülüyor.

Aslında bu veriler Linkedin’deki “iş arıyorum” paylaşımlarının devamlı surette artmasıyla gördüğümüz gerçeğin matematiksel açıklaması.

Piyasanın genelinde görülen sıkıntının finans sektörü özelinde daha fazla olduğu ise arkadaşlarımdan duyduğum ayrı bir konu.

Tabi ki tüm bu sıkıntılardan yazılımcılar da -tüm sektörlerde çalışabildiğimiz için “yazılım sektörü” demek istemiyorum- azade değil elbette. İş arayan pek çok yazılımcıyı görüyor, duyuyor ve yakinen biliyorum.

Bütün bu kasvetli ortamda yazılımcıların diğer meslek grubu mensuplarında olmayan bir avantajı var elbette: Bir iş ortamı zorunluluğu olmadan üretim yapabilmesi. Evden, kafeden, hatta Anadolu’nun ücra bir köyünden. Yeter ki yanında ihtiyacı olan programları muhtevi bir bilgisayarı olsun!

Ben de bu konu üzerinde biraz kafa patlatıp, iş arayan bir yazılımcının “o esnada” neler yapabileceğini düşündüm. İşte aklıma gelenler:

* Öncelikle direkt bir ofis çalışanı olmak dışında freelance ve remote çalışma gibi iş modelleri yaygınlaşıyor. Şu an uluslararası uzaktan çalışma platformları da revaçta. Bunları göz önünde bulundurmakta elbette fayda var. Tabi İngilizce burada ayrı bir önem kazanıyor. Öte yandan imkanı olanlar için yurtdışı da diğer bir seçenek. Örneğin Fransa gibi IT çalışanlarına özel kolaylıklar sunan ülkeler var.

* Dünya her geçen gün daha hızlı dönüyor. Bilişim dünyası ise çok çok çok daha hızlı dönüyor. Geniş vakte sahip olmayı fırsata çevirebileceğimiz en iyi yol: yeni bir şeyler, mesela yeni diller, yeni teknolojiler öğrenmek. Backend, frontend kısıtlarına takılmaksızın Python, Ruby, Go, Angular,PHP, HTML 5, Mobil programlama, IoT(Raspberry Pi, Arduino) .. ve hatta yapay zeka; Lisp, Prolog vs. Öğrenilebilecek sonsuz şey var!

Elbette bu öğrenim sürecini belli konuları önceliklendirerek yapmalıyız ama mutlaka bir öğrenim süreci oluşturmalıyız. Hatta bu öğrenim süreci sadece iş arayanlar için değil tüm yazılımcılar için olmazsa olmaz. Devamlı surette yeni teknolojiler, diller(şu an GoLang’ın yardırması gibi), yaklaşımlar/konseptler(DevOps, Mikroservisler vs) çıkıyor.. ve mesela yıllarca uygulamaya çalıştığımız “code reuse” prensibi için Mikroservis yaklaşımı “bunu o kadar da şa’apmayın” diyebiliyor. Bütün bu değişimlere ayak uydurabilmek için devamlı koşmaktan başka çaremiz de yok.

Hele bir de Endüstri 4.0 (İçinde yapay zeka, makine öğrenimi, IoT, Robotik vs. bir çok teknoloji sayılabilir) olayı var ki(ayrı bir yazı karalama amacındayım E4.0 için) topyekün ülke halinde koşmamız gerekiyor -bu sefer de!- geri kalmamak için.

Neyse konu çok dağıldı. İşin özü yeni bir şeyler öğrenerek hem canlı/diri kalmak hem CV’mizi genişletmek, hem de örneğin blog yazarak, video ders hazırlayarak katma değer üretmek mümkün.

Ve elbette bütün bu söylediklerim için 10 yılını, 15 yılını aynı kurumda, aynı teknolojileri kullanmaya veren arkadaşların “Bu saatten sonra ne öğreneyim?” psikolojisinden sakınmaları gerekiyor.. naçizane tavsiyem.

* Aklıma gelen diğer konu ise özellikle son paragrafta bahsettiğim yıllarını belli teknolojilere vermiş yazılımcılarla ilgili. Bu tecrübelerinizi profesyonel biçimde paylaşabilirsiniz. Ne basılı kitap olarak ne de video ders olarak derinlikli Türkçe kaynaklarımızın sayısı belki 2 elin parmaklarını geçmiyor. Bunları üretebilirsiniz. Kitap yazarak iyi kötü bir gelir de elde edebilirsiniz. Hatta Youtube videoları ile bile az da olsa(tam piyasasını bilmiyorum açıkçası. Mesela 10 bin izlenen bir videodan ortalama ne kadar reklam geliri oluşur?) bir gelir elde edebilirsiniz. Bunun en iyi tarafı da diğer insanlar için de bir şeyler üretiyor olmanız.

* Diğer bir konu ise kendi uygulamalarımızı geliştirebiliriz: Web, mobil.

Örneğin şu videodaki 06:58’de başlayan traktör sitesi olayını dinleyebilirsiniz. “Bu devirde o kadar kolay para yok!” diyor olabilirsiniz. Ama 3 tane PHP sayfası olmasa da kaliteli bir site şablonu hatta frameworkü oluşturup bunu ticari ürüne çevirebilirsiniz. Veya örneğin; 4-5 sene önce bir arkadaşım, geliştirdiği Android döviz uygulamasından aylık 200-300 dolar reklam geliri elde ettiğini söylemişti. Ki o zamanlar da bol miktarda muadili uygulama vardı.

Bunların dışında eksikliğini hissettiğiniz başka uygulamalar da olabilir. Örneğin benim aklıma gelen, bildiğim kadarıyla derli toplu, Türkçe bir “yazılım magazin” sitesi yok. Donanım, girişim, genel teknolojiler hakkında -hepimizin aklına gelecek- başarılı siteler var elbette. Ama yalnız yazılım hakkında aklıma gelen aktüel bir yazılım magazin sitesi yok. “Yeni çıkan konseptler hakkında neler var? Martin Fowler en son neyden bahsetmiş? Go dilinde neler eklenecekmiş?Microsoft .NET Framework’e yatırım yapmay bırakacak mı?” vs. Bilhassa İngilizcesi iyi olan arkadaşların kolaylıkla yapabileceği bir şey.

* Üsttekine benzer ayrı bir düşüncem ise kurumsal firmalar için üretilebilecek ürünler. Hatta bunu birkaç kişi beraber geliştirip “startup”a da dönüştürebilir. Örneğin bir cache yapısı, log yapısı hatta bütün bir framework. Yine mesela bir “Deployment tool”. Halen Türkiye’nin en büyük bankalarından birinde geçen seneye kadar manuel deployment yapıldığını biliyorum ve asla bu konuda yalnız olduğunu zannetmiyorum. Yine örneğin finans sektöründe çalışmış birkaç kişi, çalıştıkları “business know-how”ıyla o konudaki bir ihtiyacı gideren ürünler tasarlayabilirler.

* Bunların dışında, maddi sıkıntı varsa biraz daha hızlı getirisi olabilecek özel ders piyasası da var(Özgür Yazılım Dünyası’nın affına sığınarak :))

Benim naçizane önerilerim bunlar. Söz konusu yazılım olunca yapılabilecek başka pek çok şey de vardır muhakkak. Yorumlar da katkılarınızı beklerim.

Yazıyı okuduğunuz için teşekkürler.

Allah iş arayışındaki herkese hayırlı rızık kapıları nasip etsin.

 Bu sayfa 425 kez görüntülendi

C # 5 Caller Info Attributes Kullanımı ve Eski Versiyonlar İçin Bir Yöntem Önerisi

Merhabalar.

C# 5’te(yani .NET Framework 4.5’ta) gelen Caller Info özellikleriyle herhangi bir metodu nereden çağırdığımıza dair bilgilere erişebiliyoruz.

Bu da özellikle loglama ve izleme(örneğin SQL Server Profiler kullanımı) işlemlerinde büyük fayda sağlıyor.

Syntax şu şekilde :

public void NeredenGeldim(string parametre, 
                                             [CallerMemberName]string cagiranMetodAdi = "", 
                                             [CallerFilePath]string cagiranDosyaYolu = "", 
                                             [CallerLineNumber]int cagiranSatirNumarasi = 0)

Bu attributeleri şu şekilde açıklayabiliriz:
CallerMemberName: Bu metodun hangi metoddan çağırıldığı bilgisini,
CallerFilePath: Bu metodun çağırıldığı dosyanın dosya yolunu,
CallerLineNumber: Bu metodun çağırıldığı satır numarasını almamızı sağlar.

Örneklere başlamadan önce NOT: Resimleri üzerlerine tıklayarak büyütebilrsiniz.

Şu örneği inceleyerek oldukça basit bir kullanımı olduğunu görebilirsiniz:

static void Main(string[] args)
{
   MetodCagir();
}

private static void MetodCagir()
{
   NeredenGeldim("Bir metodun serancamı:");
}

public static void NeredenGeldim(string parametre, [CallerMemberName]string cagiranMetodAdi = "", [CallerFilePath]string cagiranDosyaYolu = "", [CallerLineNumber]int cagiranSatirNumarasi = 0)
{
   Console.WriteLine(parametre);
   Console.WriteLine("Çağıran Metodun Adı : " + cagiranMetodAdi);
   Console.WriteLine("Çağıran Metodun Dosya Yolu : " + cagiranDosyaYolu);
   Console.WriteLine("Çağıran Metodun Satır Numarası : " + cagiranSatirNumarasi);
   
   Console.Read();
}

Çıktı:

Buraya kadar her şey güzel. Ama .NET Framework’ün eski versiyonlarında bu “attribute”leri kullanamıyoruz. Bunun için yapabileceğimiz şey tüm versiyonlarda bulunan aslında fazlasıyla aşina olduğumuz bir sınıfı kullanacağız: StackTrace!

İlk etapta eski versiyonlar için metodu oluşturalım:

public static void NeredenGeldimEskiVersiyonlar(string parametre, string cagiranMetodAdi = "", string cagiranDosyaYolu = "", int cagiranSatirNumarasi = 0)
{
   StackTrace st = new StackTrace(true);
   StackFrame[] frames = st.GetFrames();

   Console.WriteLine(parametre);
   Console.WriteLine("Çağıran Metodun Adı : " + cagiranMetodAdi);
   Console.WriteLine("Çağıran Metodun Dosya Yolu : " + cagiranDosyaYolu);
   Console.WriteLine("Çağıran Metodun Satır Numarası : " + cagiranSatirNumarasi);
 
   Console.Read();
}

Burada StackTrace’in her bir “frame“i aslında hata mesajlarında gördüğümüz satırları ifade ediyor ve aşağıdaki gibi gözüküyor:

İncelediğimizde içinde bulunduğuz metoddan başlayarak hiyerarşik bir şekilde metodların “frame” dizisinde listelendiğini görüyoruz.

Gördüğünüz gibi olay “Caller Info Attributes”teki kadar kolay değil. Geldiğimiz metodu tespit etmek için bir şekilde dizinin elemanlarını bir şekilde filtrelememiz lazım.

Bunun için de “frame”lerin içeriğine biraz daha yakından bakalım. Örneğin bizim aradığımız metod olan “MetodCagir“ı içeren “frame”i inceleyelim:

Burada “Frame“in altında “DeclaringType“ı ve onun “property“leri arasında ise “Name” ve “FullName” alanlarını görüyoruz. “FullName”den yararlanarak metodumuzu çağıran programı filtreleyebiliriz. Örneğimizde hepsi “MerhabaDunya.Program” olsa da kurumsal programlarda pek çok farklı proje entegre bir şekilde çalıştığı için farklı isimler bulunabilir bu kısımda.

Bu yüzden ilk etapta bir LINQ sorgusuyla “FullName”e göre filtreleyip neler olduğuna bakıyorum.

“frames” değişkenin atamasını güncelleyelim:

StackFrame[] frames =
 st.GetFrames()
 .Where(s => s.GetMethod().DeclaringType.FullName.Contains("MerhabaDunya.Program"))
 .ToArray();

Örneğe göz atmadan önce bir NOT: Bu arada ben LINQ sorgusu kullanacağım için .NET Framework 3.5 da çalıştırıyorum programı. LINQ sorgusuna ihtiyacınız yoksa daha alt versiyonlarda da bu yöntemi kullanabiliyorsunuz.

Şimdi debug modda “frames”e bakalım tekrar:

Görüldüğü üzere 3 metod kaldı. (Bu da demek oluyor ki dışarıda kalan 4 metod programımıza değil .NET Framework’e ait metodlardı.)

Bu metodlar da sırasıyla:

  • NeredenGeldimEskiVersiyonlar(İçinde bulunduğumuz metod)
  • MetodCagir(Metodumuza çağıran, asıl aradığımız metod)
  • ve Main metodu.

Artık filtreleme yaptığım sorguya bir şart daha ekleyerek aradığım “frame”e ulaşabilirim:

“Metod ismi ‘NeredenGeldimEskiVersiyonlar’ olmayan ilk ‘frame’i getir ve bilgilerini yazdır.”

Yazıyı daha fazla uzatmadan kodun son haline bakalım:

public static void NeredenGeldimEskiVersiyonlar(string parametre, string cagiranMetodAdi = "", string cagiranDosyaYolu = "", int cagiranSatirNumarasi = 0)
{
   StackTrace st = new StackTrace(true);
   StackFrame[] frames = st.GetFrames();
   StackFrame frame = new StackFrame();

   if (frames != null)
   {
      frame = frames.FirstOrDefault(s => s.GetMethod().DeclaringType.FullName.Contains("MerhabaDunya.Program") && s.GetMethod().Name != "NeredenGeldimEskiVersiyonlar");
      cagiranMetodAdi = frame.GetMethod().Name;
      cagiranDosyaYolu = frame.GetFileName();
      cagiranSatirNumarasi = frame.GetFileLineNumber();
   }
 
   Console.WriteLine(parametre);
   Console.WriteLine("Çağıran Metodun Adı : " + cagiranMetodAdi);
   Console.WriteLine("Çağıran Metodun Dosya Yolu : " + cagiranDosyaYolu);
   Console.WriteLine("Çağıran Metodun Satır Numarası : " + cagiranSatirNumarasi);

   Console.Read();
}

Ve çıktı:

Gördüğünüz üzere aslında C# 5’te hayatımıza giren bir çözüme eski versiyonlarda ulaşmak için bir “workaround” çözüm geliştirdim. Tahmin edeceğiniz üzere bu gerçek hayatta karşılaştığım bir problemi aşmak için bulduğum çözüm. Bundan daha temiz bir çözüm de olabilir elbette. Benden şimdilik bu kadar.

Kendinize çook iyi davranın.

 Bu sayfa 409 kez görüntülendi

PL/SQL’e Nereden Başlamalı?

Merhaba.

Bugün “PL SQL öğrenmek istiyorum ama nereden nasıl başlayacağımı bilmiyorum. Bir tavsiye verirseniz mutlu olurum” şeklinde bir mail aldım.

Ben de kalkıp bir Üstad edasıyla tavsiyelerimi sıralamaya başladım 🙂

Şaka bir yana bir üstad olmasam da tecrübesi benden daha az olanlara faydası olur ümidiyle naçizane tavsiyelerimi -az bir tasarrufla- buradan da paylaşmaya karar verdim.

Katkıda bulunmak isteyenler yorumlarını paylaşırsa memnun olurum.

Buyrun:

Öncelikle İngilizceniz iyiyse her şey çok kolay 🙂 İyi değilse doğal olarak biraz daha fazla efor sarfetmek gerekiyor. Ben blogda kapsamlı bir içerik üretmeyi hedefledim ama önce iş yoğunluğu akabinde ise iş değişikliğiyle beraber Oracle’dan Microsoft SQL Server veritabanına geçiş olunca maalesef yarım kaldı.

Hatta o dönem Türkçe kitap olmadığı için kitap yazmayı bile düşündüm ama fırsat bulamadım. Sonrasında Fahrettin Ateş, Orhan Eripek ve Özgür Umut Vurgun tarafından bir Türkçe kitap yayınlandı ama henüz inceleme imkanım olmadı.

Sorunuza gelirsek..

PL SQL dili, SQL üzerine bina edildiği için öncelikle temel SQL bilgisine sahip olmanız gerekmekte. Yani;

  • DML (SELECT, INSERT, UPDATE, DELETE)
  • DDL (CREATE, ALTER, DROP vb.)
  • Trigger, Primary Key, Foreign Key, GRANT, Snonym, Constrains, Distinct, Join, Group By, Order By yapıları ve terimlerini bilmeniz gerekiyor.

Bu konularla alakalı internette çokça Türkçe kaynak da bulabilirsiniz. Ama biraz İngilizceniz varsa tavsiyem buradaki veya buradaki tutorialları incelemeniz.

Sonrasında artık “merhaba dünya” diyebilirsiniz! Daha sonra

  • değişkenler,
  • fonksiyonlar,
  • prosedürler (stored procedures) şeklinde devam edebilirsiniz.

Bu kısımları ben de blogda anlatmaya çalıştım.

Sonraki aşamada yuklarıda bahsettiğim SQL işlemlerinin PL SQL’de nasıl kullanıldığını inceleyebilirsiniz.

Bunlardan sonra ise sırasıyla;

  • şart-koşul yapıları (IF-THEN-ELSE ve CASE yapıları),
  • cursorlar, döngüler(FOR, WHILE),
  • hata yönetimi (Exception Handling),
  • Transaction yönetimi şeklinde devam ederek ilerleyebilirsiniz.

Bu konuları da hallettikten sonra artık SQL Tuningle beraber daha derinlere dalabilirsiniz. Yazılımcıysanız muhtemelen bu kısımlar size yetecektir. Ama DBA iseniz daha da ilerlemenizde (benim de şu an bilmediğim sulara doğru :)) fayda var.

Benim bu saydığım konular için tavsiye edeceğim kaynak ise burada.

Naçizane tavsiyelerim bunlar. Umarım yardımcı olabilmişimdir.

Bu sayfa 759 kez görüntülendi

C# Gerçek Hayat Örneği : Reflection ve Expression Tree

Merhaba.

Bu yazıda C#’ın ileri diyebileceğimiz bir kaç özelliğini kullandığım bir örnekten bahsedeceğim. Bir konuyu anlatmaktan ziyade ihtiyaç duyduğumuz senaryoyu nasıl gerçekleştirdiğimi anlatacağım. İnternette ciddi bir araştırma zamanı geçirdiğim için paylaşma ihtiyacı hissettim. Ama nasip olursa bu konular, özellikle de Reflection hakkında bir kaç giriş makalesi yazma planım var.

Asıl konumuza gelecek olursak.. İhtiyacımız olan karışık bir senaryoyu gerçekleştirmek için yoğun bir mücadele sonucu aşağıdaki metodları yazdım.

Öncelikle sistemimizde bir proxy yapısı var. Proxy’ye interface i vererek servis metodlarının remote çalıştırılmasını sağlıyoruz.

Örnek verecek olursak.. Amacım kod içerisinde kullanımı aşağıdaki gibi olan yapıyı çalışma zamanında oluşturup çalıştırmak.

using (var service = new Proxy<IUrunler>())

{

   var response = service.Execute<Response<List<Urunler>>>(srv => srv.GetUrunler());

   object list = response.Value;

   //Diğer kodlar

}

Burada proxy sınıfıma ait “Execute” metodu parametre olarak gönderilen “Action”ı çalıştırıp “Response<T>” tipinde dönüş yapan bir metod.

Bahsettiğim gibi bu scripti dinamik olarak oluşturmam lazım. Lakin zorluk şu ki; buradakilerden “IUrunler” sınıfını da, “Response<List<Urunler>>” tipini de, “srv => srv.GetUrunler()” ifadesini de bilmiyorum ve çalışma zamanında alabiliyorum.

Burada ilk olarak “srv => srv.GetUrunler()” ifadesini oluşturmam gerekiyor. Bunun için yazdığım metod aşağıda.

 private Expression CreateExpression(Type interfaceType, MethodInfo method)

{

   ParameterExpression parameter = Expression.Parameter(interfaceType, "srv");

   Expression callExpression = Expression.Call(parameter, method.Name, null, null);

   Expression lambdaExpression = Expression.Lambda(callExpression, new ParameterExpression[] { parameter });

   return lambdaExpression;

}

Metodun parametrelerini yukarıdaki “IUrunler” örneği üzerinden açıklayacak olursam:

interfaceType: “IUrunler” vb. sözkonusu interface in tipi.

method: “GetUrunler()” metoduna ait Reflection ile elde edilmiş “MethodInfo” nesnesi.

İlk önce lambda ifademizde parametre olarak “srv” kullanacağımı belirtiyorum. Daha sonra “call” edilecek metodun ismini(GetUrunler) vererek callExpression ifadesini elde ediyorum.  Burada Expression sınıfına ait tam 14 adet “Call” metodundan parametre olarak methodName alan Call metodunu kullandım (public static MethodCallExpression Call(Type type, string methodName, Type[] typeArguments, params Expression[] arguments);).

“Expression”ımda kullanacağım elemanlarımı elde ettikten sonra bu alemanlarla Lambda Expression’ı oluşturmaya geldi sıra. Bunun için de yine Expression sınıfına ait 18 adet Lambda metodundan parametre olarak yalnız “Expression Body” ve “ParameterExpression” dizisi alan metodu kullanıyorum(public static LambdaExpression Lambda(Expression body, params ParameterExpression[] parameters);)

Şu ana kadar en üstte verdiğim örnekteki Lambda expression(“srv => srv.GetUrunler()”) ifadesini oluturmuş olduk. Scriptin kalan kısmını elde etmek için bu lambda expression ı da parametre olarak alan yeni bir metod yazıyorum:

private object GetResponseValue(Type interfaceType, Type methodReturnType, Expression expression)

{

   var proxyType = typeof(Proxy<>);

   var service = proxyType.MakeGenericType(interfaceType);

   string methodSignature = "TResponse Execute[TResponse](System.Linq.Expressions.Expression`1[System.Func`2[" + interfaceType.FullName + ",TResponse]])";

   MethodInfo executeMethodInfo = service.GetMethods().Single(mi => mi.ToString() == methodSignature);

   MethodInfo executeGeneric = executeMethodInfo.MakeGenericMethod(methodReturnType);

   var instanceClass = Activator.CreateInstance(service);

   var response = executeGeneric.Invoke(instanceClass, new object[] { expression });

   object list = response.GetType().GetProperty("Value").GetValue(response, null);

   return list;

}

 

Bu metodda ekstra parametre olarak “methodReturnType” var ve bu “GetUrunler” metodunun dönüş tipini yani “Response<List<Urunler>>” değerini ifade ediyor.

Oluşturmamız gereken proxy nesnesi ve çağıracağımız “Execute” metodu generic yapılar olduğu için bunları reflection ile oluştumamız gerekiyor.

İlk etapta “service” instanceını oluşturabilmek için “Proxy<>” nesnesinin tipini alarak bundan yine reflection ile generic “service” tipini elde ediyorum.

Execute metodunun farklı overload ları olduğu için direkt kullanacağım metodun imzasını belirterek MethodInfo’sunu elde ediyorum. Kullanacağım metod da generic olduğu için metodun dönüş tipini belirterek ve “MakeGenericMethod” kullanarak “Execute” metodunun generic versiyonunu oluşturuyorum(MethodInfo executeGeneric = doActionMethodInfo.MakeGenericMethod(methodReturnType)).

Sonrasında “Activator.CreateInstance“ yardımıyla “service” instance ımı oluşturuyorum.

..ve oluşturduğum instance yardımıyla, expression parametresini de göndererek metodu invoke ediyorum, sonucu response değişkenine atıyorum.

Son olarak da “respons”un “Value” propertysini list değişkenime atıyorum.

Umarım açıklayıcı ve faydalı bir anlatım olmuştur.

Kendinize çook iyi davranın…

 

 Bu sayfa 665 kez görüntülendi