<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Hakan Yalitekin</title>
    <description>The latest articles on DEV Community by Hakan Yalitekin (@hakanyalitekin).</description>
    <link>https://dev.to/hakanyalitekin</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F144821%2F88fc3776-f1dc-4e84-822b-426535321acb.jpg</url>
      <title>DEV Community: Hakan Yalitekin</title>
      <link>https://dev.to/hakanyalitekin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hakanyalitekin"/>
    <language>en</language>
    <item>
      <title>What is LINQ?</title>
      <dc:creator>Hakan Yalitekin</dc:creator>
      <pubDate>Tue, 07 Mar 2023 17:13:19 +0000</pubDate>
      <link>https://dev.to/hakanyalitekin/what-is-linq-3l59</link>
      <guid>https://dev.to/hakanyalitekin/what-is-linq-3l59</guid>
      <description>&lt;p&gt;&lt;a href="https://hakanyalitekin.medium.com/what-is-linq-f88236cd6612?source=rss-c5995f0cd21------2" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9m6wq5ohbgh3yxzp2lmy.png" width="758" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;LINQ (Language Integrated Query) is a useful query language introduced with C# 3.0 by Microsoft, which allows us to query different data…&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hakanyalitekin.medium.com/what-is-linq-f88236cd6612?source=rss-c5995f0cd21------2" rel="noopener noreferrer"&gt;Continue reading on Medium »&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programminglanguages</category>
      <category>csharp</category>
      <category>csharplanguage</category>
      <category>programming</category>
    </item>
    <item>
      <title>Builder Pattern nedir? | C#</title>
      <dc:creator>Hakan Yalitekin</dc:creator>
      <pubDate>Thu, 02 Mar 2023 10:48:51 +0000</pubDate>
      <link>https://dev.to/hakanyalitekin/builder-pattern-nedir-c-4e71</link>
      <guid>https://dev.to/hakanyalitekin/builder-pattern-nedir-c-4e71</guid>
      <description>&lt;p&gt;&lt;a href="https://hakanyalitekin.medium.com/builder-pattern-nedir-c-1a6d7efce5b8?source=rss-c5995f0cd21------2" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1140%2F1%2AsHJxsvyVwR_tMT8kojlaIA.jpeg" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Merhaba, bugün Creational Desing Patterns’in alt başlıklarından biri olan Builder Pattern’den bahsedeceğim.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hakanyalitekin.medium.com/builder-pattern-nedir-c-1a6d7efce5b8?source=rss-c5995f0cd21------2" rel="noopener noreferrer"&gt;Continue reading on Medium »&lt;/a&gt;&lt;/p&gt;

</description>
      <category>builderpattern</category>
      <category>csharp</category>
      <category>designpatterns</category>
    </item>
    <item>
      <title>Docusaurus ile Harika Dokümanlar Oluşturalım</title>
      <dc:creator>Hakan Yalitekin</dc:creator>
      <pubDate>Sat, 12 Mar 2022 23:30:19 +0000</pubDate>
      <link>https://dev.to/hakanyalitekin/docusaurus-ile-harika-dokumanlar-olusturalim-36kl</link>
      <guid>https://dev.to/hakanyalitekin/docusaurus-ile-harika-dokumanlar-olusturalim-36kl</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dQQ2kb7Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/512/1%2AK1kFnCAmCxsZFcXQ4vGa7Q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dQQ2kb7Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/512/1%2AK1kFnCAmCxsZFcXQ4vGa7Q.png" alt="" width="512" height="256"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bir projeyi devralırken ya da yeni bir şeyler öğrenirken ilk görmek istediğimiz şey genellikle dokümanlar oluyor. Aramızda dokümanın öneminin farkında olmayan yoktur diye umut ediyorum.🥊 Bundan sebep, bu yazıda dokümanın öneminden değil, nasıl harika dokümanlar oluşturabileceğimizden bahsedeceğim.&lt;/p&gt;

&lt;h3&gt;
  
  
  🦖Docusaurus nedir?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://docusaurus.io/"&gt;Docusaurus&lt;/a&gt;(doki-sörz) Facebook tarafından react ile geliştirilen, tamamıyla ücretsiz &lt;a href="https://github.com/facebook/docusaurus"&gt;açık-kaynak&lt;/a&gt; bir doküman oluşturma sayfasıdır.&lt;/p&gt;

&lt;p&gt;💡Nasıl bir görünüme sahip olduğun şu örneklere bakarak anlayabilirsiniz;&lt;/p&gt;

&lt;p&gt;➡️ &lt;a href="https://devarchitecture.netlify.app/"&gt;https://devarchitecture.netlify.app/&lt;/a&gt; (benim de ilk gez karşılaştığım yer)&lt;br&gt;&lt;br&gt;
➡️ &lt;a href="https://tutorial.docusaurus.io/"&gt;https://tutorial.docusaurus.io/&lt;/a&gt; (resmi tutorial)&lt;/p&gt;
&lt;h3&gt;
  
  
  🛠️Projemize Nasıl Entegre Edebiliriz?
&lt;/h3&gt;

&lt;p&gt;Doğrudan projenin içerisinde harici bir klasör oluşturup entegre edebileceğimiz gibi harici bir repoda da tutabiliriz. &lt;a href="https://www.youtube.com/watch?v=JR9eB4JjYBY"&gt;Sonuçta kimsenin hayatına kimse karışamaz.&lt;/a&gt; Biz bu yazıda harici değil, doğrudan projemize dahil oluşturacağız. Bence en makul yöntem de bu gibi görünüyor.(YTD)&lt;/p&gt;

&lt;p&gt;Ben bu yazıda docusaurus’u örnek olması için Angular projesine dahil edeceğim ki sizde var olan projelerinize nasıl kolay entegre edilebiliyor görmüş olun.&lt;/p&gt;
&lt;h4&gt;
  
  
  🔴1.Adım — Entegrasyon başlasın! 🚀
&lt;/h4&gt;

&lt;p&gt;Ben docusaurus’u dahil etmek için çalıştıracağım komutu, projemde &lt;strong&gt;📂src&lt;/strong&gt; klasörünün altına çalıştıracağım. Bu bir zorunluluk değil, tercih meselesi. İstenilen yere istenilen isimle bir klasör oluşturulup da çalıştırabilirsiniz.&lt;/p&gt;

&lt;p&gt;Projemize docusaurus’u dahil etmek için çalıştıracağımız komut oldukça basit&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx create-docusaurus@latest **docs** classic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;💡docs&lt;/strong&gt; dediğim yere herhangi bir şey yazılır illa docs olmak zorunda değil.&lt;/p&gt;

&lt;h4&gt;
  
  
  🔴2.Adım — Çalışıyor mu bir bakalım! ⚙️
&lt;/h4&gt;

&lt;p&gt;Hem her şeyin yolunda gittiğinden emin olmak, hem de oluşan harika taslağı görmek için çalıştırmamız gereken standart komut &lt;strong&gt;npm start&lt;/strong&gt;  . Çalıştırmadan önce, &lt;strong&gt;cd docs&lt;/strong&gt; ile ilgili yola gitmeyi unutmamalıyız. Eğer her şey yolunda gittiyse aşağıdaki gibi bir görüntü oluşmuş olmalı. Ve nereden görüntüleyebileceğimizin ipucu veriliyor olmalı. bknz: &lt;a href="http://localhost:3000/"&gt;http://localhost:3000/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--a_k8-5Ha--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AuXq3UP9lB1uuENMKNkAhsA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--a_k8-5Ha--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AuXq3UP9lB1uuENMKNkAhsA.png" alt="" width="880" height="486"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  🔴3.Adım — Biraz özelleştirelim! 🌈
&lt;/h4&gt;

&lt;p&gt;Standart taslağımız başarılı bir şekilde oluştuğuna göre, sıra geldi projemizi özelleştirmeye.&lt;/p&gt;

&lt;p&gt;Özelleştirme ile ilgili en çokomelli dosyamız &lt;strong&gt;docusaurus.config.js&lt;/strong&gt; dosyası. Projemizin adından tutunda, nerede deploy edileceği(değineceğim), routing bilgisine kadar her şey burada toplanıyor. Hatta eklentilerimizi bile buraya ekliyoruz.&lt;/p&gt;

&lt;p&gt;Özelleştirme meselesi temel seviyede &lt;strong&gt;html, css&lt;/strong&gt; bilgisi gerektiriyor tabii ama gözünüz korkmasın her şey oldukça basit.&lt;/p&gt;

&lt;p&gt;Taslakta gördüklerimizi VS Code yardımı ile projede aratırsak işimiz oldukça kolaylaşacaktır. &lt;strong&gt;&lt;em&gt;BUL&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;ve&lt;/em&gt; &lt;strong&gt;&lt;em&gt;DEĞİŞTİR&lt;/em&gt;&lt;/strong&gt; mottomuz bu! 💪🏽 Bir kaç dokunuşla aşağıdaki görüntüyü elde etmek oldukça zahmetsiz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KJYFvnVw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2ANB8n06R1JaOoLKaC9zGFnw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KJYFvnVw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2ANB8n06R1JaOoLKaC9zGFnw.png" alt="" width="880" height="332"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  🔴4.Adım — Hiyerarşiyi kavrayalım 👮🏽‍♂️
&lt;/h4&gt;

&lt;p&gt;Giriş sayfamız oldukça güzel görünüyor. Şimdi de sayfalama hiyerarşisini kavrayalım. Logomuzun hemen yanında görünen öğreticiye tıklayalım, (eğer değiştirmediyseniz tutoriala). Şöyle bir görüntü bizi karşılıyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Pk_64Em6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/858/1%2A339Q97sPudozAimc8lKFYA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Pk_64Em6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/858/1%2A339Q97sPudozAimc8lKFYA.png" alt="" width="858" height="266"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bunları temizlemekle uğraşmayacağım, ama yenileri nasıl eklenir göstereceğim. Şimdi yukarıda ki gibi biz de bir klasör ve md(markdown) dosyası oluşturalım.&lt;/p&gt;

&lt;p&gt;Öncelikle isimler kafamızı karıştırmasın lütfen, doğru yerde olduğumuza yani; &lt;strong&gt;📂docs’un altında ki 📂docs klasöründe olduğumuza emin olalım&lt;/strong&gt; ve bir klasör oluşturup içerisine &lt;strong&gt;_category_.json&lt;/strong&gt; adında bir json dosyası oluşturalım. Default gelenlerden birini içinden jsonı kopyalayabiliriz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--e1b90QsR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AiCZvxCnetlD_m6lgCwcX5Q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--e1b90QsR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AiCZvxCnetlD_m6lgCwcX5Q.png" alt="" width="880" height="236"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu json dosyası klasörümüzün ara yüzde hangi isimle görüneceğini ve hangi sırada olacağını belirleyecek. Ve içeriği şöyle olacak;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MMk85X37--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/777/1%2AQb_sOrZMz3f-O7TfbfXITg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MMk85X37--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/777/1%2AQb_sOrZMz3f-O7TfbfXITg.png" alt="" width="777" height="269"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Md dosyalarımız standart md dosyaları aslında ama burada da küçük bir kaç detay var. Klasörümüzün adını ve sıralamasını belirlerken json’a ihtiyaç duymuştuk, md dosyalarında ise bu json’a ihtiyaç yok. Kendi içlerinde belirtiyoruz. Yani şöyle;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HI5itypf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A5LFSHMkLE4rxuALksVUMdw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HI5itypf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A5LFSHMkLE4rxuALksVUMdw.png" alt="" width="880" height="189"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Eğer yukarıdaki adımları başarılı bir şekilde uygulayabildiysek, görünümümüz aşağıdaki gibi olacak. Değişikliklerin yansımaz ise, belki bir durdurup &lt;strong&gt;(CTRL + C)&lt;/strong&gt; başlatmak &lt;strong&gt;(npm start)&lt;/strong&gt;gerekebilir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--T8IptAk0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/904/1%2ADBbYMsQFnVCCCFpJgQJ-Wg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--T8IptAk0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/904/1%2ADBbYMsQFnVCCCFpJgQJ-Wg.png" alt="" width="880" height="284"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  💡Bir sonraki adıma geçmeden önce şunları belirteyim;
&lt;/h4&gt;

&lt;p&gt;➡️Sadece &lt;strong&gt;MD&lt;/strong&gt; değil &lt;strong&gt;MDX&lt;/strong&gt; dosyası da desteklenir.&lt;br&gt;&lt;br&gt;
➡️ &lt;strong&gt;React.js&lt;/strong&gt; konsepti ile özgün sayfalar oluşturulabilir.&lt;br&gt;&lt;br&gt;
➡️Blog sayfası düzenlenecekse, blog postlarının &lt;strong&gt;başına tarih eklenmelidir.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
➡️Yazar bilgileri &lt;strong&gt;authors.yml&lt;/strong&gt; dosyasından düzenlenebilir.&lt;br&gt;&lt;br&gt;
➡️Renkler &lt;strong&gt;custom.css&lt;/strong&gt; dosyasından ayarlanabilir.&lt;/p&gt;
&lt;h4&gt;
  
  
  🔴5.Adım — Dokümanımızı yayınlayalım! 🌍
&lt;/h4&gt;

&lt;p&gt;Biz her ne kadar github.io üzerinde yayınlayacak olsak dahi &lt;strong&gt;docusaurus&lt;/strong&gt; bir çok platformda kolayca yayınlama hazır halde geliyor. &lt;a href="https://docusaurus.io/docs/deployment"&gt;Buradan&lt;/a&gt; detaylara ulaşabilirsiniz.&lt;/p&gt;

&lt;p&gt;github.io üzerinde yayınlamaya geçmeden önce &lt;strong&gt;docusaurus.config.js&lt;/strong&gt; bir takım ayarlamalar yapmamız gerekiyor. Neler yapılması gerektiğini yorum satırları olarak ekledim.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4CacsYP_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/746/1%2AK78wBxFglurVmVz9lBqPVg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4CacsYP_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/746/1%2AK78wBxFglurVmVz9lBqPVg.png" alt="" width="746" height="303"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gerekli ayarlamaları yaptıktan sonra; biraz sonra vereceğim kod normal terminalde çalışmayacağı için &lt;strong&gt;git bach&lt;/strong&gt; ‘e geçiyoruz ve komutu çalıştıracağımız yolu yazıyoruz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aH5-p37S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AvDwuSrPXunL_D_Zp92nSHQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aH5-p37S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AvDwuSrPXunL_D_Zp92nSHQ.png" alt="" width="880" height="220"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💡Eğer &lt;strong&gt;yarn&lt;/strong&gt; kurulu değilse &lt;strong&gt;npm install --global yarn&lt;/strong&gt; komutu ile kurabilirsiniz.&lt;/p&gt;

&lt;p&gt;Ardından deploy için çalıştırmamız gereken kodu yapıştırıyoruz;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**GIT\_USER=hakanyalitekin yarn deploy**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Eğer her şey yolunda giderse şöyle bir görüntü oluşmalı, ve bize dokümanımızın yayınlandığı URL’i veriyor olması gerekiyor.&lt;br&gt;&lt;br&gt;
🌍 &lt;a href="https://hakanyalitekin.github.io/docDemo/"&gt;&lt;strong&gt;https://hakanyalitekin.github.io/docDemo/&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--35QpTLNG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/938/1%2A9KJEWc_gqA_09s3M-VjqXg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--35QpTLNG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/938/1%2A9KJEWc_gqA_09s3M-VjqXg.png" alt="" width="880" height="286"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Artık her güncellemede yukarıdaki komutu çalıştırmamız yeterli olacaktır, değişiklikler otomatikman yansıyacaktır.&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Bir sonraki adıma geçmeden, meraklısına detay vereyim. Bu komut bizim için neler yaptı;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
➡️Bizim için bir branch oluşturdu (gh-pages)&lt;br&gt;&lt;br&gt;
➡️Oluşan branch’in içerisine bizim oluşturduğumuz md dosyalarından index.html’ler yaratıp koydu.&lt;br&gt;&lt;br&gt;
➡️Her değişiklikte güncellenmenin gerçekleşebilmesi için Git Action oluşturdu.&lt;br&gt;&lt;br&gt;
➡️Ve tabiki GitHub settings’in altına pages oluşturdu.(&lt;a href="https://hakanyalitekin.github.io/docDemo/"&gt;buyrunuz&lt;/a&gt;)&lt;br&gt;&lt;br&gt;
➡️Bunlar fark edebildiklerim, fark etmediğim şeylerde yapmış olabilir.🤭&lt;/p&gt;
&lt;h4&gt;
  
  
  🔴6.Adım (BONUS )— Aradığımızı kolayca bulalım! 🔍
&lt;/h4&gt;

&lt;p&gt;Hiç şüphesiz çılgınlar gibi doküman yazdık(!) Peki ya aradığımızı kolayca bulmak istersek? İnsanlar bunu da düşünmüş ve bize eklentiler sunmuş.&lt;/p&gt;

&lt;p&gt;Biz arama eklentisini dokümanımıza dahil edeceğiz fakat topluluğun oluşturduğu farklı eklentileri de &lt;a href="https://docusaurus.io/community/resources#search"&gt;&lt;strong&gt;buradan&lt;/strong&gt;&lt;/a&gt;inceleyip kurmak pek tabii mümkün.&lt;/p&gt;

&lt;p&gt;Doküman içinde arama ile ilgili bir çok alternatif var &lt;a href="https://docusaurus.io/docs/search"&gt;&lt;strong&gt;bu adrese&lt;/strong&gt;&lt;/a&gt;göz atabilirsiniz.&lt;/p&gt;

