<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="tr">
    <title>Erdinç Yaşan</title>
    <subtitle>Kişisel web sitesi</subtitle>
    <link rel="self" type="application/atom+xml" href="https://erdincyasan.com/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://erdincyasan.com"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-09-05T00:00:00+00:00</updated>
    <id>https://erdincyasan.com/atom.xml</id>
    <entry xml:lang="tr">
        <title>.NET&#x27;te Dependency Injection Nedir, Neden Kullanılır</title>
        <published>2026-09-05T00:00:00+00:00</published>
        <updated>2026-09-05T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://erdincyasan.com/blog/dotnet-dependency-injection/"/>
        <id>https://erdincyasan.com/blog/dotnet-dependency-injection/</id>
        
        <content type="html" xml:base="https://erdincyasan.com/blog/dotnet-dependency-injection/">&lt;p&gt;Herkese selam, bu yazımda ASP.NET&#x27;in kalbinin atmasını sağlayan ve diğer framework&#x27;lerden öne çıkmasını sağlayan, built-in gelen bir yapıdan bahsetmek istiyorum. Dependency Injection. Bu arkadaşın ismi Türkçede pek anlamlı değil, o yüzden ne olduğunu bilsek ve nasıl çalıştığını anlasak yeterli. İsminin Türkçe karşılığı bağımlılık enjeksiyonu (aslında fena da değil).&lt;&#x2F;p&gt;
&lt;p&gt;Konuya deep dive yapmadan önce bu ihtiyacı ortaya çıkarsak daha iyi olacak sanırım.&lt;&#x2F;p&gt;
&lt;p&gt;(Buradaki örneği bilerek çok absürt tutuyorum ki ilgili yazıyı söve söve okumaya devam edelim.)&lt;&#x2F;p&gt;
&lt;h2 id=&quot;baslamadan-once&quot;&gt;Başlamadan önce&lt;&#x2F;h2&gt;
&lt;p&gt;Bu yazıyı takip etmek için temel seviyede C# bilgisi yeterli: class, constructor, method ve interface kavramlarına aşina olmanız gerekiyor. Örnekleri kendiniz çalıştırmak isterseniz .NET 10 SDK kurulu olsun, veritabanı ya da başka bir kurulum gerekmiyor.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;di-olmasaydi-ne-yazardik&quot;&gt;DI olmasaydı ne yazardık?&lt;&#x2F;h2&gt;
&lt;p&gt;Yazmış olduğumuz kodda veriyi bir dosyada tuttuğumuzu düşünelim. Elimizde bir dosya yolu var, örneğin ne olsun, &lt;code&gt;data&#x2F;users.csv&lt;&#x2F;code&gt; bu şekilde bir yolumuz olsun.&lt;&#x2F;p&gt;
&lt;p&gt;Örnek bağlamında tablolar ekleyeceğim, bu tabloları da olabildiğince basic tutarak ilerliyorum, her tablo bir CSV dosyası olsun. Örneğin &lt;code&gt;users&lt;&#x2F;code&gt; adlı tablomuz var, iki tane de işlemimiz olacak: kullanıcı kayıt ve kullanıcı okuma senaryosu. Diyelim ki yeni başladık ve functional programming&#x27;den geldik. Hemen açtık iki tane fonksiyon, kayıt ol ve kullanıcı oku diye. Her iki fonksiyonun başlangıcında da kullanıcıyı dosyaya kaydetmek için ve kullanıcıyı dosyadan okumak için dosya yolunu tekrar tekrar yazacağız.&lt;&#x2F;p&gt;
&lt;p&gt;Örnek olarak verdiğim uygulamada kullanıcıları saklamak için şöyle bir method yazdım:&lt;&#x2F;p&gt;
&lt;div class=&quot;code-head&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;dotnet-dependency-injection&#x2F;blob&#x2F;where-it-comes-01&#x2F;_01_WhereItComes&#x2F;Program.cs#L50-L55&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;_01_WhereItComes&#x2F;Program.cs&lt;&#x2F;a&gt;&lt;a class=&quot;code-ref&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;dotnet-dependency-injection&#x2F;tree&#x2F;where-it-comes-01&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;where-it-comes-01&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;50&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;void&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; RegisterUser&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;string&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; email&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; string&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; displayName&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;51&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;52&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;    Directory&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;CreateDirectory&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;data&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;53&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;54&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;    File&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;AppendAllText&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;data&#x2F;users.csv&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; $&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;email&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;displayName&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;Environment&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;NewLine&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;55&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;div class=&quot;code-foot&quot;&gt;
  &lt;button type=&quot;button&quot; class=&quot;code-btn code-copy&quot;
          data-label=&quot;Kopyala&quot;
          data-done=&quot;Kopyalandı&quot;&gt;Kopyala&lt;&#x2F;button&gt;
  &lt;button type=&quot;button&quot; class=&quot;code-btn code-plain-toggle&quot;
          data-plain=&quot;Düz metin&quot;
          data-rich=&quot;Renkli görünüm&quot;&gt;Düz metin&lt;&#x2F;button&gt;
  &lt;span class=&quot;code-foot-spacer&quot;&gt;&lt;&#x2F;span&gt;
  &lt;select class=&quot;code-theme-picker&quot; aria-label=&quot;Kod teması&quot;&gt;
    &lt;option value=&quot;&quot;&gt;Site teması&lt;&#x2F;option&gt;
    &lt;option value=&quot;mocha&quot;&gt;Catppuccin Mocha&lt;&#x2F;option&gt;
    &lt;option value=&quot;latte&quot;&gt;Catppuccin Latte&lt;&#x2F;option&gt;
    &lt;option value=&quot;gruvbox&quot;&gt;Gruvbox&lt;&#x2F;option&gt;
    &lt;option value=&quot;nord&quot;&gt;Nord&lt;&#x2F;option&gt;
    &lt;option value=&quot;mono&quot;&gt;Renksiz&lt;&#x2F;option&gt;
  &lt;&#x2F;select&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;Ve kullanıcıları sonrasında okumak için de şöyle bir kod parçası yazdım:&lt;&#x2F;p&gt;
&lt;div class=&quot;code-head&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;dotnet-dependency-injection&#x2F;blob&#x2F;where-it-comes-01&#x2F;_01_WhereItComes&#x2F;Program.cs#L57-L72&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;_01_WhereItComes&#x2F;Program.cs&lt;&#x2F;a&gt;&lt;a class=&quot;code-ref&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;dotnet-dependency-injection&#x2F;tree&#x2F;where-it-comes-01&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;where-it-comes-01&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;57&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;?&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; ReadUser&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;int&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; lineNumber&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;58&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;59&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;!&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;File&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Exists&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;data&#x2F;users.csv&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;60&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;61&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;        return&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language&quot;&gt; null&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;62&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;63&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;64&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;    var&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; lines&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; File&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;ReadAllLines&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;data&#x2F;users.csv&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;65&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;66&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;lineNumber&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ||&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; lineNumber&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; lines&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Length&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;67&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;68&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;        return&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language&quot;&gt; null&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;69&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;70&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;71&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; lines&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;lineNumber&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;72&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;div class=&quot;code-foot&quot;&gt;
  &lt;button type=&quot;button&quot; class=&quot;code-btn code-copy&quot;
          data-label=&quot;Kopyala&quot;
          data-done=&quot;Kopyalandı&quot;&gt;Kopyala&lt;&#x2F;button&gt;
  &lt;button type=&quot;button&quot; class=&quot;code-btn code-plain-toggle&quot;
          data-plain=&quot;Düz metin&quot;
          data-rich=&quot;Renkli görünüm&quot;&gt;Düz metin&lt;&#x2F;button&gt;
  &lt;span class=&quot;code-foot-spacer&quot;&gt;&lt;&#x2F;span&gt;
  &lt;select class=&quot;code-theme-picker&quot; aria-label=&quot;Kod teması&quot;&gt;
    &lt;option value=&quot;&quot;&gt;Site teması&lt;&#x2F;option&gt;
    &lt;option value=&quot;mocha&quot;&gt;Catppuccin Mocha&lt;&#x2F;option&gt;
    &lt;option value=&quot;latte&quot;&gt;Catppuccin Latte&lt;&#x2F;option&gt;
    &lt;option value=&quot;gruvbox&quot;&gt;Gruvbox&lt;&#x2F;option&gt;
    &lt;option value=&quot;nord&quot;&gt;Nord&lt;&#x2F;option&gt;
    &lt;option value=&quot;mono&quot;&gt;Renksiz&lt;&#x2F;option&gt;
  &lt;&#x2F;select&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;Burada fark ettiğiniz üzere bir işi (ilgili dosya ile ilgili işlemi) iki farklı yerde yapmaya başladık.&lt;&#x2F;p&gt;
&lt;p&gt;Gelin isterseniz C#&#x27;ın nimetlerinden faydalanıp bunu bir obje hâline getirelim ve bir tane UserRepository yapalım. UserRepository de içerisinde şimdilik iki methodu olan (ihtiyacımız o kadar) bir sınıf olsun. Kullanıcı kaydet ve kullanıcı oku.&lt;&#x2F;p&gt;
&lt;!-- inline-code: the whole class is the subject here, it is 26 lines --&gt;
&lt;div class=&quot;code-head&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;dotnet-dependency-injection&#x2F;blob&#x2F;where-it-comes-02&#x2F;_01_WhereItComes&#x2F;UserRepository.cs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;_01_WhereItComes&#x2F;UserRepository.cs&lt;&#x2F;a&gt;&lt;a class=&quot;code-ref&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;dotnet-dependency-injection&#x2F;tree&#x2F;where-it-comes-02&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;where-it-comes-02&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier&quot;&gt;public&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; class&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; UserRepository&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt; 2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt; 3&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier&quot;&gt;    public&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; void&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; Save&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;string&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; email&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; string&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; displayName&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt; 4&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt; 5&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;        Directory&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;CreateDirectory&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;data&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt; 6&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt; 7&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;        File&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;AppendAllText&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;data&#x2F;users.csv&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; $&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;email&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;displayName&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;Environment&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;NewLine&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt; 8&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt; 9&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier&quot;&gt;    public&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;?&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; Read&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;int&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; lineNumber&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;11&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;12&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;!&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;File&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Exists&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;data&#x2F;users.csv&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;13&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;14&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;            return&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language&quot;&gt; null&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;15&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;16&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;17&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;        var&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; lines&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; File&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;ReadAllLines&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;data&#x2F;users.csv&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;18&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;19&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;lineNumber&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ||&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; lineNumber&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; lines&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Length&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;20&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;21&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;            return&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language&quot;&gt; null&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;22&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;23&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;24&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;        return&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; lines&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;lineNumber&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;25&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;26&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;div class=&quot;code-foot&quot;&gt;
  &lt;button type=&quot;button&quot; class=&quot;code-btn code-copy&quot;
          data-label=&quot;Kopyala&quot;
          data-done=&quot;Kopyalandı&quot;&gt;Kopyala&lt;&#x2F;button&gt;
  &lt;button type=&quot;button&quot; class=&quot;code-btn code-plain-toggle&quot;
          data-plain=&quot;Düz metin&quot;
          data-rich=&quot;Renkli görünüm&quot;&gt;Düz metin&lt;&#x2F;button&gt;
  &lt;span class=&quot;code-foot-spacer&quot;&gt;&lt;&#x2F;span&gt;
  &lt;select class=&quot;code-theme-picker&quot; aria-label=&quot;Kod teması&quot;&gt;
    &lt;option value=&quot;&quot;&gt;Site teması&lt;&#x2F;option&gt;
    &lt;option value=&quot;mocha&quot;&gt;Catppuccin Mocha&lt;&#x2F;option&gt;
    &lt;option value=&quot;latte&quot;&gt;Catppuccin Latte&lt;&#x2F;option&gt;
    &lt;option value=&quot;gruvbox&quot;&gt;Gruvbox&lt;&#x2F;option&gt;
    &lt;option value=&quot;nord&quot;&gt;Nord&lt;&#x2F;option&gt;
    &lt;option value=&quot;mono&quot;&gt;Renksiz&lt;&#x2F;option&gt;
  &lt;&#x2F;select&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;Şimdi burada gördüğünüz üzere UserRepository, bizim daha önceki fonksiyonumuz ne yapıyorsa aynen yapmaya devam ediyor.&lt;&#x2F;p&gt;
&lt;p&gt;Şu an uygulamanın iki yerinde UserRepository&#x27;yi kullanıyoruz (Program.cs içerisinde). Buralarda bu bağımlılığın çözülmesi gerek; bizim bu iki methodumuz dolaylı yoldan UserRepository&#x27;ye bağlanmış oldu artık. Gördüğünüz gibi bu iki methodda da UserRepository&#x27;yi new&#x27;lemek durumunda kaldık.&lt;&#x2F;p&gt;
&lt;div class=&quot;code-head&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;dotnet-dependency-injection&#x2F;blob&#x2F;where-it-comes-02&#x2F;_01_WhereItComes&#x2F;Program.cs#L12-L24&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;_01_WhereItComes&#x2F;Program.cs&lt;&#x2F;a&gt;&lt;a class=&quot;code-ref&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;dotnet-dependency-injection&#x2F;tree&#x2F;where-it-comes-02&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;where-it-comes-02&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;12&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;choice&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;13&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;14&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;        Console&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Write&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;email: &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;15&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;        var&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; email&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; Console&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;ReadLine&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ??&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Empty&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;16&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;17&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;        Console&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Write&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;display name: &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;18&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;        var&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; displayName&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; Console&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;ReadLine&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ??&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Empty&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;19&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;20&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;        var&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; users&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; UserRepository&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;21&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;22&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;        users&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Save&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;email&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; displayName&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;23&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;        Console&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;WriteLine&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;saved&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;24&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;div class=&quot;code-foot&quot;&gt;
  &lt;button type=&quot;button&quot; class=&quot;code-btn code-copy&quot;
          data-label=&quot;Kopyala&quot;
          data-done=&quot;Kopyalandı&quot;&gt;Kopyala&lt;&#x2F;button&gt;
  &lt;button type=&quot;button&quot; class=&quot;code-btn code-plain-toggle&quot;
          data-plain=&quot;Düz metin&quot;
          data-rich=&quot;Renkli görünüm&quot;&gt;Düz metin&lt;&#x2F;button&gt;
  &lt;span class=&quot;code-foot-spacer&quot;&gt;&lt;&#x2F;span&gt;
  &lt;select class=&quot;code-theme-picker&quot; aria-label=&quot;Kod teması&quot;&gt;
    &lt;option value=&quot;&quot;&gt;Site teması&lt;&#x2F;option&gt;
    &lt;option value=&quot;mocha&quot;&gt;Catppuccin Mocha&lt;&#x2F;option&gt;
    &lt;option value=&quot;latte&quot;&gt;Catppuccin Latte&lt;&#x2F;option&gt;
    &lt;option value=&quot;gruvbox&quot;&gt;Gruvbox&lt;&#x2F;option&gt;
    &lt;option value=&quot;nord&quot;&gt;Nord&lt;&#x2F;option&gt;
    &lt;option value=&quot;mono&quot;&gt;Renksiz&lt;&#x2F;option&gt;
  &lt;&#x2F;select&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;code-head&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;dotnet-dependency-injection&#x2F;blob&#x2F;where-it-comes-02&#x2F;_01_WhereItComes&#x2F;Program.cs#L25-L38&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;_01_WhereItComes&#x2F;Program.cs&lt;&#x2F;a&gt;&lt;a class=&quot;code-ref&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;dotnet-dependency-injection&#x2F;tree&#x2F;where-it-comes-02&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;where-it-comes-02&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;25&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;    else&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; if&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;choice&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;26&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;27&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;        Console&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Write&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;line number: &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;28&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;29&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;!&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;int&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;TryParse&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Console&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;ReadLine&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier&quot;&gt; out&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; var&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; lineNumber&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;30&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;31&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;            Console&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;WriteLine&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;line number must be a number&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;32&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;            continue&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;33&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;34&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;35&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;        var&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; users&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; UserRepository&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;36&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;37&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;        Console&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;WriteLine&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;users&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Read&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;lineNumber&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ??&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;no user on that line&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;38&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;div class=&quot;code-foot&quot;&gt;
  &lt;button type=&quot;button&quot; class=&quot;code-btn code-copy&quot;
          data-label=&quot;Kopyala&quot;
          data-done=&quot;Kopyalandı&quot;&gt;Kopyala&lt;&#x2F;button&gt;
  &lt;button type=&quot;button&quot; class=&quot;code-btn code-plain-toggle&quot;
          data-plain=&quot;Düz metin&quot;
          data-rich=&quot;Renkli görünüm&quot;&gt;Düz metin&lt;&#x2F;button&gt;
  &lt;span class=&quot;code-foot-spacer&quot;&gt;&lt;&#x2F;span&gt;
  &lt;select class=&quot;code-theme-picker&quot; aria-label=&quot;Kod teması&quot;&gt;
    &lt;option value=&quot;&quot;&gt;Site teması&lt;&#x2F;option&gt;
    &lt;option value=&quot;mocha&quot;&gt;Catppuccin Mocha&lt;&#x2F;option&gt;
    &lt;option value=&quot;latte&quot;&gt;Catppuccin Latte&lt;&#x2F;option&gt;
    &lt;option value=&quot;gruvbox&quot;&gt;Gruvbox&lt;&#x2F;option&gt;
    &lt;option value=&quot;nord&quot;&gt;Nord&lt;&#x2F;option&gt;
    &lt;option value=&quot;mono&quot;&gt;Renksiz&lt;&#x2F;option&gt;
  &lt;&#x2F;select&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;Buradaki ufak örnekte sorun yok ancak bağımlılıklarımızın arttığı senaryoda bu new&#x27;ler başımızı ağrıtmaya başlayacak.&lt;&#x2F;p&gt;
&lt;p&gt;Örneğin kullanıcıların nereye kayıt edileceğini bize sağlayan bir class&#x27;ımız olduğunu düşünelim: TableResolver. TableResolver da kendi içinde method olarak GetUserTableSource&#x27;a sahip olsun (bu method sadece kullanıcıların nereye kayıt edileceğini gösteren string dönecek).&lt;&#x2F;p&gt;
&lt;!-- inline-code: the whole class is the subject here, it is 7 lines --&gt;
&lt;div class=&quot;code-head&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;dotnet-dependency-injection&#x2F;blob&#x2F;where-it-comes-03&#x2F;_01_WhereItComes&#x2F;TableResolver.cs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;_01_WhereItComes&#x2F;TableResolver.cs&lt;&#x2F;a&gt;&lt;a class=&quot;code-ref&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;dotnet-dependency-injection&#x2F;tree&#x2F;where-it-comes-03&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;where-it-comes-03&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier&quot;&gt;public&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; class&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; TableResolver&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier&quot;&gt;    public&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; string&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; GetUserTableSource&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;4&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;5&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;        return&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;data&#x2F;users.csv&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;6&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;7&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;div class=&quot;code-foot&quot;&gt;
  &lt;button type=&quot;button&quot; class=&quot;code-btn code-copy&quot;
          data-label=&quot;Kopyala&quot;
          data-done=&quot;Kopyalandı&quot;&gt;Kopyala&lt;&#x2F;button&gt;
  &lt;button type=&quot;button&quot; class=&quot;code-btn code-plain-toggle&quot;
          data-plain=&quot;Düz metin&quot;
          data-rich=&quot;Renkli görünüm&quot;&gt;Düz metin&lt;&#x2F;button&gt;
  &lt;span class=&quot;code-foot-spacer&quot;&gt;&lt;&#x2F;span&gt;
  &lt;select class=&quot;code-theme-picker&quot; aria-label=&quot;Kod teması&quot;&gt;
    &lt;option value=&quot;&quot;&gt;Site teması&lt;&#x2F;option&gt;
    &lt;option value=&quot;mocha&quot;&gt;Catppuccin Mocha&lt;&#x2F;option&gt;
    &lt;option value=&quot;latte&quot;&gt;Catppuccin Latte&lt;&#x2F;option&gt;
    &lt;option value=&quot;gruvbox&quot;&gt;Gruvbox&lt;&#x2F;option&gt;
    &lt;option value=&quot;nord&quot;&gt;Nord&lt;&#x2F;option&gt;
    &lt;option value=&quot;mono&quot;&gt;Renksiz&lt;&#x2F;option&gt;
  &lt;&#x2F;select&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;Evet, gördüğünüz gibi bizim UserRepository&#x27;nin bağımlılığı artarak TableResolver eklendi ve artık bu şu demek: UserRepository oluşturulurken TableResolver adlı class&#x27;a ihtiyaç duyacak. Bu da daha önce yazmış olduğumuz Program.cs içerisindeki iki kodun değişmesi gerekiyor demek. Yani UserRepository kullanan herkese artık bana bunu sağlamalısın diyor, çünkü .NET elimde olmayan objeyi kullanamam diyor.&lt;&#x2F;p&gt;
&lt;div class=&quot;code-head&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;dotnet-dependency-injection&#x2F;compare&#x2F;where-it-comes-02...where-it-comes-03&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;_01_WhereItComes&#x2F;Program.cs&lt;&#x2F;a&gt;&lt;a class=&quot;code-ref&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;dotnet-dependency-injection&#x2F;compare&#x2F;where-it-comes-02...where-it-comes-03&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;where-it-comes-02 → where-it-comes-03&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;div class=&quot;code-diff-marks&quot; data-kinds=&quot;hunk,ctx,ctx,ctx,del,add,ctx,ctx,ctx,hunk,ctx,ctx,ctx,del,add,ctx,ctx,ctx&quot; hidden&gt;&lt;&#x2F;div&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;@@ &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;17&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;7&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; +&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;17&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;7&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; @@&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;         Console&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Write&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;display name: &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;         var&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; displayName&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; Console&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;ReadLine&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ??&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Empty&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;        var&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; users&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; UserRepository&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;+&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;        var&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; users&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; UserRepository&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; TableResolver&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;         users&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Save&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;email&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; displayName&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;         Console&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;WriteLine&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;saved&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;@@ &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;32&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;7&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; +&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;32&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;7&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; @@&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;             continue&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;         }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;        var&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; users&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; UserRepository&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;+&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;        var&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; users&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; UserRepository&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; TableResolver&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;         Console&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;WriteLine&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;users&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Read&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;lineNumber&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ??&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;no user on that line&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;     }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;div class=&quot;code-foot&quot;&gt;
  &lt;button type=&quot;button&quot; class=&quot;code-btn code-copy&quot;
          data-label=&quot;Kopyala&quot;
          data-done=&quot;Kopyalandı&quot;&gt;Kopyala&lt;&#x2F;button&gt;
  &lt;button type=&quot;button&quot; class=&quot;code-btn code-plain-toggle&quot;
          data-plain=&quot;Düz metin&quot;
          data-rich=&quot;Renkli görünüm&quot;&gt;Düz metin&lt;&#x2F;button&gt;
  &lt;span class=&quot;code-foot-spacer&quot;&gt;&lt;&#x2F;span&gt;
  &lt;select class=&quot;code-theme-picker&quot; aria-label=&quot;Kod teması&quot;&gt;
    &lt;option value=&quot;&quot;&gt;Site teması&lt;&#x2F;option&gt;
    &lt;option value=&quot;mocha&quot;&gt;Catppuccin Mocha&lt;&#x2F;option&gt;
    &lt;option value=&quot;latte&quot;&gt;Catppuccin Latte&lt;&#x2F;option&gt;
    &lt;option value=&quot;gruvbox&quot;&gt;Gruvbox&lt;&#x2F;option&gt;
    &lt;option value=&quot;nord&quot;&gt;Nord&lt;&#x2F;option&gt;
    &lt;option value=&quot;mono&quot;&gt;Renksiz&lt;&#x2F;option&gt;
  &lt;&#x2F;select&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;Buradaki bağımlılığın sadece bizim projede değil de birçok yerde kullanıldığını düşünsenize. Kullanıcının tek istediği sadece UserRepository, ama birçok şeyi bilmesi gerekecek (bu örnekte sadece TableResolver ama örneğin büyüdüğünü ve bağımlılıkların arttığını düşünsenize).&lt;&#x2F;p&gt;
&lt;p&gt;İşin özü bu aslında, .NET&#x27;in bu dependency injection formülü buradan geliyor. Bu aslında &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Inversion_of_control&quot;&gt;Inversion of Control&lt;&#x2F;a&gt; tasarım deseninden gelmekte.&lt;&#x2F;p&gt;
&lt;p&gt;IoC için şunu diyebiliriz o zaman: bir kodun nasıl çözümleneceğini belirttikten sonra gerisini ben hallederim der. Yani siz bir formül belirlersiniz. Örneğin çay yapmak bir süreçtir: çaydanlığı al, içine su koy, bekle, servis et. Bunları hazırlarsınız, talimatları IoC&#x27;ye girersiniz; daha sonra birisi çay yap dediğinde bu süreçleri kendisi işletir. IoC tam olarak budur. Biz de .NET içerisinde dependency injection kullanırken tam olarak bunu yapacağız. Şu an bağımlılıklarımız var ve örneğimizde bağımlılıkları (çayı) kendisi yüklemek zorunda, ancak bu işi sadece bana UserRepository ver mantığına çevirebiliriz.&lt;&#x2F;p&gt;
&lt;p&gt;Şimdi bizim örneğimizde dependency injection eklemek için bazı paketler eklememiz gerekiyor, bu paketler Microsoft&#x27;un kendi paketi zaten:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;dotnet&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; add&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; package&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Microsoft.Extensions.DependencyInjection&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Bu komut da csproj&#x27;a şu satırı ekliyor:&lt;&#x2F;p&gt;
&lt;div class=&quot;code-head&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;dotnet-dependency-injection&#x2F;blob&#x2F;where-it-comes-04&#x2F;_01_WhereItComes&#x2F;_01_WhereItComes.csproj#L10-L12&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;_01_WhereItComes&#x2F;_01_WhereItComes.csproj&lt;&#x2F;a&gt;&lt;a class=&quot;code-ref&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;dotnet-dependency-injection&#x2F;tree&#x2F;where-it-comes-04&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;where-it-comes-04&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;xml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;ItemGroup&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;11&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;    &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;PackageReference&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt; Include&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;Microsoft.Extensions.DependencyInjection&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-attribute-name&quot;&gt; Version&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;10.0.11&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt; &#x2F;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;12&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;  &amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;ItemGroup&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;div class=&quot;code-foot&quot;&gt;
  &lt;button type=&quot;button&quot; class=&quot;code-btn code-copy&quot;
          data-label=&quot;Kopyala&quot;
          data-done=&quot;Kopyalandı&quot;&gt;Kopyala&lt;&#x2F;button&gt;
  &lt;button type=&quot;button&quot; class=&quot;code-btn code-plain-toggle&quot;
          data-plain=&quot;Düz metin&quot;
          data-rich=&quot;Renkli görünüm&quot;&gt;Düz metin&lt;&#x2F;button&gt;
  &lt;span class=&quot;code-foot-spacer&quot;&gt;&lt;&#x2F;span&gt;
  &lt;select class=&quot;code-theme-picker&quot; aria-label=&quot;Kod teması&quot;&gt;
    &lt;option value=&quot;&quot;&gt;Site teması&lt;&#x2F;option&gt;
    &lt;option value=&quot;mocha&quot;&gt;Catppuccin Mocha&lt;&#x2F;option&gt;
    &lt;option value=&quot;latte&quot;&gt;Catppuccin Latte&lt;&#x2F;option&gt;
    &lt;option value=&quot;gruvbox&quot;&gt;Gruvbox&lt;&#x2F;option&gt;
    &lt;option value=&quot;nord&quot;&gt;Nord&lt;&#x2F;option&gt;
    &lt;option value=&quot;mono&quot;&gt;Renksiz&lt;&#x2F;option&gt;
  &lt;&#x2F;select&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;Ve burada birkaç terimle karşılaşacağız aslında: ServiceCollection, ServiceProvider. İlk olarak yeni bir ServiceCollection açıyoruz ve bu ServiceCollection bizim IoC&#x27;miz oluyor; burada neyi nasıl çözümleyeceğini tarif ediyoruz. Öncelikle UserRepository class&#x27;ımızı services&#x27;a ekleyelim.&lt;&#x2F;p&gt;