&lt;p&gt;Ben topluluk tarafında oluşturulan, aralarından kendimce en pratik uygulanabilir ve şık olanını dokümanıma dahil edeceğim.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/easyops-cn/docusaurus-search-local"&gt;&lt;strong&gt;Bu adresten&lt;/strong&gt;&lt;/a&gt; arama için kullanacağımız ilgili repo incelenebilir. Uygulaması oldukça basit. Şu komutu çalıştırıyoruz;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**npm install --save @easyops-cn/docusaurus-search-local**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;npm paket kurulumu tamamlandıktan sonra, &lt;strong&gt;docusaurus.config.js&lt;/strong&gt; dosyamızın en altına (farklı yerde olabilir) aşağıdaki kod bloğunu yapıştırıyoruz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;themes: [
    [
      require.resolve("[@easyops](http://twitter.com/easyops)-cn/docusaurus-search-local"),
      {
        hashed: true,
      },
    ],
  ],
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yani şöyle oluyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RnPe3oGw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/832/1%2ANZ2BZlFMRIQ9AYG_e0mGeg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RnPe3oGw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/832/1%2ANZ2BZlFMRIQ9AYG_e0mGeg.png" alt="" width="832" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Artık arama kutucuğumuz hazır. Lokalde çalışırken şöyle bir uyarı alıyoruz. Bu çok normal çünkü; aramayı proje çıktısında yani html üzerinden yapıyor. Bu tüm arama eklentileri için geçerli bir uyarı. Dokümanı paylaştığınızda böyle bir uyarı ile karşılamayacaksınız.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QCAoyqxw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/632/1%2ACxMbYCI2J2W8vBIKc0tdRg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QCAoyqxw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/632/1%2ACxMbYCI2J2W8vBIKc0tdRg.png" alt="" width="632" height="161"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Yukarıda paylaştığım &lt;strong&gt;GIT_USER=hakanyalitekin yarn deploy&lt;/strong&gt; komutuyla dokümanımın güncel halini tekrar yayınlıyorum.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UY3H76Qe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/622/1%2AStwms_DOWTvEHMca7LgcOw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UY3H76Qe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/622/1%2AStwms_DOWTvEHMca7LgcOw.png" alt="" width="622" height="290"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;VE MANZARA MUHTEŞEM! 🌍&lt;/p&gt;

&lt;p&gt;Umarım ufakta olsa Türkçe kaynak oluşturmaya, dokümantasyon oluşturmaya faydam dokunmuştur. Bir sonraki yazıda görüşmek üzere.&lt;/p&gt;

</description>
      <category>documentation</category>
      <category>wiki</category>
      <category>opensource</category>
      <category>docusaurus</category>
    </item>
    <item>
      <title>Ngrok ile Localhost’u Dış Dünyaya Açmak</title>
      <dc:creator>Hakan Yalitekin</dc:creator>
      <pubDate>Sat, 29 Jan 2022 23:32:18 +0000</pubDate>
      <link>https://dev.to/hakanyalitekin/ngrok-ile-localhostu-dis-dunyaya-acmak-flg</link>
      <guid>https://dev.to/hakanyalitekin/ngrok-ile-localhostu-dis-dunyaya-acmak-flg</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eNzh2XuX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/900/1%2ACxP44anoWmU70MZtcMxE3A.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eNzh2XuX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/900/1%2ACxP44anoWmU70MZtcMxE3A.png" alt="" width="880" height="489"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  💡 Ngrok Nedir?
&lt;/h4&gt;

&lt;p&gt;Şöyle hayal edelim, kendi lokalimizde bir şeyler geliştiriyoruz ve bir arkadaşımızdan fikir almamız gerekti, müşteri ilerlemeyi görmek istedi ya da geliştirmek istediğimiz web uygulamasının gerçektende mobil bir telefonda nasıl göründüğünü merak ettik. Yayınlama süreçleriyle uğraşmak istemiyor olabiliriz ya da henüz altyapımız hazır olmayabilir.&lt;/p&gt;

&lt;p&gt;Örnekleri arttırmak pek tabii mümkün.&lt;/p&gt;

&lt;p&gt;🌍İşte böylesi senaryolarda hayatımızı kolaylaştıracak uygulamamızın adı &lt;strong&gt;ngrok.&lt;/strong&gt; Saniyeler içerisinde kendi lokalimizdeki bir uygulamayı dünyanın herhangi bir yerinden erişilebilir hale getirebiliriz. Hatta şifre bile koyabiliriz. Tek yapmamız gereken hangi portun izleneceğini söylemek.&lt;/p&gt;

&lt;p&gt;📢 Ngrok kendisini şöyle tanıtıyor, NAT’ların ve güvenlik duvarlarının arkasındaki yerel sunucuları güvenli tüneller üzerinden tüm dünyada erişilebilir hale getirir.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;NAT (Network Address Translation — Ağ Adresi Dönüştürme) Ağ / IP maskelemeyle birlikte, bir adres uzayını gizlemek için kullanılan teknik bir terimdir. — &lt;a href="https://www.wikiwand.com/tr/NAT"&gt;wikipedia&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  🧑‍💻Haydi Deneyelim
&lt;/h4&gt;

&lt;p&gt;Öncelikle &lt;a href="https://ngrok.com/"&gt;&lt;strong&gt;bu adres&lt;/strong&gt;&lt;/a&gt; üzerinden resmi sitesine gidip bir hesap açmamız gerekiyor. Akabinde bizi bir dashboard ekranı karşılıyor. İşletim sistemimize uygun olan versiyonu indiriyoruz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--X5n_I6hW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AQZKRpgfmVDoHCLvlFnztRg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--X5n_I6hW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AQZKRpgfmVDoHCLvlFnztRg.png" alt="" width="880" height="242"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Zaten dashboard ekranını açılır açılmaz bizi sırasıyla izleyeceğim adımlar karşılıyor.&lt;/p&gt;

&lt;h4&gt;
  
  
  1.Adım
&lt;/h4&gt;

&lt;p&gt;Zip dosyasını istediğimiz herhangi bir konuma çıkarıyoruz. Uygulamamızı çalıştırıyoruz. Yayın süresince de açık bırakmalıyız aksi halde yayın sonlanır.&lt;/p&gt;

&lt;h4&gt;
  
  
  2.Adım
&lt;/h4&gt;

&lt;p&gt;Yine dashboard ekranında hali hazırda bulunan authtoken bilgisini alıp komut satırında çalıştırıyoruz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--s-8CJt_y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AdAw3oG0LrzD6H2mcnfVP9g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--s-8CJt_y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AdAw3oG0LrzD6H2mcnfVP9g.png" alt="" width="880" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RglVt5RD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/828/1%2AL_wtXqZ1jS-2hovvDuZofg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RglVt5RD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/828/1%2AL_wtXqZ1jS-2hovvDuZofg.png" alt="" width="828" height="50"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;authtoke save to configuration file gibi bir mesaj alıyorsak buraya kadar her şey yolunda demektir.&lt;/p&gt;

&lt;h4&gt;
  
  
  3.Adım
&lt;/h4&gt;

&lt;p&gt;Oturumumuzu doğruladığımıza göre, şimdi tek yapmamız gereken ilgili portu dışarıya açmak kaldı.&lt;/p&gt;

&lt;p&gt;Ben örnek bir .Net 5 API’ı oluşturdum ve default’ta swagger gelsin dedim. 5001 portunda ayağa kaldırdım.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ngrok http -host-header=localhost https://localhost:5001
##Eğer şifre koymak istersek auth tag'ini eklememiz gerekiyor##
ngrok http -auth="deneme:1234" -host-header=localhost https://localhost:5001
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yukarıdaki kodu çalıştırdığımız da aşağıdaki gibi bir görüntü elde ediyor olmamız gerekiyor. Bu artık yayında olduğumuz anlamına geliyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eKv6Nahz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A9RDhTiQ-V5ZkenEEK2gN0Q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eKv6Nahz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A9RDhTiQ-V5ZkenEEK2gN0Q.png" alt="" width="880" height="502"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hem httphem de https olarak sunulan linklerde herhangi birine tıklıyoruz ve uygulamamızın çalışıp çalışmadığını teyit ediyoruz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--is1971sR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2ATU43oP9u8s5qkXiERZJvHg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--is1971sR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2ATU43oP9u8s5qkXiERZJvHg.png" alt="" width="880" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8x3BRK5m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AOKh6CcOec5uEOG32TIg9pw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8x3BRK5m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AOKh6CcOec5uEOG32TIg9pw.png" alt="" width="880" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Her şey yolunda görünüyor; istek ayrıntılarını incelemek istersek ngrok’un sunduğu arayüze &lt;a href="http://localhost:4040/"&gt;&lt;strong&gt;http://localhost:4040/&lt;/strong&gt;&lt;/a&gt; üzerinden göz atabiliriz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CzZerZua--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AmsyJw24_uVXCpDY5VMN0EQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CzZerZua--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AmsyJw24_uVXCpDY5VMN0EQ.png" alt="" width="880" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📝Özetleyecek olursak;&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://ngrok.com/"&gt;ngrok&lt;/a&gt;’a kaydol ve güncel sürümü indir&lt;/li&gt;
&lt;li&gt;Bir token al.&lt;/li&gt;
&lt;li&gt;ngrok’u başlat ve şu komutu çalıştır &lt;strong&gt;ngrok authtoken YOUR_AUTHTOKEN&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Bir tünel oluştur: &lt;strong&gt;ngrok http -host-header=localhost&lt;/strong&gt; &lt;a href="https://localhost:44313/"&gt;&lt;strong&gt;https://localhost:&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;5001&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Bitirmeden önce şunu belirtmeliyim ki &lt;strong&gt;ngrok ücretli bir uygulamadır&lt;/strong&gt; , ücretsiz özellikleri kısıtlıdır. Ücretli ve ücretsiz versiyonlar arasında farklılıkları pricing sekmesinden inceleyebilirsiniz.&lt;/p&gt;

&lt;p&gt;Ayrıca; ngrok en kolay ve en iyi bilinen &lt;strong&gt;localhost&lt;/strong&gt; tünel açma hizmetidir, ancak alternatif seçenekler mevcuttur:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://localxpose.io/"&gt;&lt;strong&gt;LocalXpose&lt;/strong&gt;&lt;/a&gt; : ücretsiz seçeneklere sahip ticari bir hizmet. Kayıt gereklidir, ancak terminal tabanlı ve grafik kullanıcı arayüzü mevcuttur.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://localhost.run/"&gt;&lt;strong&gt;localhost.run&lt;/strong&gt;&lt;/a&gt; : SSH üzerinden çalışan ücretsiz bir hizmettir, bu nedenle istemci veya kayıt gerekmez.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://localtunnel.github.io/www/"&gt;&lt;strong&gt;localtunnel&lt;/strong&gt;&lt;/a&gt; : açık kaynaklı bir Node.js istemcisi. Kayıt gerekli değildir.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/azimjohn/jprq"&gt;&lt;strong&gt;JPRQ&lt;/strong&gt;&lt;/a&gt; : açık kaynaklı bir Python istemcisi. Kayıt gerekli değildir.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/antoniomika/sish"&gt;&lt;strong&gt;sish&lt;/strong&gt;&lt;/a&gt; : açık kaynaklı, Docker tabanlı bir kapsayıcı istemcisi. Kayıt gerekli değildir.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Umarım ufakta olsa faydam dokunmuştur. Bir sonraki yazıda görüşmek üzere.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.sitepoint.com/use-ngrok-test-local-site/"&gt;ngrok Step-by-Step Guide: Easily Share Your Local Server - SitePoint&lt;/a&gt;&lt;/p&gt;

</description>
      <category>localhost</category>
      <category>ngrok</category>
      <category>nets</category>
      <category>publishing</category>
    </item>
    <item>
      <title>Örneklerle En Popüler Sıralama Algoritmaları (C#)</title>
      <dc:creator>Hakan Yalitekin</dc:creator>
      <pubDate>Sat, 08 Jan 2022 16:26:00 +0000</pubDate>
      <link>https://dev.to/hakanyalitekin/orneklerle-en-populer-siralama-algoritmalari-c-1elj</link>
      <guid>https://dev.to/hakanyalitekin/orneklerle-en-populer-siralama-algoritmalari-c-1elj</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F584%2F1%2A8iQD2QiLGIMvDMchx7PnfA.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F584%2F1%2A8iQD2QiLGIMvDMchx7PnfA.jpeg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Bu kapak görseli “Insertion(Araya Ekleme) Sıralaması” için popüler bir örnektir.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;🤷‍♂️Öncelikle harika bir yazı olmayabilir, beklentiyi düşürerek devam etmenizi rica edeceğim. Ama “işte aradığım sadelik” de diyebilirsiniz tam kestiremiyorum.😊 Derleme notlar gibi düşünülebilir. Elimdeki sadeleştirdiğim kod örneklerini, gerek danslar gerek gif’lerle destekleyerek aktarmaya çalışacağım.&lt;/p&gt;

&lt;p&gt;Sıralama algoritmaları oldukça fazla. Ben aralarından, popüler ve anlaşılması kolay olanları seçmeye çalıştım.&lt;/p&gt;

&lt;p&gt;🤭İş hayatınızda çok işinize yarayacak gibi bir taahhüttüm yok ama bir bakış açışı katabilir. En kötü mülakatlarda adlarını sayabilirsiniz.&lt;/p&gt;

&lt;p&gt;☕Bu yazı içerisinde paylaşılan kod örneklerini bakarak anlamak zor olabilir. Kahvenizi de soğutmadan sakini sakin debug etmenizi şefkatle öneriyorum.&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/hakanyalitekin/SortingAlgorithms" rel="noopener noreferrer"&gt;Github Linki&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Algoritmaları tek tek ele almadan önce, faydalı olacağını düşündüğüm bazı linkler paylaşmak istiyorum. Devam etmeden önce mutlaka tek tek incelenmelidir.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;➡️ &lt;strong&gt;Büyük resmi görmek:&lt;/strong&gt; &lt;a href="https://www.toptal.com/developers/sorting-algorithms" rel="noopener noreferrer"&gt;https://www.toptal.com/developers/sorting-algorithms&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;➡️ &lt;strong&gt;Dans Videoları İle Olayı Kavramak:&lt;/strong&gt; &lt;a href="https://www.youtube.com/watch?v=lyZQPjUT5B4&amp;amp;list=PLcX11VWS1PdA4dSPip8-1JfKxFa32X53y&amp;amp;index=6" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=lyZQPjUT5B4&amp;amp;list=PLcX11VWS1PdA4dSPip8-1JfKxFa32X53y&amp;amp;index=6&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;➡️ &lt;strong&gt;Adım Adım İncelemek 1:&lt;/strong&gt; &lt;a href="https://sadanandpai.github.io/sorting-visualizer/dist/" rel="noopener noreferrer"&gt;https://sadanandpai.github.io/sorting-visualizer/dist/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;➡️ &lt;strong&gt;Adım Adım İncelemek 2:&lt;/strong&gt; &lt;a href="https://visualgo.net/en/sorting?slide=1" rel="noopener noreferrer"&gt;https://visualgo.net/en/sorting&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  📌 Bilmekte fayda var, sıralama algoritmalarının bazı kriterlere göre sınıflandırılır:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bellek Kullanımı:&lt;/strong&gt; Çalışırken ek bellek ihtiyacı duyan algoritmalarda kullanılabilecek bir ölçüttür.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hesaplama Karmaşıklığı:&lt;/strong&gt; Temel üç grup ölçek kullanılır. Bunlar &lt;strong&gt;best&lt;/strong&gt; , &lt;strong&gt;average&lt;/strong&gt; ve &lt;strong&gt;worst&lt;/strong&gt; durumu olarak belirtilir. İşlem yoğunluğu, zaman işleyişiyle paralel olduğundan algoritmanın işleyiş süresini de etkiler.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Yer Değiştirme Karmaşıklığı:&lt;/strong&gt; İçerisinde ek bellek kullanmayan (in place) algoritmalarda kullanılan karşılaştırılabilmesi için önemli bir ölçüttür.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kararlılık(Stability):&lt;/strong&gt; Algoritmanın uygulanması sırasında sıralanmış bir verinin tekrar sıralamaya tabi tutulup tutulmadığını belirten ölçektir.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rekürsiflik(Tekrar):&lt;/strong&gt; İç içe kendi kendini çağıran algoritmalarda kullanılan bir ölçüttür. Burada en önemli kriter stack dediğimiz maksimum iç içe çağırım kapasitesine dikkat edilmesi ve bu kapasitenin kullanılma sıklığıdır.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;En önemli kriterler&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hafıza Verimliliği&lt;/strong&gt; (Memory Efficiency)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zaman Verimliliği&lt;/strong&gt; (Time Efficiency)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  📌&lt;strong&gt;Bubble (Kabarcık) Sorting&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Sıralanacak dizinin üzerinde sürekli iki bitişik öğeyi karşılaştırır. Öğelerin yanlış sırada olmaları durumunda yerlerini değiştirir. Sıralama gerçekleşene kadar devam eder.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F500%2F1%2ApLitVc1EYcAXPJLXc1uxBg.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F500%2F1%2ApLitVc1EYcAXPJLXc1uxBg.gif"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Bubble Sorting GIF&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public static void BubbleSort(int[] array)
   {
     for(int i = 0; i &amp;lt;= array.Length - 1; i++)
     {
       for(int j = 1; j &amp;lt;= array.Length - 1; j++)
        {
          if(array[j - 1] &amp;gt; array[j])
           {
              int temp = array[j - 1];
              array[j - 1] = array[j];
              array[j] = temp;
           }
        }
      }
   }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📌&lt;strong&gt;Selection (Seçmeli) Sorting&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Sıralanacak olan dizide, en küçük öğeyi seçer ve bu öğeyi sıralanmamış listenin başına yerleştirir. Sıralama gerçekleşene kadar devam eder.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F678%2F1%2ASJXnEyk5naCeR932J3MvHA.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F678%2F1%2ASJXnEyk5naCeR932J3MvHA.gif"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public static void SelectionSort(int[] array)
   {
     for(int i = 0; i &amp;lt; array.Length - 1; i++)
       {
         for (int j = i; j &amp;lt; array.Length; j++)
           {
              if (array[j] &amp;lt; array[i])
                {
                   int temp = array[j];
                   array[j] = array[i];
                    array[i] = temp;
                 }
            }
       }
   }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📌&lt;strong&gt;Insertion(Araya Ekleme) Sorting&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Sıralanacak olan dizi içerisindeki öğeyi sırasıyla alıp sürekli bir öncekiyle karşılaştırır. Kendinden daha küçük bir öğe bulana kadar öne geçmeye devam eder. Genellikle kart oyunlarında farkında olmadan uyguladığımız sıralama algoritmasıdır.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F300%2F1%2AbmfRxyIQZEK0Iu5T6YV1sw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F300%2F1%2AbmfRxyIQZEK0Iu5T6YV1sw.gif"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Insertion Sorting GIF&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public static void InsertionSort(int[] array)
    {
      for (int i = 1; i &amp;lt; array.Length; i++)
        {
           int currentValue = array[i];
           int previousIndex = i - 1;
           while(previousIndex &amp;gt;= 0 &amp;amp;&amp;amp; currentValue &amp;lt; array[previousIndex])
            {
               array[previousIndex + 1] = array[previousIndex];
               previousIndex = previousIndex - 1;
            }
           array[previousIndex + 1] = currentValue;
        }
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📌 &lt;strong&gt;Merge (Birleştirme) Sorting&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Sıralanacak olan diziyi, ikişer elemanı kalana kadar sürekli olarak ikiye böler ve daha sonra bu parçaları kendi içlerinde sıralayarak birleştirilir. Elde edilen dizi, sıralı dizinin kendisidir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F300%2F1%2AopwN0BhtH4zvPF697fPlow.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F300%2F1%2AopwN0BhtH4zvPF697fPlow.gif"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Merge Sorting GIF&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public static void Sort(int[] array, int left, int right)
{

   //Recursive yani kendi kendini çağıran bir metot.

int leftEnd; //Bu aslında ikiye bölünmüş listenin, birinci parçasının yani sol listenin son indeksini temsil ediyor.
   if (left &amp;lt; right)
   {
       leftEnd = (left + right) / 2;

//Sol listeyi sürekli 2'ye bölüyoruz.
       Sort(array, left, leftEnd);

//Sağ listeyi sürekli 2'ye bölüyoruz.
       Sort(array, (leftEnd + 1), right);

DoMerge(array, left, (leftEnd + 1), right);

Printer.Print(array);
   }

}
public static void DoMerge(int[] array, int left, int rightStart, int right)
{
    int[] temp = new int[array.Length];
    int leftEnd, numElements, tempLeft;

tempLeft = left;
    leftEnd = rightStart - 1;
    numElements = right - left + 1;

while ((left &amp;lt;= leftEnd) &amp;amp;&amp;amp; (rightStart &amp;lt;= right))
    {
        if (array[left] &amp;lt;= array[rightStart])
        {
            temp[tempLeft++] = array[left++];
        }
        else
        {
            temp[tempLeft++] = array[rightStart++];
        }
    }
    while (left &amp;lt;= leftEnd)
    {
        temp[tempLeft++] = array[left++];
    }

while (rightStart &amp;lt;= right)
    {
        temp[tempLeft++] = array[rightStart++];
    }

for (int i = 0; i &amp;lt; numElements; i++)
    {
        array[right] = temp[right];
        right--;
    }

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yukarıda eklediğim github linki üzerinden uygulamayı indirip. Tek tek incelemek, daha iyi kavranmasını sağlanabilir.&lt;/p&gt;

&lt;p&gt;Bazı sıralama algoritmalarını direkt kodun içerisinde bıraktım buraya eklemedim.&lt;/p&gt;

&lt;p&gt;Bazılarının da ikinci versiyonlarını ekledim.&lt;/p&gt;

&lt;p&gt;Umarım ufakta olsa faydam dokunmuştur. Bir sonraki yazıda görüşmek üzere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kaynaklar;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.wikiwand.com/tr/S%C4%B1ralama_algoritmas%C4%B1" rel="noopener noreferrer"&gt;https://www.wikiwand.com/tr/S%C4%B1ralama_algoritmas%C4%B1&lt;/a&gt; &lt;a href="https://www.halildurmus.com/2021/02/22/siralama-algoritmalari-sorting-algorithms/" rel="noopener noreferrer"&gt;https://www.halildurmus.com/2021/02/22/siralama-algoritmalari-sorting-algorithms/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>sıralamaalgoritmalar</category>
      <category>insertionsort</category>
      <category>bubblesort</category>
      <category>mergesort</category>
    </item>
    <item>
      <title>Detaylı RabbitMQ Anlatımı ve Tüm Exchange Türleriyle Örnekler (Docker/.Net 5)</title>
      <dc:creator>Hakan Yalitekin</dc:creator>
      <pubDate>Sat, 22 May 2021 09:43:16 +0000</pubDate>
      <link>https://dev.to/hakanyalitekin/detayli-rabbitmq-anlatimi-ve-tum-exchange-turleriyle-ornekler-dockernet-5-1845</link>
      <guid>https://dev.to/hakanyalitekin/detayli-rabbitmq-anlatimi-ve-tum-exchange-turleriyle-ornekler-dockernet-5-1845</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F898%2F1%2AN-3o49fGhQgFuRCAIJ0YZg.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F898%2F1%2AN-3o49fGhQgFuRCAIJ0YZg.jpeg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Merhabalar,&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.notion.so/" rel="noopener noreferrer"&gt;&lt;strong&gt;Notion.so&lt;/strong&gt;&lt;/a&gt; üzerinde oldukça ciddi emek harcayarak kendim için tuttuğum notları biraz toparlayıp burada yayınlamanın kamu yararı için oldukça faydalı olacağını düşündüm. Umarım yanılmamışımdır.&lt;/p&gt;

&lt;p&gt;Çok iddialı konuşup beklentiyi de yükseltmek istemiyorum ama RabbitMQ için Türkçe olarak en kapsamlı kaynağı okuyor olabilirsiniz.🙂&lt;/p&gt;

&lt;p&gt;Eğer Exchange tipleri ile ilgili örneklere açıklama satırları eklediysen uğraştırma bizi bir çatal alıp kaçalım, bir ara inceleriz diyen arkadaşlar için doğrudan erişebilecekleri &lt;a href="https://github.com/hakanyalitekin/BasicRabbitMQ" rel="noopener noreferrer"&gt;&lt;strong&gt;GitHub linki.&lt;/strong&gt;&lt;/a&gt; ** 🍴**&lt;/p&gt;

&lt;p&gt;Eğer notion kullanan arkadaşlar varsa kopyalamaları için ve oradan devam etmeleri için köprüden önceki son çıkış &lt;a href="https://www.notion.so/RabbitMQ-9b60e97fc4a14593a2a102dd3f6bc744" rel="noopener noreferrer"&gt;&lt;strong&gt;burası&lt;/strong&gt;&lt;/a&gt;.🚗&lt;/p&gt;

&lt;p&gt;Bu yazıda, Medium’un tekdüzeliğinden biraz olsun arınmak için fazlaca emoji kullandım umarım Kobra Murat’ın evine benzememiştir. 😅&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;📌RabbitMQ nedir?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;RabbitMQ, Erlang dili ile açık kaynak olarak geliştirilen, popüler ve hızlı bir &lt;strong&gt;mesaj-kuyruk&lt;/strong&gt; yapısıdır. &lt;strong&gt;Advanced Message Queuing Protocol (AMQP)&lt;/strong&gt; protokolünü kullanarak uygulamalar ve sunucular arası veri alışverişini sağlar.&lt;/p&gt;

&lt;p&gt;Bu uygulamalar arası iletişim sağlanırken, aynı teknolojileri kullanma zorunluluğu yoktur. Yani mesajı yayınlayan uygulama(Publisher) &lt;strong&gt;Python&lt;/strong&gt; diliyle, mesajı dinleyen uygulama(consumer) ise &lt;strong&gt;C#&lt;/strong&gt; diliyle yazılmış bir .Net teknolojisi olabilir.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💊message broker:&lt;/strong&gt; mesaj kuyruk sistemlerine verilen genel bir isimdir.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;RabbitMQ’ya alternatif diğer message broker’lar;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🔹 Azure Queue Storage&lt;br&gt;&lt;br&gt;
🔹 Azure Service Bus&lt;br&gt;&lt;br&gt;
🔹 Kafka&lt;br&gt;&lt;br&gt;
🔹 MSMQ&lt;/p&gt;
&lt;h3&gt;
  
  
  📌Neden ve nerelerde RabbitMQ kullanmalıyız?
&lt;/h3&gt;

&lt;p&gt;RabbitMQ ya da diğer message broker sistemlerini kullanmak için birçok neden olabilir, bu nedenlerden en ön plana çıkanı tabii ki &lt;strong&gt;kullanıcıyı gereksiz bekleyişlerden kurtarmak&lt;/strong&gt; ve bu sayede kullanıcı deneyimini arttırmak.&lt;/p&gt;

&lt;p&gt;Biraz daha açacak olursak eğer; çok uzun süren bir PDF işlemi ya da kullanıcının sonucunu çok da önemsemediği geri dönüş mailleri gibi senaryolarda message brokerları kullanmak oldukça mantıklı olacaktır.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Özetleyecek olursak aşağıdaki senaryolarda RabbitMQ kullanılabilir;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔹&lt;/strong&gt; Son kullanıcıyı etkilemeyen arka plan işlemlerinde&lt;br&gt;&lt;br&gt;
&lt;strong&gt;🔹&lt;/strong&gt; Farklı platformlardaki uygulamalar arasında asenkron veri transferi işlemlerinde&lt;br&gt;&lt;br&gt;
&lt;strong&gt;🔹&lt;/strong&gt; Anlık işlemlerin çok önemli olmadığı işlemlerde (Örneğin; siparişiniz yola çıktı maili)&lt;br&gt;&lt;br&gt;
&lt;strong&gt;🔹&lt;/strong&gt; Veri tutarlılığının önemli olduğu işlemlerde (Örneğin; birçok pazaryerinden gelen siparişler sonucu stok miktarının tutarlılığı)&lt;br&gt;&lt;br&gt;
&lt;strong&gt;🔹&lt;/strong&gt; İşlem hacminin büyük olduğu sunucuyu yoran işlemlerde&lt;/p&gt;

&lt;p&gt;Örnekleri arttırmak pek tabii mümkün.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;📌RabbitMQ nasıl çalışır?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;RabbitMQ Publisher ve Consumer mantığıyla çalışır. Yani mesajı üretip kutuya( &lt;strong&gt;queue&lt;/strong&gt; ) atan ve kutudaki mesajları okuyan olmak üzere iki temel yapı üzerine inşa edilmiştir. Bir de senaryomuza göre bu üretilen mesajların hangi kutuya atılması gerektiğinden sorumlu olan &lt;strong&gt;exchange&lt;/strong&gt; yapımız mevcut.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F525%2F1%2Ax6TMitQA9iioiE7IHc7RJQ.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F525%2F1%2Ax6TMitQA9iioiE7IHc7RJQ.gif"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;💡Bazı terimleri inceleyecek olursak;&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;🔹Producer/Publisher(&lt;/strong&gt;yayıncı&lt;strong&gt;):&lt;/strong&gt; Queue'ya mesajı gönderen yapıya verilen isimdir.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;🔹Exchange(&lt;/strong&gt;yönlendirici*&lt;em&gt;):&lt;/em&gt;* Routing, yani kuyruğa iletilen mesajı yönlendiren yapı.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;🔹Queue(&lt;/strong&gt;kuyruk*&lt;em&gt;):&lt;/em&gt;* First-in-first-out(FIFO) ilk giren ilk çıkar mantığıyla çalışan kuyruk yapısı.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;🔹Consumer(&lt;/strong&gt;tüketici*&lt;em&gt;):&lt;/em&gt;* Queue'yu dinleyerek ilgili mesajları teslim alan yapıya verilen isimdir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Genel hatlarıyla iş akışı aşağıdaki gibidir;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F708%2F1%2AH4Yg3MX0y1zFvMKBi9aMUg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F708%2F1%2AH4Yg3MX0y1zFvMKBi9aMUg.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bir yayıncı mesajı yayınlar, yönlendirici ilgili mesajı ilgili kuyruğa iletir ve dinleyiciler ilgili kuyruktan dinleme işlemini gerçekleştirir.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💊&lt;/strong&gt; Producer/Publisher illa ki Exchange kullanmak zorunda değildir. Doğrudan Queue’ya mesajı iletebilir.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;💊&lt;/strong&gt; Consumer birden fazla kuyruğu dinleyebildiği gibi bir kuyruğu da birden fazla consumer dinleyebilir.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Olası bir senaryo üzerinden inceleyecek olursak eğer;&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AV4Wpr6GPlhj4rvkUJsKlJg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AV4Wpr6GPlhj4rvkUJsKlJg.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1️⃣&lt;/strong&gt; Kullanıcı PDF oluşturma isteğini iletir.&lt;br&gt;&lt;br&gt;
2️⃣ Producer ilgili PDF oluşturma isteğini Message Broker’a(RabbitMQ) iletir.&lt;br&gt;&lt;br&gt;
3️⃣ RabbitMQ ilgili isteği, Exchange ile ya da doğrudan kuyruğa ekler.&lt;br&gt;&lt;br&gt;
4️⃣ Consumer kuyruktaki PDF oluşturma isteğini alır ve PDF’i oluşturur.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;📌 RabbitMQ’yu Docker Üzerinde Nasıl Kurabiliriz?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;RabbitMQ ile ilgili çalışabileceğimiz bir çok farklı ortam yaratmak mümkün, &lt;a href="https://www.rabbitmq.com/download.html" rel="noopener noreferrer"&gt;&lt;strong&gt;bu link&lt;/strong&gt;&lt;/a&gt; üzerinden bir çok kurulum ortamı için bilgi edinilebilir.&lt;/p&gt;

&lt;p&gt;🔹 &lt;strong&gt;CloudAMQP&lt;/strong&gt;  &lt;strong&gt;kullanarak;&lt;/strong&gt; &lt;a href="https://customer.cloudamqp.com/signup" rel="noopener noreferrer"&gt;https://customer.cloudamqp.com/signup&lt;/a&gt; linki üzerinden hesap açarak, maksimum 100 kuyruk ve 28 gün mesaj saklama limitleri dahilinde kullanmak mümkün.&lt;/p&gt;

&lt;p&gt;🔹 &lt;strong&gt;Docker’a kurulum yaparak;&lt;/strong&gt; &lt;a href="https://hub.docker.com/_/rabbitmq" rel="noopener noreferrer"&gt;https://hub.docker.com/_/rabbitmq&lt;/a&gt; linki üzerinden gerekli talimatları takip ederek.&lt;/p&gt;

&lt;p&gt;🔹 &lt;strong&gt;İşletim sistemine kurulum yaparak;&lt;/strong&gt; &lt;a href="https://www.rabbitmq.com/install-windows.html" rel="noopener noreferrer"&gt;https://www.rabbitmq.com/install-windows.html&lt;/a&gt; üzerinde ilgili talimatları takip ederek kullanmak mümkün.&lt;/p&gt;
&lt;h4&gt;
  
  
  💡RabbitMQ’nun Docker Üzerinde Ayaklandırılması
&lt;/h4&gt;

&lt;p&gt;Doğrudan aşağıdaki komut ile RabbitMQ’yu ayaklandırabiliriz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run -d --name myRabbitMQ -p 5672:5672 -p 15672:15672 rabbitmq:3.8.14-management
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;💊İkinci port yönetim paneli için.&lt;br&gt;&lt;br&gt;
💊Eğer management tagını eklemezsek yönetim panelini eklemez. Sadece RabbitMQ’yu kurmuş oluruz.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Her şeyin sorunsuzca tamamlandığından emin olmak istersek eğer;&lt;/strong&gt; &lt;a href="http://localhost:15672/" rel="noopener noreferrer"&gt;http://localhost:15672/&lt;/a&gt; adresine gidip açılan ekranda kullanıcı adı ve şifre kısma &lt;strong&gt;guest&lt;/strong&gt; yazarak oturum açabiliriz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F403%2F1%2A_aQziZvRoEIPPQrAsSXiRA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F403%2F1%2A_aQziZvRoEIPPQrAsSXiRA.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sisteme giriş yaptıktan sonra bizi, kullanıcılarımızı yönetebileceğimiz, kuyruklarımızı, kanallarımızı vs. gözlemleyebileceğimiz basit bir ara yüz karşılıyor. Devam etmeden önce biraz kurcalamanızı öneririm.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2A4xLh9AFi4GnwTRPKgrj2RA.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2A4xLh9AFi4GnwTRPKgrj2RA.gif"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  📌Exchange Nedir ve Çeşitleri Nelerdir?
&lt;/h3&gt;

&lt;p&gt;En basit tabiriyle yönlendirici diyebiliriz, yani Publisher’dan gelen mesajı ya da mesajları alıp Queue’ya yönlendiren yapı olarak tanımlamak mümkün.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💊Exchange Type ile sadece Publisher ilgilenir. Consumer, Queue ile ilgilenir.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Exchange tiplerine ve örneklerine geçmeden önce temel hatlarıyla kullanacağımız yapı aşağıdaki gibi olacak. Ayrıca tüm örneklerde kullanacağımız &lt;strong&gt;tek nuget paketi&lt;/strong&gt;  &lt;strong&gt;RabbitMQ.Clientolacak.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;İlk oluşturması biraz sıkıcı ve zaman alıcı olsa da ileride hatırlamakta zorlandığımız exchange tip olduğunda bulması ve anlaşılabilir olması benim için önemliydi. Bundan sebep her birini bağımsız &lt;strong&gt;Consumer&lt;/strong&gt; ve &lt;strong&gt;Publisher&lt;/strong&gt; konsol uygulamaları olarak oluşturmak istedim.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Evet çok fazla kod tekrarı var kabul ama burada harika bir yapı kurmaya çalışmıyoruz, RabbitMQ’yu öğrenmeye çalışıyoruz :).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AtmS9MRiW0MmlOF8_o-QQdQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AtmS9MRiW0MmlOF8_o-QQdQ.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Yukarıdaki görselde anlatmaya çalıştığım gibi klasörleri ve ilgili konsol uygulamalarını oluşturduktan sonra ihtiyacımız olan nuget paketini kurduysak eğer &lt;strong&gt;Exchange türlerine geçmeden, öncelikle temel hatlarıyla bir kuyruk okuma-yazma işlemi gerçekleştirelim.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sonrasındaysa Exchange routing yapılandırmalarını tek tek inceleyerek her biri için basit örnekler yapalım.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💊 RabbitMQ’da Exchange kullanmak zorunda değiliz, doğrudan Queue’ya mesajlarımızı gönderebilir ve Consumer(lar)’ın dinlemesini sağlayabiliriz.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  1️⃣Exchange Kullanmadan Doğrudan Queue Kullanım Örneği
&lt;/h3&gt;

&lt;p&gt;Exchange kullanmadan basit bir RabbitMQ örneği yapalım. Daha önceden suda beklettiğimiz &lt;strong&gt;WithoutExchange.Publisher&lt;/strong&gt; uygulamamıza geliyoruz ve içeriğini aşağıdaki gibi kodluyoruz.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;Burada neler yaptık. Öncelikle bağlantımızı oluşturup bu bağlantı üzerinden bir kanal oluşturduk. Hemen akabinde &lt;strong&gt;QueueDeclare&lt;/strong&gt; metodunu kullanarak herhangi bir yönlendirme(exchange) kullanmadan doğrudan kuyruğumuzu oluşturduk.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💡Tabi kuyruğumuzu oluştururken belirlememiz gereken bazı parametreler vardı bunlardan biraz bahsedelim;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔹Queue:&lt;/strong&gt; Kuyruğumuzun adı. Herhangi bir exchange kullanamadığımız için bu kuyruk adı önemli. Consumer tarafında kuyruğumuza doğrudan ismiyle erişeceğiz.&lt;br&gt;&lt;br&gt;
🔹&lt;strong&gt;Durable(dayanıklı):&lt;/strong&gt; Kelime anlamı dayanıklı olan bu parametre sayesinde kuyruğumuzun nerede saklanacağını belirliyoruz. Eğer true yaparsak kuyruğumuz fiziksel, false yaparsak hafızada saklanır.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;🔹Exclusive(özel):&lt;/strong&gt; Kelime anlamı özel olan bu parametre ile kuyruğumuza farklı kanallar üzerinden erişilip erişilemeyeceğini belirliyoruz. True sadece bu kanal, false farklı kanallar üzerinden de erişilebilir demek. Kuyruğumuza Consumer uygulaması üzerinden, yani farklı bir kanal üzerinden erişeceğimiz için false yapmalıyız.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;🔹AutoDelete:&lt;/strong&gt; Kuyrukta yer alan veri Consumer’a ulaştığında silinip silinmemesi belirtilir.&lt;/p&gt;

&lt;p&gt;İşlenmeye hazır elli adet mesajımızın oluştuğunu ara yüzümüzden kontrol edelim.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F790%2F1%2AsLr8ipHMVVx04tNmeB4CUA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F790%2F1%2AsLr8ipHMVVx04tNmeB4CUA.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Şimdi gelelim bu oluşturduğumuz mesajların dinleneceği Consumer tarafına. Yapı yine oldukça basit. Öncesinde &lt;strong&gt;WithoutExchange.Consumer&lt;/strong&gt; ’e kodlarımızı yazalım sonrasında da üzerine konuşalım.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Yapılan tüm işlemleri yorum satırı olarak yazdım&lt;/strong&gt; fakat yine de Consumer tarafında neler yaptık üstünden geçelim.&lt;/p&gt;

&lt;p&gt;Öncelikle standart Publisher tarafında yaptığımız gibi, RabbitMQ’ya bağlandık. Bağlantımızı açtıktan sonra bu bağlantı üzerinden bir kanal oluşturduk.&lt;br&gt;&lt;br&gt;
Daha sonra bu kanal üzerinden her ihtimale karşı Publisher tarafında oluşturduğumuz kuyruğu, birebir aynı özellikleriyle tekrar oluşturduk. Tabi burası tercih meselesi eğer publisher tarafında kanalımızın oluştuğuna yüzde yüz eminsek Consumer tarafında tekrar oluşturmaya gerek yok.&lt;/p&gt;

&lt;p&gt;Hemen akabinde de oluşturduğumuz kanal ile &lt;strong&gt;EventingBasicConsumer&lt;/strong&gt; nesnesinden faydalanarak Consumer'ımızı yarattık.&lt;/p&gt;

&lt;p&gt;Daha sonra &lt;strong&gt;BasicConsume&lt;/strong&gt; metodunu kullanarak Consumer'ın hangi kuyruğu dinleyeceğini belirttik. Burada &lt;strong&gt;autoAck&lt;/strong&gt;  önemli.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔹AutoAck&lt;/strong&gt; (Auto Acknowledgement) &lt;strong&gt;:&lt;/strong&gt; Mesajın Consumer’a ulaştıktan sonra onaylanıp onaylanmama, haliyle silinip silinmeme durumunu belirlediğimiz parametre. Özetle;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Eğer true dersek -&amp;gt;&lt;/strong&gt; Mesajın doğru işlenip işlenmediğine bakılmaksızın sil.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Eğer false dersek -&amp;gt;&lt;/strong&gt; Sen silme ben haber vereceğim sileceğin zaman&lt;/p&gt;

&lt;p&gt;Consumer’ı çalıştırdığımızda tüm logs mesajlarımızın işlendiğini görebiliriz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F1%2A2VFFAQDPmvpoRPVYdb1AQg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F1%2A2VFFAQDPmvpoRPVYdb1AQg.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  2️⃣Fanout Exchange Tanım ve Örneği
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F520%2F1%2Acn2ZIsFFQ54NLu0U53FiNg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F520%2F1%2Acn2ZIsFFQ54NLu0U53FiNg.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En sade exchange tipimizdir. &lt;strong&gt;Publisher&lt;/strong&gt; tarafından gönderilen mesajları alıp route key tanımlaması gibi ayrımlara ihtiyaç duymadan, &lt;strong&gt;Fanout Exchange&lt;/strong&gt; ’e bind olan bütün kuyruklara aynı ve eşit bir şekilde iletilmesini sağlayan yapıdır.&lt;/p&gt;

&lt;p&gt;Consumer‘ın tek yapması gereken kuyruktaki mesajları okuyup işlemektir.&lt;/p&gt;

&lt;p&gt;Bu yapıyı radyo yayını yapan bir frekansa ya da Youtube üzerinden yayın yapan bir Youtuber’a benzetmek mümkün. Tüm dinleyiciler ilgili kanala eriştiğinde aynı mesajları alır.&lt;/p&gt;

&lt;p&gt;Az çok kafamızda bir şeyler oluştuysa eğer kodlarımızı yazmaya başlayabiliriz.&lt;/p&gt;

&lt;p&gt;Bir önceki örneğimizde yaptığımız işlemlere oldukça benzer bir yapı olacak, bundan sebep bir önceki kodlarımızın aynısını alıp daha önceden oluşturduğumuz &lt;strong&gt;FanoutExchange_Publisher&lt;/strong&gt;'a yapıştırıyorum.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Yukarıdaki kodları biraz açacak olursak; bir önceki &lt;strong&gt;WithoutExchange.Publisher&lt;/strong&gt;'den çok farklı değil.&lt;/p&gt;

&lt;p&gt;Önceden mesajlarımızı herhangi bir Exchange kullanmayıp doğrudan Queue’ya gönderdiğimiz için &lt;strong&gt;channel.BasicPublish()&lt;/strong&gt; metodunda Exchange tipimizi boş geçip, doğrudan kuyruğumuzun adını yazıyorduk. Şimdi ise tam tersini yapıyoruz.&lt;/p&gt;

&lt;p&gt;Artık &lt;strong&gt;QueueDeclare&lt;/strong&gt; metodu oluşturmamıza gerek kalmadı. Biz sadece Exchange'imizi tanımlıyoruz(logs-fanout). İsteyen Consumer kuyruğu oluşturup dinlemeye başlayabiliyor.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💊Fanout kullanınca illa Consumer tarafında oluşturulacak diye bir şey söz konusu değil, senaryomuza göre burada da oluşturmak pek ala mümkün.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Eğer her şey tamamsa uygulamamızı çalıştırıp RabbitMQ panelini açalım. Gördüğünüz üzere biz tip olarak &lt;strong&gt;Fanout&lt;/strong&gt; kullanarak yayın yapmaya başladık. İsteyen Consumer Queue'sunu oluşturup, dinleyebilir ve işlemlerini gerçekleştirebilir.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Yani Consumer’lar kuyruk oluşturup bizim kanalımıza abone olurlarsa, biz onların posta kutularına mektuplarımızı atabiliriz.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2ACd4dUxJJHE0dgZFQ8IYkvQ.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2ACd4dUxJJHE0dgZFQ8IYkvQ.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gördüğünüz gibi henüz bir bind olan bir consumer yok. Hadi şimdi &lt;strong&gt;FanoutExchange_Publisher&lt;/strong&gt; ’a gidip consumer tarafını kodlayalım.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;İlk Consumer örneğimizde yaptığımız işlemlerin çoğu burada da aynıydı bundan sebep aynı kısımlara yorum satırı eklemeyip değişiklik olan kısımlara açıklama satırları ekledim.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bir önceki örneğimizden tek farkı oluşturduğumuz kuyruk ile Exchange’imizi Bind ediyoruz yani bağlıyoruz.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Şimdi kodladığımız Consumer’ın çalışıp çalışmadığını ve birden fazla Consumer’a aynı mesajın gidip gitmediğini doğrulayalım.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💊Bunun için iki adet terminal açabileceğiniz gibi yan yana hizalı görmek için VS Code’un terminali de kullanabilirsiniz. Tek yapmamız gereken terminalde Consumer’ın yoluna gidip &lt;strong&gt;dotnet run&lt;/strong&gt; komutunu çalıştırmak&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Burada dikkat edilmesi gereken husus önce Consumer’ın çalıştırılmasıdır.&lt;/strong&gt; Eğer önce Publisher’ı çalıştırırsak mesajları iletilecek bir Queue olmadığı için boşa/boşluğa gider ve Consumer(lar)’ı çalıştırdığımızda okuyacak herhangi bir mesaj bulamaz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2ABj2e0cc7ygEjJa63B3OyCQ.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2ABj2e0cc7ygEjJa63B3OyCQ.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mesajlarımız okunurken biz o sıra RabbitMQ’nun paneline gidip, gerçekten de rastgele isimlerle kuyruklarımızın oluşup oluşmadığını ve Fanout Exchange’imize Bind olup olmadıklarını doğrulayabiliriz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F623%2F1%2AhAuhXggyk93DXyDkkTsK8g.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F623%2F1%2AhAuhXggyk93DXyDkkTsK8g.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Terminal üzerinde çalışan Consumer’larımızı durduğumuz da kuyrukların ve bind’ların otomatik silindiğini görebilirsiniz.&lt;/p&gt;

&lt;h3&gt;
  
  
  3️⃣Direct Exchange Tanım ve Örneği
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F520%2F1%2ANa6dp5Z6jfb9xCzqxbxTSw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F520%2F1%2ANa6dp5Z6jfb9xCzqxbxTSw.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fanout’tan farklı olarak şimdi mesajlarımıza bir yol haritası çizeceğiz yani routing key kullanmaya başlayacağız.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Direct Exchange&lt;/strong&gt;'te işleyiş şu şekilde; &lt;strong&gt;Publisher&lt;/strong&gt; tarafında mesajımız gönderilirken içerisinde bir &lt;strong&gt;routing_key&lt;/strong&gt; barındırıyor &lt;strong&gt;Direct Exchange&lt;/strong&gt; bu key'e bakıyor ve kuyruğumuzla eşleştiriyor. &lt;strong&gt;Consumer&lt;/strong&gt; yine aynı key üzerinden gidip ilgili kuyruk ile eşleşip mesajları okuyabiliyor.&lt;/p&gt;

&lt;p&gt;Örneğimizi şöyle yapalım, &lt;strong&gt;Error&lt;/strong&gt; , &lt;strong&gt;Warning&lt;/strong&gt; , &lt;strong&gt;Info&lt;/strong&gt; tipinde üç adet hata türümüz olsun. Gerçek hayatta API ya da farklı kanallardan gelir bu hatalar ama biz rastgele üretelim. Yine gerçek hatta belki Error tipinde olanlar bir yere yazılıp, Info ve Warning tipinde olanlar bir dashboard'tan izlenebilir. Biz istediğimiz türe göre konsola yazdıralım.&lt;/p&gt;

&lt;p&gt;Bir önceki &lt;strong&gt;Fanout&lt;/strong&gt; örneğinde kuyruk deklare etme işini &lt;strong&gt;Consumer&lt;/strong&gt; tarafına bırakmıştık. Burada ise &lt;strong&gt;Publisher&lt;/strong&gt; tarafında oluşturup, yine bind etme işlemini de burada gerçekleştirelim.&lt;/p&gt;

&lt;p&gt;Yine daha önceden oluşturduğumuz &lt;strong&gt;DirectExchange.Publisher&lt;/strong&gt;'a geçip bir önceki örneğimiz olan &lt;strong&gt;FanoutExchange.Publisher&lt;/strong&gt;'ı birebir kopyalıyoruz ve aşağıdaki gibi revize ediyoruz.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Gerekli bilgileri yorum satırı olarak ekledim. Kabaca bahsedecek olursam eğer gerçek hayat senaryosuna benzetmek için rastgele üç adet hata tipi ile oluşan mesajlar ve route key’ler ürettik. Bu sayede Consumer tarafında route key yardımı ile isteyen istediği log türünü dinleyebilecek.&lt;/p&gt;

&lt;p&gt;Uygulamamızı çalıştırdığımızda aşağıdaki gibi bir konsol görünümü oluşmalı.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F822%2F1%2AWdPNhf9iG4Qx3cD5iphH5g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F822%2F1%2AWdPNhf9iG4Qx3cD5iphH5g.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;RabbitMQ panelinde ise şu şekilde bir görünüm oluşmuş olmalı; üç adet Queue, bir adet log-direct adında ve direct tipinde exchange. Bu oluşan Exchange’imize tıkladığımızda ise oluşan üç kuyruğun bind edilmiş olması gerekir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F985%2F1%2Asw_tDw2s9qBFMjnR16mJTw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F985%2F1%2Asw_tDw2s9qBFMjnR16mJTw.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Şimdi Consumer tarafını oluşturalım. Yine &lt;strong&gt;FanoutExchange.Consumer&lt;/strong&gt; ’i &lt;strong&gt;DirectExchange.Consumer&lt;/strong&gt; ’a kopyalayıp aşağıdaki gibi revize ediyoruz.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Yapılan işlem oldukça basit. Her şey zaten Publisher tarafında oluştuğu için, Consumer tarafında tek yapmamız gereken dinlemek istediğimiz kuyruğun adını belirlemek. Fanout’tan farklı olarak ne yapmış olduk mesajlarımızı route key’ler ile ayırmış olduk. Bu sayede isteyen istediğini kanalı/kuyruğu dinleyebiliyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2APkvze3ulaU0qodPWyttXAg.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2APkvze3ulaU0qodPWyttXAg.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4️⃣Topic Exchange Tanım ve Örneği
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F520%2F1%2A_IXWVhiuIQbmUpJ-OpDpgw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F520%2F1%2A_IXWVhiuIQbmUpJ-OpDpgw.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Topic Exchange&lt;/strong&gt; çok daha detaylı routing yapmak istediğimiz zaman kullanılan tiptir. Direct Exchange'ten tek farkı routing key tanımlarken &lt;strong&gt;wildcard&lt;/strong&gt;'lar ile beraber belirli pattern'ler kullanabiliyor olmamız.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💊 Wildcard:&lt;/strong&gt; Türkçedeki karşılığı Özel/Yıldızlı karakterler diye bilinir ve yer tutucular(placeholder) olarak kullanılır.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Route Key’i&lt;/strong&gt;  &lt;strong&gt;Publisher tarafında oluştururken&lt;/strong&gt; aralara sadece nokta koyarak ayırırız → a.b.c.d&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Route Key’i Consumer tarafında çağırırken&lt;/strong&gt; pattern içerisinde bizim için fark etmeyen bir alan ya da alanlar varsa &lt;strong&gt;*&lt;/strong&gt; (yıldız) kullanarak geçebileceğimiz gibi sadece başı ve sonuyla ilgileneceksek eğer &lt;strong&gt;#&lt;/strong&gt; işareti kullanarak ilgilenmeyeceğimizi belirtebiliriz.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔹 a.*.*.d&lt;/strong&gt; → route key’in başında a ve sonunda d olanları dinlemek için&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔹 *.*.c.*&lt;/strong&gt; → route key’in üçüncü sırasında c olanları dinlemek için.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔹 a.# →&lt;/strong&gt; route key’in başında a olan ve gerisiyle ilgilenmediğim kuyrukları dinlemek için&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔹 #.d →&lt;/strong&gt; yukarıdakinin tam tersi başıyla ortasıyla ilgilenmeyip sonuyla ilgilendiğimiz senaryolar&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💡Biraz somutlaştırılmış örnek verecek olursa eğer;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Publisher tarafında dünyadaki anlık doğum oranlarının raporlarının excel ve pdf formatında &lt;strong&gt;aşağıdaki gibi bir routing key pattern’i kullanılarak&lt;/strong&gt; yayınlandığını varsayalım;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**avrupa.fransa.paris.pdf  
avrupa.fransa.paris.excel  
avrupa.almanya.berlin.pdf  
avrupa.almanya.munih.pdf  
asya.cin.pekin.pdf  
asya.cin.pekin.excel**  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Consumer tarafında çağırırken;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔹 #.pdf →&lt;/strong&gt; başında ve ortasında ne olduğu önemli değil tüm şehirlerin pdf’leri getir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔹 *.*.*.pdf →&lt;/strong&gt; yukarıdaki ile aynı işlemi yapar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔹 avrupa.# →&lt;/strong&gt; ortasında ve sonunda ne olduğu beni ilgilendirmez, Avrupa’nın tüm şehirlerinin hem pdf hem de excel’lerini getir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔹 *.almanya.*.pdf →&lt;/strong&gt; Almanya’nın tüm şehirlerinin doğum raporlarının pdf halini getir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔹 asya.*.*.excel →&lt;/strong&gt; Asya kıtasındaki tüm ülkelere ait tüm şehirlerin excel raporlarını getir.&lt;/p&gt;

&lt;p&gt;Şimdi kodlama tarafına geçelim. Bir önceki örneğimizin kopyasını alıp üzerinde düzenleme yaparak gideceğim. Bir önceki örneğimizden farklı olarak Queue oluşturma işlemini bu sefer Consumer tarafına bırakacağız.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;Yine her zamanki gibi tüm detayları açıklama satırları olarak ekledim. Bizim için aşağıdaki gibi rastgele üçlü serilerden oluşan hata tipleri oluştursun Publisher tarafı.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F862%2F1%2AHZQFkftQ6AuDlkzk6E8TRg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F862%2F1%2AHZQFkftQ6AuDlkzk6E8TRg.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Şimdi Consumer tarafında örneğin; ortasında Info olanları ya da başında Warning olan ortasında ve sonunda ne olduğunun önemli olmadığı gibi örekler belirleyerek hata tiplerini ekrana yazdıralım.&lt;/p&gt;

&lt;p&gt;Yine bir önceki örneğimizi kopyalayıp aşağıdaki gibi revize ettim. Değiştirdiğim yerlerin başına mutlaka açıklama satırı ekledim.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Şimdi kuyruk mekanizmamızın çalıştığını doğrulayalım. Burada unutulmaması gerekir ki Queue oluşturma işlemi Consumer tarafında bu yüzden önce Consumer tarafını ayaklandırıp ardından Publisher’ı çalıştırmak gerekir. Önce Publisher çalıştırılırsa mesajlar boşa gider.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AD6qDTsb06NyO5WdCv1dZ_Q.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AD6qDTsb06NyO5WdCv1dZ_Q.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💣Yukarıda da görüleceği üzere &lt;strong&gt;önce Consumer tarafını ardından da Publisher tarafını çalıştırıyorum.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Consumer tarafında route key’lerin başıyla ve sonuyla ilgilenmeyip sadece ortasında Error olanlarla ilgileneceğimi belirttiğim için sadece ortasında Error olanlar listeleniyor.&lt;/p&gt;

&lt;p&gt;Consumer’da rastgele isimle oluşturduğumuz Queue Name ve bind işlemi aşağıdaki gibi RabbitMQ panelinde gözlemlenebilir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2A5sILorlUsDvaltRsPDDu5A.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2A5sILorlUsDvaltRsPDDu5A.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5️⃣Header Exchange Tanım ve Örneği
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F520%2F1%2A5ibWwmaGX0GqU9UFzvt2mQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F520%2F1%2A5ibWwmaGX0GqU9UFzvt2mQ.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Header Exchange&lt;/strong&gt; diğerlerinden biraz farklı, diğerleri genelde birbirine benziyordu. Route key'den bahsettik ve ufak tefek detaylandırmalar yaparak ilerledik. Bu sefer &lt;strong&gt;header&lt;/strong&gt; kavramıyla tanışacağız.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💊Header Exchange&lt;/strong&gt; en az kullanılan exchange tipidir.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Header Exchange&lt;/strong&gt; tipinde eşleştirmelerimiz &lt;strong&gt;routing key&lt;/strong&gt; ile değil, Publisher tarafından mesajla birlikte gönderilen &lt;strong&gt;header&lt;/strong&gt; ile olacak.&lt;/p&gt;

&lt;p&gt;Header’da gönderilen değerin &lt;strong&gt;x-match&lt;/strong&gt; key’ine verilen &lt;strong&gt;all&lt;/strong&gt; veya &lt;strong&gt;any&lt;/strong&gt; değerine göre eşleşenler kuyruğa iletilecek.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔹 any→&lt;/strong&gt; değerlerden herhangi birinin eşleşmesi şartı&lt;br&gt;&lt;br&gt;
🔹 &lt;strong&gt;all →&lt;/strong&gt; tüm değerlerin eşleşmesi şartı&lt;/p&gt;

&lt;p&gt;Biraz havada kalmış olabilir yine küçük bir örnek ile kafamızı biraz daha berraklaştıralım. Yine her zamanki gibi daha önce oluşturduğumuz &lt;strong&gt;HeaderExchange_Publisher&lt;/strong&gt;'a geliyorum ve içeriğimi aşağıdaki gibi düzenliyorum.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Açıklama satırlarında neler yaptığımızı aktarmaya çalıştım.&lt;/p&gt;

&lt;p&gt;Kabaca özetleyecek olursak artık mesajımızı &lt;strong&gt;routing-key&lt;/strong&gt; ile değil &lt;strong&gt;header&lt;/strong&gt; ile gönderdik. Mesajımıza header ekleyebilmek için de mesajın &lt;strong&gt;Property&lt;/strong&gt;'lerinden Headers'a kendi oluşturduğumuz &lt;strong&gt;header&lt;/strong&gt;'ı atadık.&lt;/p&gt;

&lt;p&gt;Şimdi Consumer tarafında kuyruğumuzu oluşturalım ve &lt;strong&gt;Headers&lt;/strong&gt;'tan&lt;br&gt;&lt;br&gt;
&lt;strong&gt;x-match&lt;/strong&gt; yardımı ile dinleme işlemini gerçekleştirelim. &lt;strong&gt;HeaderExchange_Consumer&lt;/strong&gt;'a geliyorum ve içeriğimi aşağıdaki gibi düzenliyorum.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Temel işlemler yine sabit kaldı. Yeni eklenen ya da değişen kısımlara açıklamaları ekledim.&lt;/p&gt;

&lt;p&gt;Ne yaptık diyecek olursak eğer; İşimizi sağlama almak adına Publisher tarafında oluşturduğumuz &lt;strong&gt;Headers&lt;/strong&gt; tipindeki Exchange'imizi Consumer tarafında yani burada tekrar tanımladım. Tanımlamasak da olur muydu? Olurdu ama önce Consumer'ı çalıştırsak patlardı.💣&lt;/p&gt;

&lt;p&gt;Daha sonrasında beklediğimiz header’ı ayarladık ve Publisher’dakinden farklı olarak &lt;strong&gt;x-match&lt;/strong&gt; key'ini kullanıp value olarak &lt;strong&gt;all&lt;/strong&gt; diyerek birebir eşleşme olanları getirdik. İstersek &lt;strong&gt;any&lt;/strong&gt; diyerek headers da ki herhangi bir değerle eşleşenleri de getirtebilirdik tercih ve kurgu meselesi.&lt;/p&gt;

&lt;p&gt;Son olarak da &lt;strong&gt;QueueBind&lt;/strong&gt; metodunun &lt;strong&gt;routingKey&lt;/strong&gt; parametresini boş bırakıp argümanlara &lt;strong&gt;header&lt;/strong&gt;'ımızı ekledik.&lt;/p&gt;

&lt;p&gt;Kurgumuzun çalışıp çalışmadığını test edelim. Önce sol tarafta Consumer’ı çalıştırıp dinlemeye başlıyorum. Sonrasında da sağ tarafta Publisher’ı çalıştırıyorum.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AMKvzilXf9dZXa4tFrT2uog.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AMKvzilXf9dZXa4tFrT2uog.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;RabbitMQ panelinin Exchanges sekmesinde &lt;strong&gt;Routing key&lt;/strong&gt;'imizin boş olduğunu ve &lt;strong&gt;Arguments&lt;/strong&gt; kısmının da &lt;strong&gt;header&lt;/strong&gt;'ımızın dolu olduğunu gözlemleyebiliriz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F693%2F1%2AfeGnOklNeatxVzhJ_la4AQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F693%2F1%2AfeGnOklNeatxVzhJ_la4AQ.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Son olarak hem genel bir tekrar hem de farklı bir örnek görmek açısından aşağıdaki beş dakikalık videoyu kesinlikle izlemenizi öneririm.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/o8eU5WiO8fw"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Bu yazımda aktaracaklarım bu kadar. Fazlasıyla uzun bir yazı oldu farkındayım. Ayrı ayrı seri halinde yapılabilirdi elbette ama tek bir yerde topluca erişilebilecek sağlam bir kaynak(kendimce) olsun istedim.&lt;/p&gt;

&lt;p&gt;Umarım ufak da olsa bir faydam dokunmuştur.&lt;/p&gt;

&lt;p&gt;📕Bu yazı serisindeki örneklerde &lt;a href="https://medium.com/u/8f672d2fb705" rel="noopener noreferrer"&gt;Faith çakıroğlu&lt;/a&gt;’nun Udemy eğitiminden faydalanılmıştır.&lt;/p&gt;

&lt;p&gt;📝Yazım hatalarındaki desteğinden dolayı &lt;a href="https://medium.com/u/2236ea4ed366" rel="noopener noreferrer"&gt;Birol Gökkaya&lt;/a&gt; özel teşekkürler.&lt;/p&gt;

</description>
      <category>rabbitmq</category>
      <category>net5</category>
      <category>docker</category>
      <category>csharp</category>
    </item>
    <item>
      <title>MongoDB ile CURD işlemleri(.Net 5)</title>
      <dc:creator>Hakan Yalitekin</dc:creator>
      <pubDate>Sun, 04 Apr 2021 18:05:28 +0000</pubDate>
      <link>https://dev.to/hakanyalitekin/mongodb-ile-curd-islemleri-net-5-kl7</link>
      <guid>https://dev.to/hakanyalitekin/mongodb-ile-curd-islemleri-net-5-kl7</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XoFof6pU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A_8ipXv_TE3DVRGyEYOYokQ.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XoFof6pU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A_8ipXv_TE3DVRGyEYOYokQ.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Merhabalar,&lt;/p&gt;

&lt;p&gt;Uzun bir zamandır bir şeyler paylaşmadığımı fark ettim, kurum içi etkileşim ve öğrenimi artırmak için hazırladığım içeriği bu platform üzerinden de paylaşmak istedim. Öncelikle tanımlardan başlayalım ve sonrasında küçük bir örnek yapalım.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;MognoDB Nedir?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;MongoDB resmi sitesinde kendisini şu şekilde tanımlıyor;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“MongoDB, modern uygulama geliştiricileri ve bulut çağı için oluşturulmuş genel amaçlı, doküman tabanlı, dağıtılmış bir veri tabanıdır.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Resmi tanımlamaya ilaveler yapacak olursak; verilerin doküman olarak tutulduğu, -dokümandan kasıt JSON formatı- açık kaynak kodlu, ücretsiz NoSQL bir veri tabanıdır.&lt;/p&gt;

&lt;p&gt;MongoDB’yi bankacılık sektörü gibi verinin çok önemli olmadığı durumlar hariç, pek çok senaryo için kullanmak mümkün. Örneğin; loglamalar, birçok tablodan beslenen listeleme(rapor) ekranları en sık kullanılan senaryolardır.&lt;/p&gt;

&lt;p&gt;Peki resmi tanımda doküman tabanlı derken kastedilen NoSQL database nedir? MongoDB’nin detaylarına inmeden kısaca NoSQL’den bahsedelim.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;NoSQL Nedir?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;NoSQL, “Not Only SQL”in kısaltılmış halidir. ilişkisel veri tabanlarına alternatif, ilişkisel olmayan, esnek yapılı, büyük verili ve çok sayıda request-response dönen sistemlerde, yüksek performans ve yönetim kolaylığı sunan veri tabanı çözümüdür.&lt;/p&gt;

&lt;p&gt;NoSQL illaki doküman tabanlı olmak zorunda değildir. Bir çok farklı türü mevcuttur.&lt;/p&gt;

&lt;p&gt;NoSQL’in avantajları, dezavantajları, detaylı anlatımı ve diğer türleri ile ilgili aşağıdaki kaynaklara göz atabilirsiniz.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Amazon Türkçe Kaynak&lt;/strong&gt; → &lt;a href="https://aws.amazon.com/tr/nosql/"&gt;https://aws.amazon.com/tr/nosql&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Diğer bir kaynak (&lt;/strong&gt;&lt;a href="https://medium.com/u/877110501571"&gt;&lt;strong&gt;Halis Ak&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;)&lt;/strong&gt; →&lt;a href="https://link.medium.com/pJ5vhQvLReb"&gt;https://link.medium.com/pJ5vhQvLReb&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Asıl konumuz olan MongoDB’ye dönecek olursak, konunun daha iyi pekişmesi için CURD işlemlerinden oluşan küçük bir .Net Core projesi yapalım.&lt;/p&gt;

&lt;p&gt;Tabi projemize geçmeden önce MongoDB ile çalışmak için gerekli ortamı sağlayalım.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;MongoDB ile Çalışma Ortamının Hazırlanması&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;MongoDB ile ilgili çalışabileceğimiz bir çok farklı ortam yaratmak mümkün,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;İşletim sistemine kurulum yaparak;&lt;/strong&gt; &lt;a href="https://www.mongodb.com/try/download/community"&gt;https://www.mongodb.com/try/download/community&lt;/a&gt; üzerinde işletim sisteminize uygun versiyonu seçip kurulumu yapabiliriz.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MongoCloud kullanarak;&lt;/strong&gt; &lt;a href="https://www.mongodb.com/cloud"&gt;https://www.mongodb.com/cloud&lt;/a&gt; linki üzerinden hesap açarak, ücretsiz 500mb limitli veri tabanı kümleri oluşturabiliriz.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker’a kurulum yaparak;&lt;/strong&gt; (bizim örneğimiz) &lt;a href="https://hub.docker.com/_/mongo"&gt;https://hub.docker.com/_/mongo&lt;/a&gt; linki üzerinden gerekli talimatları takip ederek. MongoDB’yi kullanmak mümkün&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Docker Üzerinde MongoDB’nin kurulması
&lt;/h3&gt;

&lt;p&gt;Docker’da MongoDB’yi standart portta ayaklandırmak için, aşağıdaki kodu çalıştırıyoruz. (Eğer yüklü değilse zaten yüklüyor)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;docker run -d --name Mongo101 -p 27017:27017 mongo:latest&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Container’imiz ayaklandığına göre, içine girip inceleyebiliriz.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;docker exec -it Mongo101 bash&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Daha sonrasında MongoDB’yi incelemek istersek, eriştiğimiz bash’e &lt;strong&gt;mongo&lt;/strong&gt; komutunu vererek Mongo Shell'e erişmemiz yeterlidir. Aşağıdaki versiyon bilgilerinin, connection string bilgilerini görebiliyor olmamız gerekir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;mongo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6rqnQMSJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AQM7QijuPTwcDw6b1f7GFUA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6rqnQMSJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AQM7QijuPTwcDw6b1f7GFUA.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Proje Öncesi MongoDB’ye bir göz atalım
&lt;/h3&gt;

&lt;p&gt;Artık mongo komutları verebildiğimize göre ilk kurulumda gelen default veri tabanlarının listesine bir göz atalım.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YCoHEEPB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/202/1%2AagxbhouTUILvo27WXcI4aA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YCoHEEPB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/202/1%2AagxbhouTUILvo27WXcI4aA.png" alt=""&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#Mongo shell komutu  
**show dbs**  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;MongoDB case sensitive (harf duyarlı) bir yapıdadır. Bu yüzden büyük küçük harflere dikkat edilmelidir.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Default gelen DB’lere göz gezdirdiğimize göre artık kendi DB’mizi oluşturma vakti geldi. Bunun için &lt;strong&gt;&lt;em&gt;use&lt;/em&gt;&lt;/strong&gt; komutunu kullanabiliriz. Eğer varsa kullanacak, yoksa yeni oluşturulacak.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**use eStoreDB**

#Extra Bilgi:"use" komutu ile gidilmiş o anki DB'yi siler.(use eStoreDB)
**db.dropDatabase()**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;DB’yi oluşturduk, şimdi sıra geldi tablomuzu(collection) oluşturmaya.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**db.createCollection("users")**

#Extra Bilgi: Collection(tablolar)'ı listeler.
**db.getCollectionNames()**  

#Extra Bilgi: Collection'u(tabloyu siler)
**db.users.drop()**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;DB'miz ve Tablomuz(Collection) hazır olduğuna göre örnek bir kaç kayıt atalım. Bunun için &lt;strong&gt;insertMany&lt;/strong&gt; metodunu kullanacağız.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;MongoDB’nin Temel CRUD yapısını inceleyelim →&lt;/strong&gt; &lt;a href="https://docs.mongodb.com/manual/crud/"&gt;https://docs.mongodb.com/manual/crud/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MongoDB Karşılaştırma Operatörleri inceleyelim →&lt;/strong&gt; &lt;a href="https://docs.mongodb.com/manual/reference/operator/query/"&gt;https://docs.mongodb.com/manual/reference/operator/query/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MongoDB’nin SQL’e karşılık gelen yapısını inceleyelim →&lt;/strong&gt; &lt;a href="https://docs.mongodb.com/manual/reference/sql-comparison/"&gt;https://docs.mongodb.com/manual/reference/sql-comparison/&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**Yukarda insert örneği görmüştük simdi bir kaç örnek listeleme sorgu yazalım;**

#Tüm kullanıcıları listele
**db.users.find().pretty()**

#Yaşı 25'ten büyük olanların Ad-Soyad bilgisini getir.
**db.users.find({ age:{$gt:25}} , {firstName:1, lastName:1}).pretty()**  

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Temel hatlarıyla MongoDB üzerine fikir sahibi olduğumuza göre ilk uygulamamızı kodlamaya başlayabiliriz.&lt;/p&gt;
&lt;h3&gt;
  
  
  MongoDB CRUD işlemleri (.Net 5)
&lt;/h3&gt;
&lt;h4&gt;
  
  
  1.Adım → Uygulamanın Oluşturulması
&lt;/h4&gt;

&lt;p&gt;Öncelikle bir Web API projesi oluşturuyoruz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FCx6HZjp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1007/1%2A3pKQnOvJQ7nZVzs_vPx6tA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FCx6HZjp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1007/1%2A3pKQnOvJQ7nZVzs_vPx6tA.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Proje adını &lt;strong&gt;MongoDB101.API,&lt;/strong&gt; solution adını &lt;strong&gt;MongoDB101&lt;/strong&gt; olarak ayarlıyoruz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BR6qVf1w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/866/1%2AYDWc_vqpvCFsFZCUkpMeHQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BR6qVf1w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/866/1%2AYDWc_vqpvCFsFZCUkpMeHQ.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Daha sonrasında ise, framework olarak  &lt;strong&gt;.NET 5.0&lt;/strong&gt; ve beraberinde gelen &lt;strong&gt;swagger&lt;/strong&gt; desteği için &lt;strong&gt;Enabel OpenAPI support&lt;/strong&gt; ’u işaretliyoruz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--J_wHap-b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/767/1%2AlvKt77STylj5Xknowfjfrg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--J_wHap-b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/767/1%2AlvKt77STylj5Xknowfjfrg.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tHkPeXlE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/401/1%2AFziu1iaI6Dk-fj8ILy8Y9w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tHkPeXlE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/401/1%2AFziu1iaI6Dk-fj8ILy8Y9w.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Default olarak gelen controller ve klası siliyoruz.&lt;/p&gt;

&lt;p&gt;Projemizi oluşturduğumuza göre, MongoDB’yi kullanabilmek için ihtiyacımız olan nuget paketini aşağıdaki görsel yardımı ile kuralım.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7hCiz4vq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Ao5-uI_Zv_GkmsKmxMgGgFg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7hCiz4vq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Ao5-uI_Zv_GkmsKmxMgGgFg.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  2.Adım → MongoDB’ye erişmek için gerekli olan konfigürasyonlar
&lt;/h4&gt;

&lt;p&gt;Şimdi sıra geldi MongoDB’ye bağlanma aşamasına. Bunun için öncelikle -— 📂 &lt;strong&gt;Settings&lt;/strong&gt; adında bir klasör, akabinde &lt;strong&gt;IDbSettings&lt;/strong&gt; adında public bir interface oluşturuyoruz ve içeriğine aşağıdaki property’leri ekliyoruz.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;Bu interface’i implemente edecek olan &lt;strong&gt;MongoDbSettings&lt;/strong&gt; adındaki klasımızı oluşturuyoruz. &lt;strong&gt;IDbSettings&lt;/strong&gt; interface’imizi implemente ediyoruz.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;appsettings.json&lt;/strong&gt; dosyasına MongoDB’ye bağlanmak için gerekli olan tanımlamalarımız yapıyoruz.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Startup.cs&lt;/strong&gt; klasımıza gidip aşağıdaki kodlarımızı &lt;strong&gt;ConfigureServices&lt;/strong&gt;'in altında tanımlıyoruz. Ne anlama geldiklerini aşağıda yorum olarak ekledim.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h4&gt;
  
  
  3.Adım → Collection’a karşılık gelen modelin oluşturulması
&lt;/h4&gt;

&lt;p&gt;Servis katmanımızı yazmadan önce modelimizi oluşturalım. Uygulamamıza öncelikle 📂 &lt;strong&gt;Model&lt;/strong&gt; adında bir klasör ve sonrasında &lt;strong&gt;User&lt;/strong&gt; adında bir klas ekleyelim ve içeriğini aşağıdaki gibi dolduralım.&lt;/p&gt;

&lt;p&gt;property’lerin üzerlerinde bulunan attribute’lerin ne ifade ettiğini yorum olarak belirttim.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h4&gt;
  
  
  4.Adım → Service’in yazılması
&lt;/h4&gt;

&lt;p&gt;Projemize 📁 &lt;strong&gt;Service&lt;/strong&gt; adında bir klasör ve &lt;strong&gt;UserService&lt;/strong&gt; adında bir klas oluşturalım. Constructor’ımızı aşağıdaki gibi düzenleyelim. Akabinde ilgili metotlarımızı ekleyelim.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h4&gt;
  
  
  5.Adım → Controller’ın oluşturulması
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;UserController&lt;/strong&gt; ’ımızı oluşturalım fakat oluştururken &lt;strong&gt;API&lt;/strong&gt; ’ı seçtiğimize emin olalım.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Wl1vFuWF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/916/0%2AGFWg8bdj7GFiJpIs" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Wl1vFuWF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/916/0%2AGFWg8bdj7GFiJpIs" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UserService&lt;/strong&gt;'in constructor'ında ihtiyacımız olan &lt;strong&gt;settings&lt;/strong&gt; bilgilerini aşağıdaki gibi ekliyoruz. Akabinde ilgili metotlarımızı yazmaya başlıyoruz.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h4&gt;
  
  
  6.Adım → Swagger ile metotların tetiklenmesi
&lt;/h4&gt;

&lt;p&gt;Uygulamamızı çalıştırdığımızda şöyle bir ekranın bizi karşılaması gerekiyor ve bu da sırasıyla endpoint’lerimizi test edebiliriz demektir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vtx6eYzv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2ApjKuctIumHuEH4lc" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vtx6eYzv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/0%2ApjKuctIumHuEH4lc" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Umarım ufakta olsa faydam dokunmuştur. Bir sonraki yazıda görüşmek üzere.&lt;/p&gt;

</description>
      <category>mongodb</category>
      <category>csharp</category>
      <category>crud</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>WSL 2 Linux ve Docker özelinde bir kaç sorun ve çözümü</title>
      <dc:creator>Hakan Yalitekin</dc:creator>
      <pubDate>Sun, 27 Dec 2020 10:56:23 +0000</pubDate>
      <link>https://dev.to/hakanyalitekin/wsl-2-linux-ve-docker-ozelinde-bir-kac-sorun-ve-cozumu-cio</link>
      <guid>https://dev.to/hakanyalitekin/wsl-2-linux-ve-docker-ozelinde-bir-kac-sorun-ve-cozumu-cio</guid>
      <description>&lt;h3&gt;
  
  
  WSL 2 Linux ve Docker özelinde bir kaç sorun ve çözümü
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GPGVY7-f--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2ARxFWRcsmrS0OtjNJL9MKEQ.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GPGVY7-f--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2ARxFWRcsmrS0OtjNJL9MKEQ.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Öncelikle bu yazının, &lt;strong&gt;WSL2 -Linux -Docker&lt;/strong&gt; üçlüsünü kullanırken &lt;strong&gt;yaşadığım sorunların çözümünü&lt;/strong&gt; içerdiğini belirtmek isterim.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WLS 2 ile ilgili ayrıntılı bilgiyi&lt;/strong&gt; aşağıdaki &lt;a href="https://medium.com/u/5512c90ef9e0"&gt;Deniz İrgin&lt;/a&gt;’in yazısından edinebilirsiniz. &lt;strong&gt;Kesinlikle çok güzel bir yazı ve mutlaka okunmalıdır.&lt;/strong&gt; Yazıyı okurken bazı kısımlarda belirtilen &lt;strong&gt;preview&lt;/strong&gt; kısımlarının artık &lt;strong&gt;preview&lt;/strong&gt; olmadığını belirtmek isterim.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/codefiction/windows-subsystem-for-linux-2-wsl-2-en-b%C3%BCy%C3%BCk-a%C5%9Fklar-kavgayla-ba%C5%9Flar-4cdc11770c7f"&gt;Windows Subsystem for Linux 2 (WSL 2) — En büyük aşklar kavgayla başlar&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Neden WSL2 Linux Kullanmaya Başladım?
&lt;/h4&gt;

&lt;p&gt;Windows’un lüksünden ve yıllardır ara ara kafa dağıtmak için oynadığım LOL oyunundan vazgeçmemek için hiçbir zaman tam anlamıyla Linux’a geçmek gibi bir planım olmadı ama ilgimi de çekmiyor değildi.&lt;/p&gt;

&lt;p&gt;Üşengeçlikten olsa gerek ki dual boot ya da sanal makine ile uğraşıp Linux kurma zahmetine de girmedim.&lt;/p&gt;

&lt;p&gt;Lakin internette &lt;strong&gt;Docker&lt;/strong&gt; üzerine bir şeyler okurken anlatımların Linux ya da macOS üzerinden olduğu makalelerde zorlanmaya başladığımı ve komutlar ile ilgili kısımların Windows uyarlamalarını bulmak iyiden iyiye canımı sıkmaya başladığını görünce artık dual boot kurma vaktinin geldiğini düşünmeye başladım.&lt;/p&gt;

&lt;p&gt;Daha sonra Linux dual boot ve sanal makine üzerine bir şeyler araştırırken tesadüfen WSL ile tanıştım ve aşık oldum. &lt;strong&gt;Artık hem Windows’un tadını çıkara bilecek hem de Linux kullanmak istediğimde bunu zahmetsizce Windows üzerinden halledebilecektim…&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Linux tecrübesi olanlar için sorunlar ufak ve çözümleri basit gibi görünse de yıllardır Windows kullanan benim için bu sorunların bazıları çok zor oldu ve &lt;a href="https://www.notion.so/"&gt;&lt;strong&gt;notion.so&lt;/strong&gt;&lt;/a&gt; üzerinde ki notlarımı bir araya toplayıp paylaşma gereği hissettim.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Sorun 1 : İnternete çıkamama problemi&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Bunu Ubuntu üzerinde apt updatekomutunu çalıştırıp sistemi güncellemek istediğimde fark ettim. Daha sonrasında internetten bazı çözümler buldum fakat bunlarda her Ubuntuyu yeniden başlattığımda sıfırlanıyordu. En en önemli olan son satırı bulmak zor oldu :)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4r37VTHa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/552/1%2Aa2nUGx__OWZvXrWs3MtVaw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4r37VTHa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/552/1%2Aa2nUGx__OWZvXrWs3MtVaw.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Çözüm 1:&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Aşağıdaki kodları ister sırası ile isterseniz tek satır olarak çalıştırıp kalıcı çözüm elde edebilirsiniz.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h4&gt;
  
  
  &lt;strong&gt;Sorun 2: Her seferinde root’a geçme zahmeti&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Gerek Docker kullanırken gerekse ihtiyaç doğrultusunda klasör, dosya oluştururken sürekli izne takılıyordum ve &lt;strong&gt;sudo -i&lt;/strong&gt; komutu ile root’a geçmem ve parola girmem gerekiyordu. Bunun bir çözümü olmalıydı.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zo47EYjh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/437/1%2AC_Z6CoUyxUbUPIowgNme3g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zo47EYjh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/437/1%2AC_Z6CoUyxUbUPIowgNme3g.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Çözüm 2:
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Windows komut satırında&lt;/strong&gt; aşağıdaki kodu çalıştırmak bizi sürekli root’a geçme zahmetinden kurtarır ve Ubuntuyu artık her açılışta root kullanıcısı ile başlatır.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;ubuntu&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="err"&gt;—&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Eğer tekrar normal kullanıcıya geçmek istersek &lt;strong&gt;su - kullaniciAdi&lt;/strong&gt; komutu kullanılabilir.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Sorun 3 : Docker Volume’ün konumunu bulma sorunu&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Entegre bir Linux ile çalıştığımızı unutmamız gerekiyor.&lt;/strong&gt; Ubuntu ile Docker üzerinde çalışıyorsak eğer &lt;strong&gt;docker volume create v_Test&lt;/strong&gt; komutu ile bir volume oluşturup &lt;strong&gt;docker inspect v_Test&lt;/strong&gt; komutu ile oluşturduğumuz volume’ün yerini bulmak istediğimde o konumda olmadığını fark ettim ve bu durum Nginx ile çalışırken canımı sıktı ve oldukça vakit kaybettirdi.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Çözüm 3:&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;4.satırda bulunan komut ile volume’lerimize ulaşabiliriz. İlgili dosya yoluna ister &lt;strong&gt;windwos + r&lt;/strong&gt; istersek de doğrudan adres çubuğuna yazarak erişebiliriz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="n"&gt;Otomatik&lt;/span&gt; &lt;span class="n"&gt;Olu&lt;/span&gt;&lt;span class="err"&gt;ş&lt;/span&gt;&lt;span class="n"&gt;an&lt;/span&gt; &lt;span class="n"&gt;Yol&lt;/span&gt;
&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v_Test&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;_data&lt;/span&gt;
&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="n"&gt;Windows&lt;/span&gt; &lt;span class="n"&gt;Yolu&lt;/span&gt; 
&lt;span class="err"&gt;\\&lt;/span&gt;&lt;span class="n"&gt;wsl&lt;/span&gt;&lt;span class="err"&gt;$\&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;desktop&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;community&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;volumes&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IoFLT9Vz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/718/1%2APlP9tNB7BveHt_wzajFMJg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IoFLT9Vz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/718/1%2APlP9tNB7BveHt_wzajFMJg.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Sorun 4: Ubuntu’nun Docker daemon’a bağlanamama sorunu (Docker in Docker )
&lt;/h4&gt;

&lt;p&gt;Sorunu biraz detaylandıracak olursam; örneğin Docker içerisine &lt;strong&gt;Portainer&lt;/strong&gt; ve ya &lt;strong&gt;Jenkins&lt;/strong&gt; kurduğumda ilk etapta sorunsuz çalışsa da ertesi gün kaldığım yerden devam etmek istediğimde her şeyin alt-üst olduğunu ve WSL2 Ubuntuyu baştan kurmama sebep olacak kadar sıkıntılı bir süreçle karşı karşıya kalıyordum. Bu durum oldukça motivasyonumun kırılmasına sebep oluyordu. Çözümü ise oldukça basitmiş.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Çözüm 4:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Linux üzerinde çalıştırmamız gereken kodları sırasıyla aşağıya ekliyorum. Bu kodları çalıştırdıktan sonra gönül rahatlığıyla Docker In Docker yapabiliriz :)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DOCKER_HOST=tcp://localhost:2375
DOCKER_BUILDKIT=1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yeni sorunlarla karşılaşmam durumunda burayı güncelliyor olacağım.&lt;/p&gt;