&lt;div class=&quot;code-head&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;dotnet-dependency-injection&#x2F;blob&#x2F;where-it-comes-04&#x2F;_01_WhereItComes&#x2F;Program.cs#L3-L7&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;_01_WhereItComes&#x2F;Program.cs&lt;&#x2F;a&gt;&lt;a class=&quot;code-ref&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;dotnet-dependency-injection&#x2F;tree&#x2F;where-it-comes-04&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;where-it-comes-04&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;var&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; services&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; ServiceCollection&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;4&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;5&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;services&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;AddScoped&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;UserRepository&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;sp&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; UserRepository&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; TableResolver&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;6&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;7&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;var&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; provider&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; services&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;BuildServiceProvider&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;div class=&quot;code-foot&quot;&gt;
  &lt;button type=&quot;button&quot; class=&quot;code-btn code-copy&quot;
          data-label=&quot;Kopyala&quot;
          data-done=&quot;Kopyalandı&quot;&gt;Kopyala&lt;&#x2F;button&gt;
  &lt;button type=&quot;button&quot; class=&quot;code-btn code-plain-toggle&quot;
          data-plain=&quot;Düz metin&quot;
          data-rich=&quot;Renkli görünüm&quot;&gt;Düz metin&lt;&#x2F;button&gt;
  &lt;span class=&quot;code-foot-spacer&quot;&gt;&lt;&#x2F;span&gt;
  &lt;select class=&quot;code-theme-picker&quot; aria-label=&quot;Kod teması&quot;&gt;
    &lt;option value=&quot;&quot;&gt;Site teması&lt;&#x2F;option&gt;
    &lt;option value=&quot;mocha&quot;&gt;Catppuccin Mocha&lt;&#x2F;option&gt;
    &lt;option value=&quot;latte&quot;&gt;Catppuccin Latte&lt;&#x2F;option&gt;
    &lt;option value=&quot;gruvbox&quot;&gt;Gruvbox&lt;&#x2F;option&gt;
    &lt;option value=&quot;nord&quot;&gt;Nord&lt;&#x2F;option&gt;
    &lt;option value=&quot;mono&quot;&gt;Renksiz&lt;&#x2F;option&gt;
  &lt;&#x2F;select&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;Buradaki kodu gittikçe değiştireceğiz, buraya takip edelim.&lt;&#x2F;p&gt;
&lt;p&gt;Servis eklerken birden fazla tanımlama yöntemi var, bunlara sonra değineceğiz; şimdilik servisi &lt;code&gt;services.AddScoped&lt;&#x2F;code&gt; şeklinde kayıt edebileceğimizi bilseniz yeterli. Daha sonrasında bu lifetime&#x27;ların nasıl yönetildiğine ve nasıl çalıştıklarına da değineceğiz.&lt;&#x2F;p&gt;
&lt;p&gt;Sonrasında usage&#x27;ımızı da değiştirmek lazım, artık new kullanmamıza gerek yok. ServiceProvider&#x27;dan eklemiş olduğumuz bağımlılığı çözebiliriz, bunun için öncelikle scope oluşturmak lazım. Daha sonrasında ise bağımlılığını istediğimiz yerde &lt;code&gt;scope.ServiceProvider.GetRequiredService&amp;lt;UserRepository&amp;gt;()&lt;&#x2F;code&gt; diyerek ilgili service&#x27;i isteyebiliriz.&lt;&#x2F;p&gt;
&lt;div class=&quot;code-head&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;dotnet-dependency-injection&#x2F;blob&#x2F;where-it-comes-04&#x2F;_01_WhereItComes&#x2F;Program.cs#L20-L20&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;_01_WhereItComes&#x2F;Program.cs&lt;&#x2F;a&gt;&lt;a class=&quot;code-ref&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;dotnet-dependency-injection&#x2F;tree&#x2F;where-it-comes-04&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;where-it-comes-04&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;20&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;    using&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; var&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; scope&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; provider&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;CreateScope&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;div class=&quot;code-foot&quot;&gt;
  &lt;button type=&quot;button&quot; class=&quot;code-btn code-copy&quot;
          data-label=&quot;Kopyala&quot;
          data-done=&quot;Kopyalandı&quot;&gt;Kopyala&lt;&#x2F;button&gt;
  &lt;button type=&quot;button&quot; class=&quot;code-btn code-plain-toggle&quot;
          data-plain=&quot;Düz metin&quot;
          data-rich=&quot;Renkli görünüm&quot;&gt;Düz metin&lt;&#x2F;button&gt;
  &lt;span class=&quot;code-foot-spacer&quot;&gt;&lt;&#x2F;span&gt;
  &lt;select class=&quot;code-theme-picker&quot; aria-label=&quot;Kod teması&quot;&gt;
    &lt;option value=&quot;&quot;&gt;Site teması&lt;&#x2F;option&gt;
    &lt;option value=&quot;mocha&quot;&gt;Catppuccin Mocha&lt;&#x2F;option&gt;
    &lt;option value=&quot;latte&quot;&gt;Catppuccin Latte&lt;&#x2F;option&gt;
    &lt;option value=&quot;gruvbox&quot;&gt;Gruvbox&lt;&#x2F;option&gt;
    &lt;option value=&quot;nord&quot;&gt;Nord&lt;&#x2F;option&gt;
    &lt;option value=&quot;mono&quot;&gt;Renksiz&lt;&#x2F;option&gt;
  &lt;&#x2F;select&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;Değişikliğin tamamı da şöyle görünüyor, iki yerdeki &lt;code&gt;new&lt;&#x2F;code&gt; satırı yerini service isteğine bıraktı:&lt;&#x2F;p&gt;
&lt;div class=&quot;code-head&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;dotnet-dependency-injection&#x2F;compare&#x2F;where-it-comes-03...where-it-comes-04&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;_01_WhereItComes&#x2F;Program.cs&lt;&#x2F;a&gt;&lt;a class=&quot;code-ref&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;dotnet-dependency-injection&#x2F;compare&#x2F;where-it-comes-03...where-it-comes-04&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;where-it-comes-03 → where-it-comes-04&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;div class=&quot;code-diff-marks&quot; data-kinds=&quot;hunk,add,add,add,add,add,add,add,add,ctx,ctx,ctx,hunk,ctx,ctx,ctx,add,add,ctx,ctx,ctx,hunk,ctx,ctx,ctx,del,add,ctx,ctx,ctx,hunk,ctx,ctx,ctx,del,add,ctx,ctx,ctx&quot; hidden&gt;&lt;&#x2F;div&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;@@ &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; +&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;11&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; @@&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;+&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;using&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; Microsoft&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;Extensions&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;DependencyInjection&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;+&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;+&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;var&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; services&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; ServiceCollection&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;+&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;+&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;services&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;AddScoped&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;UserRepository&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;sp&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; UserRepository&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; TableResolver&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;+&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;+&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;var&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; provider&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; services&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;BuildServiceProvider&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;+&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt; while&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-boolean&quot;&gt;true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;     ShowMenu&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;@@ &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;9&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;6&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; +&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;17&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;8&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; @@&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;         break&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;     }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;+&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;    using&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; var&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; scope&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; provider&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;CreateScope&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;+&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;     if&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;choice&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;     {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;         Console&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Write&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;email: &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;@@ &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;17&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;7&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; +&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;27&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;7&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; @@&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;         Console&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Write&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;display name: &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;         var&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; displayName&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; Console&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;ReadLine&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ??&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Empty&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;        var&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; users&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; UserRepository&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; TableResolver&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;+&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;        var&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; users&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; scope&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;ServiceProvider&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;GetRequiredService&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;UserRepository&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;         users&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Save&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;email&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; displayName&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;         Console&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;WriteLine&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;saved&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;@@ &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;32&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;7&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; +&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;42&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;7&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; @@&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;             continue&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;         }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;        var&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; users&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; UserRepository&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; TableResolver&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;+&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;        var&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; users&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; scope&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;ServiceProvider&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;GetRequiredService&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;UserRepository&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;         Console&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;WriteLine&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;users&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Read&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;lineNumber&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ??&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;no user on that line&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;     }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;div class=&quot;code-foot&quot;&gt;
  &lt;button type=&quot;button&quot; class=&quot;code-btn code-copy&quot;
          data-label=&quot;Kopyala&quot;
          data-done=&quot;Kopyalandı&quot;&gt;Kopyala&lt;&#x2F;button&gt;
  &lt;button type=&quot;button&quot; class=&quot;code-btn code-plain-toggle&quot;
          data-plain=&quot;Düz metin&quot;
          data-rich=&quot;Renkli görünüm&quot;&gt;Düz metin&lt;&#x2F;button&gt;
  &lt;span class=&quot;code-foot-spacer&quot;&gt;&lt;&#x2F;span&gt;
  &lt;select class=&quot;code-theme-picker&quot; aria-label=&quot;Kod teması&quot;&gt;
    &lt;option value=&quot;&quot;&gt;Site teması&lt;&#x2F;option&gt;
    &lt;option value=&quot;mocha&quot;&gt;Catppuccin Mocha&lt;&#x2F;option&gt;
    &lt;option value=&quot;latte&quot;&gt;Catppuccin Latte&lt;&#x2F;option&gt;
    &lt;option value=&quot;gruvbox&quot;&gt;Gruvbox&lt;&#x2F;option&gt;
    &lt;option value=&quot;nord&quot;&gt;Nord&lt;&#x2F;option&gt;
    &lt;option value=&quot;mono&quot;&gt;Renksiz&lt;&#x2F;option&gt;
  &lt;&#x2F;select&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;Ve artık ta-daa, biz buradaki ekleme yöntemini, bağımlılık resolve işlemini Dependency Injection&#x27;a aktardığımız için yeni kullanıcılar UserRepository&#x27;yi kullanırken new yazmak ve bağımlılıklarını bilmek zorunda kalmayacak.&lt;&#x2F;p&gt;
&lt;p&gt;Şimdi TableResolver olayına geri dönelim. Bildiğiniz üzere UserRepository sınıfımızın kendi içinde bağımlılığı olan TableResolver adlı bir class&#x27;ı vardı. .NET&#x27;in nimetleri saymakla bitmiyor. .NET der ki, eğer sen bir bağımlılığı dependency injection&#x27;a eklersen, bu bağımlılığı constructor içerisinde istediğinde ben sana veririm. Bizim TableResolver class&#x27;ımız UserRepository&#x27;ye nerede aktarılıyor, hemen bakalım.&lt;&#x2F;p&gt;
&lt;div class=&quot;code-head&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;dotnet-dependency-injection&#x2F;blob&#x2F;where-it-comes-04&#x2F;_01_WhereItComes&#x2F;UserRepository.cs#L3-L8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;_01_WhereItComes&#x2F;UserRepository.cs&lt;&#x2F;a&gt;&lt;a class=&quot;code-ref&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;dotnet-dependency-injection&#x2F;tree&#x2F;where-it-comes-04&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;where-it-comes-04&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt; 3&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier&quot;&gt;    private&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier&quot;&gt; readonly&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; TableResolver&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; _tableResolver&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt; 4&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt; 5&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier&quot;&gt;    public&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; UserRepository&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;TableResolver&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; tableResolver&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt; 6&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt; 7&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;        _tableResolver&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; tableResolver&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt; 8&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;div class=&quot;code-foot&quot;&gt;
  &lt;button type=&quot;button&quot; class=&quot;code-btn code-copy&quot;
          data-label=&quot;Kopyala&quot;
          data-done=&quot;Kopyalandı&quot;&gt;Kopyala&lt;&#x2F;button&gt;
  &lt;button type=&quot;button&quot; class=&quot;code-btn code-plain-toggle&quot;
          data-plain=&quot;Düz metin&quot;
          data-rich=&quot;Renkli görünüm&quot;&gt;Düz metin&lt;&#x2F;button&gt;
  &lt;span class=&quot;code-foot-spacer&quot;&gt;&lt;&#x2F;span&gt;
  &lt;select class=&quot;code-theme-picker&quot; aria-label=&quot;Kod teması&quot;&gt;
    &lt;option value=&quot;&quot;&gt;Site teması&lt;&#x2F;option&gt;
    &lt;option value=&quot;mocha&quot;&gt;Catppuccin Mocha&lt;&#x2F;option&gt;
    &lt;option value=&quot;latte&quot;&gt;Catppuccin Latte&lt;&#x2F;option&gt;
    &lt;option value=&quot;gruvbox&quot;&gt;Gruvbox&lt;&#x2F;option&gt;
    &lt;option value=&quot;nord&quot;&gt;Nord&lt;&#x2F;option&gt;
    &lt;option value=&quot;mono&quot;&gt;Renksiz&lt;&#x2F;option&gt;
  &lt;&#x2F;select&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;Gördüğünüz gibi constructor&#x27;da. O zaman yapmamız gereken şey artık dependency injection&#x27;a TableResolver&#x27;ı eklemek.&lt;&#x2F;p&gt;
&lt;div class=&quot;code-head&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;dotnet-dependency-injection&#x2F;blob&#x2F;where-it-comes-05&#x2F;_01_WhereItComes&#x2F;Program.cs#L5-L5&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;_01_WhereItComes&#x2F;Program.cs&lt;&#x2F;a&gt;&lt;a class=&quot;code-ref&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;dotnet-dependency-injection&#x2F;tree&#x2F;where-it-comes-05&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;where-it-comes-05&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;5&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;services&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;AddScoped&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;TableResolver&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;sp&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; TableResolver&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;div class=&quot;code-foot&quot;&gt;
  &lt;button type=&quot;button&quot; class=&quot;code-btn code-copy&quot;
          data-label=&quot;Kopyala&quot;
          data-done=&quot;Kopyalandı&quot;&gt;Kopyala&lt;&#x2F;button&gt;
  &lt;button type=&quot;button&quot; class=&quot;code-btn code-plain-toggle&quot;
          data-plain=&quot;Düz metin&quot;
          data-rich=&quot;Renkli görünüm&quot;&gt;Düz metin&lt;&#x2F;button&gt;
  &lt;span class=&quot;code-foot-spacer&quot;&gt;&lt;&#x2F;span&gt;
  &lt;select class=&quot;code-theme-picker&quot; aria-label=&quot;Kod teması&quot;&gt;
    &lt;option value=&quot;&quot;&gt;Site teması&lt;&#x2F;option&gt;
    &lt;option value=&quot;mocha&quot;&gt;Catppuccin Mocha&lt;&#x2F;option&gt;
    &lt;option value=&quot;latte&quot;&gt;Catppuccin Latte&lt;&#x2F;option&gt;
    &lt;option value=&quot;gruvbox&quot;&gt;Gruvbox&lt;&#x2F;option&gt;
    &lt;option value=&quot;nord&quot;&gt;Nord&lt;&#x2F;option&gt;
    &lt;option value=&quot;mono&quot;&gt;Renksiz&lt;&#x2F;option&gt;
  &lt;&#x2F;select&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;Artık UserRepository&#x27;yi eklerken TableResolver&#x27;ı new&#x27;lemeye gerek kalmadı, onu da DI içinden alabiliriz.&lt;&#x2F;p&gt;
&lt;div class=&quot;code-head&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;dotnet-dependency-injection&#x2F;blob&#x2F;where-it-comes-05&#x2F;_01_WhereItComes&#x2F;Program.cs#L6-L6&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;_01_WhereItComes&#x2F;Program.cs&lt;&#x2F;a&gt;&lt;a class=&quot;code-ref&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;dotnet-dependency-injection&#x2F;tree&#x2F;where-it-comes-05&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;where-it-comes-05&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;6&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;services&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;AddScoped&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;UserRepository&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;sp&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; UserRepository&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;sp&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;GetRequiredService&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;TableResolver&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;div class=&quot;code-foot&quot;&gt;
  &lt;button type=&quot;button&quot; class=&quot;code-btn code-copy&quot;
          data-label=&quot;Kopyala&quot;
          data-done=&quot;Kopyalandı&quot;&gt;Kopyala&lt;&#x2F;button&gt;
  &lt;button type=&quot;button&quot; class=&quot;code-btn code-plain-toggle&quot;
          data-plain=&quot;Düz metin&quot;
          data-rich=&quot;Renkli görünüm&quot;&gt;Düz metin&lt;&#x2F;button&gt;
  &lt;span class=&quot;code-foot-spacer&quot;&gt;&lt;&#x2F;span&gt;
  &lt;select class=&quot;code-theme-picker&quot; aria-label=&quot;Kod teması&quot;&gt;
    &lt;option value=&quot;&quot;&gt;Site teması&lt;&#x2F;option&gt;
    &lt;option value=&quot;mocha&quot;&gt;Catppuccin Mocha&lt;&#x2F;option&gt;
    &lt;option value=&quot;latte&quot;&gt;Catppuccin Latte&lt;&#x2F;option&gt;
    &lt;option value=&quot;gruvbox&quot;&gt;Gruvbox&lt;&#x2F;option&gt;
    &lt;option value=&quot;nord&quot;&gt;Nord&lt;&#x2F;option&gt;
    &lt;option value=&quot;mono&quot;&gt;Renksiz&lt;&#x2F;option&gt;
  &lt;&#x2F;select&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;Buradaki &lt;code&gt;sp&lt;&#x2F;code&gt;, servisin oluşturulduğu scope&#x27;un service provider&#x27;ını temsil eder. &lt;code&gt;sp&lt;&#x2F;code&gt;, ServiceProvider kısaltması.&lt;&#x2F;p&gt;
&lt;p&gt;Vee, arkadaşlar işin güzel tarafı ne biliyor musunuz? Eğer bir sınıfın bağımlılıkları hâli hazırda dependency injection&#x27;a eklenmişse veya herhangi bir bağımlılığı yoksa func delegate açmanıza bile gerek yok. Yani &lt;code&gt;services.AddScoped&amp;lt;UserRepository&amp;gt;();&lt;&#x2F;code&gt; yazmak yeterli. Aynı şey tabii ki TableResolver için de geçerli, onun hiçbir bağımlılığı yok, .NET bunu otomatik anlayıp ilgili TableResolver&#x27;ı oluşturabilir.&lt;&#x2F;p&gt;
&lt;div class=&quot;code-head&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;dotnet-dependency-injection&#x2F;blob&#x2F;where-it-comes-06&#x2F;_01_WhereItComes&#x2F;Program.cs#L5-L6&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;_01_WhereItComes&#x2F;Program.cs&lt;&#x2F;a&gt;&lt;a class=&quot;code-ref&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;dotnet-dependency-injection&#x2F;tree&#x2F;where-it-comes-06&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;where-it-comes-06&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;5&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;services&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;AddScoped&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;TableResolver&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;6&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;services&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;AddScoped&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;UserRepository&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;div class=&quot;code-foot&quot;&gt;
  &lt;button type=&quot;button&quot; class=&quot;code-btn code-copy&quot;
          data-label=&quot;Kopyala&quot;
          data-done=&quot;Kopyalandı&quot;&gt;Kopyala&lt;&#x2F;button&gt;
  &lt;button type=&quot;button&quot; class=&quot;code-btn code-plain-toggle&quot;
          data-plain=&quot;Düz metin&quot;
          data-rich=&quot;Renkli görünüm&quot;&gt;Düz metin&lt;&#x2F;button&gt;
  &lt;span class=&quot;code-foot-spacer&quot;&gt;&lt;&#x2F;span&gt;
  &lt;select class=&quot;code-theme-picker&quot; aria-label=&quot;Kod teması&quot;&gt;
    &lt;option value=&quot;&quot;&gt;Site teması&lt;&#x2F;option&gt;
    &lt;option value=&quot;mocha&quot;&gt;Catppuccin Mocha&lt;&#x2F;option&gt;
    &lt;option value=&quot;latte&quot;&gt;Catppuccin Latte&lt;&#x2F;option&gt;
    &lt;option value=&quot;gruvbox&quot;&gt;Gruvbox&lt;&#x2F;option&gt;
    &lt;option value=&quot;nord&quot;&gt;Nord&lt;&#x2F;option&gt;
    &lt;option value=&quot;mono&quot;&gt;Renksiz&lt;&#x2F;option&gt;
  &lt;&#x2F;select&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;İki kayıt arasındaki fark da şöyle:&lt;&#x2F;p&gt;
&lt;div class=&quot;code-head&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;dotnet-dependency-injection&#x2F;compare&#x2F;where-it-comes-05...where-it-comes-06&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;_01_WhereItComes&#x2F;Program.cs&lt;&#x2F;a&gt;&lt;a class=&quot;code-ref&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;dotnet-dependency-injection&#x2F;compare&#x2F;where-it-comes-05...where-it-comes-06&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;where-it-comes-05 → where-it-comes-06&lt;&#x2F;a&gt;&lt;&#x2F;div&gt;
&lt;div class=&quot;code-diff-marks&quot; data-kinds=&quot;hunk,ctx,ctx,ctx,del,del,add,add,ctx,ctx&quot; hidden&gt;&lt;&#x2F;div&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;@@ &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;2&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;8&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; +&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;2&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;8&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; @@&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; var&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; services&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; ServiceCollection&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;services&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;AddScoped&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;TableResolver&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;sp&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; TableResolver&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;services&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;AddScoped&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;UserRepository&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;sp&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; UserRepository&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;sp&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;GetRequiredService&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;TableResolver&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;+&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;services&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;AddScoped&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;TableResolver&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;+&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;services&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;AddScoped&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;UserRepository&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; var&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; provider&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; services&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;BuildServiceProvider&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;div class=&quot;code-foot&quot;&gt;
  &lt;button type=&quot;button&quot; class=&quot;code-btn code-copy&quot;
          data-label=&quot;Kopyala&quot;
          data-done=&quot;Kopyalandı&quot;&gt;Kopyala&lt;&#x2F;button&gt;
  &lt;button type=&quot;button&quot; class=&quot;code-btn code-plain-toggle&quot;
          data-plain=&quot;Düz metin&quot;
          data-rich=&quot;Renkli görünüm&quot;&gt;Düz metin&lt;&#x2F;button&gt;
  &lt;span class=&quot;code-foot-spacer&quot;&gt;&lt;&#x2F;span&gt;
  &lt;select class=&quot;code-theme-picker&quot; aria-label=&quot;Kod teması&quot;&gt;
    &lt;option value=&quot;&quot;&gt;Site teması&lt;&#x2F;option&gt;
    &lt;option value=&quot;mocha&quot;&gt;Catppuccin Mocha&lt;&#x2F;option&gt;
    &lt;option value=&quot;latte&quot;&gt;Catppuccin Latte&lt;&#x2F;option&gt;
    &lt;option value=&quot;gruvbox&quot;&gt;Gruvbox&lt;&#x2F;option&gt;
    &lt;option value=&quot;nord&quot;&gt;Nord&lt;&#x2F;option&gt;
    &lt;option value=&quot;mono&quot;&gt;Renksiz&lt;&#x2F;option&gt;
  &lt;&#x2F;select&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;Evet, bu yazımızda .NET&#x27;in dependency injection ile kod kalitesini nasıl arttırdığını gördük. Tekrar hatırlatmak isterim ki bu kodların kullanım senaryolarında her seferinde ilgili bağımlılıkları resolve etmek çok can sıkıcı olabiliyor. Misal 5 tane bağımlılığı olan bir sınıf düşünsenize; her biri için ilgili bağımlılığı new yazarak üretsek, bu üretilen bağımlılıkların da bağımlılıkları olduğunu varsaysak, bir de bunları birden fazla yerde yaptığımızı düşünsek, değişiklik esnasında içinden çıkılmaz bir hâle gelir.&lt;&#x2F;p&gt;
&lt;p&gt;Yazımızın devamında, bu yazımızda ufak bir girizgâh yaptığımız AddScoped methoduyla ilişkili olarak lifetime&#x27;lardan bahsedeceğiz. Aynı zamanda hangi lifetime ne zaman kullanılmalı şeklinde bir konuya da giriş yapabiliriz.&lt;&#x2F;p&gt;
&lt;p&gt;Projenin son hâlini &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;dotnet-dependency-injection&quot;&gt;buradaki repository&#x27;den&lt;&#x2F;a&gt; görebilirsiniz. Aynı zamanda buradaki kod değişikliklerini de commit geçmişi üzerinden (&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;dotnet-dependency-injection&#x2F;commits&#x2F;main&quot;&gt;buradan&lt;&#x2F;a&gt;) bakarak görüntüleyebilir, kodumuzun nasıl daha organize hâle geldiğini görebilirsiniz.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="tr">
        <title>Credential&#x27;ları repoda saklamak: SOPS + age</title>
        <published>2026-08-14T00:00:00+00:00</published>
        <updated>2026-08-14T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://erdincyasan.com/blog/sops-age-ile-secret-saklamak/"/>
        <id>https://erdincyasan.com/blog/sops-age-ile-secret-saklamak/</id>
        
        <content type="html" xml:base="https://erdincyasan.com/blog/sops-age-ile-secret-saklamak/">&lt;p&gt;Projelerimden birinde deployment aşamasında takıldığım bir soru vardı: secret