&lt;p&gt;Umarım ufakta olsa faydam dokunmuştur. Bir sonraki yazıda görüşmek üzere.&lt;/p&gt;

</description>
      <category>wsl2</category>
      <category>windowssubsystemlinu</category>
      <category>linux</category>
      <category>wsl</category>
    </item>
    <item>
      <title>Medium’daki yazıları Dev.to ile senkronize etmek</title>
      <dc:creator>Hakan Yalitekin</dc:creator>
      <pubDate>Sat, 26 Dec 2020 13:14:35 +0000</pubDate>
      <link>https://dev.to/hakanyalitekin/mediumdaki-yazilari-devto-ile-senkronize-etmek-901</link>
      <guid>https://dev.to/hakanyalitekin/mediumdaki-yazilari-devto-ile-senkronize-etmek-901</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OJ38COPX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2ArUk4MoyriTEfIqPPxUL6gw.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OJ38COPX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2ArUk4MoyriTEfIqPPxUL6gw.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nedeni bir türlü anlayamadığım Medium’un yükselişinden sonra ben de dahil bir çok geliştirici, gerek insanlarla paylaşımda bulunmak gerek Türkçe kaynak oluşturmak için bildiklerini Medium üzerinden aktarmaya başladı.&lt;/p&gt;

&lt;p&gt;Medium, düz yazılar paylaşmak güzel bir yer olabilir belki ama kod paylaşımı için hiç de kullanışlı olmayan, gist gibi ekstra zahmetlere katlanmamıza sebep olan bir yer.&lt;/p&gt;

&lt;p&gt;Bu yazımda yaklaşık olarak iki yıldır takip ettiğim &lt;a href="https://dev.to/"&gt;&lt;strong&gt;dev.to&lt;/strong&gt;&lt;/a&gt;’dan ve Medium ile nasıl senkronize edebileceğimizden bahsedeceğim.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Burada ki temel maksadım dev.to’nun da Türkçe kaynak olarak güçlenmesine katkıda bulunmak&lt;/strong&gt; ve ilk etapta Medium da ki trafikten vazgeçmek istemeyen kullanıcıların yazılarını dev.to’da zahmetsizce paylaşmasının yolunu açmak.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dev.to&lt;/strong&gt; , &lt;strong&gt;ilan&lt;/strong&gt; yayınlamaktan tutunda &lt;strong&gt;blog&lt;/strong&gt; , &lt;strong&gt;podcast&lt;/strong&gt; , &lt;strong&gt;video&lt;/strong&gt; gibi bir sürü paylaşımı içinde barındıran, geliştiriciler bir topluluk yaratmayı hedefleyen açık kaynak kodlu bir platformdur.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/forem/forem"&gt;forem/forem&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dev.to kendini şu şekilde tanımlıyor,&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;DEV, birbirlerine yardım etmek için bir araya gelen yazılım geliştiricilerinden oluşan bir topluluktur. Yazılım endüstrisi, işbirliğine ve ağa bağlı öğrenmeye dayanır. Bunun olması için bir yer sağlıyoruz.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://dev.to/about"&gt;About DEV - DEV Community&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Gelelim senkronizasyon meselesine;
&lt;/h3&gt;