değerlerini nerede tutmam gerekiyor? Başlarda bunları GitHub üzerinde secret
olarak saklıyordum. Çalışıyordu çalışmasına ama zamanla tekrar okuması beni
zorladı.&lt;&#x2F;p&gt;
&lt;p&gt;İlk yöntemim tüm &lt;code&gt;.env&lt;&#x2F;code&gt; dosyasını tek bir GitHub secret&#x27;inin içine koymaktı.
Kolaydı, ama bu sefer hangi secret&#x27;in set edilmiş olduğunu göremiyordum: her şey
tek bir blok. Bunun yerine her değeri ayrı secret yapmaya kalksam bu sefer de
secret sayısı arttıkça onlarca değeri tek tek set etmem gerekiyordu, yönetmesi
ayrı dert.&lt;&#x2F;p&gt;
&lt;p&gt;Sunucuda doğrudan bir secret dosyası da tutabilirdim. Ama o zaman da her
değişiklik için sunucuya bağlanmam gerekecekti. İstediğim şeyi netleştirdim: CI
sürecini hiç bozmadan, secret&#x27;i otomatik değiştirip deploy edebilmek.&lt;&#x2F;p&gt;
&lt;p&gt;Biraz araştırınca Mozilla ekibinin çıkardığı bir yöntem karşıma çıktı: SOPS. age
ile birleştirince secret&#x27;ları şifreli halde reponun içinde tutabiliyordum. Kod
nerede, secret de orada olsun, ama düz metin olarak değil. Bu yazıda bunu nasıl
yaptığımı, nerede işe yaradığını ve nerede dikkat etmek gerektiğini anlatıyorum.&lt;&#x2F;p&gt;
&lt;p&gt;Bütün örnekler çalışan bir demo repoda:
https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;sops-age-example&lt;&#x2F;p&gt;
&lt;h2 id=&quot;fikir&quot;&gt;Fikir&lt;&#x2F;h2&gt;
&lt;p&gt;İki parça var:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;age&lt;&#x2F;strong&gt;: basit, modern bir şifreleme aracı. Bir public&#x2F;private key çifti
üretiyoruz. Public key ile şifrelenen şeyi yalnızca private key açıyor.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;SOPS&lt;&#x2F;strong&gt; (Secrets OPerationS): bir YAML&#x2F;JSON&#x2F;env dosyasının &lt;strong&gt;sadece
değerlerini&lt;&#x2F;strong&gt; şifreliyor, key&#x27;leri (alan adlarını) düz bırakıyor. Yani dosya
hala okunabilir yapıda duruyor, ama değerler şifreli. Diff aldığımızda &quot;hangi
alan değişmiş&quot; görünüyor, değerin kendisi görünmüyor.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;age asimetrik anahtarla çalışıyor: bir public&#x2F;private key çifti üretiyoruz.
Veriyi &lt;strong&gt;public key&lt;&#x2F;strong&gt; ile şifreliyoruz ve o veri &lt;strong&gt;yalnızca eşleşen private key&lt;&#x2F;strong&gt;
ile açılıyor, başka hiçbir anahtarla değil. Asimetri de burada: public key&#x27;i
herkese verebiliriz, herkes onunla bize şifreli veri hazırlayabilir, ama açabilen
tek taraf private key&#x27;in sahibi. Yani şifreleyebilmek herkese açık bir yetenek,
çözebilmek tek elde. (GPG de temelde aynı asimetrik mantıkla çalışıyor, public
ile şifrele, private ile aç.)&lt;&#x2F;p&gt;
&lt;p&gt;age&#x27;in GPG&#x27;den farkı ağırlıkta. GPG (GNU Privacy Guard) güçlü ama hantal:
web-of-trust denen bir güven modeli, keyring yönetimi, keyserver&#x27;lar, anahtar
son kullanma tarihleri, subkey&#x27;ler, arka planda çalışan agent süreçleri,
düzinelerce alt komut. Daha bir dosyayı şifreleyene kadar epey kavram öğrenmek
gerekiyor. age tek işe odaklı: config dosyası yok, anahtarlar kısa, komutlar tek
satır. Gündelik secret şifrelemede GPG&#x27;nin bütün o düzeneğine çoğu zaman ihtiyaç
olmuyor; age aynı işi çok daha sade yapıyor.&lt;&#x2F;p&gt;
&lt;p&gt;Bunları birleştirince şunu elde ediyoruz: secret dosyası git&#x27;e commit&#x27;lenebilir.
Çünkü içindeki değerler age ile şifreli. Private key&#x27;i olmayan biri clone&#x27;lasa
bile işe yaramaz bir şifreli metin görür. Kim ne zaman değiştirmiş git
history&#x27;de duruyor. Yeni makinede tek &lt;code&gt;git clone&lt;&#x2F;code&gt; (bir de age anahtarı) ile her
şey geliyor.&lt;&#x2F;p&gt;
&lt;p&gt;Şunu da baştan söyleyeyim: bu yaklaşım küçük ve orta ölçekli projeler için
biçilmiş kaftan. Ama bir sınırı var. Public key&#x27;ler &lt;code&gt;.sops.yaml&lt;&#x2F;code&gt;&#x27;da açıkta
olduğu için, repoya yazma erişimi olan herkes secret&#x27;ların değerini okuyamasa
bile üzerine yeni değer yazabiliyor (aşağıda &quot;Şifreleyebilmek okuyabilmek değil&quot;
bölümünde açıyorum). Küçük ve güvenilir bir ekipte bu kabul edilebilir bir risk.
Ekip ve etki alanı büyüdükçe git tarafında ekstra korumalar (branch protection,
zorunlu review, secret path&#x27;ine özel kurallar) ya da bir noktadan sonra merkezi
bir secret manager gerekiyor.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;kurulum&quot;&gt;Kurulum&lt;&#x2F;h2&gt;
&lt;p&gt;macOS&#x27;ta ikisi de brew&#x27;da:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;brew&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; sops&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; age&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;1-age-anahtari-uret&quot;&gt;1. age anahtarı üret&lt;&#x2F;h2&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;age-keygen&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;o&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; key.txt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Çıktısı şöyle bir dosya:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# created: 2026-08-12T12:02:42+03:00&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# public key: age1cpyuq5ss7w85phtrkhsxntek7k4ypx3gr8qa8c4vd5y0k772wqssrd4w4q&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;AGE-SECRET-KEY-1DC8QTSCYAXRADPLAQA853TMCYDYZXSJ9JW8MFWRYLZFM6J4E67CS3K6ZW5&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Üstteki &lt;code&gt;age1...&lt;&#x2F;code&gt; satırı &lt;strong&gt;public key&lt;&#x2F;strong&gt; (recipient). Alttaki &lt;code&gt;AGE-SECRET-KEY-...&lt;&#x2F;code&gt;
&lt;strong&gt;private key&lt;&#x2F;strong&gt;. Public key ile şifreliyoruz, private key ile açıyoruz. Private
key gizli kalıyor, public key&#x27;i rahatça paylaşabiliyoruz. Gerçekte private key
her makinede &lt;code&gt;~&#x2F;.config&#x2F;sops&#x2F;age&#x2F;keys.txt&lt;&#x2F;code&gt; altında durur ve asla commit&#x27;lenmez.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;2-dosya-duzeni-secrets-ve-env-enc&quot;&gt;2. Dosya düzeni: secrets&#x2F; ve .env.enc&lt;&#x2F;h2&gt;
&lt;p&gt;Kendi kurulumumda secret&#x27;ları bir &lt;code&gt;secrets&#x2F;&lt;&#x2F;code&gt; dizininde, ortam başına ayrı
tutuyorum. Her ortam için üç dosya var:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;secrets&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  app.local.env.enc         # şifreli, commit&amp;#39;li&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  app.local.env.example     # sadece key&amp;#39;ler, commit&amp;#39;li (hangi secret&amp;#39;lar var belli olsun)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  app.local.env             # düz metin working file, GITIGNORE (lokal, çözülmüş kopya)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Mantık şu: &lt;code&gt;.enc&lt;&#x2F;code&gt; şifreli ve commit&#x27;lenen dosya; &lt;code&gt;.example&lt;&#x2F;code&gt; sadece anahtar
isimlerini taşıyan, yeni gelenin &quot;hangi değerleri doldurmam lazım&quot; diye bakacağı
template; düz &lt;code&gt;.env&lt;&#x2F;code&gt; ise düzenlerken oluşan çözülmüş kopya, &lt;code&gt;.gitignore&lt;&#x2F;code&gt;&#x27;da durur
ve hiçbir zaman commit&#x27;lenmez.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;.enc&lt;&#x2F;code&gt; uzantısının bir faydası da CI tarafında: pipeline &lt;code&gt;secrets&#x2F;*.env.enc&lt;&#x2F;code&gt;
gibi bir kalıpla tüm şifreli dosyaları tek seferde bulup topluca çözebiliyor.
Buradaki &lt;code&gt;*&lt;&#x2F;code&gt; bir joker karakter; &quot;bu desene uyan bütün dosya isimlerini getir&quot;
demek. Dosya isimlerini böyle desenle eşleştirmeye glob deniyor (&lt;code&gt;secrets&#x2F;&lt;&#x2F;code&gt;
dizininde &lt;code&gt;.env.enc&lt;&#x2F;code&gt; ile biten ne varsa hepsi). Uzantı ayrıca &quot;bu dosya şifreli,
deploy&#x27;da çözülecek&quot; sinyali oluyor.&lt;&#x2F;p&gt;
&lt;p&gt;Bir nokta: &lt;code&gt;.enc&lt;&#x2F;code&gt; uzantısı SOPS&#x27;a formatı söylemiyor. Dosyalar dotenv
(&lt;code&gt;KEY=value&lt;&#x2F;code&gt;) formatında, ama SOPS bunu uzantıdan çıkaramadığı için her komutta
formatı elle vermek gerekiyor: &lt;code&gt;--input-type dotenv --output-type dotenv&lt;&#x2F;code&gt;.
Aşağıdaki küçük yönetici bunu hep otomatik ekliyor.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;3-kime-sifreleniyor-sops-yaml&quot;&gt;3. Kime şifreleniyor: .sops.yaml&lt;&#x2F;h2&gt;
&lt;p&gt;SOPS&#x27;a hangi dosyayı kimin için şifreleyeceğini &lt;code&gt;.sops.yaml&lt;&#x2F;code&gt; söylüyor. Ortam
başına farklı recipient&#x27;lar tanımlıyoruz. Önce anahtarları anchor olarak bir kere
yazıp aşağıda referans veriyoruz:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; .sops.yaml&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;k&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;eys&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  -&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-anchor z-yaml&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type z-anchor z-yaml&quot;&gt;local&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;          a&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;ge1cpyuq5ss...&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;   #&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; benim makinem&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  -&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-anchor z-yaml&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type z-anchor z-yaml&quot;&gt;server_staging&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; a&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;ge12clzmdhl...&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;   #&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; staging sunucusu&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  -&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-anchor z-yaml&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type z-anchor z-yaml&quot;&gt;server_prod&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;    a&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;ge1g5uwzup8...&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;   #&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; prod sunucusu&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;c&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;reation_rules&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;  #&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; local: sadece benim makinem açabilir&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; p&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;ath_regex&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; s&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;ecrets[&#x2F;\\]app\.local\.env(\.enc)?$&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    k&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;ey_groups&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; a&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;ge&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;          -&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-alias z-yaml&quot;&gt; *&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-alias z-yaml&quot;&gt;local&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;  #&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; staging: staging sunucusu + ben&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; p&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;ath_regex&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; s&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;ecrets[&#x2F;\\]app\.staging\.env(\.enc)?$&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    k&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;ey_groups&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; a&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;ge&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;          -&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-alias z-yaml&quot;&gt; *&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-alias z-yaml&quot;&gt;server_staging&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;          -&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-alias z-yaml&quot;&gt; *&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-alias z-yaml&quot;&gt;local&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;  #&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; prod: prod sunucusu + ben&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; p&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;ath_regex&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; s&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;ecrets[&#x2F;\\]app\.prod\.env(\.enc)?$&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    k&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;ey_groups&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;      -&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; a&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;ge&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;          -&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-alias z-yaml&quot;&gt; *&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-alias z-yaml&quot;&gt;server_prod&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;          -&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-alias z-yaml&quot;&gt; *&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-alias z-yaml&quot;&gt;local&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Buradaki recipient modeli önemli: her ortam &lt;strong&gt;o ortamın sunucu public key&#x27;i +
benim local public key&#x27;im&lt;&#x2F;strong&gt; ile şifreleniyor. Sonuç:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Sunucu deploy anında kendi private key&#x27;i ile açıyor.&lt;&#x2F;li&gt;
&lt;li&gt;Ben local&#x27;de kendi private key&#x27;imle açıp düzenliyorum.&lt;&#x2F;li&gt;
&lt;li&gt;Prod dosyasını sadece prod sunucusu (bir de ben) açabiliyor; staging sunucusu
ya da başka bir geliştirici prod secret&#x27;ını çözemiyor, çünkü onların key&#x27;i o
kuralda yok.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;code&gt;.sops.yaml&lt;&#x2F;code&gt;&#x27;a yazdığımız &lt;code&gt;age1...&lt;&#x2F;code&gt; satırlarının &lt;strong&gt;hepsi public key&lt;&#x2F;strong&gt;. Hiçbir
private key buraya girmiyor.&lt;&#x2F;p&gt;
&lt;p&gt;sops+age kurulumunu ilk zamanlar biraz ezbere yapıyordum; bu yapının nasıl
işlediğini tam bilmiyordum. O zaman dokümanın tamamını okumamıştım, açıkçası
deneyimim de yoktu. Sonradan fark ettim ki buradaki &lt;code&gt;key_groups&lt;&#x2F;code&gt; aslında dikkat
isteyen bir ifade: prod kuralına &quot;local için de encrypt et&quot; dediğimiz an, prod
secret&#x27;ı local&#x27;de de çözülebilir hale geliyor. SOPS bir değeri şifrelerken önce
rastgele bir data key üretiyor, asıl veriyi onunla şifreliyor, sonra o data key&#x27;i
gruptaki her recipient&#x27;ın public key&#x27;ine ayrı ayrı sarıyor. Yani prod dosyasındaki
data key hem prod sunucusunun private key&#x27;iyle hem benim local private key&#x27;imle
açılabiliyor; ikisinden biri yetiyor. Prod secret&#x27;larını local&#x27;de &lt;code&gt;sops -d&lt;&#x2F;code&gt; ile
çözebildiğimi görünce açıkçası çok şaşırmıştım; ilk anda &quot;acaba bir zafiyet mi
var&quot; diye düşündüm. Değil: bu tam da her ortamın key group&#x27;una &lt;code&gt;&amp;amp;local&lt;&#x2F;code&gt;&#x27;i
eklememin sonucu, tasarımın kendisi. Aynısı staging&#x2F;qa için de geçerli: kuralda
&lt;code&gt;&amp;amp;local&lt;&#x2F;code&gt; recipient olduğu sürece o ortamı local&#x27;de açabiliyorum.&lt;&#x2F;p&gt;
&lt;p&gt;Ama getirdiği trade-off&#x27;u görmek gerekiyor: local private key&#x27;i eline geçiren
biri, o key&#x27;in recipient olduğu her ortamın (prod dahil) secret&#x27;larını çözebilir.
Yani &lt;code&gt;keys.txt&lt;&#x2F;code&gt; dosyasını korumak ve kimin hangi ortama recipient olduğunu
bilinçli seçmek önemli. Küçük ve güvenilir bir ekipte bu kabul edilebilir bir
kolaylık. Erişimi daraltmak istersek local&#x27;i prod grubundan çıkarıp prod&#x27;u
sadece sunucu key&#x27;iyle şifreleriz; o zaman prod secret&#x27;ını kimse local&#x27;de
açamaz.&lt;&#x2F;p&gt;
&lt;p&gt;(&lt;code&gt;path_regex&lt;&#x2F;code&gt;&#x27;teki &lt;code&gt;secrets[&#x2F;\\]&lt;&#x2F;code&gt; hem &lt;code&gt;&#x2F;&lt;&#x2F;code&gt; hem &lt;code&gt;\&lt;&#x2F;code&gt; ayıracını kapsıyor: bir Windows
portability detayı, aşağıdaki encoding bölümünde değiniyorum.)&lt;&#x2F;p&gt;
&lt;p&gt;Bir de terim notu: buradaki &lt;code&gt;key_groups&lt;&#x2F;code&gt;, bir grup içinde recipient&#x27;ları saran
bir konteyner sadece. Ortam ayrımı için tek grup ve o gruba yazdığımız recipient
listesi yeterli.&lt;&#x2F;p&gt;
&lt;p&gt;Tam dosya:
https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;sops-age-example&#x2F;blob&#x2F;811a70873d040b2be83f68f5cfaaf972cef7deeb&#x2F;.sops.yaml&lt;&#x2F;p&gt;
&lt;h2 id=&quot;4-secret-i-yaz-ve-sifrele&quot;&gt;4. Secret&#x27;i yaz ve şifrele&lt;&#x2F;h2&gt;
&lt;p&gt;Önce düz working file&#x27;ı hazırlıyoruz (dotenv):&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# secrets&#x2F;app.local.env  (gitignore&amp;#39;lı, düz metin)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;HELLO=world&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;FAKE_API_KEY=demo_local_sk_0000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;DB_PASSWORD=local-demo-password&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Sonra şifreliyoruz (dotenv formatını elle vererek):&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;sops&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;e&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;-input-type&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; dotenv&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;-output-type&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; dotenv&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; secrets&#x2F;app.local.env&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; secrets&#x2F;app.local.env.enc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;.enc&lt;&#x2F;code&gt; dosyası artık şöyle görünüyor:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;HELLO=ENC[AES256_GCM,data:wPU91TF7...,iv:bbS2qHGd...,tag:ALssHW9H...,type:str]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;FAKE_API_KEY=ENC[AES256_GCM,data:...,type:str]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;DB_PASSWORD=ENC[AES256_GCM,data:...,type:str]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sops_age__list_0__map_recipient=age1cpyuq5ss...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sops_mac=ENC[AES256_GCM,...]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sops_version=3.13.2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Alan adları (&lt;code&gt;HELLO&lt;&#x2F;code&gt;, &lt;code&gt;FAKE_API_KEY&lt;&#x2F;code&gt;, &lt;code&gt;DB_PASSWORD&lt;&#x2F;code&gt;) düz, değerleri şifreli. İşte
bu yüzden diff&#x27;ler anlamlı kalıyor. Alttaki &lt;code&gt;sops_...&lt;&#x2F;code&gt; satırları SOPS&#x27;un
metadata&#x27;sı: hangi recipient için şifrelendiği ve bütünlük kontrolü (&lt;code&gt;mac&lt;&#x2F;code&gt;). YAML
kullansaydık bu bir &lt;code&gt;sops:&lt;&#x2F;code&gt; bloğu olurdu; dotenv düz key=value tuttuğu için
metadata da &lt;code&gt;sops_...&lt;&#x2F;code&gt; şeklinde düz anahtarlara yayılıyor.&lt;&#x2F;p&gt;
&lt;p&gt;Bu &lt;code&gt;.enc&lt;&#x2F;code&gt; dosyasını rahatça commit&#x27;leyebiliyoruz. Düz &lt;code&gt;app.local.env&lt;&#x2F;code&gt;&#x27;i ise git
görmüyor.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;5-runtime-da-acmak&quot;&gt;5. Runtime&#x27;da açmak&lt;&#x2F;h2&gt;
&lt;p&gt;Şifreli dosya güzel de, uygulama bunu nasıl okuyacak? En temiz yol düz metni hiç
diske yazmamak: dosyayı bellekte çözüp değerleri ortam değişkeni olarak process&#x27;e
enjekte etmek.&lt;&#x2F;p&gt;
&lt;p&gt;Bunun için repoya küçük bir yönetici koydum (&lt;code&gt;secrets.mjs&lt;&#x2F;code&gt;), gerçek projemdeki
daha kapsamlı halinin sadeleştirilmişi. Kendi kripto&#x27;yu yapmıyor, sadece &lt;code&gt;sops&lt;&#x2F;code&gt;
CLI&#x27;ını çağırıyor. &lt;code&gt;run&lt;&#x2F;code&gt; komutu ortamı çözüp verilen komutu o değişkenlerle
çalıştırıyor:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;node&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; secrets.mjs&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; run&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; local&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; node&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; index.js&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Uygulama tarafı sadece &lt;code&gt;process.env&lt;&#x2F;code&gt;&#x27;i okuyor, SOPS&#x27;tan haberi bile yok:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; index.js&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-js&quot;&gt; KEYS&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; [&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;HELLO&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;FAKE_API_KEY&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;DB_PASSWORD&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;console&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;log&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;Secrets decrypted by SOPS, read from process.env:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-character z-escape&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;for&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;const&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-js&quot;&gt; key&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-expression z-of z-js&quot;&gt; of&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-js&quot;&gt; KEYS&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;  console&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;log&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;`&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;  ${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;key&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; = &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;process&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-property z-js&quot;&gt;env&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;key&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ??&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;(missing)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;`&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Çıktı:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ npm start&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Secrets decrypted by SOPS, read from process.env:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  HELLO = world (local)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  FAKE_API_KEY = demo_local_sk_0000_not_a_real_key&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  DB_PASSWORD = local-demo-password&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Neden &lt;code&gt;sops exec-env&lt;&#x2F;code&gt; değil de kendi küçük script&#x27;im? Çünkü &lt;code&gt;exec-env&lt;&#x2F;code&gt;,
&lt;code&gt;--input-type&lt;&#x2F;code&gt; bayrağını kabul etmiyor; formatı uzantıdan çıkaramadığı için
uzantısız&#x2F;&lt;code&gt;.enc&lt;&#x2F;code&gt; dotenv dosyalarında işe yaramıyor. Node tarafında &lt;code&gt;sops -d --input-type dotenv ...&lt;&#x2F;code&gt; ile çözüp çıktıyı parse etmek hem bu sorunu çözüyor hem
de boşluk içeren değerleri (&lt;code&gt;world (local)&lt;&#x2F;code&gt; gibi) shell&#x27;in bozmasına izin
vermiyor. Çözülmüş içerik hiçbir zaman diske yazılmıyor, sadece process yaşadığı
sürece bellekte duruyor.&lt;&#x2F;p&gt;
&lt;p&gt;Yöneticinin tamamı:
https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;sops-age-example&#x2F;blob&#x2F;811a70873d040b2be83f68f5cfaaf972cef7deeb&#x2F;secrets.mjs&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ekip-anahtar-paylasmak-degil-recipient-eklemek&quot;&gt;Ekip: anahtar paylaşmak değil, recipient eklemek&lt;&#x2F;h2&gt;
&lt;p&gt;Başta tek bir anahtar çifti ürettik, çünkü tek kişiydik. Peki ekip olunca ne
oluyor, herkese aynı private key&#x27;i mi dağıtıyoruz? Hayır. İşin püf noktası tam
burada.&lt;&#x2F;p&gt;
&lt;p&gt;Ekipteki her kişi kendi makinesinde &lt;code&gt;age-keygen&lt;&#x2F;code&gt; çalıştırıp kendine ait bir çift
üretiyor: kendi private key&#x27;i (gizli, makinesinden çıkmaz) ve kendi public key&#x27;i
(paylaşılabilir). Yani ortada tek bir public key yok; her üyenin farklı bir çifti
var. &lt;code&gt;.sops.yaml&lt;&#x2F;code&gt;&#x27;daki &lt;code&gt;age1...&lt;&#x2F;code&gt; satırlarının hepsi public key.&lt;&#x2F;p&gt;
&lt;p&gt;SOPS bir dosyayı şifrelerken şöyle çalışıyor: rastgele bir veri anahtarı (data
key) üretir, asıl değerleri onunla şifreler, sonra bu veri anahtarını o kuraldaki
her recipient&#x27;ın public key&#x27;i ile ayrı ayrı sarmalar (wrap). Böylece listedeki
herhangi bir kişi (ya da sunucu) kendi private key&#x27;i ile veri anahtarını açıp
dosyayı çözebiliyor. Herkesin ayrı private key&#x27;i olduğu için kimse başkasının
anahtarını bilmek zorunda değil.&lt;&#x2F;p&gt;
&lt;p&gt;Neden böyle? Çünkü tek bir private key&#x27;i herkese dağıtsaydık: biri sızdırınca
hepsi birden yanardı, kimin açtığı belli olmazdı ve anahtarı değiştirmek için
herkese yeniden dağıtmamız gerekirdi. Ayrı ayrı olunca sadece public key&#x27;ler
paylaşılıyor, private key&#x27;ler makineden hiç çıkmıyor.&lt;&#x2F;p&gt;
&lt;p&gt;Yeni biri katılınca, onun public key&#x27;ini ilgili kurala ekliyoruz, sonra dosyayı
onun için de sarmalamak üzere:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;sops&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; updatekeys&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; secrets&#x2F;app.local.env.enc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Biri ayrılınca: public key&#x27;ini &lt;code&gt;.sops.yaml&lt;&#x2F;code&gt;&#x27;dan çıkarıyoruz, &lt;code&gt;sops updatekeys&lt;&#x2F;code&gt;
çalıştırıyoruz, bir de gerçek secret değerlerini rotate ediyoruz. (Ayrılan kişi
eski commit&#x27;teki şifreli dosyayı hala açabilir, çünkü history&#x27;de o versiyon
duruyor. O yüzden değeri değiştirmek şart.)&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ci-github-actions&quot;&gt;CI (GitHub Actions)&lt;&#x2F;h2&gt;
&lt;p&gt;CI ortamında o ortamın private key&#x27;ini repo secret&#x27;ı olarak veriyoruz:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt; r&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;un&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; n&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;ode secrets.mjs run prod -- node index.js&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;  e&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;nv&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;    S&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;OPS_AGE_KEY&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; $&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;{{ secrets.PROD_AGE_KEY }}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;SOPS_AGE_KEY&lt;&#x2F;code&gt; anahtarın içeriğini doğrudan alır; &lt;code&gt;SOPS_AGE_KEY_FILE&lt;&#x2F;code&gt; ise bir
dosya yolu ister. İstediğim şey de tam buydu: CI&#x27;a hiç dokunmadan, şifreli
dosyayı commit&#x27;leyerek secret güncelliyorum ve prod anahtarı sadece prod CI&#x27;ının
secret&#x27;ında durduğu için ortam izolasyonu bozulmuyor.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;sifreleyebilmek-okuyabilmek-degil-repo-erisimi&quot;&gt;Şifreleyebilmek okuyabilmek değil: repo erişimi&lt;&#x2F;h2&gt;
&lt;p&gt;Bir noktada şunu fark ettim: public key&#x27;ler &lt;code&gt;.sops.yaml&lt;&#x2F;code&gt;&#x27;da açıkta
duruyor. Peki repoya yazma erişimi olan biri secret&#x27;ları değiştirebilir mi? Evet,
değiştirebilir. Şifrelemek için sadece public key yetiyor, private key
gerekmiyor. Yani o kişi mevcut değerleri &lt;strong&gt;okuyamaz&lt;&#x2F;strong&gt; (okumak private key ister),
ama üzerlerine yeni değer yazıp yeniden şifreleyip commit&#x27;leyebilir. Deploy&#x27;da
sunucu commit&#x27;lenmiş değeri çözüp kullandığı için, yazma erişimi olan biri
&lt;code&gt;DB_PASSWORD&lt;&#x2F;code&gt;&#x27;ü farklı bir değere çekebilir ya da bir API adresini yanlış bir
yere yönlendirebilir.&lt;&#x2F;p&gt;
&lt;p&gt;Yani SOPS bize &lt;strong&gt;gizlilik&lt;&#x2F;strong&gt; (confidentiality) veriyor, &lt;strong&gt;bütünlük&lt;&#x2F;strong&gt; (integrity)
değil. Değerleri okumaya karşı korur, değiştirilmeye karşı korumaz. Küçük projede
bu genelde yeterli; ölçek büyüdükçe bu boşluğu git tarafında kapatmak gerekiyor.
sops&#x27;u bir ekipte kullanmaya karar verilirse önerim şu birkaç önlem:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Branch protection + zorunlu review.&lt;&#x2F;strong&gt; &lt;code&gt;main&lt;&#x2F;code&gt;&#x27;e doğrudan push&#x27;u kapatmak, her
değişikliği PR + onay ile almak. Böylece kimse tek başına secret&#x27;ın üzerine
yazıp deploy&#x27;a gönderemez.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Secret path&#x27;ine özel reviewer (CODEOWNERS).&lt;&#x2F;strong&gt; &lt;code&gt;secrets&#x2F;&lt;&#x2F;code&gt; ve &lt;code&gt;.sops.yaml&lt;&#x2F;code&gt;&#x27;a
dokunan her PR&#x27;a belirli kişilerin onayını zorunlu kılmak.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;PR&#x27;da otomatik uyarı.&lt;&#x2F;strong&gt; secret dosyalarına dokunan bir PR açıldığında oraya
otomatik bir uyarı yorumu düşürmek. Böylece o değişiklik reviewer&#x27;ın gözünden
kolayca kaçmıyor. İstersek bunu required status check&#x27;e bağlayıp onaysız
merge&#x27;ü de engelleyebilir, daha ileri gidip commit imzalama ekleyebiliriz.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Not: SOPS&#x27;taki &lt;code&gt;mac&lt;&#x2F;code&gt; alanı dosyanın elle (sops kullanmadan) kurcalanmasını
yakalar, ama sops ile düzgünce yeniden şifreleyen biri geçerli bir &lt;code&gt;mac&lt;&#x2F;code&gt; üretir.
Yani &lt;code&gt;mac&lt;&#x2F;code&gt; kör hex editini engeller, yetkili birinin yeniden şifrelemesini değil.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;dikkat-edilecek-nokta-metadata-sizar&quot;&gt;Dikkat edilecek nokta: metadata sızar&lt;&#x2F;h2&gt;
&lt;p&gt;SOPS sadece &lt;strong&gt;değerleri&lt;&#x2F;strong&gt; şifreliyor, &lt;strong&gt;alan adları düz kalıyor&lt;&#x2F;strong&gt;. Diff&#x27;ler
okunabilir olsun diye böyle, ama bunun bedeli var: dosyaya bakan biri hangi
secret&#x27;lardan bahsedildiğini görür. &lt;code&gt;DB_PASSWORD&lt;&#x2F;code&gt;, &lt;code&gt;STRIPE_SECRET_KEY&lt;&#x2F;code&gt;,
&lt;code&gt;ADMIN_TOKEN&lt;&#x2F;code&gt;... değerleri gizli ama isimleri altyapının şeklini ele veriyor.
Alan adının kendisi hassassa, ya bütün dosyayı şifrelemek ya da ismini
nötrleştirmek gerekiyor.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;satir-sonu-crlf-lf-ve-encoding-tuzagi&quot;&gt;Satır sonu (CRLF&#x2F;LF) ve encoding tuzağı&lt;&#x2F;h2&gt;
&lt;p&gt;Bununla deploy tarafında baya uğraştım, en sinir bozucu kısım buydu. &lt;code&gt;.enc&lt;&#x2F;code&gt;
dosyasını bir makinede (mac, LF satır sonu) oluşturdum, sonra aynı repoyu
Windows&#x27;ta açtım. Değerler doğruydu ama decrypt bir türlü olmuyordu. Sebep: SOPS
her dosya için içeriğin üzerinden bir &lt;code&gt;mac&lt;&#x2F;code&gt; (bütünlük kontrolü) hesaplıyor.
Byte&#x27;lar bir tık değişince mac tutmuyor ve dosya bozuk sayılıyor. Windows&#x27;ta bu
byte&#x27;ları değiştiren birkaç ayrı şey var.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;1. Git autocrlf.&lt;&#x2F;strong&gt; Windows&#x27;ta git checkout sırasında LF&#x27;leri CRLF&#x27;e
çevirebiliyor. &lt;code&gt;.enc&lt;&#x2F;code&gt;&#x27;in byte&#x27;ları değişiyor, mac patlıyor. Çözüm &lt;code&gt;.gitattributes&lt;&#x2F;code&gt;
ile bu dosyalarda dönüşümü kapatmak:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# .gitattributes&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;secrets&#x2F;*.enc -text&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;-text&lt;&#x2F;code&gt;, git&#x27;e &quot;bu dosyaları metin sayma, satır sonlarına dokunma&quot; diyor.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;2. PowerShell &lt;code&gt;&amp;gt;&lt;&#x2F;code&gt; yönlendirmesi UTF-16 yazıyor.&lt;&#x2F;strong&gt; Bunu bulmak zaman aldı.
Windows&#x27;ta &lt;code&gt;sops -e ... &amp;gt; dosya.enc&lt;&#x2F;code&gt; yapınca, PowerShell&#x27;in &lt;code&gt;&amp;gt;&lt;&#x2F;code&gt; operatörü çıktıyı
UTF-8 değil &lt;strong&gt;UTF-16 LE&lt;&#x2F;strong&gt; olarak yazıyor, üstüne bir de BOM ekliyor. Dosya daha
baştan bozuk doğuyor. Editörlerin araya kattığı BOM da aynı sonucu veriyor.&lt;&#x2F;p&gt;
&lt;p&gt;Bu yüzden Windows için küçük bir PowerShell script&#x27;i yazdım (&lt;code&gt;encrypt.ps1&lt;&#x2F;code&gt;).
Kabaca: önce plaintext&#x27;i LF-only + UTF-8 no BOM&#x27;a normalize ediyor, sonra sops
çıktısını &lt;code&gt;&amp;gt;&lt;&#x2F;code&gt; ile değil bir değişkene alıp .NET File API ile (yine LF + UTF-8 no
BOM, sonda tek newline) yazıyor, en sonunda dosyanın ilk byte&#x27;larına bakıp
UTF-16&#x2F;UTF-8 BOM ya da CRLF varsa hata fırlatıyor. Yani bozuk bir &lt;code&gt;.enc&lt;&#x2F;code&gt; üretmeyi
baştan imkansız kılıyor. Tamamı repoda:
https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;sops-age-example&#x2F;blob&#x2F;811a70873d040b2be83f68f5cfaaf972cef7deeb&#x2F;encrypt.ps1&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;3. Path ayıracı.&lt;&#x2F;strong&gt; Küçük ama can sıkan bir başka Windows farkı &lt;code&gt;.sops.yaml&lt;&#x2F;code&gt;&#x27;daki
&lt;code&gt;path_regex&lt;&#x2F;code&gt;. sops, dosya yolunu OS&#x27;un verdiği haliyle regex&#x27;e geçiriyor;
Windows&#x27;ta ayıraç &lt;code&gt;\&lt;&#x2F;code&gt; olduğu için sadece &lt;code&gt;&#x2F;&lt;&#x2F;code&gt; ile yazılmış bir pattern eşleşmiyor
ve dosya &quot;hangi kurala ait&quot; bulunamıyor. Yukarıda &lt;code&gt;.sops.yaml&lt;&#x2F;code&gt; örneğinde
&lt;code&gt;path_regex&lt;&#x2F;code&gt;&#x27;i &lt;code&gt;secrets[&#x2F;\\]...&lt;&#x2F;code&gt; diye yazmamın sebebi bu: köşeli parantez iki
ayıracı da kapsıyor.&lt;&#x2F;p&gt;
&lt;p&gt;Özet: &lt;code&gt;.enc&lt;&#x2F;code&gt; dosyalarının byte&#x27;ları aynen korunmalı. Satır sonu, encoding, BOM,
araya giren her şey mac&#x27;i bozuyor. &lt;code&gt;.enc&lt;&#x2F;code&gt;&#x27;i elle editörde açıp kaydetmemek
gerekiyor; hep araçlar (sops, secrets.mjs, encrypt.ps1) üzerinden düzenliyoruz.
Dosyaların encoding&#x27;i önemli.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;sops-ne-zaman-alternatifler-ne-zaman&quot;&gt;SOPS ne zaman, alternatifler ne zaman&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;git-crypt&lt;&#x2F;strong&gt;: bütün dosyayı şifreler, şeffaf çalışır (checkout&#x27;ta açılır). Ama
değer değil dosya bazlı olduğu için diff&#x27;ler okunmaz. Alan adı sızmasını
istemiyorsak avantaj.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Vault &#x2F; cloud secret manager (Azure Key Vault, AWS Secrets Manager)&lt;&#x2F;strong&gt;:
merkezi, audit log&#x27;lu, dinamik secret üreten ağır çözümler. Büyük ekip ve sıkı
uyumluluk gereksinimi varsa doğru yer. Ama ayağa kaldırmak ve işletmek
maliyetli.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;SOPS + age&lt;&#x2F;strong&gt;: küçük&#x2F;orta projeler için tatlı nokta. Ekstra bir servis yok,
secret kodla aynı yerde versiyonlu, kurulum bir avuç komut. GitOps akışlarına
da iyi oturuyor.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&quot;Zaten private repomuz var, üstüne bir de şifrelemek gereksiz mi?&quot; diye
sorulabilir. Bence değil: defense in depth. Repo yanlışlıkla public olursa, bir
fork sızarsa ya da birinin GitHub token&#x27;ı çalınırsa düz &lt;code&gt;.env&lt;&#x2F;code&gt; anında ele geçer;
şifreli dosya hala private key olmadan işe yaramaz.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;sonuc&quot;&gt;Sonuç&lt;&#x2F;h2&gt;
&lt;p&gt;Secret&#x27;ları repoda şifreli tutmak, &quot;ayrı bir yerde secret saklama&quot; derdini büyük
ölçüde ortadan kaldırıyor. SOPS + age ile kurulum birkaç komut, günlük kullanım
neredeyse görünmez. Küçük projelerde Vault&#x27;a gerek kalmadan makul bir güvenlik ve
rahat bir iş akışı sağlıyor.&lt;&#x2F;p&gt;
&lt;p&gt;Tam çalışan demo, tüm dosyalarıyla:
https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;sops-age-example&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="tr">
        <title>Cloudflare ve Gmail ile Kendi Domain&#x27;inden Ücretsiz E-posta</title>
        <published>2026-08-10T00:00:00+00:00</published>
        <updated>2026-08-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://erdincyasan.com/blog/cloudflare-gmail-custom-domain-email/"/>
        <id>https://erdincyasan.com/blog/cloudflare-gmail-custom-domain-email/</id>
        
        <content type="html" xml:base="https://erdincyasan.com/blog/cloudflare-gmail-custom-domain-email/">&lt;p&gt;E-posta gönderimlerini custom domain ile yapmak daha profesyonel duruyor. Hatta
çoğu hosting firması bunu bir artı özellik olarak sunuyor. Ama kendi e-posta
sunucunu kurmak ve bununla uğraşmak gerçekten külfet. İşin içine SPF kaydı,
domain doğrulama, hatta reverse DNS giriyor. MX kaydı da var bu işlerin. Yani
mailin düzgün teslim edilsin istiyorsan uğraşacağın bir sürü ayar var.&lt;&#x2F;p&gt;
&lt;p&gt;Çoğu firma bunları senin yerine otomatik hallediyor tabii. Ama custom bir e-posta
servisi istersen bu challenge&#x27;lar karşına çıkıyor.&lt;&#x2F;p&gt;
&lt;p&gt;Her neyse. Son dönemde web sitemi statik tutmaya karar verdim, admin panelim yok.
Özetle arkada sürekli çalışan bir hosting ya da VPS de yok, dolayısıyla sunucu
masrafım olmuyor. E-posta gönderimini kurumsal kimlik&#x2F;imaj açısından nasıl
çözerim diye araştırınca Gmail&#x27;de başka bir kişi olarak mail gönderebildiğini
gördüm. Zaten Cloudflare kullanırken mail forwarding yapıyordum: mesela
&lt;code&gt;iam@erdincyasan.com&lt;&#x2F;code&gt;&#x27;a mail atarsanız benim şahsi hesabıma, &lt;code&gt;erdincyasan@gmail.com&lt;&#x2F;code&gt;&#x27;a
düşüyor.&lt;&#x2F;p&gt;
&lt;p&gt;Şimdi gelin hep beraber bu ayarları nasıl yaptığımızı anlatmaya devam edelim.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;on-kosullar&quot;&gt;Ön koşullar&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Domain&#x27;in DNS&#x27;i Cloudflare&#x27;de yönetiliyor olmalı (nameserver&#x27;lar Cloudflare&#x27;e
bakıyor olacak).&lt;&#x2F;li&gt;
&lt;li&gt;Bir Gmail hesabı.&lt;&#x2F;li&gt;
&lt;li&gt;Gmail hesabında 2 adımlı doğrulama (2FA) açık. App password üretmek için bu
şart, sonra değineceğim.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;adim-1-cloudflare-email-routing-ile-mail-almak&quot;&gt;Adım 1: Cloudflare Email Routing ile mail almak&lt;&#x2F;h2&gt;
&lt;p&gt;Cloudflare dashboard&#x27;da domain&#x27;ini seç, sol menüden &lt;strong&gt;Email &amp;gt; Email Routing&lt;&#x2F;strong&gt;&#x27;e
gir. İlk kez açıyorsan seni bir kurulum akışına alıyor.&lt;&#x2F;p&gt;
&lt;p&gt;İki şey yapıyorsun:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Destination address ekle.&lt;&#x2F;strong&gt; Maillerin nereye düşeceğini söylüyorsun, yani
kendi Gmail adresin (&lt;code&gt;erdincyasan@gmail.com&lt;&#x2F;code&gt;). Cloudflare buraya bir doğrulama
maili gönderiyor, linke tıklayıp adresi onaylıyorsun. Onaylamadan yönlendirme
çalışmaz.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Routing kuralı ekle.&lt;&#x2F;strong&gt; Örneğin &lt;code&gt;iam@erdincyasan.com&lt;&#x2F;code&gt;&#x27;a gelen her şey
&lt;code&gt;erdincyasan@gmail.com&lt;&#x2F;code&gt;&#x27;a gitsin. İstersen tek tek adres kuralı yazarsın,
istersen &lt;strong&gt;catch-all&lt;&#x2F;strong&gt; açarsın (domain&#x27;e gelen ne varsa hepsi tek kutuya).
Catch-all pratik ama spam&#x27;i de topluyor, ona göre.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Email Routing&#x27;i enable edince Cloudflare senin adına otomatik olarak gerekli DNS
kayıtlarını ekliyor. Elle uğraşmana gerek yok, ama ne eklendiğini bilmek iyi:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Üç tane &lt;strong&gt;MX&lt;&#x2F;strong&gt; kaydı (&lt;code&gt;route1.mx.cloudflare.net&lt;&#x2F;code&gt;, &lt;code&gt;route2...&lt;&#x2F;code&gt;, &lt;code&gt;route3...&lt;&#x2F;code&gt;
şeklinde, farklı öncelik değerleriyle). Bunlar &quot;bu domain&#x27;in maili buraya
gelsin&quot; diyen kayıtlar.&lt;&#x2F;li&gt;
&lt;li&gt;Bir &lt;strong&gt;SPF&lt;&#x2F;strong&gt; kaydı (TXT): &lt;code&gt;v=spf1 include:_spf.mx.cloudflare.net ~all&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Bir de &lt;strong&gt;DKIM&lt;&#x2F;strong&gt; kaydı (TXT, &lt;code&gt;cf2024-1._domainkey...&lt;&#x2F;code&gt; gibi). Bu Cloudflare&#x27;in
kendi mail yolu için imza kaydı; Gmail&#x27;den giden mailde işe yaramıyor, ona
aşağıda &quot;Sınırlar&quot; bölümünde değineceğim.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Bu kadar. Artık &lt;code&gt;iam@erdincyasan.com&lt;&#x2F;code&gt;&#x27;a gelen mailler Gmail&#x27;ine düşüyor. Test
et: başka bir hesaptan bu adrese bir mail at, Gmail&#x27;e geliyor mu bak.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;adim-2-gmail-app-password-uretmek&quot;&gt;Adım 2: Gmail app password üretmek&lt;&#x2F;h2&gt;
&lt;p&gt;Şimdi giden tarafa geliyoruz. Gmail&#x27;in normal şifresiyle SMTP&#x27;ye bağlanamıyorsun,
Google bunu reddediyor. Onun yerine &lt;strong&gt;app password&lt;&#x2F;strong&gt; denen 16 karakterlik özel
bir şifre üretiyorsun.&lt;&#x2F;p&gt;
&lt;p&gt;Bunun ön koşulu 2FA&#x27;nın açık olması. 2FA kapalıysa app password ekranı hiç
görünmüyor.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Google hesabına gir: &lt;strong&gt;Google Account &amp;gt; Security&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;2 adımlı doğrulama açık değilse önce onu aç.&lt;&#x2F;li&gt;
&lt;li&gt;Ardından &lt;strong&gt;App passwords&lt;&#x2F;strong&gt; bölümüne git (arama kutusuna &quot;app passwords&quot;
yazarsan direkt bulursun).&lt;&#x2F;li&gt;
&lt;li&gt;Yeni bir app password oluştur, bir isim ver (mesela &quot;Gmail SMTP&quot;).&lt;&#x2F;li&gt;
&lt;li&gt;Google sana boşluklu görünen 16 karakterlik bir kod veriyor
(&lt;code&gt;abcd efgh ijkl mnop&lt;&#x2F;code&gt; gibi). Bu kodu bir yere kaydet, ekrandan çıkınca bir
daha göstermiyor.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Burada bir nokta var: Google şifreyi araya boşluk koyarak gösteriyor ama SMTP
ayarına girerken bu boşlukları silerek, bitişik girmen gerekiyor. Adım 3&#x27;te SMTP
server bilgilerini doldururken buna dikkat et, yoksa şifre kabul edilmiyor.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;adim-3-gmail-e-custom-adresi-tanitmak-send-mail-as&quot;&gt;Adım 3: Gmail&#x27;e custom adresi tanıtmak (Send mail as)&lt;&#x2F;h2&gt;
&lt;p&gt;Son adım, Gmail&#x27;e &quot;ben bu adresle de gönderebilirim&quot; demek.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Gmail &amp;gt; &lt;strong&gt;Settings (dişli) &amp;gt; See all settings &amp;gt; Accounts and Import&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Send mail as&lt;&#x2F;strong&gt; bölümünde &lt;strong&gt;Add another email address&lt;&#x2F;strong&gt;&#x27;e tıkla.&lt;&#x2F;li&gt;
&lt;li&gt;Ad ve göndermek istediğin adresi gir: &lt;code&gt;iam@erdincyasan.com&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Treat as an alias&lt;&#x2F;strong&gt; kutusu çıkıyor. Bunu işaretli bırakabilirsin; işaretini
kaldırırsan alıcı tarafında &quot;on behalf of&quot; gibi bir ibare çıkabiliyor. İlk
kurulumda işaretli bırakmak en temiz sonucu veriyor.&lt;&#x2F;li&gt;
&lt;li&gt;Sonraki ekranda SMTP bilgilerini istiyor:&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;SMTP Server : smtp.gmail.com&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Port        : 465  (SSL)   ya da   587 (TLS)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Username    : erdincyasan@gmail.com   (tam Gmail adresi, sadece &amp;quot;erdincyasan&amp;quot; değil)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Password    : ürettiğin 16 haneli app password (boşluksuz, bitişik gir)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;Kaydedince Google &lt;code&gt;iam@erdincyasan.com&lt;&#x2F;code&gt;&#x27;a bir doğrulama kodu yolluyor. Bu
mail Adım 1 sayesinde Gmail&#x27;ine düşüyor. Koddaki linke tıkla ya da kodu gir.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Bittiğinde Gmail&#x27;de yeni mail yazarken &quot;From&quot; alanından &lt;code&gt;iam@erdincyasan.com&lt;&#x2F;code&gt;&#x27;u
seçebiliyorsun. Gelen de Gmail&#x27;de, giden de Gmail&#x27;de. Tek kuruş ödemedin.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;takildigin-yer-535-5-7-8-username-and-password-not-accepted&quot;&gt;Takıldığın yer: &lt;code&gt;535-5.7.8 Username and Password not accepted&lt;&#x2F;code&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Adım 3&#x27;te SMTP kaydederken en çok bu hatayı alıyorsun. Sebepleri sırasıyla:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Normal Gmail şifreni girmişsin.&lt;&#x2F;strong&gt; App password kullanman lazım.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;2FA kapalı.&lt;&#x2F;strong&gt; App password üretemeyeceğin için zaten yanlış bir şey giriyorsun.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Username eksik.&lt;&#x2F;strong&gt; &lt;code&gt;erdincyasan&lt;&#x2F;code&gt; değil, tam adres: &lt;code&gt;erdincyasan@gmail.com&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;App password&#x27;un boşluklarını silmemişsin.&lt;&#x2F;strong&gt; Google kodu &lt;code&gt;abcd efgh ijkl mnop&lt;&#x2F;code&gt;
gibi boşluklu gösteriyor; SMTP&#x27;ye bitişik (&lt;code&gt;abcdefghijklmnop&lt;&#x2F;code&gt;) girmen gerekiyor.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Kopyalarken görünmez karakter kaçmış.&lt;&#x2F;strong&gt; App password&#x27;u elle, dikkatli gir.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;sinirlar-durust-olmak-gerekirse&quot;&gt;Sınırlar (dürüst olmak gerekirse)&lt;&#x2F;h2&gt;
&lt;p&gt;Bu kurulum bedava ve işini görüyor ama sihir değil:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Gerçek bir mailbox değil. Cloudflare tarafında mail saklanmıyor, sadece
forward. Gmail&#x27;in silersen o mail gitti.&lt;&#x2F;li&gt;
&lt;li&gt;Giden mail teknik olarak Gmail sunucusundan çıkıyor. Bu yüzden SPF&#x2F;DKIM
hizalaması (alignment) domain&#x27;inle &lt;strong&gt;tam&lt;&#x2F;strong&gt; örtüşmüyor; header&#x27;da Gmail izleri
kalıyor. Kişisel&#x2F;küçük kullanım için sorun değil, ama kurumsal bir mail
altyapısı arayan biri için yeterli değil.&lt;&#x2F;li&gt;
&lt;li&gt;Ciddi gönderim hacmin varsa ya da teslimat garantisi önemliyse, ayrı bir mail
sağlayıcısı (Zoho, Google Workspace gibi) ya da transactional bir SMTP servisi
daha doğru olur.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Ama &quot;domain&#x27;imden profesyonel görünen bir adresim olsun, para ödemeyeyim&quot; diyorsan
bu ikili tam da o iş için.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="tr">
        <title>Git&#x27;te Yerel Ignore Kuralları: .git&#x2F;info&#x2F;exclude ve core.excludesFile</title>
        <published>2026-08-10T00:00:00+00:00</published>
        <updated>2026-08-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://erdincyasan.com/blog/git-yerel-ignore-kurallari/"/>
        <id>https://erdincyasan.com/blog/git-yerel-ignore-kurallari/</id>
        
        <content type="html" xml:base="https://erdincyasan.com/blog/git-yerel-ignore-kurallari/">&lt;h2 id=&quot;giris&quot;&gt;Giriş&lt;&#x2F;h2&gt;
&lt;p&gt;Ekiple birlikte büyük bir proje üzerinde çalışıyorduk. Projede herkes Claude
kullanmıyordu. Ben ise pairing yaparken proje root&#x27;una sürekli bir şeyler
bırakıyordum. Bir konuyu tarayıp docs olarak .md çıktısı alıyordum, geçici json
dosyaları atıyordum, görseller koyuyordum. Bunların hiçbiri projeyle doğrudan
ilgili değildi.&lt;&#x2F;p&gt;
&lt;p&gt;İki şey istemiyordum. Birincisi bu dosyaları .gitignore&#x27;a eklemek, çünkü
.gitignore commit&#x27;lenir ve ilişkisiz bir değişiklik olarak herkese gider.
İkincisi bunların file change&#x27;lerde gözükmesi, kendi yerel çalışmam yüzünden
diff&#x27;i kirletmek istemiyordum.&lt;&#x2F;p&gt;
&lt;p&gt;Yani bana repoya hiç dokunmayan, sadece kendi makinemde geçerli bir ignore
çözümü lazımdı. Aradım ve buldum: .git&#x2F;info&#x2F;exclude.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;uc-yer-uc-amac&quot;&gt;Üç yer, üç amaç&lt;&#x2F;h2&gt;
&lt;p&gt;Git&#x27;te ignore kuralı yazabileceğin üç yer var, ve üçü de farklı bir işe yarıyor:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.gitignore&lt;&#x2F;code&gt;: repo ile paylaşılan, commit&#x27;lenen, herkesi bağlayan kurallar.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;.git&#x2F;info&#x2F;exclude&lt;&#x2F;code&gt;: sadece senin makinen ve klonun için. Commit, push, clone
edilmez, takımdaki kimse görmez.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;core.excludesFile&lt;&#x2F;code&gt;: git config ile işaret ettiğin bir dosya. Global (tüm
repoların için, per-user) ya da tek repo için local olabilir.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Benim ihtiyacım ikincisiydi, ama üçünü de bilmek işine yarıyor.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;git-info-exclude-kisiye-ozel-ve-repoya-girmez&quot;&gt;.git&#x2F;info&#x2F;exclude, kişiye özel ve repoya girmez&lt;&#x2F;h2&gt;
&lt;p&gt;Bu tam benim aradığım şeydi. Kurallar sadece bende kalıyor, repoya hiç
dokunmuyor. Dosya zaten her repoda mevcut, ekstra bir şey yaratman gerekmiyor,
sonuna satır eklemen yeterli:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;*.local&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; .git&#x2F;info&#x2F;exclude&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;scratch&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; .git&#x2F;info&#x2F;exclude&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Bunu yerelde test ettim. &lt;code&gt;*.local&lt;&#x2F;code&gt; kuralını yazınca untracked &lt;code&gt;note.local&lt;&#x2F;code&gt;
dosyası yoksayıldı:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;git&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; check-ignore&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;v&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; note.local&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; .git&#x2F;info&#x2F;exclude:1:*.local	note.local&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;En güzel tarafı, bu dosya klonlanmıyor ve push edilmiyor. Yani proje root&#x27;una
attığım docs ve json dosyalarını burada tuttum, kimsenin diff&#x27;inde gözükmedi.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;onemli-tuzak-zaten-tracked-olan-dosya&quot;&gt;Önemli tuzak: zaten tracked olan dosya&lt;&#x2F;h2&gt;
&lt;p&gt;Burası çok yanlış biliniyor, o yüzden ayrı yazıyorum. Eğer bir dosya zaten
commit edilmişse (tracked), onu exclude&#x27;a eklemek hiçbir şey değiştirmiyor. Git
tracked dosyalara ignore kurallarını uygulamaz.&lt;&#x2F;p&gt;
&lt;p&gt;Test ettim: tracked bir dosyayı exclude&#x27;a ekledim, &lt;code&gt;git check-ignore -v&lt;&#x2F;code&gt; hiçbir
şey döndürmedi. Çünkü tracked dosya &quot;ignored&quot; sayılmıyor.&lt;&#x2F;p&gt;
&lt;p&gt;Çözüm, önce dosyayı index&#x27;ten düşürmek. Çalışma dizinindeki dosya silinmiyor,
sadece git takibi bitiyor:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;git&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; rm&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;-cached&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; tracked.txt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; dosya diskte kalır, sadece git artık takip etmez&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; bundan sonra .gitignore veya exclude kuralı devreye girer&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;core-excludesfile-global-kisisel-ignore&quot;&gt;core.excludesFile, global kişisel ignore&lt;&#x2F;h2&gt;
&lt;p&gt;Bir de her repoda tekrar tekrar yazmak istemediğin şeyler var. &lt;code&gt;.DS_Store&lt;&#x2F;code&gt;,
&lt;code&gt;.idea&#x2F;&lt;&#x2F;code&gt;, &lt;code&gt;*.swp&lt;&#x2F;code&gt; gibi. Bunları her projede ayrı ayrı yazmak yerine bir kere
merkezi tanımlayabilirsin:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;git&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; config&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;-global&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; core.excludesFile&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; ~&#x2F;.gitignore_global&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;*.conf&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; ~&#x2F;.gitignore_global&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Yerelde denedim, &lt;code&gt;*.conf&lt;&#x2F;code&gt; kuralı &lt;code&gt;app.conf&lt;&#x2F;code&gt;&#x27;u yoksaydı:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;git&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; check-ignore&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;v&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; app.conf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; ~&#x2F;.gitignore_global:1:*.conf	app.conf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Global şart değil, &lt;code&gt;--global&lt;&#x2F;code&gt; olmadan &lt;code&gt;git config core.excludesFile &amp;lt;yol&amp;gt;&lt;&#x2F;code&gt;
diyerek tek repo için de kullanabilirsin.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;oncelik-sirasi&quot;&gt;Öncelik sırası&lt;&#x2F;h2&gt;
&lt;p&gt;Şimdi asıl kafa karıştıran yere geldik. Aynı dosya için birden fazla yerde kural
varsa kim kazanır? Yerelde test ettim, yüksekten düşüğe sıra şöyle:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Komut satırı pattern&#x27;leri (git ls-files gibi)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;.gitignore&lt;&#x2F;code&gt; dosyaları (daha derin dizindeki kural üstünü ezer, aynı dosya
içinde son eşleşen kural kazanır)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;.git&#x2F;info&#x2F;exclude&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;core.excludesFile&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Bunu iki negation testiyle doğruladım. &lt;code&gt;.gitignore&lt;&#x2F;code&gt; içine &lt;code&gt;!note.local&lt;&#x2F;code&gt;
yazdığımda, exclude&#x27;daki &lt;code&gt;*.local&lt;&#x2F;code&gt; kuralını ezdi ve dosya yoksayılmadı. Yani
&lt;code&gt;.gitignore&lt;&#x2F;code&gt;, exclude&#x27;dan önceliklidir. Sonra exclude&#x27;a &lt;code&gt;!build&#x2F;&lt;&#x2F;code&gt; yazdığımda,
core.excludesFile&#x27;daki &lt;code&gt;build&#x2F;&lt;&#x2F;code&gt; kuralını ezdi. Yani exclude da
core.excludesFile&#x27;dan önceliklidir.&lt;&#x2F;p&gt;
&lt;p&gt;Kısacası ortak kural (&lt;code&gt;.gitignore&lt;&#x2F;code&gt;) her zaman kişisel kurallarını ezer. Bunu
akılda tutmak lazım.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hata-ayiklama-bir-dosya-neden-yoksayiliyor&quot;&gt;Hata ayıklama: bir dosya neden yoksayılıyor?&lt;&#x2F;h2&gt;
&lt;p&gt;Bir dosyanın neden ignore edildiğini (ya da edilmediğini) merak ettiğinde tek
komut yetiyor:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;git&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; check-ignore&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;v&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;dosy&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;a&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;-v&lt;&#x2F;code&gt; bayrağı hangi dosyanın, hangi satırın, hangi kuralın eşleştiğini gösteriyor:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;git&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; check-ignore&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;v&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; note.local&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; .git&#x2F;info&#x2F;exclude:1:*.local	note.local&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Çıktı gelmiyorsa iki ihtimal var: ya dosya ignore edilmiyor, ya da zaten tracked
(tracked dosyalar bu komutta raporlanmaz).&lt;&#x2F;p&gt;
&lt;h2 id=&quot;takim-acisindan-exclude-mi-ortak-kural-mi&quot;&gt;Takım açısından: exclude mı, ortak kural mı?&lt;&#x2F;h2&gt;
&lt;p&gt;Benim durumumda cevap netti. Attığım dosyalar tamamen kişiseldi, takımın
umurunda değildi, o yüzden &lt;code&gt;.git&#x2F;info&#x2F;exclude&lt;&#x2F;code&gt; doğru seçimdi. Repoya dokunmadan
kendi kirimi kendi makinemde tuttum.&lt;&#x2F;p&gt;
&lt;p&gt;Basit bir ayrım var kafamda:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Sadece sana özgü şeyler (IDE ayarları, kişisel scratch, pairing artıkları):
&lt;code&gt;.git&#x2F;info&#x2F;exclude&lt;&#x2F;code&gt; veya global &lt;code&gt;core.excludesFile&lt;&#x2F;code&gt;. Repoyu kirletmez.&lt;&#x2F;li&gt;
&lt;li&gt;Takımca ortak muaf tutulması gereken şeyler (&lt;code&gt;node_modules&#x2F;&lt;&#x2F;code&gt;, build çıktısı):
commit&#x27;lenen &lt;code&gt;.gitignore&lt;&#x2F;code&gt;. Çünkü exclude paylaşılmıyor, herkesin aynı
davranışı görmesi gerekir.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;kapanis&quot;&gt;Kapanış&lt;&#x2F;h2&gt;
&lt;p&gt;Özetle, .gitignore tek yer değil. Kişisel işler için &lt;code&gt;.git&#x2F;info&#x2F;exclude&lt;&#x2F;code&gt; ve
&lt;code&gt;core.excludesFile&lt;&#x2F;code&gt; var, ve bunlar repoya hiç dokunmuyor. Bir daha proje
root&#x27;una geçici bir dosya bırakıp da &quot;bunu nasıl gizlerim&quot; diye düşündüğünde,
çözüm bu.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="tr">
        <title>PostgreSQL LIKE Performansı: CAST, Concat ve OR Karşılaştırması</title>
        <published>2026-06-29T00:00:00+00:00</published>
        <updated>2026-06-29T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://erdincyasan.com/blog/postgresql-like-concat-vs-or/"/>
        <id>https://erdincyasan.com/blog/postgresql-like-concat-vs-or/</id>
        
        <content type="html" xml:base="https://erdincyasan.com/blog/postgresql-like-concat-vs-or/">&lt;p&gt;Geçenlerde gördüğüm bir sorgu üzerine düşünmeye başladım. &lt;code&gt;LongColumn&lt;&#x2F;code&gt; (&lt;code&gt;bigint&lt;&#x2F;code&gt;) ve &lt;code&gt;Description&lt;&#x2F;code&gt; (&lt;code&gt;text&lt;&#x2F;code&gt;) diye iki sütun vardı. Arama şöyle çalışıyordu:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Eski kod: CAST + concat&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;context&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Documents&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;    .&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Where&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;d&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; EF&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Functions&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Like&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        d&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;LongColumn&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;ToString&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; +&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; +&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; d&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Description&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; pattern&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;EF Core bunu &lt;code&gt;LongColumn::text || &#x27; &#x27; || Description&lt;&#x2F;code&gt; olarak PostgreSQL&#x27;e gönderiyordu. &lt;code&gt;bigint&lt;&#x2F;code&gt; bir sütunda LIKE aramak için önce &lt;code&gt;::text&lt;&#x2F;code&gt; cast edip Description ile birleştirmek gerekiyordu. Daha sonra &lt;code&gt;LongColumn&lt;&#x2F;code&gt;&#x27;daki veriler &lt;code&gt;TextColumn&lt;&#x2F;code&gt; adlı &lt;code&gt;text&lt;&#x2F;code&gt; tipinde yeni bir sütuna taşındı. CAST ortadan kalktı.&lt;&#x2F;p&gt;
&lt;p&gt;Peki şimdi sorguyu nasıl yazmalıyız? Altı farklı yol var:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; A: CAST + concat (eski yol)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Where&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;d&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; EF&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Functions&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Like&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    d&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;LongColumn&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;ToString&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; +&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; +&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; d&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Description&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; pattern&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; B: CAST, tek sütun&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Where&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;d&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; EF&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Functions&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Like&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;d&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;LongColumn&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;ToString&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; pattern&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; C: TextColumn concat&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Where&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;d&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; EF&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Functions&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Like&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    d&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;TextColumn&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; +&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; +&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; d&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Description&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; pattern&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; D: TextColumn tek sütun&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Where&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;d&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; EF&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Functions&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Like&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;d&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;TextColumn&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; pattern&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; E: TextColumn OR Description (ayrı ayrı LIKE)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Where&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;d&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; EF&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Functions&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Like&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;d&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;TextColumn&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; pattern&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;         ||&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; EF&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Functions&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Like&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;d&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Description&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; pattern&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; F: LongColumn::text OR Description (CAST&amp;#39;li OR)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Where&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;d&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; EF&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Functions&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Like&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;d&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;LongColumn&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;ToString&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; pattern&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;         ||&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; EF&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Functions&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Like&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;d&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Description&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; pattern&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Hangisi daha hızlı? CAST maliyeti ne kadar? Concat index&#x27;i bozuyor mu? OR yaklaşımı index kullanabiliyor mu? Bu soruları cevaplamak için 2 milyon satırlık bir benchmark kurdum.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;benchmark-kurulumu&quot;&gt;Benchmark Kurulumu&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;PostgreSQL 16 (Docker), port 5433&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;documents&lt;&#x2F;code&gt; tablosu: &lt;code&gt;Id&lt;&#x2F;code&gt;, &lt;code&gt;LongColumn (bigint)&lt;&#x2F;code&gt;, &lt;code&gt;TextColumn (text)&lt;&#x2F;code&gt;, &lt;code&gt;Description (text)&lt;&#x2F;code&gt; - 2 milyon satır&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;TextColumn&lt;&#x2F;code&gt;: &lt;code&gt;LongColumn&lt;&#x2F;code&gt;&#x27;ın string karşılığı + Türkçe metin. Ortalama 439 byte&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;LongColumn&lt;&#x2F;code&gt;: rastgele 10 haneli bigint. String karşılığı ortalama 14 byte&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;Description&lt;&#x2F;code&gt;: Türkçe metin, ortalama 423 byte&lt;&#x2F;li&gt;
&lt;li&gt;Index&#x27;ler &lt;code&gt;TextColumn&lt;&#x2F;code&gt; ve &lt;code&gt;Description&lt;&#x2F;code&gt; üzerinde (&lt;code&gt;bigint&lt;&#x2F;code&gt; sütuna text index&#x27;i oluşturulmaz)&lt;&#x2F;li&gt;
&lt;li&gt;3 index stratejisi: Yok, B-tree, GIN trigram (&lt;code&gt;pg_trgm&lt;&#x2F;code&gt;)&lt;&#x2F;li&gt;
&lt;li&gt;3 pattern: &lt;code&gt;%ankara%&lt;&#x2F;code&gt; (&lt;del&gt;%42 satır), &lt;code&gt;%de%&lt;&#x2F;code&gt; (&lt;&#x2F;del&gt;%99 satır), &lt;code&gt;%xyzqwerty%&lt;&#x2F;code&gt; (hiç yok)&lt;&#x2F;li&gt;
&lt;li&gt;Her senaryo 5 kez çalıştırıldı, en iyi&#x2F;en kötü atıldı, 3&#x27;ünün ortalaması&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON)&lt;&#x2F;code&gt; ile ölçüldü&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;ef-core-un-urettigi-sql&quot;&gt;EF Core&#x27;un Ürettiği SQL&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;A - CAST + concat&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;--&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; @__pattern_1=&amp;#39;%ankara%&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;SELECT&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; d.&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;Id&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;, d.&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;Description&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;, d.&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;LongColumn&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;, d.&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;TextColumn&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;FROM&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; documents &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;AS&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; d&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;WHERE&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; d.&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;LongColumn&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;::&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;text&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ||&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ||&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; d.&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;Description&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; LIKE&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; @__pattern_1&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; ESCAPE &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;B - CAST, tek sütun&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;WHERE&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; d.&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;LongColumn&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;::&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;text&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; LIKE&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; @__pattern_1&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; ESCAPE &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;C - TextColumn concat&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;WHERE&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; d.&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;TextColumn&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ||&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ||&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; d.&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;Description&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; LIKE&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; @__pattern_1&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; ESCAPE &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;D - TextColumn tek sütun&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;WHERE&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; d.&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;TextColumn&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; LIKE&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; @__pattern_1&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; ESCAPE &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;E - TextColumn OR Description&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;WHERE&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; d.&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;TextColumn&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; LIKE&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; @__pattern_1&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; ESCAPE &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; OR&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; d.&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;Description&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; LIKE&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; @__pattern_1&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; ESCAPE &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;F - LongColumn::text OR Description&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;WHERE&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; d.&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;LongColumn&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;::&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;text&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; LIKE&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; @__pattern_1&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; ESCAPE &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; OR&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; d.&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;Description&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; LIKE&lt;&#x2F;span&gt;&lt;span class=&quot;z-text&quot;&gt; @__pattern_1&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; ESCAPE &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;d.LongColumn.ToString()&lt;&#x2F;code&gt; → &lt;code&gt;LongColumn::text&lt;&#x2F;code&gt;. &lt;code&gt;string + string&lt;&#x2F;code&gt; → &lt;code&gt;||&lt;&#x2F;code&gt;. &lt;code&gt;ESCAPE &#x27;&#x27;&lt;&#x2F;code&gt; EF Core varsayılanı, performansa etkisiz.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;sonuclar-gin-trigram-index-ile&quot;&gt;Sonuçlar - GIN Trigram İndex ile&lt;&#x2F;h2&gt;
&lt;p&gt;En kritik senaryo GIN index varken. B-tree None ile aynı sonucu verdiği için atlıyorum - &lt;code&gt;LIKE &#x27;%x%&#x27;&lt;&#x2F;code&gt; B-tree&#x27;nin çalışma prensibine ters.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Yaklaşım&lt;&#x2F;th&gt;&lt;th&gt;Pattern&lt;&#x2F;th&gt;&lt;th&gt;Süre (ms)&lt;&#x2F;th&gt;&lt;th&gt;Read Blocks&lt;&#x2F;th&gt;&lt;th&gt;Satır&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;A: CAST+concat&lt;&#x2F;td&gt;&lt;td&gt;%ankara%&lt;&#x2F;td&gt;&lt;td&gt;702.35&lt;&#x2F;td&gt;&lt;td&gt;465,400&lt;&#x2F;td&gt;&lt;td&gt;1,036,239&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;A: CAST+concat&lt;&#x2F;td&gt;&lt;td&gt;%de%&lt;&#x2F;td&gt;&lt;td&gt;645.73&lt;&#x2F;td&gt;&lt;td&gt;232,304&lt;&#x2F;td&gt;&lt;td&gt;1,991,384&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;A: CAST+concat&lt;&#x2F;td&gt;&lt;td&gt;%xyzqwerty%&lt;&#x2F;td&gt;&lt;td&gt;468.41&lt;&#x2F;td&gt;&lt;td&gt;464,416&lt;&#x2F;td&gt;&lt;td&gt;0&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;B: CAST tek&lt;&#x2F;td&gt;&lt;td&gt;%ankara%&lt;&#x2F;td&gt;&lt;td&gt;131.93&lt;&#x2F;td&gt;&lt;td&gt;459,568&lt;&#x2F;td&gt;&lt;td&gt;0&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;B: CAST tek&lt;&#x2F;td&gt;&lt;td&gt;%de%&lt;&#x2F;td&gt;&lt;td&gt;328.45&lt;&#x2F;td&gt;&lt;td&gt;229,556&lt;&#x2F;td&gt;&lt;td&gt;0&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;B: CAST tek&lt;&#x2F;td&gt;&lt;td&gt;%xyzqwerty%&lt;&#x2F;td&gt;&lt;td&gt;137.11&lt;&#x2F;td&gt;&lt;td&gt;457,680&lt;&#x2F;td&gt;&lt;td&gt;0&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;C: TextConcat&lt;&#x2F;td&gt;&lt;td&gt;%ankara%&lt;&#x2F;td&gt;&lt;td&gt;996.65&lt;&#x2F;td&gt;&lt;td&gt;453,224&lt;&#x2F;td&gt;&lt;td&gt;1,729,401&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;C: TextConcat&lt;&#x2F;td&gt;&lt;td&gt;%de%&lt;&#x2F;td&gt;&lt;td&gt;640.01&lt;&#x2F;td&gt;&lt;td&gt;226,244&lt;&#x2F;td&gt;&lt;td&gt;1,999,945&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;C: TextConcat&lt;&#x2F;td&gt;&lt;td&gt;%xyzqwerty%&lt;&#x2F;td&gt;&lt;td&gt;780.89&lt;&#x2F;td&gt;&lt;td&gt;451,480&lt;&#x2F;td&gt;&lt;td&gt;0&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;D: TextSingle&lt;&#x2F;td&gt;&lt;td&gt;%ankara%&lt;&#x2F;td&gt;&lt;td&gt;1,644.34&lt;&#x2F;td&gt;&lt;td&gt;224,260&lt;&#x2F;td&gt;&lt;td&gt;850,373&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;D: TextSingle&lt;&#x2F;td&gt;&lt;td&gt;%de%&lt;&#x2F;td&gt;&lt;td&gt;552.69&lt;&#x2F;td&gt;&lt;td&gt;224,148&lt;&#x2F;td&gt;&lt;td&gt;1,987,804&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;D: TextSingle&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;%xyzqwerty%&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;0.01&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;0&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;0&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;E: TextOR&lt;&#x2F;td&gt;&lt;td&gt;%ankara%&lt;&#x2F;td&gt;&lt;td&gt;2,480.59&lt;&#x2F;td&gt;&lt;td&gt;223,484&lt;&#x2F;td&gt;&lt;td&gt;1,297,051&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;E: TextOR&lt;&#x2F;td&gt;&lt;td&gt;%de%&lt;&#x2F;td&gt;&lt;td&gt;543.10&lt;&#x2F;td&gt;&lt;td&gt;223,204&lt;&#x2F;td&gt;&lt;td&gt;1,999,945&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;E: TextOR&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;%xyzqwerty%&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;0.01&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;0&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;0&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;F: CAST OR&lt;&#x2F;td&gt;&lt;td&gt;%ankara%&lt;&#x2F;td&gt;&lt;td&gt;1,776.36&lt;&#x2F;td&gt;&lt;td&gt;222,064&lt;&#x2F;td&gt;&lt;td&gt;777,179&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;F: CAST OR&lt;&#x2F;td&gt;&lt;td&gt;%de%&lt;&#x2F;td&gt;&lt;td&gt;627.46&lt;&#x2F;td&gt;&lt;td&gt;221,848&lt;&#x2F;td&gt;&lt;td&gt;1,991,384&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;F: CAST OR&lt;&#x2F;td&gt;&lt;td&gt;%xyzqwerty%&lt;&#x2F;td&gt;&lt;td&gt;459.11&lt;&#x2F;td&gt;&lt;td&gt;443,016&lt;&#x2F;td&gt;&lt;td&gt;0&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;kritik-bulgu-1-gin-index-kim-kullaniyor-kim-kullanamiyor&quot;&gt;Kritik Bulgu 1: GIN İndex - Kim Kullanıyor, Kim Kullanamıyor?&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;%xyzqwerty%&lt;&#x2F;code&gt; pattern&#x27;ine odaklanalım. Bu pattern hiçbir satırda yok - index&#x27;in gerçek etkisini en net burada görüyoruz:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;#&lt;&#x2F;th&gt;&lt;th&gt;Yaklaşım&lt;&#x2F;th&gt;&lt;th&gt;SQL Özeti&lt;&#x2F;th&gt;&lt;th&gt;Süre&lt;&#x2F;th&gt;&lt;th&gt;Tarama Tipi&lt;&#x2F;th&gt;&lt;th&gt;İndex?&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;A&lt;&#x2F;td&gt;&lt;td&gt;CAST+concat&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;LongCol::text || Desc&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;468ms&lt;&#x2F;td&gt;&lt;td&gt;Seq Scan&lt;&#x2F;td&gt;&lt;td&gt;❌&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;B&lt;&#x2F;td&gt;&lt;td&gt;CAST tek&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;LongCol::text&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;137ms&lt;&#x2F;td&gt;&lt;td&gt;Seq Scan&lt;&#x2F;td&gt;&lt;td&gt;❌&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;C&lt;&#x2F;td&gt;&lt;td&gt;TextConcat&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;TextCol || Desc&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;781ms&lt;&#x2F;td&gt;&lt;td&gt;Seq Scan&lt;&#x2F;td&gt;&lt;td&gt;❌&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;D&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;TextSingle&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;TextCol&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;0.01ms&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;Bitmap Index Scan&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;✅&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;E&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;Text OR&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;TextCol OR Desc&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;0.01ms&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;BitmapOr&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;✅✅&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;F&lt;&#x2F;td&gt;&lt;td&gt;CAST OR&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;LongCol::text OR Desc&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;459ms&lt;&#x2F;td&gt;&lt;td&gt;Seq Scan&lt;&#x2F;td&gt;&lt;td&gt;❌&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Sadece D ve E GIN index kullanabiliyor. Neden?&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;A, B, C:&lt;&#x2F;strong&gt; &lt;code&gt;||&lt;&#x2F;code&gt; concat ve &lt;code&gt;::text&lt;&#x2F;code&gt; CAST birer &lt;em&gt;expression&lt;&#x2F;em&gt;. GIN index&#x27;i &lt;code&gt;TextColumn&lt;&#x2F;code&gt; ve &lt;code&gt;Description&lt;&#x2F;code&gt; sütunları üzerinde. Expression&#x27;lar bu index&#x27;lerle eşleşmez - planner Seq Scan&#x27;e düşer.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;D:&lt;&#x2F;strong&gt; &lt;code&gt;TextColumn&lt;&#x2F;code&gt; direkt sütun referansı. &lt;code&gt;ix_text_gin&lt;&#x2F;code&gt; tam bu sütunda. Planner anında Bitmap Index Scan kullanır.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;E:&lt;&#x2F;strong&gt; İki direkt sütun referansı, OR ile bağlı. PostgreSQL &lt;code&gt;ix_text_gin&lt;&#x2F;code&gt; ve &lt;code&gt;ix_desc_gin&lt;&#x2F;code&gt; index&#x27;lerini ayrı ayrı tarar, sonuçları &lt;strong&gt;BitmapOr&lt;&#x2F;strong&gt; ile birleştirir. Çift index, tek seferde.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;F:&lt;&#x2F;strong&gt; &lt;code&gt;LongColumn::text&lt;&#x2F;code&gt; CAST&#x27;li, &lt;code&gt;Description&lt;&#x2F;code&gt; direkt. CAST&#x27;li kısım index kullanamaz. PostgreSQL OR ifadesinin &lt;em&gt;tamamını&lt;&#x2F;em&gt; Seq Scan&#x27;e düşürür - Description&#x27;ın GIN index&#x27;i olsa bile.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;kritik-bulgu-2-e-nin-explain-plani-bitmapor&quot;&gt;Kritik Bulgu 2: E&#x27;nin EXPLAIN Planı - BitmapOr&lt;&#x2F;h2&gt;
&lt;p&gt;Yaklaşım E (&lt;code&gt;TextColumn OR Description&lt;&#x2F;code&gt;) GIN index ile şu planı üretiyor:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Bitmap Heap Scan (time=0.003ms, rows=0)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  -&amp;gt; BitmapOr&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    -&amp;gt; Bitmap Index Scan on ix_text_gin (time=0.003ms)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       Index Cond: (&amp;quot;TextColumn&amp;quot; ~~ &amp;#39;%xyzqwerty%&amp;#39;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    -&amp;gt; Bitmap Index Scan on ix_desc_gin (time=0.003ms)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       Index Cond: (&amp;quot;Description&amp;quot; ~~ &amp;#39;%xyzqwerty%&amp;#39;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;İki index paralel taranıyor, BitmapOr ile birleştiriliyor, heap&#x27;e hiç gidilmiyor. Sonuç: 0.01ms.&lt;&#x2F;p&gt;
&lt;p&gt;Bu, ayrı ayrı LIKE + OR yaklaşımının concat&#x27;tan neden bu kadar üstün olduğunu gösteriyor. Concat (A, C) ifadeyi tek bir expression&#x27;a dönüştürüp index&#x27;i devre dışı bırakırken, OR her sütunu ayrı ayrı index&#x27;letebiliyor.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;kritik-bulgu-3-cast-or-u-zehirliyor&quot;&gt;Kritik Bulgu 3: CAST OR&#x27;u Zehirliyor&lt;&#x2F;h2&gt;
&lt;p&gt;F (&lt;code&gt;LongColumn::text OR Description&lt;&#x2F;code&gt;) GIN index varken bile Seq Scan:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Gather (workers=2) -&amp;gt; Parallel Seq Scan&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Filter: ((LongColumn::text ~~ &amp;#39;%xyzqwerty%&amp;#39;) OR (Description ~~ &amp;#39;%xyzqwerty%&amp;#39;))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Rows Removed by Filter: 666,667 (x3 workers = 2M)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Execution Time: 459ms&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Description&#x27;ın GIN index&#x27;i (&lt;code&gt;ix_desc_gin&lt;&#x2F;code&gt;) var. Ama &lt;code&gt;LongColumn::text&lt;&#x2F;code&gt; CAST&#x27;i non-indexable olduğu için, PostgreSQL tüm OR ifadesini Seq Scan olarak planlıyor. Tek bir non-indexable terim, tüm sorguyu index&#x27;siz bırakıyor.&lt;&#x2F;p&gt;
&lt;p&gt;Bu, migration&#x27;ın neden kritik olduğunu gösteriyor: &lt;code&gt;LongColumn&lt;&#x2F;code&gt; (bigint) durduğu sürece, ister concat ister OR kullan, index faydası alamazsın.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;kritik-bulgu-4-hiz-siralamasi-gin-seyrek-pattern&quot;&gt;Kritik Bulgu 4: Hız Sıralaması (GIN, seyrek pattern)&lt;&#x2F;h2&gt;
&lt;p&gt;Kazananlar:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;D ve E: 0.01ms&lt;&#x2F;strong&gt; - index kullanıyor, sub-milisaniye&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;B: 137ms&lt;&#x2F;strong&gt; - Seq Scan ama en kısa veri (14 byte)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;A: 468ms&lt;&#x2F;strong&gt; - Seq Scan, CAST + concat (~438 byte)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;F: 459ms&lt;&#x2F;strong&gt; - Seq Scan, CAST OR (~438 byte)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;C: 781ms&lt;&#x2F;strong&gt; - Seq Scan, TextConcat (~863 byte)&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;En yavaş C çünkü en büyük veriyi tarıyor (TextColumn 439B + Description 423B = 862B). En hızlı Seq Scan B çünkü sadece 14 byte&#x27;lık LongColumn::text taranıyor.&lt;&#x2F;p&gt;
&lt;p&gt;Ama index devredeyken veri boyutunun önemi kalmıyor - D de 439 byte tarıyor olmasına rağmen index sayesinde 0.01ms.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;diger-bulgular&quot;&gt;Diğer Bulgular&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Sık pattern&#x27;lerde index kullanılmıyor.&lt;&#x2F;strong&gt; &lt;code&gt;%de%&lt;&#x2F;code&gt; ve &lt;code&gt;%ankara%&lt;&#x2F;code&gt; için tüm yaklaşımlar Seq Scan. Planner, çok satır match olunca heap lookup maliyetinin direkt taramayı geçtiğini biliyor.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;CAST maliyeti düşük.&lt;&#x2F;strong&gt; &lt;code&gt;bigint::text&lt;&#x2F;code&gt; dönüşümü mikrosaniye seviyesinde. Asıl maliyet concat ile iki büyük sütunu birleştirmekte.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;A, C&#x27;den hızlı.&lt;&#x2F;strong&gt; CAST+concat (468ms), TextConcat&#x27;tan (781ms) daha hızlı. Sebep: &lt;code&gt;LongColumn::text&lt;&#x2F;code&gt; 14 byte, &lt;code&gt;TextColumn&lt;&#x2F;code&gt; 439 byte. CAST maliyeti değil, veri boyutu belirleyici.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;pratik-tavsiyeler&quot;&gt;Pratik Tavsiyeler&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;LIKE sorgusunda asla concat kullanma.&lt;&#x2F;strong&gt; &lt;code&gt;col1 || &#x27; &#x27; || col2&lt;&#x2F;code&gt; ifadesi sütun bazlı index&#x27;leri tamamen devre dışı bırakır. Her zaman &lt;strong&gt;ayrı ayrı LIKE + OR&lt;&#x2F;strong&gt; yap.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;OR kullanırken CAST&#x27;li sütunları OR&#x27;a dahil etme.&lt;&#x2F;strong&gt; Tek bir CAST&#x27;li terim bile olsa, tüm OR Seq Scan&#x27;e düşer. CAST&#x27;li sütunu ayrı bir WHERE koşulu olarak yazıp &lt;code&gt;UNION&lt;&#x2F;code&gt; ile birleştirmek daha iyi olabilir.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Non-text sütunları text&#x27;e çevir.&lt;&#x2F;strong&gt; &lt;code&gt;bigint&lt;&#x2F;code&gt; gibi tiplerde LIKE araması yapıyorsan migration ile text sütuna taşı. CAST ortadan kalkar, GIN index kullanılabilir hale gelirsin.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;GIN trigram index&#x27;i seyrek pattern&#x27;ler için ezici.&lt;&#x2F;strong&gt; Ama sık pattern&#x27;lerde planner kullanmayacak. Index&#x27;in INSERT&#x2F;UPDATE maliyetini değerlendir.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ayrı ayrı LIKE + OR, tek sütun LIKE kadar hızlı.&lt;&#x2F;strong&gt; E (&lt;code&gt;TextColumn OR Description&lt;&#x2F;code&gt;) de D (&lt;code&gt;TextColumn&lt;&#x2F;code&gt;) de 0.01ms. İkinci sütunu dahil etmenin index maliyeti yok denecek kadar az (BitmapOr).&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Kendi verinde ölç.&lt;&#x2F;strong&gt; Bu benchmark 2M satır, Docker macOS. &lt;code&gt;EXPLAIN ANALYZE&lt;&#x2F;code&gt; ile kendi ortamında test et.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;kaynaklar&quot;&gt;Kaynaklar&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erdyasan&#x2F;pg-perf&quot;&gt;GitHub - pg-perf benchmark projesi&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.postgresql.org&#x2F;docs&#x2F;current&#x2F;pgtrgm.html&quot;&gt;PostgreSQL pg_trgm dokümantasyonu&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.npgsql.org&#x2F;efcore&#x2F;mapping&#x2F;string.html&quot;&gt;Npgsql EF Core - string çevirileri&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="tr">
        <title>.NET&#x27;te Bellek Yönetimi 1: Stack, Heap ve String&#x27;ler</title>
        <published>2026-06-28T00:00:00+00:00</published>
        <updated>2026-06-28T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://erdincyasan.com/blog/bellek-yonetimi-1-stack-heap-string/"/>
        <id>https://erdincyasan.com/blog/bellek-yonetimi-1-stack-heap-string/</id>
        
        <content type="html" xml:base="https://erdincyasan.com/blog/bellek-yonetimi-1-stack-heap-string/">&lt;p&gt;Selamlar. Bu hafta bir görüşme üzerine bellek yönetimi konusuna odaklanmam
gerektiğine karar verdim. Konuya dair yüzeysel bilgim vardı, derinleştirmek
istedim. Stack nedir, heap nedir, string neden heap&#x27;te yaşar, CLR bir obje
yarattığında arka planda neler döner, &lt;code&gt;Span&amp;lt;T&amp;gt;&lt;&#x2F;code&gt; bellek ayırmadan nasıl çalışır,
GC ne zaman devreye girer, &lt;code&gt;IDisposable&lt;&#x2F;code&gt; kime yarar - hepsini sırayla
anlatacağım.&lt;&#x2F;p&gt;
&lt;p&gt;Ama önce temelden başlayalım. &quot;Stack ve heap&quot; dediğimiz şey aslında ne?&lt;&#x2F;p&gt;
&lt;h2 id=&quot;veriye-yer-bulmak&quot;&gt;Veriye Yer Bulmak&lt;&#x2F;h2&gt;
&lt;p&gt;Siz bir değişken tanımladığınızda:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;int&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; x&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 5&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;string&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; name&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;Erdinç&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;User&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; user&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; User&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; Name&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;Erdinç&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; Age&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 30&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; }&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Bu &lt;code&gt;x&lt;&#x2F;code&gt;, &lt;code&gt;name&lt;&#x2F;code&gt; ve &lt;code&gt;user&lt;&#x2F;code&gt; nerede duruyor? Bilgisayarınızın RAM&#x27;inde - tamam.
Peki RAM&#x27;in neresinde? Bir köşesinde mi, ortasında mı? Cevap: &lt;strong&gt;tipine göre.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;.NET runtime&#x27;ı bellek yönetimi için iki ana bölge kullanır:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Bölge&lt;&#x2F;th&gt;&lt;th&gt;Açıklama&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Stack&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Metod çağrılarının, yerel değişkenlerin ve parametrelerin yaşadığı LIFO (Last-In-First-Out) yapı. Küçük, hızlı, otomatik temizlenir.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Heap&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Dinamik olarak ayrılan, uzun ömürlü nesnelerin yaşadığı bölge. Büyük, GC tarafından yönetilir.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;İkisi arasındaki farkı anlamak, yazdığınız kodun performansını kavramanın
ilk adımıdır.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;stack-lifo-yapisi&quot;&gt;Stack: LIFO Yapısı&lt;&#x2F;h2&gt;
&lt;p&gt;Stack&#x27;in çalışma prensibini anlamak için en iyi örnek &lt;strong&gt;üst üste dizilmiş
tabaklardır.&lt;&#x2F;strong&gt; Bir tabak eklemek istediğinizde en üste koyarsınız. Bir tabak
almak istediğinizde en üsttekini alırsınız. Ortadan tabak çekemezsiniz.
En son koyduğunuz tabak, ilk alınan tabaktır. İşte bu LIFO&#x27;dur.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[Tabak 3]  ← En son kondu, ilk alınır (Last-In)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[Tabak 2]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[Tabak 1]  ← İlk kondu, en son alınır (First-Out)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Stack&#x27;te olan da tam olarak budur. Metodlar üst üste binerek çalışır ve
biten metodun değişkenleri anında temizlenir:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;&#x2F;*&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-comment&quot;&gt; * Calculate metodu bittiğinde içerideki tüm değişkenler (a, b, result)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-comment&quot;&gt; * bellekten tamamen kaldırılır. Peki bu &amp;quot;kaldırma&amp;quot; işlemi tam olarak nedir?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-comment&quot;&gt; *&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-comment&quot;&gt; * CPU seviyesinde stack, RSP (Stack Pointer) register&amp;#39;ı ile yönetilir.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-comment&quot;&gt; * Metoda girerken RSP aşağı çekilir (sub rsp, N), böylece N byte&amp;#39;lık&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-comment&quot;&gt; * alan &amp;quot;tahsis edilmiş&amp;quot; olur. Metod dönerken RSP yukarı itilir&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-comment&quot;&gt; * (add rsp, N), bu alanı &amp;quot;serbest bırakır.&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-comment&quot;&gt; *&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-comment&quot;&gt; * Buna &amp;quot;Stack Pointer Adjustment&amp;quot; veya kısaca &amp;quot;stack unwinding&amp;quot; denir.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-comment&quot;&gt; *&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-comment&quot;&gt; * Önemli nokta: serbest bırakılan bölgedeki veriler fiziksel olarak&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-comment&quot;&gt; * SİLİNMEZ. Sadece artık o bölge &amp;quot;kullanımda değil&amp;quot; olarak işaretlenir.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-comment&quot;&gt; * İşletim sistemi bir sonraki metod çağrısında aynı bellek adreslerinin&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-comment&quot;&gt; * üzerine yeni değerler yazabilir. Bu yüzden C#&amp;#39;ta initialize edilmemiş&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-comment&quot;&gt; * bir yerel değişkeni okumaya çalışırsan derleyici hata verir,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-comment&quot;&gt; * okuduğun değer bir önceki metodun çöp verisi olabilir.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; *&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;void&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; Calculate&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    int&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; a&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;       &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Stack&amp;#39;e a = 10 yazıldı&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    int&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; b&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 20&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;       &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Stack&amp;#39;e b = 20 yazıldı&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    int&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; result&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; Add&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;a&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; b&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Add metodu çağrıldı&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;   &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Calculate dönünce RSP yukarı çekilir, frame serbest kalır&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;int&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; Add&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;int&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; x&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; int&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; y&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    int&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; sum&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; x&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; +&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; y&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Stack&amp;#39;te x, y, sum için yeni frame açıldı&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; sum&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;       &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Add dönünce kendi frame&amp;#39;i serbest kalır&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Metod çağrıldıkça stack büyür, metod döndükçe stack küçülür. Her metod kendi
&lt;strong&gt;stack frame&lt;&#x2F;strong&gt;&#x27;ini oluşturur. Frame, o metodun parametrelerini, yerel
değişkenlerini ve dönüş adresini içerir. Görsel olarak:&lt;&#x2F;p&gt;
&lt;pre class=&quot;mermaid&quot;&gt;
flowchart TB
    subgraph T1[&quot;1. Calculate çağrıldı&quot;]
        direction LR
        A1[&quot;[Boş]&quot;]
    end
    subgraph T2[&quot;2. int a = 10&quot;]
        direction LR
        A2[&quot;a = 10&quot;]
    end
    subgraph T3[&quot;3. int b = 20&quot;]
        direction LR
        A3[&quot;b = 20&quot;]
        A3b[&quot;a = 10&quot;]
    end
    subgraph T4[&quot;4. Add(10, 20) çağrıldı&quot;]
        direction LR
        A4[&quot;sum = 30&quot;]
        A4b[&quot;y = 20&quot;]
        A4c[&quot;x = 10&quot;]
        A4d[&quot;--- frame sınırı ---&quot;]
        A4e[&quot;b = 20&quot;]
        A4f[&quot;a = 10&quot;]
    end
    subgraph T5[&quot;5. Add döndü (frame silindi)&quot;]
        direction LR
        A5[&quot;result = 30&quot;]
        A5b[&quot;b = 20&quot;]
        A5c[&quot;a = 10&quot;]
    end
    subgraph T6[&quot;6. Calculate döndü (hepsi silindi)&quot;]
        direction LR
        A6[&quot;[Boş]&quot;]
    end

    T1 --&gt; T2 --&gt; T3 --&gt; T4 --&gt; T5 --&gt; T6
&lt;&#x2F;pre&gt;
&lt;p&gt;Dikkat edin: Add metodu döndüğünde &lt;code&gt;x&lt;&#x2F;code&gt;, &lt;code&gt;y&lt;&#x2F;code&gt;, &lt;code&gt;sum&lt;&#x2F;code&gt; - frame ile birlikte
&lt;strong&gt;hemen&lt;&#x2F;strong&gt; silindi. GC&#x27;nin gelmesini beklemedik. Buna &lt;strong&gt;deterministik
temizleme&lt;&#x2F;strong&gt; denir.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;cop-deger-ve-bellek-guvenligi&quot;&gt;Çöp Değer ve Bellek Güvenliği&lt;&#x2F;h2&gt;
&lt;p&gt;Yukarıda dedik ki: serbest bırakılan stack bölgesindeki veriler fiziksel
olarak silinmez. Peki bu &quot;silinmemiş&quot; veriye erişmeye kalksak ne olur?&lt;&#x2F;p&gt;
&lt;h3 id=&quot;c-tarafi-adres-ver-istedigin-yere-git&quot;&gt;C++ Tarafı: Adres Ver, İstediğin Yere Git&lt;&#x2F;h3&gt;
&lt;p&gt;C++ bu konuda hiçbir engel koymaz. Stack&#x27;te bir değişken tanımlar,
initialize etmez ve okumaya kalkarsanız:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;void&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; Foo&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;    int&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; previousData &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 42&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;    &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; stack&amp;#39;te bir değer bıraktı&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;void&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; Bar&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;    int&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; x&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;                    &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; initialize edilmedi!&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-scope-resolution z-cpp&quot;&gt;    std&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;::&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;cout &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;lt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; x&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;           &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; 42 veya başka rastgele bir sayı basar&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;Bar&lt;&#x2F;code&gt; çağrıldığında stack frame&#x27;i &lt;code&gt;Foo&lt;&#x2F;code&gt;&#x27;nun bıraktığı bölgeye denk
gelebilir. &lt;code&gt;x&lt;&#x2F;code&gt;&#x27;in değeri &lt;code&gt;42&lt;&#x2F;code&gt; olur - ama bu tamamen tesadüftür. Başka
bir çalışma sırasında bambaşka bir sayı alırsınız. Buna &lt;strong&gt;undefined
behavior&lt;&#x2F;strong&gt; denir. Derleyici hata vermez, çalışma zamanında patlamazsınız;
yanlış sonuç alırsınız, haberiniz bile olmaz.&lt;&#x2F;p&gt;
&lt;p&gt;Daha da kötüsü, C++ pointer aritmetiği ile stack&#x27;in tamamen dışına çıkıp
aynı process içindeki bambaşka bir veriye erişebilirsiniz:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;int&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; arr&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;int&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; p &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; arr&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;p &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;+=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 100&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;                &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; dizinin 100 eleman ötesi - tanımsız bölge&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-scope-resolution z-cpp&quot;&gt;std&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;::&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;cout &lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;&amp;lt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; *&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;p&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;         &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; orada ne varsa onu okur&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Modern işletim sistemlerinde sanal bellek (virtual memory) sayesinde başka
bir &lt;strong&gt;programın&lt;&#x2F;strong&gt; belleğine erişemezsiniz - MMU buna izin vermez, segfault
yersiniz. Ama kendi process&#x27;iniz içinde istediğiniz adrese gidip okuyabilirsiniz.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;c-tarafi-derleyici-engel-koyar&quot;&gt;C# Tarafı: Derleyici Engel Koyar&lt;&#x2F;h3&gt;
&lt;p&gt;C# bu konuda C++&#x27;ın tam tersidir. &lt;strong&gt;C# bellek hareketleri güvenlidir.&lt;&#x2F;strong&gt;
Aynı senaryoyu C#&#x27;ta deneyelim:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;void&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; Bar&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    int&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; x&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    Console&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;WriteLine&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;x&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; DERLEME HATASI: Use of unassigned local variable &amp;#39;x&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;C# derleyicisi &lt;strong&gt;definite assignment&lt;&#x2F;strong&gt; analizi yapar. Yerel bir değişkenin
okunmadan önce mutlaka bir değer atanmış olmasını zorunlu tutar. Atanmamışsa
derleme aşamasında hata alırsınız - çalışma zamanına bile gelemez.&lt;&#x2F;p&gt;
&lt;p&gt;Sebebi basit: initialize edilmemiş bir
değişkeni okumak, bellekte o anda ne varsa onu almanız demektir. Orada
rastgele bir değer vardır ve bu değer programınızın mantığını bozabilir.&lt;&#x2F;p&gt;
&lt;p&gt;Bir hastane yazılımı düşünün:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; C#&amp;#39;ta bu kod derlenmez - ama derlendiğini varsayalım&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;int&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; insulinDose&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;                  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; atanmadı!&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;AdministerInsulin&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;patient&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; insulinDose&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; rastgele bir doz uygulanır&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Eğer &lt;code&gt;insulinDose&lt;&#x2F;code&gt; bellekte kalan bir önceki değeri (diyelim ki 999)
okursa, hasta ölebilir. C# tam olarak bu senaryoyu önlemek için &quot;kullanmadan
önce ata&quot; kuralını koyar. C++ ise böyle bir koruma sunmaz - hata sessizce
çalışmaya devam eder.&lt;&#x2F;p&gt;
&lt;p&gt;C#&#x27;ın &lt;code&gt;unsafe&lt;&#x2F;code&gt; bağlamında pointer kullanabilirsiniz, ama bu kasıtlı bir
tercihtir ve &lt;code&gt;&#x2F;unsafe&lt;&#x2F;code&gt; derleme bayrağı gerektirir. Normal C# kodunda
yanlışlıkla initialize edilmemiş bir değeri okuyamazsınız.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;ozet-neden-c-engel-koyar&quot;&gt;Özet: Neden C# Engel Koyar?&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Durum&lt;&#x2F;th&gt;&lt;th&gt;C++&lt;&#x2F;th&gt;&lt;th&gt;C#&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Initialize edilmemiş yerel değişken okuma&lt;&#x2F;td&gt;&lt;td&gt;Derlenir, rastgele değer döner (undefined behavior)&lt;&#x2F;td&gt;&lt;td&gt;Derleme hatası (CS0165)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Pointer ile stack dışına çıkma&lt;&#x2F;td&gt;&lt;td&gt;Derlenir, segfault veya rastgele veri&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;unsafe&lt;&#x2F;code&gt; olmadan yapamazsınız&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Dizi sınırlarını aşma&lt;&#x2F;td&gt;&lt;td&gt;Derlenir, undefined behavior&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;IndexOutOfRangeException&lt;&#x2F;code&gt; fırlatır&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Null referans kullanma&lt;&#x2F;td&gt;&lt;td&gt;Derlenir, segfault&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;NullReferenceException&lt;&#x2F;code&gt; fırlatır&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;C# runtime&#x27;ı sizi korumak için ekstra kontroller yapar. Bu kontrollerin
bir performans maliyeti vardır (array bounds check gibi), ama güvenlik
ve hata ayıklama kolaylığı açısından buna değer.&lt;&#x2F;p&gt;
&lt;p&gt;Stack&#x27;in özellikleri:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Boyut:&lt;&#x2F;strong&gt; Thread başına 1-8 MB. &lt;code&gt;stackalloc&lt;&#x2F;code&gt; yapmadığınız sürece dolmaz.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Hız:&lt;&#x2F;strong&gt; Allocation ve deallocation tek CPU komutu (stack pointer hareketi). Cache-friendly.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Ömür:&lt;&#x2F;strong&gt; Metod scope&#x27;u ile sınırlı. Metod bitince değişken ölür.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Ne yaşar:&lt;&#x2F;strong&gt; &lt;code&gt;int&lt;&#x2F;code&gt;, &lt;code&gt;bool&lt;&#x2F;code&gt;, &lt;code&gt;double&lt;&#x2F;code&gt;, &lt;code&gt;struct&lt;&#x2F;code&gt;, &lt;code&gt;enum&lt;&#x2F;code&gt; gibi value type&#x27;lar. Ayrıca reference type&#x27;ların &lt;strong&gt;referansları&lt;&#x2F;strong&gt; (adresleri).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Stack&#x27;in en kritik kuralı: &lt;strong&gt;boyutu derleme zamanında bilinmeyen hiçbir şey
stack&#x27;te yaşayamaz.&lt;&#x2F;strong&gt; Bir metod çağrısında stack frame&#x27;in boyutu önceden
hesaplanmak zorundadır.&lt;&#x2F;p&gt;
&lt;p&gt;Bu yüzden:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;byte&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; buffer&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; byte&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;4096&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; buffer referansı (8 byte) stack&amp;#39;te, 4096 byte heap&amp;#39;te&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;buffer&lt;&#x2F;code&gt; değişkeni (8 byte&#x27;lık bir adres) stack&#x27;tedir. Ama işaret ettiği
4096 byte&#x27;lık alan heap&#x27;tedir. Çünkü o 4096 byte&#x27;ın ömrü metod bitince sona
ermeyebilir - başkası hala kullanıyor olabilir.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;array-in-heap-teki-gercek-yapisi&quot;&gt;Array&#x27;in Heap&#x27;teki Gerçek Yapısı&lt;&#x2F;h3&gt;
&lt;p&gt;Peki &lt;code&gt;byte[4096]&lt;&#x2F;code&gt; heap&#x27;te tam olarak nasıl duruyor? Ve CLR, &lt;code&gt;buffer[150]&lt;&#x2F;code&gt;
dediğinizde 150. byte&#x27;ı nasıl buluyor? Sınırı nereden biliyor? Hadi
parçalayalım.&lt;&#x2F;p&gt;
&lt;p&gt;Heap&#x27;te bir dizi objesinin yapısı:&lt;&#x2F;p&gt;
&lt;pre class=&quot;mermaid&quot;&gt;
flowchart LR
    subgraph Stack[&quot;Stack&quot;]
        U[&quot;buffer = 0x00E100 (heap&#x27;teki byte[] objesinin başlangıç adresi)&quot;]
    end
    subgraph Heap[&quot;Heap&quot;]
        direction TB
        subgraph Arr[&quot;byte[] objesi (adres: 0x00E100)&quot;]
            direction LR
            A1[&quot;MethodTable* (0x00A000) (8 byte, Byte[] MethodTable&#x27;ının adresi)&quot;]
            A2[&quot;Length = 4096 (4 byte)&quot;]
            A3[&quot;padding (4 byte)&quot;]
            A4[&quot;[0] = 0 (1 byte)&quot;]
            A5[&quot;[1] = 0 (1 byte)&quot;]
            A6[&quot;... (4094 byte)&quot;]
            A7[&quot;[4095] = 0 (1 byte)&quot;]
        end
        subgraph MT[&quot;Byte[] MethodTable (0x00A000)&quot;]
            direction LR
            M1[&quot;BaseSize: 16&quot;]
            M2[&quot;ComponentSize: 1&quot;]
            M3[&quot;ElementType: System.Byte&quot;]
            M4[&quot;Rank: 1&quot;]
            M5[&quot;IsArray: true&quot;]
        end
    end
    U -.-&gt;|&quot;heap&#x27;teki adresi tutar&quot;| Arr
    A1 -.-&gt;|&quot;MethodTable&#x27;ın adresini tutar&quot;| MT
&lt;&#x2F;pre&gt;
&lt;p&gt;MethodTable* (8 byte): Bu, Byte[] tipine ait MethodTable&#x27;ın &lt;strong&gt;heap&#x27;teki
adresidir.&lt;&#x2F;strong&gt; Yani &lt;code&gt;0x00A000&lt;&#x2F;code&gt; gibi bir bellek adresidir. CLR bu adresi
okuyarak objenin hangi tipe ait olduğunu, elemanlarının boyutunu, sınırlarını
ve davranışlarını (method&#x27;larını) öğrenir. Her tip için bir tane MethodTable
vardır ve o tipteki bütün objeler aynı MethodTable&#x27;ı paylaşır.&lt;&#x2F;p&gt;
&lt;p&gt;Dikkat edin: stack&#x27;teki &lt;code&gt;buffer&lt;&#x2F;code&gt; değişkeni &lt;code&gt;0x00E100&lt;&#x2F;code&gt; değerini tutar.
Bu değer, &lt;strong&gt;heap&#x27;teki byte[] objesinin başlangıç adresidir.&lt;&#x2F;strong&gt; Başka bir
deyişle &lt;code&gt;buffer&lt;&#x2F;code&gt;, heap&#x27;teki 4096 byte&#x27;lık alanın &quot;adres kartıdır.&quot;
Bu referansı elinize aldığınızda CLR şunları yapabilir:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;1. Tipi öğrenmek:&lt;&#x2F;strong&gt; &lt;code&gt;buffer.GetType()&lt;&#x2F;code&gt; → önce &lt;code&gt;buffer&lt;&#x2F;code&gt;&#x27;ın tuttuğu
0x00E100 adresine gider, oradaki 8 byte&#x27;lık MethodTable* değerini (0x00A000)
okur. 0x00A000, Byte[] MethodTable&#x27;ının adresidir. O MethodTable&#x27;dan
&lt;code&gt;IsArray = true&lt;&#x2F;code&gt;, &lt;code&gt;ElementType = System.Byte&lt;&#x2F;code&gt;, &lt;code&gt;Rank = 1&lt;&#x2F;code&gt; bilgilerine ulaşır.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;2. Uzunluğu öğrenmek:&lt;&#x2F;strong&gt; &lt;code&gt;buffer.Length&lt;&#x2F;code&gt; → 0x00E100 + 8. byte&#x27;taki
4 byte&#x27;lık &lt;code&gt;Length&lt;&#x2F;code&gt; değerini okur. 4096.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;3. Elemana erişmek:&lt;&#x2F;strong&gt; &lt;code&gt;buffer[150]&lt;&#x2F;code&gt; dediğinizde CLR üç kontrollü adım atar:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;1. Sınır kontrolü:   if (150 &amp;lt; 0 || 150 &amp;gt;= 4096) → throw IndexOutOfRangeException&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;2. Adres hesabı:      hedef = 0x00E100 + 16 (header) + (150 × 1) (componentSize)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                      = 0x00E100 + 16 + 150&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                      = 0x00E196&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;3. Okuma&#x2F;Yazma:       *(byte*)0x00E196&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Formülün parçaları:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Parça&lt;&#x2F;th&gt;&lt;th&gt;Değer&lt;&#x2F;th&gt;&lt;th&gt;Kaynak&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Base adres&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;0x00E100&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Stack&#x27;teki &lt;code&gt;buffer&lt;&#x2F;code&gt; referansı&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Header boyutu&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;16 byte&lt;&#x2F;code&gt; (8 MT + 4 Length + 4 padding)&lt;&#x2F;td&gt;&lt;td&gt;Array MethodTable&#x27;daki &lt;code&gt;BaseSize&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;ComponentSize&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;1&lt;&#x2F;code&gt; (byte için)&lt;&#x2F;td&gt;&lt;td&gt;Array MethodTable&#x27;daki &lt;code&gt;ComponentSize&lt;&#x2F;code&gt; alanı&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Length&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;4096&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Objenin 8. byte offset&#x27;inde&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;index&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;150&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Sizin yazdığınız kod&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;MethodTable&#x27;da diziler için iki özel alan daha vardır:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ComponentSize&lt;&#x2F;code&gt;:&lt;&#x2F;strong&gt; Her bir elemanın byte cinsinden boyutu. &lt;code&gt;byte[]&lt;&#x2F;code&gt; için 1,
&lt;code&gt;int[]&lt;&#x2F;code&gt; için 4, bir &lt;code&gt;struct&lt;&#x2F;code&gt; dizisi için struct&#x27;ın boyutu.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;BaseSize&lt;&#x2F;code&gt;:&lt;&#x2F;strong&gt; Dizinin header kısmının boyutu (MT + Length + padding).
Gerçek obje boyutu = &lt;code&gt;BaseSize + (Length × ComponentSize)&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;CLR, &lt;code&gt;buffer[150]&lt;&#x2F;code&gt; için gereken her şeyi MethodTable + Length ikilisinden
çıkarır. Ayrı bir &quot;start&#x2F;length&quot; struct&#x27;ına ihtiyaç duymaz, çünkü dizi
her zaman 0. indexten başlar. &lt;code&gt;start&lt;&#x2F;code&gt; her zaman 0&#x27;dır.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;span-t-de-start-length-durumu&quot;&gt;Span&amp;lt;T&amp;gt;&#x27;de Start&#x2F;Length Durumu&lt;&#x2F;h3&gt;
&lt;p&gt;&quot;Start ve length değerlerine sahip struct tipi&quot; dediğiniz şey aslında
&lt;code&gt;Span&amp;lt;T&amp;gt;&lt;&#x2F;code&gt;&#x27;dir. Span, bir dizinin &lt;strong&gt;üzerinde&lt;&#x2F;strong&gt; çalışan bir view (görünüm)
struct&#x27;ıdır:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;byte&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; fullBuffer&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; byte&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;4096&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;Span&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;byte&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; slice&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; fullBuffer&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;AsSpan&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;100&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 50&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; 100. byte&amp;#39;tan başla, 50 byte al&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Span&#x27;in kendisi stack&#x27;te yaşayan bir struct&#x27;tır (value type) ve içinde şunlar
vardır:&lt;&#x2F;p&gt;
&lt;pre class=&quot;mermaid&quot;&gt;
flowchart LR
    subgraph Stack[&quot;Stack&quot;]
        direction TB
        subgraph Span[&quot;Span&amp;lt;byte&amp;gt; slice (stack)&quot;]
            S1[&quot;_reference (8 byte, 100. elemanın heap adresini tutar)&quot;]
            S2[&quot;_length = 50 (4 byte)&quot;]
        end
    end
    subgraph Heap[&quot;Heap&quot;]
        direction TB
        subgraph Arr[&quot;byte[] fullBuffer (0x00E100)&quot;]
            direction LR
            MT[&quot;MethodTable* (8)&quot;]
            LEN[&quot;Length = 4096 (4)&quot;]
            PAD[&quot;padding (4)&quot;]
            EL0[&quot;[0]...[99] (100 byte, header + 0..99)&quot;]
            EL100[&quot;[100] = slice başlangıcı&quot;]
            EL149[&quot;[149] = slice sonu&quot;]
            EL150[&quot;[150]...[4095]&quot;]
        end
    end
    S1 -.-&gt;|&quot;header&#x27;ı atlayıp doğrudan 100. elemanı gösterir&quot;| EL100
&lt;&#x2F;pre&gt;
&lt;p&gt;Span&#x27;in &lt;code&gt;_reference&lt;&#x2F;code&gt; alanı, dizinin başlangıcını değil, &lt;strong&gt;dilimin başlangıcını&lt;&#x2F;strong&gt;
işaret eder (offset eklenmiş hali). Span üzerinde indeksleme yaparken CLR:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;1. Dizi sınırı:       if (index &amp;lt; 0 || index &amp;gt;= 50) → hata (Span&amp;#39;in _length&amp;#39;i)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;2. Gerçek adres:      hedef = _reference + (index × 1)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Gördüğünüz gibi Span, &quot;start ve length&quot; bilgisini taşır. Ama &lt;code&gt;byte[]&lt;&#x2F;code&gt;&#x27;in
kendisi taşımaz, dizi her zaman 0&#x27;dan başlar, length ise objenin içinde
gömülüdür. Start&#x2F;length ikilisi bir view ihtiyacı olduğunda devreye girer.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;eleman-tipi-nereden-biliniyor&quot;&gt;Eleman Tipi Nereden Biliniyor?&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;buffer[150]&lt;&#x2F;code&gt; okurken CLR, 150. byte&#x27;ın bir &lt;code&gt;byte&lt;&#x2F;code&gt; olduğunu &lt;strong&gt;ComponentSize&lt;&#x2F;strong&gt;
değerinden anlar. &lt;code&gt;Byte[]&lt;&#x2F;code&gt; MethodTable&#x27;ında &lt;code&gt;ComponentSize = 1&lt;&#x2F;code&gt; yazar.
&lt;code&gt;Int32[]&lt;&#x2F;code&gt; için 4, &lt;code&gt;Double[]&lt;&#x2F;code&gt; için 8.&lt;&#x2F;p&gt;
&lt;p&gt;Peki eleman bir reference type ise? &lt;code&gt;string[]&lt;&#x2F;code&gt; düşünelim:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; names&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Bu dizinin heap&#x27;teki yapısı:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[MethodTable* → String[]]    (8 byte)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[Length = 3]                 (4 byte)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[padding]                    (4 byte)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[names[0] = null]            (8 byte - string referansı)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[names[1] = null]            (8 byte - string referansı)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[names[2] = null]            (8 byte - string referansı)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Toplam: 16 + (3 × 8) = 40 byte&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Burada &lt;code&gt;ComponentSize = 8&lt;&#x2F;code&gt; (64-bit&#x27;te referans boyutu). Her eleman bir
referanstır, string&#x27;in kendisi heap&#x27;te başka bir yerdedir. Dizi sadece
adresleri tutar. &lt;code&gt;names[1]&lt;&#x2F;code&gt; okurken:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;1. Adres:    0x00E100 + 16 + (1 × 8) = 0x00E118&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;2. Oku:      *(string*)0x00E118 → 0x00F200 (string&amp;#39;in adresi)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;3. String&amp;#39;e git: 0x00F200&amp;#39;deki string objesini oku&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;GC de bu referansları takip eder. &lt;code&gt;string[]&lt;&#x2F;code&gt; dizisinin kendisi hayatta olduğu
sürece, dizinin içindeki string referanslarının gösterdiği string&#x27;ler de
hayatta kalır (başka hiçbir yer referans vermiyor olsa bile).&lt;&#x2F;p&gt;
&lt;h2 id=&quot;heap-ve-methodtable&quot;&gt;Heap ve MethodTable&lt;&#x2F;h2&gt;
&lt;p&gt;Heap&#x27;i büyük bir &lt;strong&gt;arsa&lt;&#x2F;strong&gt; gibi düşünün. İhtiyacınız olduğunda bir parsel
ayırırsınız (allocation), işiniz bitince boşaltırsınız (GC toplar). Stack&#x27;in
aksine burada sıra yoktur - her parsel bağımsızdır.&lt;&#x2F;p&gt;
&lt;p&gt;Ama asıl mesele, heap&#x27;te bir obje yaratıldığında CLR&#x27;ın perde arkasında
neler yaptığıdır. &lt;code&gt;new User()&lt;&#x2F;code&gt; dediğiniz anda olanları adım adım inceleyelim.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;clr-obje-yaratirken-ne-olur&quot;&gt;CLR Obje Yaratırken Ne Olur?&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;var&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; user&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; User&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; Name&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;Erdinç&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; Age&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 30&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; }&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Bu satır çalıştığında CLR şu adımları izler:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tip bilgisine bak.&lt;&#x2F;strong&gt; CLR, &lt;code&gt;User&lt;&#x2F;code&gt; tipini tanıyor mu? &lt;code&gt;User&lt;&#x2F;code&gt; sınıfına ait
&lt;code&gt;MethodTable&lt;&#x2F;code&gt; nerede? (Eğer ilk kez kullanılıyorsa tip yüklenir - type load.)&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Bellek ayır.&lt;&#x2F;strong&gt; &lt;code&gt;MethodTable&lt;&#x2F;code&gt;&#x27;daki &lt;code&gt;BaseSize&lt;&#x2F;code&gt; alanına bakar. Bu alan,
&lt;code&gt;User&lt;&#x2F;code&gt; tipindeki bir objenin heap&#x27;te kaç byte yer kaplayacağını söyler.
GC heap&#x27;inden bu kadar byte&#x27;lık alan tahsis edilir.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;MethodTable işaretçisini yaz.&lt;&#x2F;strong&gt; Ayrılan belleğin ilk 8 byte&#x27;ına (64-bit)
veya 4 byte&#x27;ına (32-bit) &lt;code&gt;MethodTable&lt;&#x2F;code&gt;&#x27;ın adresi yazılır. Bu işaretçi
(TypeHandle), objenin hangi tipe ait olduğunu çalışma zamanında
söyleyen kritik bir referanstır.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Field&#x27;ları sıfırla.&lt;&#x2F;strong&gt; Kalan alan sıfırlanır. &lt;code&gt;int&lt;&#x2F;code&gt; → 0, &lt;code&gt;string&lt;&#x2F;code&gt; → null,
&lt;code&gt;bool&lt;&#x2F;code&gt; → false.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Constructor&#x27;ı çağır.&lt;&#x2F;strong&gt; &lt;code&gt;User&lt;&#x2F;code&gt;&#x27;ın constructor&#x27;ı çalışır, field&#x27;lara
gerçek değerleri yazar.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Referansı döndür.&lt;&#x2F;strong&gt; &lt;code&gt;var user&lt;&#x2F;code&gt; değişkenine, heap&#x27;te ayrılan bu objenin
&lt;strong&gt;başlangıç adresi&lt;&#x2F;strong&gt; atanır. Bu adres stack&#x27;te tutulur.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Görsel olarak:&lt;&#x2F;p&gt;
&lt;pre class=&quot;mermaid&quot;&gt;
flowchart LR
    subgraph Stack[&quot;Stack&quot;]
        direction TB
        U[&quot;user = 0x001A3F (8 byte)&quot;]
    end

    subgraph Heap[&quot;Heap&quot;]
        direction TB
        subgraph Obj[&quot;User objesi (adres: 0x001A3F)&quot;]
            direction LR
            MT[&quot;MethodTable* (8 byte)&quot;]
            F1[&quot;Age = 30 (4 byte)&quot;]
            PAD[&quot;padding (4 byte)&quot;]
            F2[&quot;Name = 0x00B210 (8 byte)&quot;]
        end
        subgraph MTBlock[&quot;User MethodTable&quot;]
            direction LR
            MTInfo[&quot;BaseSize: 24
            EEClass*: 0xF0A100
            Parent MethodTable*: System.Object
            Interface count: 0
            Method slots: ...&quot;]
        end
        subgraph Str[&quot;String &#x27;Erdinç&#x27; (0x00B210)&quot;]
            direction LR
            SM[&quot;MethodTable* (System.String)&quot;]
            SL[&quot;Length = 6&quot;]
            SC[&quot;chars: E r d i n ç&quot;]
        end
    end

    U -.-&gt;|&quot;işaret eder&quot;| Obj
    MT -.-&gt;|&quot;tip bilgisi&quot;| MTBlock
    F2 -.-&gt;|&quot;Name işaret eder&quot;| Str
&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;methodtable-nedir-ne-ise-yarar&quot;&gt;MethodTable Nedir, Ne İşe Yarar?&lt;&#x2F;h3&gt;
&lt;p&gt;Her tipin bir &lt;strong&gt;MethodTable&lt;&#x2F;strong&gt;&#x27;ı vardır. CLR, bu tabloyu tip ilk
yüklendiğinde oluşturur ve o tipin tüm objeleri aynı MethodTable&#x27;ı paylaşır.
Yani milyon tane &lt;code&gt;User&lt;&#x2F;code&gt; objesi yaratsanız da &lt;strong&gt;tek bir&lt;&#x2F;strong&gt; &lt;code&gt;User&lt;&#x2F;code&gt; MethodTable&#x27;ı
vardır.&lt;&#x2F;p&gt;
&lt;p&gt;MethodTable&#x27;ın içeriği (basitleştirilmiş):&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Alan&lt;&#x2F;th&gt;&lt;th&gt;Açıklama&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;BaseSize&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Bu tipteki bir objenin heap&#x27;te kaç byte yer kaplayacağı. GC&#x27;nin allocation için kullandığı ilk alan.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;EEClass pointer&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;EEClass&lt;&#x2F;code&gt; yapısına işaret eder. Field&#x27;ların offset&#x27;leri, interface listesi, property metadata&#x27;ları buradadır.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Parent MethodTable&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Kalıtım zinciri. &lt;code&gt;User&lt;&#x2F;code&gt; ise parent&#x27;ı &lt;code&gt;System.Object&lt;&#x2F;code&gt;&#x27;in MethodTable&#x27;ıdır.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Interface count ve Interface map&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Hangi interface&#x27;leri implement ettiği. Cast ve &lt;code&gt;is&lt;&#x2F;code&gt; kontrolü için kullanılır.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Method slots&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Virtual method&#x27;ların adresleri. &lt;code&gt;ToString()&lt;&#x2F;code&gt;, &lt;code&gt;GetHashCode()&lt;&#x2F;code&gt; gibi.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Yani &lt;code&gt;user.GetType()&lt;&#x2F;code&gt; dediğinizde CLR&#x27;ın yaptığı tek şey, objenin ilk
8 byte&#x27;ındaki MethodTable işaretçisini okuyup size ilgili &lt;code&gt;Type&lt;&#x2F;code&gt; nesnesini
döndürmektir.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;namespace-ile-methodtable-iliskisi&quot;&gt;Namespace ile MethodTable İlişkisi&lt;&#x2F;h3&gt;
&lt;p&gt;MethodTable, namespace&#x27;lere göre &lt;strong&gt;değil&lt;&#x2F;strong&gt;, &lt;strong&gt;tip başına&lt;&#x2F;strong&gt; oluşturulur.
Namespace dediğimiz şey derleme zamanında kullanılan mantıksal bir
gruplandırmadır. Runtime&#x27;ta &quot;namespace MethodTable&quot; diye bir yapı yoktur.&lt;&#x2F;p&gt;
&lt;p&gt;Bir tipin runtime&#x27;taki tam kimliği üç parçadan oluşur:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Assembly + Namespace + TypeName&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Örneğin:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;namespace&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; MyApp&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;Models&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier&quot;&gt;    public&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; class&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; User&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; ... &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;     &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Kimlik: MyApp.dll + MyApp.Models + User&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;namespace&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; MyApp&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;DTOs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier&quot;&gt;    public&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; class&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; User&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; ... &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;     &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Kimlik: MyApp.dll + MyApp.DTOs + User&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Bu iki &lt;code&gt;User&lt;&#x2F;code&gt; sınıfının isimleri aynı olsa da, namespace&#x27;leri farklıdır.
Dolayısıyla CLR bunlar için &lt;strong&gt;iki ayrı MethodTable&lt;&#x2F;strong&gt; oluşturur. Her birinin
kendi &lt;code&gt;BaseSize&lt;&#x2F;code&gt;, field offset&#x27;leri ve method slot&#x27;ları vardır. &lt;code&gt;Models.User&lt;&#x2F;code&gt;
ile &lt;code&gt;DTOs.User&lt;&#x2F;code&gt; tamamen farklı iki tiptir, sadece isim benzerliği vardır.&lt;&#x2F;p&gt;
&lt;p&gt;Namespace bilgisi MethodTable&#x27;ın içinde ayrı bir alan olarak değil, &lt;strong&gt;tipin
adının bir parçası&lt;&#x2F;strong&gt; olarak tutulur. &lt;code&gt;Type.FullName&lt;&#x2F;code&gt; dediğinizde
&lt;code&gt;&quot;MyApp.Models.User&quot;&lt;&#x2F;code&gt; döner; bu string, tipin metadata&#x27;sından gelir. CLR
bir tipi yüklerken bu tam ismi kullanır:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;1. assembly&amp;#39;de &amp;quot;MyApp.Models.User&amp;quot; diye bir tip var mı?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;2. Varsa, onun MethodTable&amp;#39;ını yükle (veya zaten yüklüyse onu kullan)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;3. Yoksa TypeLoadException fırlat&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Yani namespace, tip çözümleme (type resolution) için gereklidir ama
MethodTable&#x27;ın kendisi namespace bazlı değil, tip bazlıdır. Aynı namespace
içindeki 50 sınıf = 50 ayrı MethodTable.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;property-lere-erisim-offset-mekanizmasi&quot;&gt;Property&#x27;lere Erişim: Offset Mekanizması&lt;&#x2F;h3&gt;
&lt;p&gt;Peki &lt;code&gt;user.Name&lt;&#x2F;code&gt; dediğinizde CLR, heap&#x27;teki objenin hangi byte&#x27;larının
&lt;code&gt;Name&lt;&#x2F;code&gt; property&#x27;sine ait olduğunu nasıl bilir? Cevap: &lt;strong&gt;field offset.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;EEClass&lt;&#x2F;code&gt; içinde her field için bir offset değeri tutulur:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;User Class EEClass (basitleştirilmiş):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Field: Age      → offset: 8   (MethodTable işaretçisinden hemen sonra)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Field: Name     → offset: 16  (Age 4 byte + padding 4 byte = 8 byte sonra)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Total size      → 24 byte     (8 MT + 4 Age + 4 pad + 8 Name)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Peki padding neden var? CPU, bellekteki verilere daha hızlı erişmek için
&lt;strong&gt;hizalama (alignment)&lt;&#x2F;strong&gt; ister. 64-bit sistemde 8 byte&#x27;lık referanslar
8&#x27;in katı olan adreslerde durmalıdır. Bu yüzden &lt;code&gt;Age&lt;&#x2F;code&gt; (4 byte) ile &lt;code&gt;Name&lt;&#x2F;code&gt;
(8 byte) arasına 4 byte padding konur.&lt;&#x2F;p&gt;
&lt;p&gt;CLR bu offset değerlerini kullanarak &lt;code&gt;user.Name&lt;&#x2F;code&gt; çağrısını şuna dönüştürür:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; user.Name aslında şudur:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;string&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; name&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; *&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;string&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;byte&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;user&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; +&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 16&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; objenin 16. byte&amp;#39;ındaki referansı oku&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Offset ile erişimin avantajı:&lt;&#x2F;strong&gt; Her obje için ayrı bir property adresi
haritası tutulmaz. Tüm &lt;code&gt;User&lt;&#x2F;code&gt; objeleri aynı offset&#x27;leri kullanır. Sadece
base address değişir: &lt;code&gt;objenin_adresi + Age_offset = Age&#x27;in adresi&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Dikkat edin: &lt;code&gt;Age&lt;&#x2F;code&gt; value type olduğu için değerin kendisi heap&#x27;teki objenin
&lt;strong&gt;içindedir.&lt;&#x2F;strong&gt; Ama &lt;code&gt;Name&lt;&#x2F;code&gt; reference type olduğu için heap&#x27;teki objenin
içinde sadece &lt;strong&gt;adresi&lt;&#x2F;strong&gt; vardır. Asıl string verisi başka bir heap adresindedir.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;kalitimda-offset-durumu&quot;&gt;Kalıtımda Offset Durumu&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;class&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; Person&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier&quot;&gt;    public&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; int&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; Id&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; get&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; set&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;class&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; User&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; :&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; Person&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier&quot;&gt;    public&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; string&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; Name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; get&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; set&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier&quot;&gt;    public&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; int&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; Age&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; get&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; set&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Heap&#x27;teki &lt;code&gt;User&lt;&#x2F;code&gt; objesi:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[MethodTable* → User]  (8 byte, en başta)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[Id: int]              (offset 8, Person&amp;#39;dan gelen field)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[Name: string ref]     (offset 16, 4 byte Id + 4 padding = 8)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[Age: int]             (offset 24)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Toplam: 32 byte&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Burada kritik nokta: parent class&#x27;ın field&#x27;ları her zaman child&#x27;ın
field&#x27;larından &lt;strong&gt;önce&lt;&#x2F;strong&gt; gelir. Bu sayede &lt;code&gt;Person person = user;&lt;&#x2F;code&gt; yaptığınızda
bile &lt;code&gt;person.Id&lt;&#x2F;code&gt; aynı offset&#x27;ten okunur. Çünkü &lt;code&gt;Person&lt;&#x2F;code&gt; MethodTable&#x27;ı da
&lt;code&gt;Id&lt;&#x2F;code&gt;&#x27;nin 8. byte&#x27;ta olduğunu bilir - ve &lt;code&gt;user&lt;&#x2F;code&gt; objesinin 8. byte&#x27;ında
gerçekten de &lt;code&gt;Id&lt;&#x2F;code&gt; durur.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;value-type-vs-reference-type-ozet-tablo&quot;&gt;Value Type vs Reference Type: Özet Tablo&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Özellik&lt;&#x2F;th&gt;&lt;th&gt;Value Type (&lt;code&gt;struct&lt;&#x2F;code&gt;, &lt;code&gt;int&lt;&#x2F;code&gt;, &lt;code&gt;bool&lt;&#x2F;code&gt;)&lt;&#x2F;th&gt;&lt;th&gt;Reference Type (&lt;code&gt;class&lt;&#x2F;code&gt;, &lt;code&gt;string&lt;&#x2F;code&gt;)&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Yaşadığı yer&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Sahibinin bulunduğu yer (stack veya heap içinde)&lt;&#x2F;td&gt;&lt;td&gt;Her zaman heap&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Atama davranışı&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Değer kopyalanır&lt;&#x2F;td&gt;&lt;td&gt;Referans (adres) kopyalanır&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Null olabilir mi?&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Hayır (&lt;code&gt;int?&lt;&#x2F;code&gt; nullable wrapper ile evet)&lt;&#x2F;td&gt;&lt;td&gt;Evet&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Varsayılan değer&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Sıfırlanmış hali (&lt;code&gt;0&lt;&#x2F;code&gt;, &lt;code&gt;false&lt;&#x2F;code&gt;, &lt;code&gt;default&lt;&#x2F;code&gt;)&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;null&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Kalıtım&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;System.ValueType&lt;&#x2F;code&gt;&#x27;tan, sealed&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;Object&lt;&#x2F;code&gt;&#x27;ten&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;GC etkisi&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Sahibi toplanınca otomatik gider&lt;&#x2F;td&gt;&lt;td&gt;GC toplaması gerekir&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Objede nasıl durur?&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Değer objenin içindedir&lt;&#x2F;td&gt;&lt;td&gt;Adres objenin içindedir&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;string-meselesi&quot;&gt;String Meselesi&lt;&#x2F;h2&gt;
&lt;p&gt;String bu hikayede özel bir yere sahip. Kafaları en çok karıştıran tip.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;string&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; a&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;hello&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;string&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; b&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; a&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;b&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;world&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; a hala &amp;quot;hello&amp;quot;, değil mi? Evet.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;String reference type&#x27;tır - heap&#x27;tedir. Ama &lt;strong&gt;immutable&#x27;dır&lt;&#x2F;strong&gt; (değiştirilemez).
Bu yüzden yukarıdaki &lt;code&gt;b = &quot;world&quot;&lt;&#x2F;code&gt; işlemi &lt;code&gt;a&lt;&#x2F;code&gt;&#x27;yı etkilemez, çünkü &lt;code&gt;b&lt;&#x2F;code&gt;&#x27;nin
işaret ettiği string&#x27;in içeriğini değiştirmez - &lt;code&gt;b&lt;&#x2F;code&gt;&#x27;ye yeni bir string&#x27;in
adresini atar.&lt;&#x2F;p&gt;
&lt;p&gt;Aslında string&#x27;in heap&#x27;teki yapısı da MethodTable ile başlar:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;String objesi (heap):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  [MethodTable* → System.String]  (8 byte)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  [Length: int = 5]               (4 byte)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  [Padding]                       (4 byte)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  [First Char: &amp;#39;h&amp;#39;]               (2 byte)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  [Second Char: &amp;#39;e&amp;#39;]              (2 byte)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;Length&lt;&#x2F;code&gt; ve karakterler objenin içinde, sabit offset&#x27;lerle erişilebilir.
Ama &lt;strong&gt;içeriği değiştiremezsiniz&lt;&#x2F;strong&gt; çünkü CLR string&#x27;in yazılabilir olduğunu
bilmez - obje readonly olarak işaretlenmiştir.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;neden-immutable&quot;&gt;Neden Immutable?&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Thread safety.&lt;&#x2F;strong&gt; Birden fazla thread korksuzca aynı string&#x27;i okuyabilir.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Interning.&lt;&#x2F;strong&gt; Aynı içerikteki string&#x27;ler bellekte bir kez tutulur.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Güvenlik.&lt;&#x2F;strong&gt; Bir string&#x27;i metoda parametre geçtiniz diye metod onu
değiştiremez.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Ama bu immutability&#x27;nin bir bedeli var:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;string&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; result&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;for&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;int&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; i&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; i&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 10000&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; i&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;++&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;    result&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; +=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;x&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;   &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Her döngüde yeni string objesi. 10.000 allocation.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Bu kod 10.000 defa yeni &lt;code&gt;string&lt;&#x2F;code&gt; objesi yaratır, heap&#x27;i kirletir. Doğrusu:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;var&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; sb&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; StringBuilder&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;for&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;int&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; i&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; i&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric&quot;&gt; 10000&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; i&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;++&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    sb&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Append&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;x&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;string&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; result&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; sb&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;ToString&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Tek allocation.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;String, reference type olmasına rağmen value type gibi davranır. &lt;code&gt;==&lt;&#x2F;code&gt;
operatörü içerik karşılaştırır (adres değil). Immutable olduğu için kopyalama
güvenlidir. Ama bellekte hep &lt;strong&gt;heap&#x27;tedir&lt;&#x2F;strong&gt; - stack&#x27;te yaşayamaz, çünkü
boyutu derleme zamanında bilinmez ve ömrü metod scope&#x27;unu aşabilir.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;string-interning&quot;&gt;String Interning&lt;&#x2F;h3&gt;
&lt;p&gt;CLR sık kullanılan string&#x27;leri &lt;strong&gt;intern pool&lt;&#x2F;strong&gt; denen bir havuzda tutar:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;string&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; a&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;dotnet&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;string&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; b&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;dotnet&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;Console&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;WriteLine&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Object&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;ReferenceEquals&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;a&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; b&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; True - aynı obje.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Derleme zamanında sabit olan string&#x27;ler otomatik intern edilir. Runtime&#x27;da
manuel de yapabilirsiniz:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;string&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; c&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;new&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; char&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; {&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;d&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;o&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;t&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;n&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;e&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;t&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; }&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;string&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; d&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Intern&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;c&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Peki bir metod runtime&#x27;da string döndüğünde intern otomatik gerçekleşir mi?
İki senaryo var:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Senaryo A: Metod compile-time literal dönerse - intern edilir.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;string&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; GetHelloWorld&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;Merhaba dunya&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;   &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; compile-time literal&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;string&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; a&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;Merhaba dunya&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;string&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; b&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; GetHelloWorld&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;Object&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;ReferenceEquals&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;a&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; b&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; True - ikisi de aynı intern objesi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;GetHelloWorld()&lt;&#x2F;code&gt; gövdesindeki &lt;code&gt;&quot;Merhaba dunya&quot;&lt;&#x2F;code&gt; literal&#x27;ı assembly
metadata&#x27;sına gömülür. CLR assembly yüklerken onu da intern havuzuna atar.
Metod çağrıldığında havuzdaki aynı objeyi döner. İki literal &lt;code&gt;+&lt;&#x2F;code&gt; ile
birleşiyorsa derleyici build time&#x27;da optimize edip tek literal&#x27;a
indirgeyebiliyorsa, sonuç yine intern olur.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Senaryo B: Metod string&#x27;i runtime&#x27;da oluşturursa - intern edilmez.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;string&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; GetHelloWorld&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;    var&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; merhaba&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;Merhaba &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;    var&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; dunya&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;dunya&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; merhaba&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; +&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; dunya&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;   &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; runtime concat, yeni obje&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;string&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; a&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;Merhaba dunya&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;string&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; b&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; GetHelloWorld&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;Object&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;ReferenceEquals&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;a&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; b&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; False - b runtime&amp;#39;da oluştu, intern havuzunda değil&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;string&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; c&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Intern&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;b&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Manuel intern&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;Object&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;ReferenceEquals&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;a&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; c&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; True - artık aynı havuz objesi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Değişkenlerle &lt;code&gt;+&lt;&#x2F;code&gt; concat, &lt;code&gt;StringBuilder.ToString()&lt;&#x2F;code&gt;, &lt;code&gt;Substring()&lt;&#x2F;code&gt;,
&lt;code&gt;ToUpper()&lt;&#x2F;code&gt;, dosyadan okuma, JSON deserialize - bunların hepsi runtime&#x27;da
yeni heap objesi yaratır. İçerik aynı olsa bile intern havuzuna kendiliğinden
girmez. &lt;code&gt;string.Intern()&lt;&#x2F;code&gt; çağırmanız gerekir.&lt;&#x2F;p&gt;
&lt;p&gt;Özetle mesele string&#x27;in &lt;strong&gt;içeriği değil&lt;&#x2F;strong&gt;, &lt;strong&gt;nasıl oluştuğudur.&lt;&#x2F;strong&gt; Dahasına
sonra bakacağız.&lt;&#x2F;p&gt;
&lt;p&gt;Interning sayesinde aynı string defalarca heap&#x27;te yer kaplamaz. Ama aşırı
kullanımı GC&#x27;nin Gen 2&#x27;sini şişirebilir - çünkü intern edilen string&#x27;ler
&lt;strong&gt;asla&lt;&#x2F;strong&gt; GC tarafından toplanmaz (AppDomain kapanana kadar yaşar).&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ozet-stack-heap-methodtable-iliskisi&quot;&gt;Özet: Stack, Heap, MethodTable İlişkisi&lt;&#x2F;h2&gt;
&lt;p&gt;Bir &lt;code&gt;new User()&lt;&#x2F;code&gt; çağrısının baştan sona yolculuğu:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;1. CLR, User MethodTable&amp;#39;ına bakar → BaseSize: 24 byte&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;2. GC heap&amp;#39;inden 24 byte ayırır&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;3. Ayrılan alanın ilk 8 byte&amp;#39;ına User MethodTable&amp;#39;ının adresini yazar&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;4. Kalan alanı sıfırlar, constructor&amp;#39;ı çağırır&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;5. Heap adresini stack&amp;#39;teki user değişkenine atar&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;6. user.Name çağrısı: user adresi + 16 offset&amp;#39;inden string adresini okur&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Bu mekanizmayı anladığınızda, performans problemlerinin çoğunu da anlamaya
başlarsınız. Her &lt;code&gt;new&lt;&#x2F;code&gt; bir allocation&#x27;dır. GC&#x27;nin Gen 0 bölgesinde bir
&lt;strong&gt;tahsis bütçesi (allocation budget)&lt;&#x2F;strong&gt; vardır, yeni bir obje yaratmak,
bu bütçeyi tüketir. Bütçe sıfırlandığında GC tetiklenir ve kullanılmayan
nesneleri toplar. Yani her allocation, GC&#x27;nin bir sonraki toplama döngüsüne
sizi bir adım daha yaklaştırır. Her gereksiz allocation, önlenebilir bir
maliyettir.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;bundan-sonrasi&quot;&gt;Bundan Sonrası&lt;&#x2F;h2&gt;
&lt;p&gt;Stack ve heap&#x27;in ne olduğunu, CLR&#x27;ın obje yaratırken neler yaptığını,
MethodTable&#x27;ın rolünü ve string&#x27;in neden özel olduğunu gördük. Ama asıl
soru şu:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;String işlerken heap allocation&#x27;dan nasıl kaçarız?&quot;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Cevap: &lt;code&gt;Span&amp;lt;T&amp;gt;&lt;&#x2F;code&gt;, &lt;code&gt;Memory&amp;lt;T&amp;gt;&lt;&#x2F;code&gt;, &lt;code&gt;stackalloc&lt;&#x2F;code&gt; ve &lt;code&gt;IDisposable&lt;&#x2F;code&gt; pattern&#x27;i.
Yazının devamında bunları kod örnekleriyle ele alacağım. Ayrıca GC&#x27;nin
nesil (generation) mekanizmasına, finalizer&#x27;ların neden tehlikeli olduğuna
ve bellek sızıntılarını nasıl yakalayacağımıza da bakacağız.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;kaynaklar&quot;&gt;Kaynaklar&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;learn.microsoft.com&#x2F;en-us&#x2F;dotnet&#x2F;standard&#x2F;garbage-collection&#x2F;&quot;&gt;Microsoft Docs - Memory management and garbage collection&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;devblogs.microsoft.com&#x2F;dotnet&#x2F;all-about-span-exploring-a-new-net-mainstay&#x2F;&quot;&gt;Stephen Toub - All About Span: Exploring .NET Memory&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dotnet&#x2F;runtime&#x2F;blob&#x2F;main&#x2F;src&#x2F;coreclr&#x2F;vm&#x2F;methodtable.h&quot;&gt;.NET Runtime - MethodTable source&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dotnet&#x2F;runtime&#x2F;blob&#x2F;main&#x2F;docs&#x2F;design&#x2F;coreclr&#x2F;botr&#x2F;object-layout.md&quot;&gt;.NET Runtime - Object layout&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;learn.microsoft.com&#x2F;en-us&#x2F;archive&#x2F;blogs&#x2F;ericlippert&#x2F;the-stack-is-an-implementation-detail-part-one&quot;&gt;Eric Lippert - The Stack Is An Implementation Detail&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;script src=&quot;https:&#x2F;&#x2F;cdn.jsdelivr.net&#x2F;npm&#x2F;mermaid@11&#x2F;dist&#x2F;mermaid.min.js&quot;&gt;&lt;&#x2F;script&gt;
&lt;script&gt;
  mermaid.initialize({
    startOnLoad: true,
    theme: &#x27;neutral&#x27;,
    flowchart: { nodeSpacing: 30, rankSpacing: 40 },
    themeVariables: { fontSize: &#x27;15px&#x27; }
  });
&lt;&#x2F;script&gt;
</content>
        
    </entry>
    <entry xml:lang="tr">
        <title>ASP.NET Middleware&#x27;leri Anlamak</title>
        <published>2026-06-18T00:00:00+00:00</published>
        <updated>2026-06-18T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://erdincyasan.com/blog/aspnet-middleware/"/>
        <id>https://erdincyasan.com/blog/aspnet-middleware/</id>
        
        <content type="html" xml:base="https://erdincyasan.com/blog/aspnet-middleware/">&lt;p&gt;Selamlar, bu yazıda middleware&#x27;leri anlatmak istiyorum. Şimdi size sırayla neler anlatacağımı yazayım:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;İlk önce HTTP nasıl çalışır, onun akışını kabaca anlatacağım.&lt;&#x2F;li&gt;
&lt;li&gt;İstek geldiğinde ASP.NET nasıl hareket eder, ondan bahsedeceğim.&lt;&#x2F;li&gt;
&lt;li&gt;İsteğiniz controller&#x27;a veya ilgili route&#x27;a nasıl ulaşır, ondan bahsedeceğim.&lt;&#x2F;li&gt;
&lt;li&gt;Makaleyi bitireceğim.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Aslında burada yazmış olduğum maddeli yazı middleware&#x27;in çalışma mantığını gösteriyor. Middleware, client (kullanıcı&#x2F;istemci) tarafından gelen isteklerin hangi sırayla işleneceğini belirten yapıya verilen isim. Sadece ASP.NET içerisinde değil, bütün web API programlama dillerinde ilgili middleware yapısına sahibiz. Hatta kullanıcının authenticate veya authorize olup olmadığı bilgisi de middleware&#x27;ler ile sağlanıyor. Daha da ileri gidecek olursak idempotent check yapabiliriz middleware içerisinde (benim tercihim olmaz).&lt;&#x2F;p&gt;
&lt;h2 id=&quot;middleware-nedir&quot;&gt;Middleware Nedir?&lt;&#x2F;h2&gt;
&lt;p&gt;.NET içerisinde mevcutta bazı middleware&#x27;ler bulunuyor zaten ve bunları kendimiz de ekliyoruz. &lt;code&gt;app.UseAuthentication()&lt;&#x2F;code&gt; dediğimizde aslında arka tarafta bir middleware ekliyoruz:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier&quot;&gt;public&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier&quot;&gt; static&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; IApplicationBuilder&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; UseAuthentication&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier&quot;&gt;this&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; IApplicationBuilder&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; app&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    ArgumentNullException&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;ThrowIfNull&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;app&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    app&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Properties&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;AuthenticationMiddlewareSetKey&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-boolean&quot;&gt; true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; app&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;UseMiddleware&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;AuthenticationMiddleware&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Yukarıdaki gördüğünüz örnekte bir middleware örneği mevcut. Gördüğünüz gibi aslında &lt;code&gt;UseAuthentication&lt;&#x2F;code&gt; methodu araya bir &lt;code&gt;AuthenticationMiddleware&lt;&#x2F;code&gt; ekliyor.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;middleware-ler-nasil-calisir&quot;&gt;Middleware&#x27;ler Nasıl Çalışır?&lt;&#x2F;h2&gt;
&lt;p&gt;Middleware&#x27;ler aşama aşama ilerliyor ve her birisi eline gelen &lt;code&gt;HttpRequest&lt;&#x2F;code&gt;&#x27;i bozmayacak hareketler yaparak ilgili işlemini tamamlayıp devam ediyor.&lt;&#x2F;p&gt;
&lt;p&gt;Eğer authenticate middleware&#x27;in içeriğine bakarsak göreceğimiz şey aslında &lt;code&gt;Invoke&lt;&#x2F;code&gt; methodudur. &lt;code&gt;Invoke&lt;&#x2F;code&gt; methodu her middleware&#x27;de zorunlu olarak olması gereken bir methoddur. Bu methodun imzasına bakarak aslında bir listeye ekleme yapıyoruz. Her &lt;code&gt;app.UseMiddleware&lt;&#x2F;code&gt; dediğimizde bir listeye ekleme yapmış oluyoruz.&lt;&#x2F;p&gt;
&lt;p&gt;Eğer kodları inspect ile en detayına kadar incelerseniz veya dotnet&#x27;in kendi reposu üzerinde incelerseniz &lt;code&gt;Use&lt;&#x2F;code&gt; middleware sizi şuraya yönlendiriyor:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier&quot;&gt;public&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; IApplicationBuilder&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; Use&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;Func&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;RequestDelegate&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; RequestDelegate&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; middleware&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    _components&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Add&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;middleware&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;    _descriptions&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;?&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Add&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;CreateMiddlewareDescription&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;middleware&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-language z-this&quot;&gt; this&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Tabi buradaki koda direkt baktığınızda &lt;code&gt;_components&lt;&#x2F;code&gt; herhangi bir şey olabilir diyebilirsiniz, şu an anonymous duruyor. Ancak tanıma baktığınızda sonuç nettir:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-modifier&quot;&gt;private&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier&quot;&gt; readonly&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; List&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;Func&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;RequestDelegate&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; RequestDelegate&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; _components&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Ve bu listenin sırası önemlidir. Siz .NET içerisinde middleware listesine ekleme yaptığınız sıralama geçerli olacaktır. Yani çalışırken de sizin bu eklediğiniz sıraya göre çalışacaktır.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;siralama-neden-onemli&quot;&gt;Sıralama Neden Önemli?&lt;&#x2F;h2&gt;
&lt;p&gt;Bu niye önemli? Bildiğiniz gibi REST üzerinde belli başlı hiyerarşiler vardı, authentication ve authorization bunlardan birisi. &lt;strong&gt;Authentication&lt;&#x2F;strong&gt; sizin kim olduğunuzu tanımlar, adınızı soyadınızı söyler. &lt;strong&gt;Authorization&lt;&#x2F;strong&gt; ise sizin bir işlemi yapmaya yetkinizin olup olmadığını söyler.&lt;&#x2F;p&gt;
&lt;p&gt;Bu senaryoda siz middleware ekleme sıranızı şu şekilde yaparsanız:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;app&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;UseAuthorization&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;app&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;UseAuthentication&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Yüksek ihtimalle yetki gerektiren endpoint&#x27;lerinizin tamamında hata alacaksınız. Çünkü kullanıcının kim olduğunu bilmeden yetkisini sorgulamak istiyor olacaksınız (authorization önce eklendiği için).&lt;&#x2F;p&gt;
&lt;p&gt;Eğer authorization middleware&#x27;in içeriğini inceleyecek olursanız göreceğiniz kod:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;var&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; authenticateResult&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; await&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; policyEvaluator&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;AuthenticateAsync&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;policy&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; context&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;if&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;authenticateResult&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;?&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Succeeded&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ??&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-boolean&quot;&gt; false&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;context&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Features&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Get&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;IAuthenticateResultFeature&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; is&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; IAuthenticateResultFeature&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; authenticateResultFeature&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        authenticateResultFeature&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;AuthenticateResult&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt; authenticateResult&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    else&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;        var&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; authFeatures&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; AuthenticationFeatures&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;authenticateResult&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        context&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Features&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Set&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;IHttpAuthenticationFeature&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;authFeatures&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        context&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Features&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Set&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;IAuthenticateResultFeature&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;authFeatures&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Burada dikkat ederseniz önce authenticate ediyor, buranın hemen ardından gelen kodlarda ise authorize işlemi oluyor.&lt;&#x2F;p&gt;
&lt;p&gt;Aslında authentication middleware kullanıcının kim olduğunu tespit etmekten ziyade, authorize ve diğer kullanım senaryoları için de ilgili kullanıcının kimliğini doğruluyor gibi düşünebilirsiniz. Çoğu kullanıcı kendi kimliğini bize bildirir (JWT, cookie veya diğer yöntemlerle).&lt;&#x2F;p&gt;
&lt;p&gt;Bu kimlik bildirimi çeşitli onaylardan (doğrulama aşamalarından) geçtikten sonra kullanıcının bilgileri kayıt edilir ve middleware &lt;code&gt;_next&lt;&#x2F;code&gt; diyerek sonraki aşamaya geçer:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;var&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; defaultAuthenticate&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; await&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; Schemes&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;GetDefaultAuthenticateSchemeAsync&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;if&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;defaultAuthenticate&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; !=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language&quot;&gt; null&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;    var&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; result&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; await&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; context&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;AuthenticateAsync&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;defaultAuthenticate&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;result&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;?&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Principal&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; !=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language&quot;&gt; null&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        context&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;User&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; result&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Principal&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;result&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;?&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Succeeded&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; ??&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-boolean&quot;&gt; false&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;        var&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt; authFeatures&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt; new&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt; AuthenticationFeatures&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;result&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        context&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Features&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Set&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;IHttpAuthenticationFeature&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;authFeatures&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-source&quot;&gt;        context&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-source&quot;&gt;Features&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;Set&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-type&quot;&gt;IAuthenticateResultFeature&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-typeparameters&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;authFeatures&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword z-operator&quot;&gt;await&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt; _next&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite&quot;&gt;context&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;middleware-pipeline-siralama&quot;&gt;Middleware Pipeline (Sıralama)&lt;&#x2F;h2&gt;
&lt;p&gt;Aşağıda tipik bir ASP.NET Core middleware pipeline&#x27;ının çalışma sırasını görüyorsunuz. Her middleware bir öncekinden &lt;code&gt;HttpContext&lt;&#x2F;code&gt;&#x27;i alır, kendi işini yapar ve &lt;code&gt;_next()&lt;&#x2F;code&gt; ile bir sonrakine iletir. Response dönüşünde ise ters sırada ilerlenir.&lt;&#x2F;p&gt;
&lt;pre class=&quot;mermaid&quot;&gt;
flowchart TB
C[Client &#x2F; Istemci]
C --&gt;|request| M1[1 - UseExceptionHandler]
M1 --&gt;|request| M2[2 - UseHsts]
M2 --&gt;|request| M3[3 - UseHttpsRedirection]
M3 --&gt;|request| M4[4 - UseStaticFiles]
M4 --&gt;|request| M5[5 - UseRouting]
M5 --&gt;|request| M6[6 - UseCors]
M6 --&gt;|request| M7[7 - UseAuthentication]
M7 --&gt;|request| M8[8 - UseAuthorization]
M8 --&gt;|request| EP[Controller]
EP -.-&gt;|response| M8
M8 -.-&gt;|response| M7
M7 -.-&gt;|response| M6
M6 -.-&gt;|response| M5
M5 -.-&gt;|response| M4
M4 -.-&gt;|response| M3
M3 -.-&gt;|response| M2
M2 -.-&gt;|response| M1
M1 -.-&gt;|response| C
&lt;&#x2F;pre&gt;
&lt;p&gt;Bu sıralama kritiktir. Birkaç önemli nokta:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Routing&lt;&#x2F;strong&gt; yetkilendirmeden önce gelmelidir ki hangi endpoint&#x27;in hedeflendiği bilinsin.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;CORS&lt;&#x2F;strong&gt;, routing&#x27;den sonra ama authentication&#x27;dan önce gelmelidir.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Authentication&lt;&#x2F;strong&gt;, authorization&#x27;dan önce gelmek &lt;strong&gt;zorundadır&lt;&#x2F;strong&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Static files&lt;&#x2F;strong&gt;, authentication&#x27;dan önce gelmelidir ki giriş yapmadan statik dosyalara erişilebilsin.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;gercek-dunya-senaryolari&quot;&gt;Gerçek Dünya Senaryoları&lt;&#x2F;h2&gt;
&lt;p&gt;Diğer programlama dillerinde middleware&#x27;lerin çoğunu kendiniz yazmak durumundasınız. Ancak ASP.NET framework&#x27;ü oldukça zengin ve yaşlı olduğu için çoğu tekrar eden durumu kendi bünyesine dahil ediyor. Bunların içerisinde authentication, authorization ve rate limit bile var.&lt;&#x2F;p&gt;
&lt;p&gt;Ve bunların sıralaması gerçekten çok önemlidir. Örneğin rate limit için eğer kullanıcı bazlı bir rate limit koymak istiyorsanız, ilgili rate limit middleware&#x27;inizi &lt;code&gt;UseAuthentication&lt;&#x2F;code&gt; middleware&#x27;inden sonra koymanız gerekmektedir, çünkü öncesi senaryolarda geçersiz olacaktır.&lt;&#x2F;p&gt;
&lt;p&gt;Aynı zamanda siteniz için static file&#x27;lar barındıracaksanız, bunları da &lt;code&gt;UseAuthentication&lt;&#x2F;code&gt; middleware&#x27;inden önce koymanız gerekir. Bu sayede giriş yapmadan kullanıcılar static file&#x27;lara erişebilir (&lt;code&gt;.css&lt;&#x2F;code&gt;, &lt;code&gt;.js&lt;&#x2F;code&gt; gibi dosyalardan bahsediyorum).&lt;&#x2F;p&gt;
&lt;h2 id=&quot;kaynaklar&quot;&gt;Kaynaklar&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;learn.microsoft.com&#x2F;en-us&#x2F;aspnet&#x2F;core&#x2F;fundamentals&#x2F;middleware&#x2F;&quot;&gt;ASP.NET Core Middleware — Microsoft Docs&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dotnet&#x2F;aspnetcore&quot;&gt;dotnet&#x2F;aspnetcore — GitHub&lt;&#x2F;a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dotnet&#x2F;aspnetcore&#x2F;blob&#x2F;main&#x2F;src&#x2F;Http&#x2F;Http&#x2F;src&#x2F;Builder&#x2F;ApplicationBuilder.cs&quot;&gt;&lt;code&gt;ApplicationBuilder.cs&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; — middleware&#x27;lerin &lt;code&gt;_components&lt;&#x2F;code&gt; listesine eklendiği sınıf&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dotnet&#x2F;aspnetcore&#x2F;blob&#x2F;main&#x2F;src&#x2F;Security&#x2F;Authentication&#x2F;Core&#x2F;src&#x2F;AuthenticationMiddleware.cs&quot;&gt;&lt;code&gt;AuthenticationMiddleware.cs&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; — &lt;code&gt;UseAuthentication&lt;&#x2F;code&gt;&#x27;ın arka planda eklediği middleware&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dotnet&#x2F;aspnetcore&#x2F;blob&#x2F;main&#x2F;src&#x2F;Security&#x2F;Authorization&#x2F;Policy&#x2F;src&#x2F;AuthorizationMiddleware.cs&quot;&gt;&lt;code&gt;AuthorizationMiddleware.cs&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; — &lt;code&gt;UseAuthorization&lt;&#x2F;code&gt; middleware implementasyonu&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dotnet&#x2F;runtime&quot;&gt;dotnet&#x2F;runtime — GitHub&lt;&#x2F;a&gt; — .NET runtime&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;script src=&quot;https:&#x2F;&#x2F;cdn.jsdelivr.net&#x2F;npm&#x2F;mermaid@11&#x2F;dist&#x2F;mermaid.min.js&quot;&gt;&lt;&#x2F;script&gt;
&lt;script&gt;
  mermaid.initialize({
    startOnLoad: true,
    theme: &#x27;neutral&#x27;,
    flowchart: { nodeSpacing: 30, rankSpacing: 40 },
    themeVariables: { fontSize: &#x27;15px&#x27; }
  });
&lt;&#x2F;script&gt;
</content>
        
    </entry>
    <entry xml:lang="tr">
        <title>Hoş Geldin</title>
        <published>2026-06-15T00:00:00+00:00</published>
        <updated>2026-06-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://erdincyasan.com/blog/welcome/"/>
        <id>https://erdincyasan.com/blog/welcome/</id>
        
        <content type="html" xml:base="https://erdincyasan.com/blog/welcome/">&lt;p&gt;Herkese tekrar selam, ben Erdinç Yaşan.&lt;&#x2F;p&gt;
&lt;p&gt;Şimdiye kadar bir sürü site kurdum; sunucu kaldırdım, indirdim. Çoğunun
sebebi istikrarsızlık, bir kısmı da maymun iştahlılıktı, yani sürekli yeni
bir şey deneme isteği. Sonunda farklı bir karar verdim: asıl önemli olanın
&lt;strong&gt;istikrar&lt;&#x2F;strong&gt; olduğuna kanaat getirdim ve bu statik web sayfasını o niyetle
geliştirdim.&lt;&#x2F;p&gt;
&lt;p&gt;Buradaki genel amacım iki şey: günlük yaptığım işlerin takibini tutmak ve
etkilendiğim içerikleri, denemeleri kendi dilimce aktarmak.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ai-caginda-yazmak&quot;&gt;AI çağında yazmak&lt;&#x2F;h2&gt;
&lt;p&gt;Bu çağda bir yazının AI ile mi yoksa elle mi yazıldığını düşünmemek elde
değil. Bunu baştan netleştireyim: buradaki projeler benim tarafımdan
düşünülmüştür, ancak yer yer AI ile yazılmış olabilir. Yazılar ise farklı.&lt;&#x2F;p&gt;
&lt;p&gt;Bu kişisel sitede &lt;strong&gt;hiçbir zaman doğrudan AI tarafından üretilmiş bir yazı
olmayacak.&lt;&#x2F;strong&gt; İçeriklerimi üretirken AI&#x27;dan farklı bakış açılarını
değerlendirmek için yararlanacağım, ama son sözü kendi bakış açım söyleyecek
ve yazıya ben dökeceğim.&lt;&#x2F;p&gt;
&lt;p&gt;Kod tarafında da kural aynı: bir commit&#x27;in üzerinde benim adım yazıyorsa,
o kodu ben yazmışımdır. AI değil.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;editorler-degisiyor-yazilim-olmuyor&quot;&gt;Editörler değişiyor, yazılım ölmüyor&lt;&#x2F;h2&gt;
&lt;p&gt;AI bir noktada editörlerin yerini alacak. Aslında bu devrimle birlikte
editörler çoktan şekilden şekle girmeye, terminaller değişmeye başladı bile.
Ama yazılım ölmüyor.&lt;&#x2F;p&gt;
&lt;p&gt;Tek bir endişem var. Eskiden bize hataları nasıl çözeceğimizi, tooltip&#x27;leri
nasıl kullanacağımızı, editör üzerindeki refactoring kolaylıklarını
öğretirlerdi. Artık bunları öğrenemiyoruz. Bir sorun çıktığında ilk nereye
bakacağımızı bilemez hâle geldik. Gözlemim şu yönde: eski topraklar, hatanın
kaynağını tespit etmek için AI kullanmıyor.&lt;&#x2F;p&gt;
&lt;p&gt;İşte bu yüzden bu site, AI&#x27;ı bir araç olarak kullanırken kendi kafamla
düşünmeyi de elden bırakmama niyetimin kaydı olacak. Hoş geldin.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="tr">
        <title>The 14 Habits of Highly Productive Developers</title>
        <published>2026-06-15T00:00:00+00:00</published>
        <updated>2026-06-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://erdincyasan.com/library/14-habits-of-highly-productive-developers/"/>
        <id>https://erdincyasan.com/library/14-habits-of-highly-productive-developers/</id>
        
        <content type="html" xml:base="https://erdincyasan.com/library/14-habits-of-highly-productive-developers/">&lt;p&gt;Bu kitabı siteyi kurmadan önce okumuştum, o yüzden burada henüz yorumum yok. Yakın zamanda kendi notlarımı ekleyeceğim.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="tr">
        <title>Agile for Dummies</title>
        <published>2026-06-15T00:00:00+00:00</published>
        <updated>2026-06-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://erdincyasan.com/library/agile-for-dummies/"/>
        <id>https://erdincyasan.com/library/agile-for-dummies/</id>
        
        <content type="html" xml:base="https://erdincyasan.com/library/agile-for-dummies/">&lt;p&gt;Bu kitabı siteyi kurmadan önce okumuştum, o yüzden burada henüz yorumum yok. Yakın zamanda kendi notlarımı ekleyeceğim.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="tr">
        <title>Agile Principles, Patterns, and Practices in C#</title>
        <published>2026-06-15T00:00:00+00:00</published>
        <updated>2026-06-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://erdincyasan.com/library/agile-ppp-csharp/"/>
        <id>https://erdincyasan.com/library/agile-ppp-csharp/</id>
        
        <content type="html" xml:base="https://erdincyasan.com/library/agile-ppp-csharp/">&lt;p&gt;Bu kitabı siteyi kurmadan önce okumuştum, o yüzden burada henüz yorumum yok. Yakın zamanda kendi notlarımı ekleyeceğim.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="tr">
        <title>ASP.NET 8 Best Practices</title>
        <published>2026-06-15T00:00:00+00:00</published>
        <updated>2026-06-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://erdincyasan.com/library/aspnet-8-best-practices/"/>
        <id>https://erdincyasan.com/library/aspnet-8-best-practices/</id>
        
        <content type="html" xml:base="https://erdincyasan.com/library/aspnet-8-best-practices/">&lt;p&gt;Bu kitabı siteyi kurmadan önce okumuştum, o yüzden burada henüz yorumum yok. Yakın zamanda kendi notlarımı ekleyeceğim.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="tr">
        <title>Clean Architecture</title>
        <published>2026-06-15T00:00:00+00:00</published>
        <updated>2026-06-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://erdincyasan.com/library/clean-architecture/"/>
        <id>https://erdincyasan.com/library/clean-architecture/</id>
        
        <content type="html" xml:base="https://erdincyasan.com/library/clean-architecture/">&lt;p&gt;Bu kitabı siteyi kurmadan önce okumuştum, o yüzden burada henüz yorumum yok. Yakın zamanda kendi notlarımı ekleyeceğim.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="tr">
        <title>Clean Code</title>
        <published>2026-06-15T00:00:00+00:00</published>
        <updated>2026-06-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://erdincyasan.com/library/clean-code/"/>
        <id>https://erdincyasan.com/library/clean-code/</id>
        
        <content type="html" xml:base="https://erdincyasan.com/library/clean-code/">&lt;p&gt;Bu kitabı siteyi kurmadan önce okumuştum, o yüzden burada henüz yorumum yok. Yakın zamanda kendi notlarımı ekleyeceğim.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="tr">
        <title>C# 12 and .NET 8: Modern Cross-Platform Development Fundamentals</title>
        <published>2026-06-15T00:00:00+00:00</published>
        <updated>2026-06-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://erdincyasan.com/library/csharp-12-and-net-8/"/>
        <id>https://erdincyasan.com/library/csharp-12-and-net-8/</id>
        
        <content type="html" xml:base="https://erdincyasan.com/library/csharp-12-and-net-8/">&lt;p&gt;Bu kitabı siteyi kurmadan önce okumuştum, o yüzden burada henüz yorumum yok. Yakın zamanda kendi notlarımı ekleyeceğim.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="tr">
        <title>Domain-Driven Design</title>
        <published>2026-06-15T00:00:00+00:00</published>
        <updated>2026-06-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://erdincyasan.com/library/domain-driven-design/"/>
        <id>https://erdincyasan.com/library/domain-driven-design/</id>
        
        <content type="html" xml:base="https://erdincyasan.com/library/domain-driven-design/">&lt;p&gt;Bu kitabı siteyi kurmadan önce okumuştum, o yüzden burada henüz yorumum yok. Yakın zamanda kendi notlarımı ekleyeceğim.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="tr">
        <title>C# 10 in a Nutshell: The Definitive Reference</title>
        <published>2026-06-15T00:00:00+00:00</published>
        <updated>2026-06-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://erdincyasan.com/library/dotnet-in-a-nutshell/"/>
        <id>https://erdincyasan.com/library/dotnet-in-a-nutshell/</id>
        
        <content type="html" xml:base="https://erdincyasan.com/library/dotnet-in-a-nutshell/">&lt;p&gt;Bu kitabı siteyi kurmadan önce okumuştum, o yüzden burada henüz yorumum yok. Yakın zamanda kendi notlarımı ekleyeceğim.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="tr">
        <title>Hands-On Domain-Driven Design with .NET Core</title>
        <published>2026-06-15T00:00:00+00:00</published>
        <updated>2026-06-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://erdincyasan.com/library/hands-on-ddd-with-net-core/"/>
        <id>https://erdincyasan.com/library/hands-on-ddd-with-net-core/</id>
        
        <content type="html" xml:base="https://erdincyasan.com/library/hands-on-ddd-with-net-core/">&lt;p&gt;Bu kitabı siteyi kurmadan önce okumuştum, o yüzden burada henüz yorumum yok. Yakın zamanda kendi notlarımı ekleyeceğim.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="tr">
        <title>Implementing Domain-Driven Design</title>
        <published>2026-06-15T00:00:00+00:00</published>
        <updated>2026-06-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://erdincyasan.com/library/implementing-domain-driven-design/"/>
        <id>https://erdincyasan.com/library/implementing-domain-driven-design/</id>
        
        <content type="html" xml:base="https://erdincyasan.com/library/implementing-domain-driven-design/">&lt;p&gt;Bu kitabı siteyi kurmadan önce okumuştum, o yüzden burada henüz yorumum yok. Yakın zamanda kendi notlarımı ekleyeceğim.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="tr">
        <title>The Rust Programming Language</title>
        <published>2026-06-15T00:00:00+00:00</published>
        <updated>2026-06-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://erdincyasan.com/library/the-rust-programming-language/"/>
        <id>https://erdincyasan.com/library/the-rust-programming-language/</id>
        
        <content type="html" xml:base="https://erdincyasan.com/library/the-rust-programming-language/">&lt;p&gt;Bu kitabı siteyi kurmadan önce okumuştum, o yüzden burada henüz yorumum yok. Yakın zamanda kendi notlarımı ekleyeceğim.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="tr">
        <title>Ultimate ASP.NET Core Web API (Code Maze)</title>
        <published>2026-06-15T00:00:00+00:00</published>
        <updated>2026-06-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://erdincyasan.com/library/ultimate-aspnet-core-web-api/"/>
        <id>https://erdincyasan.com/library/ultimate-aspnet-core-web-api/</id>
        
        <content type="html" xml:base="https://erdincyasan.com/library/ultimate-aspnet-core-web-api/">&lt;p&gt;Bu kitabı siteyi kurmadan önce okumuştum, o yüzden burada henüz yorumum yok. Yakın zamanda kendi notlarımı ekleyeceğim.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="tr">
        <title>Designing Data-Intensive Applications</title>
        <published>2026-06-10T00:00:00+00:00</published>
        <updated>2026-06-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://erdincyasan.com/library/designing-data-intensive-applications/"/>
        <id>https://erdincyasan.com/library/designing-data-intensive-applications/</id>
        
        <content type="html" xml:base="https://erdincyasan.com/library/designing-data-intensive-applications/">&lt;p&gt;Bu kitabı siteyi kurmadan önce okumuştum, o yüzden burada henüz yorumum yok. Yakın zamanda kendi notlarımı ekleyeceğim.&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