&lt;p&gt;İnternette arattığımda nedendir bilmiyorum oldukça zahmetli yöntemler ile karşılaştım, biraz daha araştırınca bunu RSS akışı ile zahmetsizce yapılabileceğini gördüm. Sırasıyla aktarıyorum.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Adım 1: Aktarımı sağlamak&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Profil resmimizin üzerine gelip menüden, &lt;strong&gt;Settings’e&lt;/strong&gt; tıklıyoruz. Açılan sayfada sol menüden &lt;strong&gt;Extensions&lt;/strong&gt; tıklıyoruz ve &lt;strong&gt;Publishing to DEV from RSS&lt;/strong&gt; bölümüne geliyoruz.&lt;/p&gt;

&lt;p&gt;Sonrasında &lt;strong&gt;RSS Feed URL&lt;/strong&gt; başlığını göreceğiz, buraya Medium RSS akışımızı eklememiz gerekiyor.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Medium RSS akışımız şu şekilde -&amp;gt; &lt;a href="https://medium.com/feed/@"&gt;https://medium.com/feed/@&lt;/a&gt; &lt;strong&gt;KullanıcıAdı&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5p7cLenI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2AKpzF2z59rbhcERP_2aQxrg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5p7cLenI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2AKpzF2z59rbhcERP_2aQxrg.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kaydetme işlemini tamamladıktan sonra &lt;strong&gt;Fetch feed now&lt;/strong&gt; diyerek saniyeler içinde Medium akışımızın aktarımı tamamlıyoruz.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Artık tek yapmamız gereken yazılarımızı yayına almak.&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Adım 2: Yayına almak
&lt;/h4&gt;

&lt;p&gt;Taslak olarak eklenen yazılarımızı yayına almak için yine profil resmimizin üzerine gelip açılan menüden &lt;strong&gt;Dasboard&lt;/strong&gt; ’a tıklıyoruz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VIdGFxaz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Afd9ExSCSPnzbDhRgZPp2-g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VIdGFxaz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Afd9ExSCSPnzbDhRgZPp2-g.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Burada başarıyla aktarımı gerçekleştirilmiş olan yazılarımızı görebiliyor olmamız gerekiyor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Edit&lt;/strong&gt; ile yazımızın içerisine girip &lt;strong&gt;published: false&lt;/strong&gt; olan kısmı &lt;strong&gt;true&lt;/strong&gt; olarak ayarlayıp kaydetmek. &lt;strong&gt;Tüm işlem bu kadar.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rw4JKzpy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2ASDdeuOjqsqDuheDZITZXrg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rw4JKzpy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2ASDdeuOjqsqDuheDZITZXrg.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu yazı her ne kadar Medium özelinde görünse de aslında RSS akışı olan tüm bloglardan aktarım sağlayabiliriz.&lt;/p&gt;

&lt;p&gt;Umarım Türkçe kaynağın desteklenmesine ve okuyan herkese ufak da olsa faydam dokunmuştur.&lt;/p&gt;

&lt;p&gt;Bir sonraki yazımda görüşmek üzere.&lt;/p&gt;

</description>
      <category>turkish</category>
      <category>ｍedium</category>
      <category>devto</category>
      <category>türkçe</category>
    </item>
    <item>
      <title>Local NuGet Server Kurulumu ve Kullanımı</title>
      <dc:creator>Hakan Yalitekin</dc:creator>
      <pubDate>Thu, 10 Dec 2020 18:34:23 +0000</pubDate>
      <link>https://dev.to/hakanyalitekin/local-nuget-server-kurulumu-ve-kullanimi-31i2</link>
      <guid>https://dev.to/hakanyalitekin/local-nuget-server-kurulumu-ve-kullanimi-31i2</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--P_U6lIlu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/512/1%2A45xSo3gUpJu74nayqfZIXA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P_U6lIlu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/512/1%2A45xSo3gUpJu74nayqfZIXA.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Merhabalar,&lt;/p&gt;

&lt;p&gt;Uzun bir aradan sonra, yakın zamanda öğrendiğim, benim için de öğretici ve eğlenceli bir konu olan NuGet Server kurulumu ve kullanımından bahsetmek istedim.&lt;/p&gt;

&lt;p&gt;Çoğumuzun bildiği üzere NuGet, .NET için bir paket yönetim sistemidir. &lt;a href="https://www.nuget.org/"&gt;&lt;strong&gt;nuget.org&lt;/strong&gt;&lt;/a&gt;üzerinden ister var olan paketleri kullanabilir, istersek de kendi paketlerimizi herkese açık bir şekilde yükleyebiliriz.&lt;/p&gt;

&lt;p&gt;Peki ya herkese açık bir şekilde değil de kurum içinde kalmasını istediğimiz paketleri ne yapacağız, nasıl yöneteceğiz? İşte tam da bu ihtiyaç doğrultusunda NuGet Server imdadımıza yetişiyor.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Dikkat&lt;/strong&gt; : Başlamadan şunu not düşmeliyim ki; bu anlatım  &lt;strong&gt;.Net Framework 4.6 ile çalışır.&lt;/strong&gt; Eğer NuGet Server’ı .Net Core üzerinde ayaklandırmak isterseniz Google da BaGet’i aratırsanız ihtiyacınız görülecektir.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Haydi başlayalım ve toplamda 5 aşamadan oluşan adımlarımızı tek tek uygulayalım.&lt;/p&gt;

&lt;p&gt; &lt;strong&gt;1-&lt;/strong&gt; NuGet Server uygulamasının oluşturulması&lt;br&gt;&lt;br&gt;
&lt;strong&gt;2-&lt;/strong&gt; IIS’te NuGet Server’ın yayınlanması&lt;br&gt;&lt;br&gt;
&lt;strong&gt;3-&lt;/strong&gt; nuget.exe’nın Ortam Değişkenlerine eklenmesi&lt;br&gt;&lt;br&gt;
&lt;strong&gt;4-&lt;/strong&gt; Kendi NuGet’imize paket yükleme&lt;br&gt;&lt;br&gt;
&lt;strong&gt;4.1-&lt;/strong&gt; Publish yöntemi&lt;br&gt;&lt;br&gt;
&lt;strong&gt;4.2&lt;/strong&gt; - DLL yöntemi&lt;br&gt;&lt;br&gt;
&lt;strong&gt;5-&lt;/strong&gt; Gerekli ön ayarların yapılması ve paketimizin kullanımı&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Adım 1: NuGet Server Uygulamasının Oluşturulması&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Yeni bir uygulama oluşturuyoruz ve &lt;strong&gt;ASP.NET Web Application(.Net Framework)&lt;/strong&gt;’u seçiyoruz, özellikle .Net Framework 4.6 seçilmesi gerektiğini tekrar hatırlatmak isterim. Bir sonraki ekranda &lt;strong&gt;Empty’i&lt;/strong&gt; seçerek uygulamamızı oluşturma aşamasını tamamlıyoruz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--J7a6DzWp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/827/1%2AFYkimRQAQRwcYWOosrKSMw.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--J7a6DzWp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/827/1%2AFYkimRQAQRwcYWOosrKSMw.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Uygulamamız oluştuktan sonra Solution’a sağ tıklayıp &lt;strong&gt;NuGet Package Manager&lt;/strong&gt; ’a tıklıyoruz ve arama alanına &lt;strong&gt;NuGet.Server&lt;/strong&gt; yazıyoruz. Akabinde ilk çıkan paketi yüklüyoruz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Y-rV0wpi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2An7lroiCp5fkjEI3pBJmHKA.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Y-rV0wpi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2An7lroiCp5fkjEI3pBJmHKA.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Paket yüklemesi tamamlandıktan sonra uygulamamızı çalıştırıyoruz. Eğer aşağıdaki görüntüyü görebiliyorsanız her şey yolunda demektir. Paket yöneticimizi neredeyse publish etmeye hazırız.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eiuenbix--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AxZ5KwuLowHXL9Mzx3T2cxA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eiuenbix--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AxZ5KwuLowHXL9Mzx3T2cxA.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Publish etmeden önce &lt;strong&gt;web.config&lt;/strong&gt; içerisinde küçük bir ayar yapmamız gerekiyor. NuGet server üzerinde &lt;strong&gt;nuget.exe&lt;/strong&gt; (birazdan değiniyor olacağım) ile push ve delete komutlarını çalıştırmak istendiğinde bir &lt;strong&gt;Api Key&lt;/strong&gt; zorunlu olması için &lt;strong&gt;requireApiKey&lt;/strong&gt; parametresi halihazırda &lt;strong&gt;true&lt;/strong&gt; olarak geliyor, tek yapmamız gereken &lt;strong&gt;apiKey&lt;/strong&gt; parametresini bulup parolamızı belirlemek.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Unutulmamalıdır ki bu public bir key, edinen herkes her işlemi yapabilir.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;add key="apiKey" value="123456CokZor" /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dünyanın en zor parolasını da belirledikten sonra artık publish işlemine geçebiliriz.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adım 2: IIS’te NuGet Server’ın Yayınlanması
&lt;/h3&gt;

&lt;p&gt;Eğer ikinci adıma geçebildiysek zaten oldukça kolay olan ilk adımı geçebilmişizdir diye tahmin ediyorum. Vakit kaybetmeden uygulamamıza sağ tıklayıp IIS’te yayınlamak üzere seçtiğimiz klasöre uygulamamızı publish ediyoruz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RwAzLMLS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AF-ZFtgxqF1DMhsrHQ9rh7A.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RwAzLMLS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AF-ZFtgxqF1DMhsrHQ9rh7A.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Seçilen klasöre uygulamamızı publish işlemi tamamlandıktan sonra IIS tarafı için gerekli adımları uygulayabiliriz.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Eğer bir sunucuda değil de bilgisayarımızda bu kurulum işlemini gerçekleştireceksek ve bilgisayarınızda &lt;strong&gt;IIS yok ise Google’a IIS kurulumu yazmak yeterli olacaktır.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SL_yoJ_b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AW0CSNUcfLHU-L7ZiEFh4hQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SL_yoJ_b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AW0CSNUcfLHU-L7ZiEFh4hQ.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;IIS’i açtıktan sonra &lt;strong&gt;Siteler&lt;/strong&gt; ’e sağ tıklayıp &lt;strong&gt;Web Sitesi Ekle&lt;/strong&gt; diyerek yukarıdaki şekilde gerekli ayarlamaları tamamlayıp &lt;strong&gt;Tamam&lt;/strong&gt; dememiz gerekmekte.&lt;/p&gt;

&lt;p&gt;Bu işlemi tamamladıktan sonra; Local NuGet Serverımıza bir isim ile erişmek istediğimiz için(tabii ki zorunluluk değil localhost kalabilir.) &lt;strong&gt;Host&lt;/strong&gt; dosyasında küçük bir ayar yapmamız gerekiyor, bunun için bu adrese gidip -&amp;gt; &lt;strong&gt;C:\Windows\System32\drivers\etc&lt;/strong&gt; yolu üzerinden &lt;strong&gt;Host&lt;/strong&gt; dosyamızı herhangi bir düzenleyici ile açıp şu ayarlamayı yapıyoruz;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zzsO2lAn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/786/1%2ApJDGfvMNRJ78kOOflogYWQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zzsO2lAn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/786/1%2ApJDGfvMNRJ78kOOflogYWQ.png" alt=""&gt;&lt;/a&gt;Yazmamız gereken : 127.0.0.1 nugetserver&lt;/p&gt;

&lt;p&gt;Host dosyamıza &lt;strong&gt;127.0.0.1 nugetserver&lt;/strong&gt; eklemesini yaptıktan sonra eğer her şey yolunda gittiyse &lt;a href="http://nugetserver/"&gt;&lt;strong&gt;http://nugetserver/&lt;/strong&gt;&lt;/a&gt; adresinden aşağıdaki görüntüyü alabiliyor olmamız gerekir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nO83erFm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AFQGASMLr58fJaauDgLDV8Q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nO83erFm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AFQGASMLr58fJaauDgLDV8Q.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Adım 3: NuGet.exe’nın Ortam Değişkenlerine Eklenmesi&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.nuget.org/downloads"&gt;&lt;strong&gt;Bu adres&lt;/strong&gt;&lt;/a&gt; üzerinden &lt;strong&gt;NuGet.exe&lt;/strong&gt; dosyasını bilgisayarımıza indirip, istediğimiz herhangi bir yere kopyalıyoruz.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Bu noktada kişisel tavsiyem Program Files’ın altına Nuget adında bir klasör oluşturup bu klasörün altına kopyalamak olacaktır. &lt;strong&gt;(C:\Program Files\Nuget)&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Daha sonra Başlat’a gelip “Ortam değişkeni” deyip (eğer İngilizce ise sisteminiz “Environment”) ilk çıkan seçeneğe tıklıyoruz ve &lt;strong&gt;Path kısmına nuget.exe’nin yolunu tanımlıyoruz.&lt;/strong&gt; Bu sayede komut isteminde nuget.exe’yi kullanılabilir hale getiriyoruz. Aşağıda görsel olarak aktarmaya çalıştım. Ok yönünde, sırasıyla adımları takip etmemiz yeterli olacaktır.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3LIRPqCS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AwrQHmmKQt7oHWIS-F6zPyA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3LIRPqCS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AwrQHmmKQt7oHWIS-F6zPyA.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Çalışıp çalışmadığını anlamak için;&lt;/strong&gt; komut satırına “nuget” yazdığımızda verilebilecek komutların listesi geliyorsa her şey yolunda demektir. Aksi bir durumda bilgisayarı yeniden başlatmak ya da yolu tekrar gözden geçirmek gerekebilir.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Adım 4:&lt;/strong&gt; Kendi NuGet’imize Paket Yükleme
&lt;/h3&gt;

&lt;p&gt;Evet keyifli kısımlara gelmeye başladık. Şimdi IIS’te emrimize amade bir paket yöneticimiz olduğuna göre, hem küçük bir örnek teşkil etmesi açısından hem de daha sonra kullanmak üzere bir paket yükleyelim.&lt;/p&gt;

&lt;p&gt;Örneğimizi çok basit tutacağım. Hello World döndüren string metot barındıran bir &lt;strong&gt;Class Library (.NET Standard)&lt;/strong&gt; olacak. Vakit kaybetmeden oluşturmaya başlayalım. Genel görünüm aşağıdaki gibi olmalı.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--x1FJ-XnE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/812/1%2ADdHulyFm6WJwuFjyyRAmag.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--x1FJ-XnE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/812/1%2ADdHulyFm6WJwuFjyyRAmag.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Uygulamamızı oluşturduktan sonra, kendi paket yöneticimize yüklemek için birden fazla yöntem mevcut. Build ettikten sonra &lt;strong&gt;DLL üzerinden kendimiz paket oluşturabiliriz&lt;/strong&gt; ya da direk projemizi &lt;strong&gt;publish ederek&lt;/strong&gt; Visual Studio’nun bu işi bizim için yapmasını sağlayabiliriz. Publish yönetimi daha kolay gibi gelse de uzun vadede &lt;strong&gt;paket sayıları ve güncellemeleri arttıkça daha zahmetli bir hal alacaktır.&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Adım 4.1: Publish Yöntemi
&lt;/h4&gt;

&lt;p&gt;Projemize sağ tıklayıp &lt;strong&gt;Properties&lt;/strong&gt; ’i seçiyoruz. Açılan sekmede &lt;strong&gt;Package&lt;/strong&gt; kısmına geliyoruz. &lt;strong&gt;Burası zaten hali hazırda otomatik doluyor&lt;/strong&gt; açıklama eklemek istersek, icon tanımlamak istersek ya da ilerde sürüm numarasını değiştirmek istersek bu alandan yapıldığını bilmemiz gerekiyor. Özetle paketimiz ile ilgili tüm değişiklikleri buradan yapabiliyoruz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_hGrCfwE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1006/1%2Ay0QLp0QNotkS0JfEVgRlPw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_hGrCfwE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1006/1%2Ay0QLp0QNotkS0JfEVgRlPw.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Yukarıdaki görsel zaten hali hazırda default değerlerle otomatik olarak dolmuş bir şekilde geliyor. Bilgi amaçlı bu detayları verdim. Bizim tek yapmamız gereken projemize sağ tıklayıp Publish etmek.&lt;/p&gt;

&lt;p&gt;Publish işlemi tamamlandıktan sonra sıra geldi paketimizi yayınlamaya. Publish klasörüne gidip &lt;strong&gt;cmd yazıp enter&lt;/strong&gt; diyerek komut istemi başlatıyoruz.(doğrudan o yol ile açılacaktır.)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PDy68B5_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/780/1%2Az2kqKSKYc2yaIUyYDe4BWg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PDy68B5_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/780/1%2Az2kqKSKYc2yaIUyYDe4BWg.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Komut istemi çalıştıktan sonra, aşağıdaki kodun ilgili alanlarını doldurup enter dememiz yeterli olacaktır. Kodun hemen altında aşağıda bir örnek görüntü paylaştım.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nuget push **PAKET\_ADI.1.0.0**.nupkg -source [**D**](http://nugetserver) **OMAIN** -ApiKey **PUBLIC\_KEY**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hh_bPi8n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/776/1%2AKSbHQHwIJyghqr6WFJGk6g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hh_bPi8n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/776/1%2AKSbHQHwIJyghqr6WFJGk6g.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Adım 4.2: DLL Yöntemi
&lt;/h4&gt;

&lt;p&gt;Öncelikle bu yönteme geçmeden, IIS’ten ilgili yola ulaşıp bir önceki yöntem ile oluşturduğum paketi sildim. (Silmeden de sadece sürüm numarasını yükselterek ya da yeni bir isim vererek de devam edilebilir)&lt;br&gt;&lt;br&gt;
Şimdi yapmamız gereken uygulamamızı release modda derlemek. Derleme tamamlandıktan sonra projemize sağ tıklayıp &lt;strong&gt;Open Folder in File Explorer&lt;/strong&gt; diyerek uygulamamızın yolunu açıyoruz ve &lt;strong&gt;bin/release&lt;/strong&gt; klasörünün içinden DLL dosyamızı sabit bir yere alıyoruz. &lt;em&gt;(aşağıda bonus olarak ekleyeceğim otomatikleştirme aşamasında bu sabit yer önem arz ediyor olacak).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Paket haline getireceğimiz DLL’imizi, taşıdığımız klasörün adres yoluna &lt;strong&gt;cmd&lt;/strong&gt; diyerek, komut istemini başlatıyoruz ve sırasıyla aşağıdaki komutları çalıştırıyoruz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nuget spech **PAKET\_ADI**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu komut bize &lt;strong&gt;MyPackage.nuspec&lt;/strong&gt; uzantılı bir dosya oluşturacak. Oluşan bu dosya ne diyecek olursak, publish yöntemindeki kullandığımız paketin özelliklerini belirlediğimiz Package sekmesinin XML hali. Bu dosyayı herhangi bir editör ile açıp yine logo, sürüm vb. özelliklerini düzenleyebiliriz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nuget pack **PAKET\_ADI**.nuspec
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu komut bize push edeceğimiz dosyayı oluşturuyor. Push etmeden önce yapacağımız değişiklikler varsa eğer, bu dosyayı editör ile açıp yapmamız gerekiyor.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nuget push **PAKET\_ADI.1.0.0**.nupkg -source [**D**](http://nugetserver) **OMAIN** -ApiKey **PUBLIC\_KEY**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ve son olarak bu komut ile paketimizi nuget server’ımıza aktarıyoruz.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Eğer çok çok fazla test vs yaptıysak cache temizlemekte fayda var komut istemcisinde aşağıdaki kodu çalıştırmak yeterli olacaktır.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;nuget locals all -clear&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Adım 5:&lt;/strong&gt; Gerekli Ön Ayarların Yapılması ve Paketimizin Kullanımı
&lt;/h3&gt;

&lt;p&gt;Oluşturduğumuz paketi kullanmak oldukça kolay, klasik nuget.org ile birebir aynı. Fakat bizim kendi NuGet Server’ımızı kullanabilmek için öncesinde küçük bir ayar yapmamız gerekiyor. Bunun için NuGet Package Manager’a gelip &lt;strong&gt;aşağıdaki adımları sırasıyla ok yönünde yapıyoruz.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0n69Vv8---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/743/1%2AdG3HPTQy8eUmVdxmPHp2Pw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0n69Vv8---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/743/1%2AdG3HPTQy8eUmVdxmPHp2Pw.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ok dedikten sonra artık projelerimizde kendi paket yöneticimizi kullanabileceğiz. Hemen hızlıca test etmek adına bir konsol uygulaması oluşturuyorum. Sonrasında NuGet Package Manager’ı açıyorum ve &lt;strong&gt;Package source’ta biraz önce oluşturduğum kendi paket yöneticimi seçiyorum.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fhgczE-o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1015/1%2AYx59iTEAog9GFBgJCDnqUg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fhgczE-o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1015/1%2AYx59iTEAog9GFBgJCDnqUg.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Paketi indirdikten sonra, geriye kalan tek şey kullanmak oluyor. Aşağıda küçük bir kullanım örneği mevcut.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PWPzZSGh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/438/1%2ASh_GWCDa9BaHlpSIlLTOyw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PWPzZSGh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/438/1%2ASh_GWCDa9BaHlpSIlLTOyw.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Şimdi Adım 4.2 de bahsettiğim DLL yöntemini nasıl otomatikleştireceğimizden bahsedeceğim.&lt;/p&gt;

&lt;p&gt;Aşağıya scriptin github reposunu iliştiriyorum. README.md dosyasına gerekli açıklamaları adım adım ekledim. İlgili adımlar sırasıyla takip edildiğinde sorunsuzca çalışmasını bekleriz, eğer bir aksilik olursa bana linkedin üzerinden ulaşabilirsiniz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/hakanyalitekin/AutoPublishNugetPackage"&gt;hakanyalitekin/AutoPublishNugetPackage&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu yazımda ve otomatikleştirme konusunda desteğini esirgemeyen &lt;a href="https://medium.com/u/f790d19fcd1d"&gt;Mehmet Aktaş&lt;/a&gt; ve yazım denetimi için &lt;a href="https://medium.com/u/2236ea4ed366"&gt;Birol Gökkaya&lt;/a&gt;’ya özel teşekkürlerimle :)&lt;/p&gt;

&lt;p&gt;Umarım okuyan herkese ufak da olsa faydam dokunmuştur. Bir sonraki yazımda görüşmek üzere.&lt;/p&gt;

</description>
      <category>packagemanagement</category>
      <category>csharp</category>
      <category>nuget</category>
      <category>nugetpackage</category>
    </item>
    <item>
      <title>C# ile PDF Oluşturma (Örnek fatura uygulaması)</title>
      <dc:creator>Hakan Yalitekin</dc:creator>
      <pubDate>Mon, 08 Jun 2020 23:32:02 +0000</pubDate>
      <link>https://dev.to/hakanyalitekin/c-ile-pdf-olusturma-ornek-fatura-uygulamasi-1fjn</link>
      <guid>https://dev.to/hakanyalitekin/c-ile-pdf-olusturma-ornek-fatura-uygulamasi-1fjn</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NNPx5YPF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/627/0%2AlxLvVeFkj856bt0d.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NNPx5YPF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/627/0%2AlxLvVeFkj856bt0d.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Merhabalar bu yazımda günlük hayatta olmazsa olmazlar arasında bulunan PDF’leri, C# ile Server side Handlebars template engine kullanarak nasıl oluşturabileceğimizden bahsedeceğim.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Doğrudan örnek projeyi incelemek için&lt;/strong&gt; &lt;a href="https://github.com/hakanyalitekin/SampleCreatePDF"&gt;&lt;strong&gt;GitHub linki.&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kullanım alanları olarak gerek fatura, irsaliye gerek blog sitelerimize ekleyeceğimiz CV’lerde kullananabileceğimiz örnekler yapmak mümkün.&lt;/p&gt;

&lt;p&gt;Burada ben, günümüzde çok daha yaygın olan Web Servis ile örnek uygulama yapacağım fakat aynı kodlar ile ister .Net Core ister .Net Framework 4.5+ fark etmeksizin tüm platformlar için kullanabilirsiniz. Yani aynı kodları Console’a da WinForm’a da dahil edebilirsiniz.&lt;/p&gt;

&lt;p&gt;C# ile PDF oluşturmak için iki adet NuGet paketi ve bir adet Html şablonu gereksinimimiz olacak;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1-&lt;/strong&gt; &lt;a href="https://www.nuget.org/packages/Select.HtmlToPdf"&gt;&lt;strong&gt;https://www.nuget.org/packages/Select.HtmlToPdf&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;2-&lt;/strong&gt; &lt;a href="https://www.nuget.org/packages/Handlebars.Net"&gt;&lt;strong&gt;https://www.nuget.org/packages/Handlebars.Net&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;(Template Engine )&lt;br&gt;&lt;br&gt;
3- Örnek şablona yukarıda ki&lt;/strong&gt;&lt;a href="https://github.com/hakanyalitekin/SampleCreatePDF/blob/master/SampleCreatePDF/PDF_Template.html"&gt;&lt;strong&gt;github linkinden&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;erişilebilir.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ben PDF ile ilgili 5 sayfaya kadar ücretsiz olan SelectPDF’i kullandım fakat siz ihtiyaçlarınıza göre &lt;a href="https://www.it-swarm.dev/tr/c%23/htmlyi-.nette-pdfye-donusturun/958245890/"&gt;&lt;strong&gt;bu link&lt;/strong&gt;&lt;/a&gt; üzerindeki tartışmaya göz atarak farklı bir package kullanabilirsiniz. (Eğer SelectPDF’i kullanacaksanız dahi bir göz atmanızda fayda var)&lt;/p&gt;

&lt;p&gt;Kodlamaya geçmeden önce template engine’lerin çalışma mantığından kısaca bahsedeyim. Template engine’leri Html input’ların yer tutucularına(placeholder) benzetmek mümkündür. Yaptığı iş örneğin Html içerisinde &lt;code&gt;{{isim}}&lt;/code&gt; gördüğü yeri göndereceğimiz isim değeri ile yer değiştirmesidir. Handlebars’ın yeteneklerine &lt;a href="https://handlebarsjs.com/guide/"&gt;&lt;strong&gt;bu link&lt;/strong&gt;&lt;/a&gt; üzerinden erişebilirsiniz. Ben basit expression ve each yeteneklerinden faydalanacağım.&lt;/p&gt;

&lt;p&gt;Html içerisinden küçük bir örnek gösterim;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WmsRnZ8y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/953/1%2AxvnIVGadBkRvmMNVQJmFWQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WmsRnZ8y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/953/1%2AxvnIVGadBkRvmMNVQJmFWQ.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gelelim kod kısmına. Öncelikle bir PdfManager oluşturuyoruz ve içerisine SelectPDF ile ilgili kısmı yazıyoruz.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ben portrait bir A4 kağıdı üzerinden gittim fakat siz farklı ihtiyaçlarınıza göre farklı kağıt seçenekleri ekleyebilirsiniz. PdfPageSize enum’u üzerinden kağıt seçeneklerini görebilirsiniz.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Atrık Pdf oluşturma metodumuz olduğuna göre template engine’imizi kullanarak &lt;strong&gt;Html - Model&lt;/strong&gt; birleştirme işlemini gerçekleştirebiliriz. Fakat bu birleştirme işleminine geçmeden önce Handlebars’ın nimetlerinden biraz daha faydalanmak istiyorum. Para ve tarih formatların da küçük ayarlamalar yapan metodumu yazıyorum. &lt;em&gt;(Ben tarih formatını açıklayacağım bunu anladığınızda para formatını da anlamış olacaksınız.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Öncelikle metodumuzda kullandığımız parameters’in değerlerini html içerisinde önceden ayarlıyoruz ve ekran görüntüsünün aşağıdaki gibi olduğundan emin oluyoruz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lZC0hMiw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/586/1%2ApENpq8yn4vXUeBz76msf6Q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lZC0hMiw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/586/1%2ApENpq8yn4vXUeBz76msf6Q.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ve sonrasında metodumuzu yazıyoruz. Bu metot ile ilgili önemli ayrıntıları yorum satırı olarak ekledim fakat tekrar bahsedeyim.&lt;/p&gt;

&lt;p&gt;Neden ikinci parametre olarak tarih formatını aldık, elle yazsak olmaz mıydı?&lt;/p&gt;

&lt;p&gt;Kesinlikle olurdu. Fakat birden fazla format kullanılmak istendiğinde bunu nasıl çözeceğinizi göstermek istedim.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;PdfManager sınıfımız hazır olduğuna göre şimdi kullanma aşamasına geçelim. Tüm detaylarını yorum satırı olarak ekledim, tek tek burada yeniden bahsedip gereksiz yere vaktinizi almayacağım :)&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;localhost:(port)/api/home/CreatePdf’ü tetikleyerek pdf’in oluşup oluşmadığını test edebilirsiniz. Örnek görüntü aşağıdaki gibi olmalıdır.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cj0yEHMu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/925/1%2Ac4I2HDUBOKr33DhhjCt-kQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cj0yEHMu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/925/1%2Ac4I2HDUBOKr33DhhjCt-kQ.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Umarım ufakta olsa faydam dokunmuştur.&lt;/p&gt;

</description>
      <category>createpdfsoftware</category>
      <category>pdf</category>
      <category>csharp</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>.Net Framework için Swagger ile FileUpload</title>
      <dc:creator>Hakan Yalitekin</dc:creator>
      <pubDate>Thu, 28 May 2020 13:07:56 +0000</pubDate>
      <link>https://dev.to/hakanyalitekin/net-framework-icin-swagger-ile-fileupload-4c8p</link>
      <guid>https://dev.to/hakanyalitekin/net-framework-icin-swagger-ile-fileupload-4c8p</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WdY62I1s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/500/1%2AqC5H4wYInMmabTWZkkyoVg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WdY62I1s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/500/1%2AqC5H4wYInMmabTWZkkyoVg.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Merhaba bir önce ki yazımda paylaştığım swagger kurulum, kimlik doğrulama vs. işlemlerine bu &lt;a href="https://dev.to/hakanyalitekin/net-framework-icin-swagger-ve-jwt-authentication-5e4c-temp-slug-2951071"&gt;&lt;strong&gt;link&lt;/strong&gt;&lt;/a&gt;üzerinden erişebilirsiniz. Bu yazı devamı niteliğinde olacak.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Doğrudan örnek projeyi incelemek için&lt;/strong&gt; &lt;a href="https://github.com/hakanyalitekin/SwaggerWithJWT"&gt;&lt;strong&gt;GitHub linki.&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gelelim asıl meselemize, dosya yükleme işlemlerinde Postman’a bağlı kalmadan swaggerdan from-data üzerinden nasıl dosya yükleme yapılacağından bahsedeceğim.&lt;/p&gt;

&lt;p&gt;Bunun için öncelikle bir atrribute’e ihtiyacımız olacak. Bu attribute’ü kullanarak hangi serviste file upload yapacağımızı belirteceğiz ve istersek belirli parametereler yollayarak örneğin required olup olmadığını, açıklamasını belirtebileceğiz.&lt;/p&gt;

&lt;p&gt;Projemizin Filters klasörüne &lt;strong&gt;SwaggerParameterAttribute.cs&lt;/strong&gt; adında bir attribute sınıfı ekleyelim ve içeriğini aşağıda ki gibi ayarlayalım. Default alanları siz istediğiniz şekilde ayarlayabilirsiniz.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Artık attribute’tümüz hazır olduğuna göre, gelelim swagger ayarlamasına. Bu ayarlamayı yapabilmek için IOperationFilter interface’inden faydalanarak kendi OperationFilter kuralımızı oluşturacağız.&lt;/p&gt;

&lt;p&gt;Oluşturacağımız bu class’ı ister swagger’ın halihazırda ki SwaggerConfig.cs’ine ekleyebilir, isterseniz de ayrı bir class oluşturarak yapabilirsiniz. Ben çok dallanıp budaklanmamak için direk içerisine dahil ettim.&lt;/p&gt;

&lt;p&gt;OperationFilter’ın nasıl bir mantık ile çalıştığını kodun içerisine yorum satırı olarak ekledim.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Swagger’da oluşturduğumuz bu OperationFilter’i aktifleştirmemiz gerekiyor bunun içinde SwaggerConfig.cs’in içerisine aşağıdaki kodu ekliyoruz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--p4M0VfBn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AjpRuxUJwp9rpIEz_6K7gXw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--p4M0VfBn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AjpRuxUJwp9rpIEz_6K7gXw.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Artık oluşturduğumuz SwaggerParameterAttribut’ü kullanarak swagger’dan file upload işlemlerimizi gerçekleştirebiliriz. Bunun için örnek bir kullanımı aşağıda paylaşıyorum.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Kodumuzu çalıştırdığımızda görmemiz gereken görüntü aşağıda ki gibi olmalıdır. Eğer değilse bir şeyleri yanlış yapmış olabiliriz. Yazıyı ya da github üzerinde ki projeyi inceleyebilirsiniz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7uhHI2nC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AorMSHGWKJJFLyXOxQP7dqA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7uhHI2nC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AorMSHGWKJJFLyXOxQP7dqA.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Umarım ufakta olsa faydam dokunmuştur.&lt;/p&gt;

</description>
      <category>swashbuckle</category>
      <category>fileupload</category>
      <category>csharp</category>
      <category>dotnetframework</category>
    </item>
  </channel>
</rss>
