{"id":33335,"date":"2025-11-01T18:01:44","date_gmt":"2025-11-01T15:01:44","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/blog-post-demystifying-zios-dependency-injection-a-practical-guide\/"},"modified":"2025-11-01T18:01:44","modified_gmt":"2025-11-01T15:01:44","slug":"blog-post-demystifying-zios-dependency-injection-a-practical-guide","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/blog-post-demystifying-zios-dependency-injection-a-practical-guide\/","title":{"rendered":"Blog Post: Demystifying ZIO&#8217;s Dependency Injection: A Practical Guide"},"content":{"rendered":"<p>Modern Scala uygulamalar\u0131 geli\u015ftirirken ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00f6netmek karma\u015f\u0131k bir s\u00fcre\u00e7 olabilir. \u00d6zellikle fonksiyonel programlama prensiplerini benimseyen ZIO gibi g\u00fc\u00e7l\u00fc bir k\u00fct\u00fcphane ile \u00e7al\u0131\u015f\u0131rken, ba\u011f\u0131ml\u0131l\u0131k enjeksiyonunun (DI) geleneksel yakla\u015f\u0131mlardan farkl\u0131 oldu\u011funu fark edebilirsiniz. Bu makale, ZIO&#8217;nun ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu mekanizmas\u0131 olan ZLayer&#8217;\u0131 derinlemesine inceleyecek ve pratik \u00f6rneklerle nas\u0131l kullan\u0131laca\u011f\u0131n\u0131 ad\u0131m ad\u0131m a\u00e7\u0131klayacakt\u0131r. Ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131z\u0131 tip g\u00fcvenli, test edilebilir ve \u00f6l\u00e7eklenebilir bir \u015fekilde y\u00f6netmek i\u00e7in ZIO&#8217;nun sundu\u011fu g\u00fcc\u00fc ke\u015ffedin.<\/p>\n<p>Geleneksel nesne tabanl\u0131 programlamada ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu, genellikle bir DI konteyneri veya elle olu\u015fturulan ba\u011f\u0131ml\u0131l\u0131k a\u011fa\u00e7lar\u0131 ile y\u00f6netilir. Bu yakla\u015f\u0131mlar genellikle \u00e7al\u0131\u015fma zaman\u0131 hatalar\u0131na, global state&#8217;e ba\u011f\u0131ml\u0131l\u0131\u011fa veya test edilebilirli\u011fi zorla\u015ft\u0131ran monolitik yap\u0131lara yol a\u00e7abilir. ZIO ise bu sorunlara k\u00f6kten farkl\u0131, fonksiyonel ve tip g\u00fcvenli bir \u00e7\u00f6z\u00fcm sunar: ZLayer.<\/p>\n<p>ZIO ekosisteminde her efekt, kendisiyle birlikte bir &#8220;ortam&#8221; (environment) ta\u015f\u0131r. Bu ortam, efektin ihtiya\u00e7 duydu\u011fu ba\u011f\u0131ml\u0131l\u0131klar\u0131 bar\u0131nd\u0131ran bir &#8220;konteyner&#8221; gibidir. Geleneksel yakla\u015f\u0131mlar\u0131n aksine, ZIO&#8217;da ba\u011f\u0131ml\u0131l\u0131klar a\u00e7\u0131k\u00e7a, tipler arac\u0131l\u0131\u011f\u0131yla tan\u0131mlan\u0131r. Bir ZIO efekti <code>ZIO[R, E, A]<\/code> olarak tan\u0131mland\u0131\u011f\u0131nda, <code>R<\/code> tipi efektin ihtiya\u00e7 duydu\u011fu ba\u011f\u0131ml\u0131l\u0131klar\u0131, yani ortam\u0131n\u0131 temsil eder. Bu, derleme zaman\u0131nda hangi servislere ihtiya\u00e7 duyuldu\u011funu ve bunlar\u0131n hangi tiplerde olmas\u0131 gerekti\u011fini net bir \u015fekilde g\u00f6rmemizi sa\u011flar.<\/p>\n<p>Peki, bu neden \u00f6nemli? \u0130lk olarak, tip g\u00fcvenli\u011fi sayesinde eksik veya yanl\u0131\u015f ba\u011f\u0131ml\u0131l\u0131klar \u00e7al\u0131\u015fma zaman\u0131nda de\u011fil, derleme zaman\u0131nda tespit edilir. Bu, hata ay\u0131klama s\u00fcresini \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r ve daha g\u00fcvenilir uygulamalar geli\u015ftirmenizi sa\u011flar. \u0130kinci olarak, ZIO&#8217;nun ba\u011f\u0131ml\u0131l\u0131klar\u0131 tamamen saf fonksiyonlar ve de\u011fi\u015fmez veri yap\u0131lar\u0131 \u00fczerine kuruludur. Bu, herhangi bir global state veya yan etkiye ba\u011f\u0131ml\u0131l\u0131k olmaks\u0131z\u0131n, bile\u015fenlerinizi izole bir \u015fekilde test etmenizi kolayla\u015ft\u0131r\u0131r. \u00dc\u00e7\u00fcnc\u00fc olarak, ZIO&#8217;nun katman (Layer) tabanl\u0131 ba\u011f\u0131ml\u0131l\u0131k y\u00f6netimi, uygulaman\u0131z\u0131n mod\u00fclerli\u011fini ve yeniden kullan\u0131labilirli\u011fini art\u0131r\u0131r. K\u00fc\u00e7\u00fck, odaklanm\u0131\u015f katmanlar olu\u015fturarak, bunlar\u0131 farkl\u0131 senaryolar i\u00e7in bir araya getirebilir ve kolayca test edilebilir hale getirebilirsiniz.<\/p>\n<p>Bu yakla\u015f\u0131m, \u00f6zellikle mikroservis mimarilerinde veya b\u00fcy\u00fck, karma\u015f\u0131k i\u015f uygulamalar\u0131nda b\u00fcy\u00fck faydalar sa\u011flar. Her bir mikroservis veya uygulama mod\u00fcl\u00fc, kendi ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 a\u00e7\u0131k\u00e7a beyan eder ve bu ba\u011f\u0131ml\u0131l\u0131klar, ZLayer&#8217;lar arac\u0131l\u0131\u011f\u0131yla bir araya getirilir. B\u00f6ylece, uygulaman\u0131z\u0131n herhangi bir noktas\u0131nda hangi hizmetlerin mevcut oldu\u011funu veya eksik oldu\u011funu kolayca g\u00f6rebilirsiniz. Bu sayede, geli\u015ftirme s\u00fcreciniz h\u0131zlan\u0131r, bak\u0131m maliyetleri d\u00fc\u015fer ve sisteminizin genel sa\u011flaml\u0131\u011f\u0131 artar. Ayr\u0131ca, ZIO&#8217;nun sa\u011flad\u0131\u011f\u0131 kaynak y\u00f6netimi (scoped layers) sayesinde, veritaban\u0131 ba\u011flant\u0131lar\u0131, dosya kollar\u0131 gibi d\u0131\u015f kaynaklar\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc de g\u00fcvenli ve otomatik bir \u015fekilde y\u00f6netebilirsiniz. Bu, kaynak s\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00f6nler ve uygulaman\u0131z\u0131n daha kararl\u0131 \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>ZIO 2.x ile birlikte ba\u011f\u0131ml\u0131l\u0131klar, <code>ZEnvironment<\/code> ad\u0131 verilen \u00f6zel bir veri yap\u0131s\u0131 i\u00e7inde ta\u015f\u0131n\u0131r. Bu yap\u0131, birden fazla servisi bir arada tutabilen ve bunlar\u0131 tip g\u00fcvenli bir \u015fekilde eri\u015filebilir k\u0131lan bir harita gibidir. Geli\u015ftiriciler, <code>ZIO.service[MyService]<\/code> gibi ifadelerle bu ortamdan gerekli servisleri kolayca \u00e7ekebilirler. Bu mekanizma, ba\u011f\u0131ml\u0131l\u0131klar\u0131n elden ele ge\u00e7irilmesi ihtiyac\u0131n\u0131 ortadan kald\u0131r\u0131r ve kodun daha temiz ve okunabilir olmas\u0131n\u0131 sa\u011flar. Dahas\u0131, <code>ZLayer<\/code>&#8216;lar, ba\u011f\u0131ml\u0131l\u0131klar\u0131n nas\u0131l olu\u015fturulaca\u011f\u0131n\u0131, yap\u0131land\u0131r\u0131laca\u011f\u0131n\u0131 ve di\u011fer ba\u011f\u0131ml\u0131l\u0131klarla nas\u0131l birle\u015ftirilece\u011fini tan\u0131mlayan re\u00e7etelerdir. Bu re\u00e7eteler sayesinde, karma\u015f\u0131k ba\u011f\u0131ml\u0131l\u0131k a\u011fa\u00e7lar\u0131n\u0131 bile deklaratif bir \u015fekilde olu\u015fturmak m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<h2>ZLayer&#8217;\u0131n Sihri: Temel Yap\u0131y\u0131 Anlamak ve Kullanmak<\/h2>\n<p>ZIO&#8217;da ba\u011f\u0131ml\u0131l\u0131klar\u0131n kalbi <code>ZLayer<\/code>&#8216;d\u0131r. Bir <code>ZLayer[RIn, E, ROut]<\/code> tipi, \u00fc\u00e7 ana bile\u015fenden olu\u015fur:<\/p>\n<ol>\n<li><code>RIn<\/code>: Bu katman\u0131n olu\u015fturulmas\u0131 i\u00e7in gereken ba\u011f\u0131ml\u0131l\u0131klar. \u00d6rne\u011fin, bir veritaban\u0131 katman\u0131, bir konfig\u00fcrasyon servisine ihtiya\u00e7 duyabilir.<\/li>\n<li><code>E<\/code>: Katman\u0131n olu\u015fturulmas\u0131 veya ba\u015flat\u0131lmas\u0131 s\u0131ras\u0131nda ortaya \u00e7\u0131kabilecek hata tipi. E\u011fer bir katman ba\u015flat\u0131l\u0131rken bir sorun ya\u015fan\u0131rsa (\u00f6rne\u011fin, veritaban\u0131 ba\u011flant\u0131s\u0131 kurulamad\u0131), bu hata tipi arac\u0131l\u0131\u011f\u0131yla bildirilir.<\/li>\n<li><code>ROut<\/code>: Bu katman\u0131n sa\u011flad\u0131\u011f\u0131 ba\u011f\u0131ml\u0131l\u0131klar. Bu genellikle uygulaman\u0131z\u0131n di\u011fer k\u0131s\u0131mlar\u0131n\u0131n kullanaca\u011f\u0131 servislerin aray\u00fczleridir.<\/li>\n<\/ol>\n<p>Basit\u00e7e ifade etmek gerekirse, bir <code>ZLayer<\/code> &#8220;<code>RIn<\/code> ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 kullanarak, <code>E<\/code> hatas\u0131 potansiyeliyle, <code>ROut<\/code> ba\u011f\u0131ml\u0131l\u0131klar\u0131 sa\u011flayan bir yap\u0131&#8221; anlam\u0131na gelir. Bu deklaratif yap\u0131, ZIO&#8217;nun ba\u011f\u0131ml\u0131l\u0131k enjeksiyonunu di\u011fer yakla\u015f\u0131mlardan ay\u0131r\u0131r ve uygulaman\u0131z\u0131n mimarisini daha \u015feffaf hale getirir.<\/p>\n<p>Peki, bir <code>ZLayer<\/code> nas\u0131l olu\u015fturulur ve kullan\u0131l\u0131r? En temel <code>ZLayer<\/code> olu\u015fturma y\u00f6ntemleri \u015funlard\u0131r:<\/p>\n<ul>\n<li><code>ZLayer.succeed[A](value: A)<\/code>: Sabit bir de\u011feri do\u011frudan sa\u011flayan basit bir katman olu\u015fturur.<\/li>\n<li><code>ZLayer.fromFunction[R, A](f: R => A)<\/code>: Ortamdan (<code>R<\/code>) bir de\u011fer alarak bir <code>A<\/code> de\u011feri \u00fcreten bir fonksiyonla katman olu\u015fturur.<\/li>\n<li><code>ZLayer.fromZIO[RIn, E, ROut](zio: ZIO[RIn, E, ROut])<\/code>: Bir ZIO efektinden do\u011frudan bir katman olu\u015fturur. Bu, genellikle as\u0131l i\u015f mant\u0131\u011f\u0131n\u0131 i\u00e7eren servisleri ba\u015flatmak i\u00e7in kullan\u0131l\u0131r.<\/li>\n<\/ul>\n<p>Ger\u00e7ek d\u00fcnya senaryolar\u0131nda, servis aray\u00fczlerini ve onlar\u0131n somut uygulamalar\u0131n\u0131 tan\u0131mlar\u0131z. Diyelim ki basit bir kullan\u0131c\u0131 servisine ihtiyac\u0131m\u0131z var:<\/p>\n<pre><code>\n\/\/ 1. Servis aray\u00fcz\u00fcn\u00fc ve etki alan\u0131n\u0131 tan\u0131mlay\u0131n\ntrait UserService {\n  def getUser(id: Long): ZIO[Any, Throwable, String]\n}\n\n\/\/ 2. Servis uygulamas\u0131n\u0131 tan\u0131mlay\u0131n\ncase class UserServiceLive() extends UserService {\n  override def getUser(id: Long): ZIO[Any, Throwable, String] =\n    ZIO.succeed(s\"Kullan\u0131c\u0131 ${id}\") \/\/ Basit bir \u00f6rnek\n}\n\n\/\/ 3. Servis i\u00e7in bir ZLayer olu\u015fturun\nobject UserService {\n  val live: ZLayer[Any, Nothing, UserService] =\n    ZLayer.succeed(UserServiceLive())\n}\n\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>UserService<\/code> aray\u00fcz\u00fcn\u00fc ve <code>UserServiceLive<\/code> somut uygulamas\u0131n\u0131 tan\u0131mlad\u0131k. Ard\u0131ndan, <code>UserService.live<\/code> arac\u0131l\u0131\u011f\u0131yla bu servisi sa\u011flayan bir <code>ZLayer<\/code> olu\u015fturduk. <code>ZLayer.succeed<\/code> kulland\u0131k \u00e7\u00fcnk\u00fc <code>UserServiceLive<\/code> kendi ba\u015f\u0131na ba\u015fka hi\u00e7bir \u015feye ihtiya\u00e7 duymuyor. E\u011fer <code>UserService<\/code> bir <code>UserRepository<\/code>'e ihtiya\u00e7 duysayd\u0131, <code>ZLayer.fromFunction<\/code> veya <code>ZLayer.fromZIO<\/code> kullanmam\u0131z gerekirdi.<\/p>\n<p>Katmanlar\u0131 birle\u015ftirmek, ZIO DI'n\u0131n en g\u00fc\u00e7l\u00fc y\u00f6nlerinden biridir. ZIO, katmanlar\u0131 birle\u015ftirmek i\u00e7in iki ana operat\u00f6r sa\u011flar: <code>>>><\/code> (andThen) ve <code>++<\/code> (zip).<\/p>\n<ul>\n<li><code>>>><\/code> (andThen): Bir katman\u0131n \u00e7\u0131kt\u0131s\u0131n\u0131 (<code>ROut<\/code>) di\u011fer bir katman\u0131n girdisine (<code>RIn<\/code>) ba\u011flar. Bu, bir boru hatt\u0131 (pipeline) olu\u015fturmak gibidir. \u00d6rne\u011fin, Konfig\u00fcrasyon katman\u0131 Veritaban\u0131 katman\u0131na girdi sa\u011flar.<\/li>\n<li><code>++<\/code> (zip): \u0130ki katman\u0131 paralel olarak birle\u015ftirir ve her iki katman\u0131n sa\u011flad\u0131\u011f\u0131 \u00e7\u0131kt\u0131lar\u0131 (<code>ROut<\/code>'lar\u0131) birle\u015ftirir. Her iki katman\u0131n da kendi ba\u011f\u0131ms\u0131z girdileri olabilir.<\/li>\n<\/ul>\n<p>\u00d6rne\u011fin, bir <code>UserRepository<\/code> katman\u0131 ve <code>UserService<\/code> katman\u0131m\u0131z varsa:<\/p>\n<pre><code>\ntrait UserRepository {\n  def findUserById(id: Long): ZIO[Any, Throwable, Option[String]]\n}\n\ncase class UserRepositoryLive() extends UserRepository {\n  override def findUserById(id: Long): ZIO[Any, Throwable, Option[String]] =\n    if (id == 1) ZIO.succeed(Some(\"Ali Can\"))\n    else ZIO.succeed(None)\n}\n\nobject UserRepository {\n  val live: ZLayer[Any, Nothing, UserRepository] = ZLayer.succeed(UserRepositoryLive())\n}\n\n\/\/ UserService art\u0131k UserRepository'e ba\u011f\u0131ml\u0131\ncase class UserServiceWithRepoLive(userRepo: UserRepository) extends UserService {\n  override def getUser(id: Long): ZIO[Any, Throwable, String] =\n    userRepo.findUserById(id).map(_.getOrElse(s\"Kullan\u0131c\u0131 ${id} bulunamad\u0131.\"))\n}\n\nobject UserService {\n  \/\/ UserService'in UserRepository'e ba\u011f\u0131ml\u0131 bir ZLayer'\u0131\n  val live: ZLayer[UserRepository, Nothing, UserService] =\n    ZLayer.fromFunction[UserRepository, UserService](repo => UserServiceWithRepoLive(repo))\n}\n\n\/\/ Uygulama katmanlar\u0131n\u0131 birle\u015ftirelim\nval applicationLayer: ZLayer[Any, Nothing, UserService with UserRepository] =\n  UserRepository.live ++ UserService.live\n\n\/\/ Bir ZIO efektini bu katmanla \u00e7al\u0131\u015ft\u0131rmak\nval program = ZIO.service[UserService].flatMap(_.getUser(1))\n\n\/\/ Program\u0131 \u00e7al\u0131\u015ft\u0131rma\nval result = program.provideLayer(applicationLayer)\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnek, ZIO'nun ba\u011f\u0131ml\u0131l\u0131klar\u0131 nas\u0131l y\u00f6netti\u011fini g\u00f6steriyor. <code>UserService.live<\/code> art\u0131k <code>UserRepository<\/code>'e ihtiya\u00e7 duydu\u011funu a\u00e7\u0131k\u00e7a belirtiyor. <code>applicationLayer<\/code> ise bu iki ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 <code>++<\/code> operat\u00f6r\u00fc ile birle\u015ftiriyor. En sonunda, <code>program.provideLayer(applicationLayer)<\/code> diyerek, program\u0131m\u0131z\u0131n ihtiya\u00e7 duydu\u011fu t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131 sa\u011fl\u0131yoruz. Bu yakla\u015f\u0131m, uygulaman\u0131z\u0131n ba\u011f\u0131ml\u0131l\u0131k grafi\u011fini a\u00e7\u0131k\u00e7a tan\u0131mlaman\u0131za ve derleme zaman\u0131nda do\u011frulaman\u0131za olanak tan\u0131r, b\u00f6ylece \u00e7al\u0131\u015fma zaman\u0131 hatalar\u0131n\u0131 en aza indirir.<\/p>\n<pre><code class=\"html\">\n  Uzman \u0130pucu: ZIO 2.0 ile birlikte gelen ZLayer.make operat\u00f6r\u00fc, ba\u011f\u0131ml\u0131l\u0131k grafi\u011fini otomatik olarak \u00e7\u0131kararak katmanlar\u0131 birle\u015ftirmenizi \u00e7ok daha kolay hale getirir. Karma\u015f\u0131k ba\u011f\u0131ml\u0131l\u0131k a\u011fa\u00e7lar\u0131 i\u00e7in elle birle\u015ftirmek yerine <code>ZLayer.make[Service1 with Service2](Service1.live, Service2.live)<\/code> kullanmay\u0131 deneyin. Bu, \u00f6zellikle \u00e7ok say\u0131da ba\u011f\u0131ml\u0131l\u0131k oldu\u011funda kodunuzu sadele\u015ftirir.\n<\/pre>\n<p><\/code><\/p>\n<h2>U\u00e7tan Uca Bir Uygulama: ZLayer ile Mikroservis Geli\u015ftirme<\/h2>\n<p>Ger\u00e7ek d\u00fcnya uygulamalar\u0131nda, servisler genellikle veritaban\u0131, konfig\u00fcrasyon, harici API'lar gibi bir\u00e7ok farkl\u0131 ba\u011f\u0131ml\u0131l\u0131\u011fa sahiptir. Bu b\u00f6l\u00fcmde, ZIO'nun <code>ZLayer<\/code> mekanizmas\u0131n\u0131 kullanarak, bir \u00fcr\u00fcn katalog mikroservisi nas\u0131l geli\u015ftirilir onu inceleyece\u011fiz. Bu servis, bir veritaban\u0131ndan \u00fcr\u00fcn bilgilerini \u00e7ekecek ve basit bir i\u015f mant\u0131\u011f\u0131na sahip olacakt\u0131r. Bu vaka analizi, ZLayer'lar\u0131n nas\u0131l bir araya getirilece\u011fini ve karma\u015f\u0131k ba\u011f\u0131ml\u0131l\u0131klar\u0131n nas\u0131l y\u00f6netilece\u011fini g\u00f6sterecektir.<\/p>\n<h3>\n<h3\/>1. Konfig\u00fcrasyon Katman\u0131 Olu\u015fturma<\/h3>\n<p>Her uygulaman\u0131n konfig\u00fcrasyona ihtiyac\u0131 vard\u0131r. ZIO'da konfig\u00fcrasyonlar\u0131 y\u00f6netmek i\u00e7in <code>zio.config<\/code> k\u00fct\u00fcphanesini kullanabiliriz, ancak bu \u00f6rnekte basit bir <code>Config<\/code> servis aray\u00fcz\u00fc ve onun <code>ZLayer<\/code>'\u0131n\u0131 olu\u015fturaca\u011f\u0131z.<\/p>\n<pre><code>\n\/\/ modules\/Config.scala\ncase class DatabaseConfig(url: String, user: String, pass: String)\n\ntrait Config {\n  def getDbConfig: DatabaseConfig\n}\n\ncase class ConfigLive(dbConfig: DatabaseConfig) extends Config {\n  override def getDbConfig: DatabaseConfig = dbConfig\n}\n\nobject Config {\n  \/\/ Varsay\u0131lan bir konfig\u00fcrasyon sa\u011flayan ZLayer\n  val live: ZLayer[Any, Nothing, Config] =\n    ZLayer.succeed(ConfigLive(DatabaseConfig(\"jdbc:postgresql:\/\/localhost:5432\/products\", \"admin\", \"password\")))\n\n  \/\/ Servise eri\u015fim i\u00e7in yard\u0131mc\u0131 method\n  def getDbConfig: ZIO[Config, Nothing, DatabaseConfig] =\n    ZIO.serviceWith[Config](_.getDbConfig)\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Burada, <code>DatabaseConfig<\/code> ad\u0131nda bir case class tan\u0131mlad\u0131k ve bu konfig\u00fcrasyonu sa\u011flayan bir <code>Config<\/code> trait'i ile <code>ConfigLive<\/code> uygulamas\u0131n\u0131 olu\u015fturduk. <code>Config.live<\/code> ise bu konfig\u00fcrasyonu <code>ZLayer.succeed<\/code> ile sa\u011flayan basit bir katmand\u0131r. Ger\u00e7ek bir senaryoda, bu konfig\u00fcrasyon dosyalardan veya ortam de\u011fi\u015fkenlerinden okunabilir, bu da <code>ZLayer.fromZIO<\/code> kullanmay\u0131 gerektirebilirdi.<\/p>\n<h3>\n<h3\/>2. Veritaban\u0131 Katman\u0131 (Repository) Olu\u015fturma<\/h3>\n<p>\u00dcr\u00fcn verilerini saklamak ve almak i\u00e7in bir <code>ProductRepository<\/code>'ye ihtiyac\u0131m\u0131z var. Bu repository, <code>Config<\/code> katman\u0131ndan veritaban\u0131 konfig\u00fcrasyonunu alarak bir veritaban\u0131 ba\u011flant\u0131s\u0131 kuracak (basit bir taklit kullanaca\u011f\u0131z) ve \u00fcr\u00fcn CRUD operasyonlar\u0131n\u0131 sa\u011flayacakt\u0131r.<\/p>\n<pre><code>\n\/\/ modules\/ProductRepository.scala\ncase class Product(id: Long, name: String, price: Double)\n\ntrait ProductRepository {\n  def getProductById(id: Long): ZIO[Any, Throwable, Option[Product]]\n  def addProduct(product: Product): ZIO[Any, Throwable, Unit]\n}\n\n\/\/ ProductRepository'nin canl\u0131 uygulamas\u0131\n\/\/ Ger\u00e7ekte, veritaban\u0131 s\u00fcr\u00fcc\u00fcs\u00fc (pl: Doobie, Quill) bu katmanda kullan\u0131lacakt\u0131r.\ncase class ProductRepositoryLive(dbConfig: DatabaseConfig) extends ProductRepository {\n  \/\/ Veritaban\u0131 ba\u011flant\u0131 havuzu sim\u00fclasyonu\n  println(s\"Veritaban\u0131na ba\u011flan\u0131l\u0131yor: ${dbConfig.url} (${dbConfig.user})\")\n\n  override def getProductById(id: Long): ZIO[Any, Throwable, Option[Product]] =\n    ZIO.succeed(Some(Product(id, s\"\u00dcr\u00fcn $id\", 10.0 * id))) \/\/ Taklit veri\n\n  override def addProduct(product: Product): ZIO[Any, Throwable, Unit] =\n    ZIO.succeed(println(s\"\u00dcr\u00fcn eklendi: $product\"))\n}\n\nobject ProductRepository {\n  \/\/ Config katman\u0131na ba\u011f\u0131ml\u0131 bir ZLayer\n  val live: ZLayer[Config, Nothing, ProductRepository] =\n    ZLayer.fromFunction(configService => ProductRepositoryLive(configService.getDbConfig))\n\n  \/\/ Servise eri\u015fim i\u00e7in yard\u0131mc\u0131 methodlar\n  def getProductById(id: Long): ZIO[ProductRepository, Throwable, Option[Product]] =\n    ZIO.serviceWithZIO[ProductRepository](_.getProductById(id))\n  def addProduct(product: Product): ZIO[ProductRepository, Throwable, Unit] =\n    ZIO.serviceWithZIO[ProductRepository](_.addProduct(product))\n}\n<\/pre>\n<p><\/code><\/p>\n<p><code>ProductRepository.live<\/code> katman\u0131n\u0131n <code>Config<\/code> katman\u0131na ba\u011f\u0131ml\u0131 oldu\u011funa dikkat edin. <code>ZLayer.fromFunction<\/code> kullanarak bu ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 al\u0131p <code>ProductRepositoryLive<\/code> \u00f6rne\u011fini olu\u015fturduk.<\/p>\n<h3>\n<h3\/>3. \u0130\u015f Mant\u0131\u011f\u0131 Katman\u0131 (Service) Olu\u015fturma<\/h3>\n<p>\u015eimdi de \u00fcr\u00fcnlerle ilgili i\u015f mant\u0131\u011f\u0131n\u0131 i\u00e7eren <code>ProductService<\/code>'i olu\u015ftural\u0131m. Bu servis, <code>ProductRepository<\/code>'ye ba\u011f\u0131ml\u0131 olacakt\u0131r.<\/p>\n<pre><code>\n\/\/ modules\/ProductService.scala\ntrait ProductService {\n  def getProductDetails(id: Long): ZIO[Any, Throwable, String]\n  def createNewProduct(name: String, price: Double): ZIO[Any, Throwable, Unit]\n}\n\ncase class ProductServiceLive(repo: ProductRepository) extends ProductService {\n  override def getProductDetails(id: Long): ZIO[Any, Throwable, String] =\n    repo.getProductById(id).map {\n      case Some(product) => s\"ID: ${product.id}, Ad: ${product.name}, Fiyat: ${product.price} TL\"\n      case None          => s\"\u00dcr\u00fcn ${id} bulunamad\u0131.\"\n    }\n\n  override def createNewProduct(name: String, price: Double): ZIO[Any, Throwable, Unit] =\n    for {\n      _ <- repo.addProduct(Product(System.currentTimeMillis(), name, price))\n      _ <- ZIO.logInfo(s\"Yeni \u00fcr\u00fcn olu\u015fturuldu: $name\")\n    } yield ()\n}\n\nobject ProductService {\n  \/\/ ProductRepository katman\u0131na ba\u011f\u0131ml\u0131 bir ZLayer\n  val live: ZLayer[ProductRepository, Throwable, ProductService] =\n    ZLayer.fromFunction(repo => ProductServiceLive(repo))\n\n  \/\/ Servise eri\u015fim i\u00e7in yard\u0131mc\u0131 methodlar\n  def getProductDetails(id: Long): ZIO[ProductService, Throwable, String] =\n    ZIO.serviceWithZIO[ProductService](_.getProductDetails(id))\n  def createNewProduct(name: String, price: Double): ZIO[ProductService, Throwable, Unit] =\n    ZIO.serviceWithZIO[ProductService](_.createNewProduct(name, price))\n}\n<\/pre>\n<p><\/code><\/p>\n<p><code>ProductService.live<\/code>, <code>ProductRepository<\/code>'ye ba\u011f\u0131ml\u0131 oldu\u011fu i\u00e7in, <code>RIn<\/code> tipi olarak <code>ProductRepository<\/code>'i al\u0131r.<\/p>\n<h3>\n<h3\/>4. T\u00fcm Katmanlar\u0131 Birle\u015ftirme ve Uygulamay\u0131 \u00c7al\u0131\u015ft\u0131rma<\/h3>\n<p>\u015eimdi elimizdeki <code>Config.live<\/code>, <code>ProductRepository.live<\/code> ve <code>ProductService.live<\/code> katmanlar\u0131n\u0131 bir araya getirerek uygulaman\u0131n tam ba\u011f\u0131ml\u0131l\u0131k grafi\u011fini olu\u015ftural\u0131m. <code>ZLayer.make<\/code> operat\u00f6r\u00fcn\u00fc kullanarak ba\u011f\u0131ml\u0131l\u0131klar\u0131 otomatik olarak birle\u015ftirebiliriz.<\/p>\n<pre><code>\n\/\/ main.scala\nimport zio._\nimport modules._ \/\/ Config, ProductRepository, ProductService objelerini i\u00e7erdi\u011fi varsay\u0131l\u0131r\n\nobject ProductCatalogApp extends ZIOAppDefault {\n  \/\/ T\u00fcm katmanlar\u0131 birle\u015ftirerek uygulaman\u0131n tam ortam\u0131n\u0131 olu\u015fturun\n  val appLayer: ZLayer[Any, Throwable, ProductService] =\n    ZLayer.make[ProductService](\n      Config.live,              \/\/ Config katman\u0131n\u0131 sa\u011flar\n      ProductRepository.live,   \/\/ ProductRepository katman\u0131 Config'e ba\u011f\u0131ml\u0131d\u0131r\n      ProductService.live       \/\/ ProductService katman\u0131 ProductRepository'e ba\u011f\u0131ml\u0131d\u0131r\n    )\n\n  override def run: ZIO[Any, Throwable, Unit] =\n    (for {\n      _ <- ProductService.createNewProduct(\"Laptop\", 12000.0)\n      _ <- ProductService.createNewProduct(\"Mouse\", 250.0)\n      details <- ProductService.getProductDetails(1)\n      _ <- ZIO.logInfo(details)\n      details2 <- ProductService.getProductDetails(100) \/\/ Olmayan \u00fcr\u00fcn\n      _ <- ZIO.logInfo(details2)\n    } yield ())\n      .provide(appLayer) \/\/ Olu\u015fturulan katman\u0131 programa sa\u011fla\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki <code>ProductCatalogApp<\/code> i\u00e7inde, <code>appLayer<\/code> de\u011fi\u015fkeni ile t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131 bir araya getirdik. <code>ZLayer.make<\/code> sayesinde, <code>ProductService<\/code>'in <code>ProductRepository<\/code>'ye, <code>ProductRepository<\/code>'nin ise <code>Config<\/code>'e ba\u011f\u0131ml\u0131 oldu\u011funu ZIO otomatik olarak anlay\u0131p do\u011fru s\u0131rayla birle\u015ftirir. <code>run<\/code> metodu i\u00e7indeki as\u0131l program mant\u0131\u011f\u0131, daha sonra bu <code>appLayer<\/code>'\u0131 <code>provide<\/code> ederek \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r. Bu sayede, <code>ProductService<\/code>'e ve dolayl\u0131 olarak onun ba\u011f\u0131ml\u0131l\u0131klar\u0131na tip g\u00fcvenli bir \u015fekilde eri\u015febiliriz. Bu yap\u0131, hem okumas\u0131 kolay hem de derleme zaman\u0131 g\u00fcvenli\u011fi sa\u011flayan bir ba\u011f\u0131ml\u0131l\u0131k y\u00f6netimi sunar. Uygulaman\u0131z b\u00fcy\u00fcd\u00fck\u00e7e ve daha fazla servis ekledik\u00e7e, bu mod\u00fcler yakla\u015f\u0131m sayesinde ba\u011f\u0131ml\u0131l\u0131k grafi\u011finiz her zaman \u015feffaf ve y\u00f6netilebilir kal\u0131r.<\/p>\n<h2>Test Edilebilirlik ve \u0130leri D\u00fczey Teknikler: Daha G\u00fcvenli ve \u00d6l\u00e7eklenebilir Sistemler<\/h2>\n<p>ZIO'nun <code>ZLayer<\/code> tabanl\u0131 ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu, test edilebilirli\u011fi ola\u011fan\u00fcst\u00fc kolayla\u015ft\u0131r\u0131r. Bir servis, somut bir uygulamaya ba\u011fl\u0131 olmak yerine, soyut bir aray\u00fcze (trait) ba\u011fl\u0131 oldu\u011fu i\u00e7in, testler s\u0131ras\u0131nda ger\u00e7ek ba\u011f\u0131ml\u0131l\u0131klar\u0131 sahte (mock) veya ge\u00e7ici (stub) uygulamalarla de\u011fi\u015ftirebiliriz. Bu, testlerin h\u0131zl\u0131, izole ve g\u00fcvenilir olmas\u0131n\u0131 sa\u011flar. ZIO'da sahte ba\u011f\u0131ml\u0131l\u0131k olu\u015fturmak, ger\u00e7ek ba\u011f\u0131ml\u0131l\u0131k olu\u015fturmaktan farks\u0131zd\u0131r, sadece <code>ZLayer.succeed<\/code> veya <code>ZLayer.fromFunction<\/code> ile test ama\u00e7l\u0131 \u00f6zel bir uygulama sa\u011flar\u0131z.<\/p>\n<h3>\n<h3\/>Servisleri Test Etmek: Sahte Ba\u011f\u0131ml\u0131l\u0131klarla Kolayl\u0131k<\/h3>\n<p>Yukar\u0131daki <code>ProductService<\/code> \u00f6rne\u011fimizi ele alal\u0131m. Bu servisi test ederken, ger\u00e7ek bir veritaban\u0131na ba\u011flanmak yerine, <code>ProductRepository<\/code> i\u00e7in sahte bir implementasyon sa\u011flamak isteriz. \u0130\u015fte bunun nas\u0131l yap\u0131laca\u011f\u0131:<\/p>\n<pre><code>\n\/\/ Test dosyas\u0131\nimport zio._\nimport zio.test._\nimport zio.test.Assertion._\nimport modules._ \/\/ Product, ProductRepository, ProductService objelerini i\u00e7erdi\u011fi varsay\u0131l\u0131r\n\nobject ProductServiceSpec extends ZIOSpecDefault {\n  \/\/ Test i\u00e7in ProductRepository'nin sahte implementasyonu\n  val mockProductRepository: ZLayer[Any, Nothing, ProductRepository] =\n    ZLayer.succeed(new ProductRepository {\n      private val products = scala.collection.mutable.Map.empty[Long, Product]\n      products.put(1, Product(1, \"Test \u00dcr\u00fcn A\", 100.0))\n      products.put(2, Product(2, \"Test \u00dcr\u00fcn B\", 200.0))\n\n      override def getProductById(id: Long): ZIO[Any, Throwable, Option[Product]] =\n        ZIO.succeed(products.get(id))\n\n      override def addProduct(product: Product): ZIO[Any, Throwable, Unit] =\n        ZIO.succeed(products.put(product.id, product)).unit\n    })\n\n  \/\/ ProductService i\u00e7in tam katman, sahte repository kullanarak\n  val testAppLayer: ZLayer[Any, Throwable, ProductService] =\n    mockProductRepository >>> ProductService.live \/\/ Sahte repository'yi servis katman\u0131na ba\u011flar\n\n  override def spec: Spec[Any, Throwable] =\n    suite(\"ProductService Specification\")(\n      test(\"should retrieve product details for an existing product\") {\n        (for {\n          details <- ProductService.getProductDetails(1)\n        } yield assert(details)(equalTo(\"ID: 1, Ad: Test \u00dcr\u00fcn A, Fiyat: 100.0 TL\")))\n          .provideLayer(testAppLayer)\n      },\n      test(\"should indicate product not found for a non-existing product\") {\n        (for {\n          details <- ProductService.getProductDetails(99)\n        } yield assert(details)(equalTo(\"\u00dcr\u00fcn 99 bulunamad\u0131.\")))\n          .provideLayer(testAppLayer)\n      },\n      test(\"should successfully create a new product\") {\n        (for {\n          _ <- ProductService.createNewProduct(\"Yeni Test \u00dcr\u00fcn\", 300.0)\n          details <- ProductService.getProductDetails(System.currentTimeMillis() \/* Dinamik ID *\/ ) \/\/ Test verisine bakmal\u0131\n        } yield assert(details)(startsWith(\"ID:\"))) \/\/ Sadece ID'nin ba\u015flad\u0131\u011f\u0131n\u0131 kontrol et\n          .provideLayer(testAppLayer)\n      }\n    )\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu test kodunda, <code>mockProductRepository<\/code> ad\u0131nda \u00f6zel bir <code>ZLayer<\/code> olu\u015fturduk. Bu katman, ger\u00e7ek bir veritaban\u0131na ba\u011flanmak yerine, bellekte bir <code>Map<\/code> kullanarak \u00fcr\u00fcnleri taklit eder. Daha sonra, <code>testAppLayer<\/code> olu\u015ftururken bu sahte repository'yi <code>ProductService.live<\/code> katman\u0131na ba\u011flad\u0131k. Sonu\u00e7 olarak, <code>ProductService<\/code> test edilirken sadece taklit verilerle \u00e7al\u0131\u015f\u0131r, bu da testlerin izole ve h\u0131zl\u0131 olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>\n<h3\/>\u0130leri D\u00fczey Teknikler: Kaynak Y\u00f6netimi ve Optimizasyon<\/h3>\n<ul>\n<li>\n        <strong>ZLayer.scoped<\/strong>: D\u0131\u015f kaynaklar\u0131 (veritaban\u0131 ba\u011flant\u0131lar\u0131, dosya kollar\u0131 vb.) g\u00fcvenli bir \u015fekilde y\u00f6netmek i\u00e7in kullan\u0131l\u0131r. <code>scoped<\/code> katmanlar, kayna\u011f\u0131n a\u00e7\u0131l\u0131\u015f\u0131n\u0131 ve kapan\u0131\u015f\u0131n\u0131 ZIO'nun ya\u015fam d\u00f6ng\u00fcs\u00fc y\u00f6netimine b\u0131rak\u0131r, b\u00f6ylece kaynak s\u0131z\u0131nt\u0131lar\u0131 \u00f6nlenir.<\/p>\n<pre><code>\n          \/\/ Veritaban\u0131 ba\u011flant\u0131 havuzu gibi bir kaynak i\u00e7in scoped layer\n          val dbConnectionPoolLayer: ZLayer[Config, Throwable, DbConnectionPool] =\n            ZLayer.scoped {\n              for {\n                config <- ZIO.service[Config]\n                dbConfig = config.getDbConfig\n                pool <- ZIO.acquireRelease(\n                  ZIO.succeed(println(s\"Veritaban\u0131 havuzu ba\u015flat\u0131l\u0131yor: ${dbConfig.url}\")).as(new DbConnectionPool {})\n                )(pool => ZIO.succeed(println(\"Veritaban\u0131 havuzu kapat\u0131l\u0131yor\")))\n              } yield pool\n            }\n        <\/pre>\n<p><\/code>\n    <\/li>\n<li>\n        <strong>ZLayer.memoized<\/strong>: Bir katman\u0131n yaln\u0131zca bir kez olu\u015fturulmas\u0131n\u0131 ve sonu\u00e7 de\u011ferinin \u00f6nbelle\u011fe al\u0131nmas\u0131n\u0131 sa\u011flar. Bu, \u00f6zellikle ba\u015flat\u0131lmas\u0131 maliyetli olan katmanlar i\u00e7in performans optimizasyonu sa\u011flar.<\/p>\n<pre><code>\n          val expensiveServiceLayer: ZLayer[Any, Nothing, ExpensiveService] =\n            ZLayer.succeed(new ExpensiveService {}).memoized\n        <\/pre>\n<p><\/code>\n    <\/li>\n<li>\n        <strong>Circular Dependencies<\/strong>: ZIO'nun <code>ZLayer<\/code> sistemi, d\u00f6ng\u00fcsel ba\u011f\u0131ml\u0131l\u0131klar\u0131 derleme zaman\u0131nda tespit etmenize yard\u0131mc\u0131 olur. <code>ZLayer.make<\/code> kullan\u0131rken d\u00f6ng\u00fcsel bir ba\u011f\u0131ml\u0131l\u0131k olursa, derleyici hata verecektir. Bu, mimarinizin temiz kalmas\u0131n\u0131 ve beklenmedik durumlar\u0131n \u00f6n\u00fcne ge\u00e7ilmesini sa\u011flar. Genellikle, servis aray\u00fczlerinin birbirine ba\u011f\u0131ml\u0131 olmas\u0131 yerine, daha \u00fcst seviye bir servis, alt seviyedeki servisleri kullanmal\u0131d\u0131r.\n    <\/li>\n<\/ul>\n<p>Bu ileri d\u00fczey teknikler, ZIO uygulamalar\u0131n\u0131z\u0131n sadece i\u015flevsel de\u011fil, ayn\u0131 zamanda sa\u011flam, performansl\u0131 ve bak\u0131m\u0131 kolay olmas\u0131n\u0131 sa\u011flar. ZLayer'lar\u0131n mod\u00fcler do\u011fas\u0131 sayesinde, uygulaman\u0131z\u0131n her bir par\u00e7as\u0131n\u0131 izole edebilir, test edebilir ve optimize edebilirsiniz. Bu da ZIO'yu b\u00fcy\u00fck \u00f6l\u00e7ekli ve kritik \u00f6neme sahip sistemler i\u00e7in ideal bir se\u00e7im haline getirir.<\/p>\n<pre><code class=\"html\">\n  Uzman \u0130pucu: Karma\u015f\u0131k servislerinizi test ederken, sadece ihtiya\u00e7 duyulan ba\u011f\u0131ml\u0131l\u0131klar\u0131 sa\u011flamak i\u00e7in <code>ZLayer.make[ServiceToTest](ServiceToTest.live, MockDependency1.live, MockDependency2.live)<\/code> kombinasyonunu kullan\u0131n. Bu, test ortam\u0131n\u0131z\u0131 minimal tutar ve testlerinizin odakl\u0131 olmas\u0131n\u0131 sa\u011flar.\n<\/pre>\n<p><\/code><\/p>\n<h2>Web Geli\u015ftiricileri \u0130\u00e7in Ek Bilgi: Mobil Uyumlu Tasar\u0131m Prensipleri<\/h2>\n<p>Bu teknik makale ZIO'nun ba\u011f\u0131ml\u0131l\u0131k enjeksiyonunu a\u00e7\u0131klarken, modern blog i\u00e7eri\u011fi olu\u015ftururken SEO ve kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan mobil uyumlulu\u011fun ne kadar \u00f6nemli oldu\u011funu unutmamak gerekir. Blog yaz\u0131lar\u0131n\u0131z\u0131n okunabilirli\u011fini art\u0131rmak ve farkl\u0131 cihazlarda iyi g\u00f6r\u00fcnmesini sa\u011flamak i\u00e7in CSS media query'leri kullanmak hayati \u00f6neme sahiptir. \u0130\u015fte bu blog g\u00f6nderisi gibi HTML i\u00e7erikleri i\u00e7in temel mobil uyumluluk prensipleri ve bir \u00f6rnek CSS kodu:<\/p>\n<h3>\n<h3\/>Meta Viewport Etiketi<\/h3>\n<p>Mobil cihazlarda sayfan\u0131z\u0131n do\u011fru \u00f6l\u00e7eklenmesi i\u00e7in <code><head><\/code> b\u00f6l\u00fcm\u00fcne a\u015fa\u011f\u0131daki meta etiketini eklemek zorunludur:<\/p>\n<pre><code>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<\/pre>\n<p><\/code><\/p>\n<p>Bu etiket, taray\u0131c\u0131ya sayfan\u0131n cihaz\u0131n ger\u00e7ek geni\u015fli\u011fine g\u00f6re render edilmesi ve ba\u015flang\u0131\u00e7 \u00f6l\u00e7e\u011finin 1.0 olmas\u0131 gerekti\u011fini s\u00f6yler.<\/p>\n<h3>\n<h3\/>Esnek D\u00fczenler ve Medya Sorgular\u0131 (Media Queries)<\/h3>\n<p>\u0130\u00e7eri\u011finizin farkl\u0131 ekran boyutlar\u0131na uyum sa\u011flamas\u0131 i\u00e7in esnek bir d\u00fczenleme (flexbox veya grid) kullan\u0131n ve medya sorgular\u0131 ile belirli ekran geni\u015fliklerinde stil de\u011fi\u015fiklikleri yap\u0131n. \u0130\u015fte bu makale i\u00e7in basit bir CSS \u00f6rne\u011fi:<\/p>\n<pre><code class=\"html\">\n<style>\n  \/* Temel stiller *\/\n  body {\n    font-family: Arial, sans-serif;\n    line-height: 1.6;\n    color: #333;\n    max-width: 1000px;\n    margin: 0 auto;\n    padding: 20px;\n  }\n\n  h2 {\n    color: #2c3e50;\n    margin-top: 30px;\n    margin-bottom: 15px;\n    border-bottom: 2px solid #3498db;\n    padding-bottom: 10px;\n  }\n\n  h3 {\n    color: #34495e;\n    margin-top: 25px;\n    margin-bottom: 10px;\n  }\n\n  p {\n    margin-bottom: 1em;\n  }\n\n  pre {\n    background-color: #ecf0f1;\n    border-left: 5px solid #3498db;\n    padding: 15px;\n    overflow-x: auto;\n    font-size: 0.9em;\n    margin-bottom: 1em;\n  }\n\n  code {\n    font-family: 'Courier New', Courier, monospace;\n    color: #c0392b;\n  }\n\n  pre code {\n    color: #2c3e50;\n  }\n\n  ul, ol {\n    margin-bottom: 1em;\n    padding-left: 20px;\n  }\n\n  \/* Uzman \u0130pucu kutusu *\/\n  .expert-tip {\n    background-color: #e8f6f3; \/* A\u00e7\u0131k ye\u015filimsi-mavi *\/\n    border-left: 4px solid #48c9b0; \/* Koyu ye\u015filimsi-mavi *\/\n    padding: 15px;\n    margin: 20px 0;\n    font-style: italic;\n    color: #1a5e4d;\n  }\n\n  \/* Mobil cihazlar i\u00e7in medya sorgular\u0131 (\u00f6rne\u011fin, 768px alt\u0131) *\/\n  @media (max-width: 768px) {\n    body {\n      padding: 15px;\n    }\n\n    h2 {\n      font-size: 1.8em;\n    }\n\n    h3 {\n      font-size: 1.3em;\n    }\n\n    pre {\n      font-size: 0.85em;\n      padding: 10px;\n    }\n\n    .expert-tip {\n      padding: 10px;\n    }\n  }\n\n  \/* \u00c7ok k\u00fc\u00e7\u00fck cihazlar i\u00e7in medya sorgular\u0131 (\u00f6rne\u011fin, 480px alt\u0131) *\/\n  @media (max-width: 480px) {\n    body {\n      padding: 10px;\n    }\n\n    h2 {\n      font-size: 1.5em;\n    }\n\n    h3 {\n      font-size: 1.1em;\n    }\n\n    pre {\n      font-size: 0.8em;\n      padding: 8px;\n    }\n  }\n<\/style>\n<\/pre>\n<p><\/code><\/p>\n<p>Bu CSS kodu, varsay\u0131lan bir masa\u00fcst\u00fc g\u00f6r\u00fcn\u00fcm\u00fc tan\u0131mlar ve ard\u0131ndan <code>max-width: 768px<\/code> ve <code>max-width: 480px<\/code> i\u00e7in medya sorgular\u0131 kullanarak yaz\u0131 tipi boyutlar\u0131n\u0131, dolgular\u0131 ve di\u011fer \u00f6zellikleri mobil cihazlara daha uygun hale getirir. Bu, blog makalenizin \u00e7e\u015fitli ekran boyutlar\u0131nda harika g\u00f6r\u00fcnmesini ve okuyucular\u0131n\u0131z i\u00e7in daha iyi bir deneyim sunmas\u0131n\u0131 sa\u011flar.<\/p>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>ZIO'nun ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu mekanizmas\u0131, <code>ZLayer<\/code>'lar arac\u0131l\u0131\u011f\u0131yla, geleneksel yakla\u015f\u0131mlar\u0131n aksine, tip g\u00fcvenli\u011fi, kompozisyon yetene\u011fi ve ola\u011fan\u00fcst\u00fc test edilebilirli\u011fi bir araya getirir. Bu makalede, <code>ZLayer<\/code>'\u0131n temel prensiplerini, nas\u0131l olu\u015fturulaca\u011f\u0131n\u0131 ve birle\u015ftirilece\u011fini, ger\u00e7ek bir mikroservis senaryosunda nas\u0131l kullan\u0131laca\u011f\u0131n\u0131 ve testler s\u0131ras\u0131nda sahte ba\u011f\u0131ml\u0131l\u0131klar\u0131n \u00f6nemini detayl\u0131 bir \u015fekilde inceledik. Ayr\u0131ca, mobil uyumlu blog g\u00f6nderileri i\u00e7in pratik CSS ipu\u00e7lar\u0131na da de\u011findik.<\/p>\n<p>Uygulamalar\u0131n\u0131z\u0131 <code>ZLayer<\/code>'lar kullanarak tasarlad\u0131\u011f\u0131n\u0131zda, ba\u011f\u0131ml\u0131l\u0131k grafi\u011finiz derleme zaman\u0131nda do\u011frulan\u0131r, bu da \u00e7al\u0131\u015fma zaman\u0131 hatalar\u0131n\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde azalt\u0131r. Her bir katman\u0131n a\u00e7\u0131k\u00e7a tan\u0131mlanm\u0131\u015f girdileri ve \u00e7\u0131kt\u0131lar\u0131 olmas\u0131 sayesinde, uygulaman\u0131z\u0131n her bir par\u00e7as\u0131n\u0131n neye ihtiya\u00e7 duydu\u011funu ve ne sa\u011flad\u0131\u011f\u0131n\u0131 kolayca anlayabilirsiniz. Bu mod\u00fcler yap\u0131, ZIO uygulamalar\u0131n\u0131 b\u00fcy\u00fck \u00f6l\u00e7ekli ve karma\u015f\u0131k projeler i\u00e7in son derece uygun hale getirir. Fonksiyonel programlaman\u0131n getirdi\u011fi avantajlar\u0131 ba\u011f\u0131ml\u0131l\u0131k y\u00f6netimine ta\u015f\u0131yan ZIO, daha g\u00fcvenilir, bak\u0131m\u0131 kolay ve \u00f6l\u00e7eklenebilir sistemler in\u015fa etmenizi sa\u011flar. ZIO d\u00fcnyas\u0131na ad\u0131m atarken, <code>ZLayer<\/code>'\u0131 anlamak ve etkili bir \u015fekilde kullanmak, ba\u015far\u0131n\u0131z\u0131n anahtarlar\u0131ndan biri olacakt\u0131r.<\/p>\n<h3>\n<h3\/>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<ol>\n<li>\n        <strong>ZIO'daki Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu di\u011fer Scala DI k\u00fct\u00fcphanelerinden (\u00f6rne\u011fin MacWire, Guice) ne fark\u0131 var?<\/strong><\/p>\n<p>ZIO'nun ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu, derleme zaman\u0131 tip g\u00fcvenli\u011fi ve fonksiyonel programlama prensiplerine s\u0131k\u0131 s\u0131k\u0131ya ba\u011fl\u0131d\u0131r. Geleneksel DI k\u00fct\u00fcphaneleri genellikle \u00e7al\u0131\u015fma zaman\u0131 refleksiyonu veya makrolar kullanarak ba\u011f\u0131ml\u0131l\u0131klar\u0131 ba\u011flarken, ZIO <code>ZLayer<\/code>'lar arac\u0131l\u0131\u011f\u0131yla ba\u011f\u0131ml\u0131l\u0131k grafi\u011fini a\u00e7\u0131k\u00e7a ve tip g\u00fcvenli bir \u015fekilde temsil eder. Bu, runtime hatalar\u0131n\u0131 ortadan kald\u0131r\u0131r ve test edilebilirli\u011fi do\u011fal olarak art\u0131r\u0131r.<\/p>\n<\/li>\n<li>\n        <strong>Her \u015fey i\u00e7in ZLayer kullanmal\u0131 m\u0131y\u0131m? Basit bir de\u011fer i\u00e7in bile mi?<\/strong><\/p>\n<p>Hay\u0131r, her \u015fey i\u00e7in ZLayer kullanman\u0131z gerekmez. Basit, yan etkisi olmayan, ba\u011f\u0131ms\u0131z de\u011ferler veya konfig\u00fcrasyonlar gibi \u015feyler i\u00e7in do\u011frudan <code>ZIO.succeed(value)<\/code> veya <code>ZIO.succeed(MyValue)<\/code> kullanmak yeterli olabilir. ZLayer'lar daha \u00e7ok, d\u0131\u015f kaynaklara ba\u011f\u0131ml\u0131 olan, ba\u015flat\u0131lmas\u0131 veya kapat\u0131lmas\u0131 gereken (veritaban\u0131 ba\u011flant\u0131s\u0131 gibi) veya di\u011fer servislere ba\u011f\u0131ml\u0131 olan servisler i\u00e7in tasarlanm\u0131\u015ft\u0131r.<\/p>\n<\/li>\n<li>\n        <strong>D\u00f6ng\u00fcsel ba\u011f\u0131ml\u0131l\u0131klar\u0131 ZIO'da nas\u0131l \u00f6nlerim?<\/strong><\/p>\n<p>ZIO'nun <code>ZLayer<\/code> sistemi, d\u00f6ng\u00fcsel ba\u011f\u0131ml\u0131l\u0131klar\u0131 derleme zaman\u0131nda tespit etmenize yard\u0131mc\u0131 olur. <code>ZLayer.make<\/code> operat\u00f6r\u00fc, ba\u011f\u0131ml\u0131l\u0131k grafi\u011fini \u00e7\u00f6zmeye \u00e7al\u0131\u015f\u0131rken bir d\u00f6ng\u00fc bulursa hata verir. Bunu \u00f6nlemek i\u00e7in, servislerinizi daha k\u00fc\u00e7\u00fck, tek sorumluluk ilkesine uygun mod\u00fcllere ay\u0131r\u0131n ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n her zaman tek y\u00f6nl\u00fc olmas\u0131n\u0131 sa\u011flay\u0131n (\u00fcst seviye servisler alt seviye servislere ba\u011f\u0131ml\u0131 olmal\u0131, tersi de\u011fil).<\/p>\n<\/li>\n<li>\n        <strong>ZLayer'lar i\u00e7inde yan etkileri nas\u0131l y\u00f6netirim?<\/strong><\/p>\n<p>ZLayer'lar i\u00e7inde yan etkileri (\u00f6rne\u011fin, veritaban\u0131na ba\u011flanmak, dosya okumak) <code>ZIO<\/code> efektleri i\u00e7inde sarmalaman\u0131z gerekir. <code>ZLayer.fromZIO<\/code> veya <code>ZLayer.scoped<\/code> gibi yap\u0131c\u0131lar\u0131 kullanarak, yan etkileri i\u00e7eren bir <code>ZIO<\/code> efekti sa\u011flayabilir ve bu efektin hatalar\u0131n\u0131 ve ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc ZIO'nun y\u00f6netmesini sa\u011flayabilirsiniz. Bu, katmanlar\u0131n\u0131z\u0131n ba\u015flat\u0131lmas\u0131n\u0131 ve sonland\u0131r\u0131lmas\u0131n\u0131 g\u00fcvenli ve deklaratif bir \u015fekilde yapar.<\/p>\n<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"Modern Scala uygulamalar\u0131 geli\u015ftirirken ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00f6netmek karma\u015f\u0131k bir s\u00fcre\u00e7 olabilir. \u00d6zellikle fonksiyonel programlama prensiplerini benimseyen ZIO gibi g\u00fc\u00e7l\u00fc&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-33335","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Blog Post: Demystifying ZIO&#039;s Dependency Injection: A Practical Guide<\/title>\n<meta name=\"description\" content=\"Modern Scala uygulamalar\u0131 geli\u015ftirirken ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00f6netmek karma\u015f\u0131k bir s\u00fcre\u00e7 olabilir. \u00d6zellikle fonksiyonel programlama prensiplerini benimseyen ZIO gibi g\u00fc\u00e7l\u00fc bir k\u00fct\u00fcphane ile \u00e7al\u0131\u015f\u0131rken, ba\u011f\u0131ml\u0131l\u0131k enjeksiyonunun (DI) geleneksel yakla\u015f\u0131mlardan farkl\u0131 oldu\u011funu fark edebilirsiniz. Bu makale, ZIO&#039;nun ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu mekanizmas\u0131 olan ZLayer&#039;\u0131 derinlemesine inceleyecek ve pratik \u00f6rneklerle nas\u0131l kullan\u0131laca\u011f\u0131n\u0131 ad\u0131m ad\u0131m a\u00e7\u0131klayacakt\u0131r. Ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131z\u0131 tip g\u00fcvenli, test edilebilir ve \u00f6l\u00e7eklenebilir bir \u015fekilde y\u00f6netmek i\u00e7in ZIO&#039;nun sundu\u011fu g\u00fcc\u00fc ke\u015ffedin.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/blog-post-demystifying-zios-dependency-injection-a-practical-guide\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Blog Post: Demystifying ZIO&#039;s Dependency Injection: A Practical Guide\" \/>\n<meta property=\"og:description\" content=\"Modern Scala uygulamalar\u0131 geli\u015ftirirken ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00f6netmek karma\u015f\u0131k bir s\u00fcre\u00e7 olabilir. \u00d6zellikle fonksiyonel programlama prensiplerini benimseyen ZIO gibi g\u00fc\u00e7l\u00fc bir k\u00fct\u00fcphane ile \u00e7al\u0131\u015f\u0131rken, ba\u011f\u0131ml\u0131l\u0131k enjeksiyonunun (DI) geleneksel yakla\u015f\u0131mlardan farkl\u0131 oldu\u011funu fark edebilirsiniz. Bu makale, ZIO&#039;nun ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu mekanizmas\u0131 olan ZLayer&#039;\u0131 derinlemesine inceleyecek ve pratik \u00f6rneklerle nas\u0131l kullan\u0131laca\u011f\u0131n\u0131 ad\u0131m ad\u0131m a\u00e7\u0131klayacakt\u0131r. Ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131z\u0131 tip g\u00fcvenli, test edilebilir ve \u00f6l\u00e7eklenebilir bir \u015fekilde y\u00f6netmek i\u00e7in ZIO&#039;nun sundu\u011fu g\u00fcc\u00fc ke\u015ffedin.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/blog-post-demystifying-zios-dependency-injection-a-practical-guide\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-01T15:01:44+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/blog-post-demystifying-zios-dependency-injection-a-practical-guide\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/blog-post-demystifying-zios-dependency-injection-a-practical-guide\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Blog Post: Demystifying ZIO&#8217;s Dependency Injection: A Practical Guide\",\"datePublished\":\"2025-11-01T15:01:44+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/blog-post-demystifying-zios-dependency-injection-a-practical-guide\/\"},\"wordCount\":2989,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/blog-post-demystifying-zios-dependency-injection-a-practical-guide\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/blog-post-demystifying-zios-dependency-injection-a-practical-guide\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/blog-post-demystifying-zios-dependency-injection-a-practical-guide\/\",\"name\":\"Blog Post: Demystifying ZIO's Dependency Injection: A Practical Guide\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-01T15:01:44+00:00\",\"description\":\"Modern Scala uygulamalar\u0131 geli\u015ftirirken ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00f6netmek karma\u015f\u0131k bir s\u00fcre\u00e7 olabilir. \u00d6zellikle fonksiyonel programlama prensiplerini benimseyen ZIO gibi g\u00fc\u00e7l\u00fc bir k\u00fct\u00fcphane ile \u00e7al\u0131\u015f\u0131rken, ba\u011f\u0131ml\u0131l\u0131k enjeksiyonunun (DI) geleneksel yakla\u015f\u0131mlardan farkl\u0131 oldu\u011funu fark edebilirsiniz. Bu makale, ZIO'nun ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu mekanizmas\u0131 olan ZLayer'\u0131 derinlemesine inceleyecek ve pratik \u00f6rneklerle nas\u0131l kullan\u0131laca\u011f\u0131n\u0131 ad\u0131m ad\u0131m a\u00e7\u0131klayacakt\u0131r. Ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131z\u0131 tip g\u00fcvenli, test edilebilir ve \u00f6l\u00e7eklenebilir bir \u015fekilde y\u00f6netmek i\u00e7in ZIO'nun sundu\u011fu g\u00fcc\u00fc ke\u015ffedin.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/blog-post-demystifying-zios-dependency-injection-a-practical-guide\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/blog-post-demystifying-zios-dependency-injection-a-practical-guide\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/blog-post-demystifying-zios-dependency-injection-a-practical-guide\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog Post: Demystifying ZIO&#8217;s Dependency Injection: A Practical Guide\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Blog Post: Demystifying ZIO's Dependency Injection: A Practical Guide","description":"Modern Scala uygulamalar\u0131 geli\u015ftirirken ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00f6netmek karma\u015f\u0131k bir s\u00fcre\u00e7 olabilir. \u00d6zellikle fonksiyonel programlama prensiplerini benimseyen ZIO gibi g\u00fc\u00e7l\u00fc bir k\u00fct\u00fcphane ile \u00e7al\u0131\u015f\u0131rken, ba\u011f\u0131ml\u0131l\u0131k enjeksiyonunun (DI) geleneksel yakla\u015f\u0131mlardan farkl\u0131 oldu\u011funu fark edebilirsiniz. Bu makale, ZIO'nun ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu mekanizmas\u0131 olan ZLayer'\u0131 derinlemesine inceleyecek ve pratik \u00f6rneklerle nas\u0131l kullan\u0131laca\u011f\u0131n\u0131 ad\u0131m ad\u0131m a\u00e7\u0131klayacakt\u0131r. Ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131z\u0131 tip g\u00fcvenli, test edilebilir ve \u00f6l\u00e7eklenebilir bir \u015fekilde y\u00f6netmek i\u00e7in ZIO'nun sundu\u011fu g\u00fcc\u00fc ke\u015ffedin.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/blog-post-demystifying-zios-dependency-injection-a-practical-guide\/","og_locale":"tr_TR","og_type":"article","og_title":"Blog Post: Demystifying ZIO's Dependency Injection: A Practical Guide","og_description":"Modern Scala uygulamalar\u0131 geli\u015ftirirken ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00f6netmek karma\u015f\u0131k bir s\u00fcre\u00e7 olabilir. \u00d6zellikle fonksiyonel programlama prensiplerini benimseyen ZIO gibi g\u00fc\u00e7l\u00fc bir k\u00fct\u00fcphane ile \u00e7al\u0131\u015f\u0131rken, ba\u011f\u0131ml\u0131l\u0131k enjeksiyonunun (DI) geleneksel yakla\u015f\u0131mlardan farkl\u0131 oldu\u011funu fark edebilirsiniz. Bu makale, ZIO'nun ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu mekanizmas\u0131 olan ZLayer'\u0131 derinlemesine inceleyecek ve pratik \u00f6rneklerle nas\u0131l kullan\u0131laca\u011f\u0131n\u0131 ad\u0131m ad\u0131m a\u00e7\u0131klayacakt\u0131r. Ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131z\u0131 tip g\u00fcvenli, test edilebilir ve \u00f6l\u00e7eklenebilir bir \u015fekilde y\u00f6netmek i\u00e7in ZIO'nun sundu\u011fu g\u00fcc\u00fc ke\u015ffedin.","og_url":"https:\/\/fatihsoysal.com\/blog\/blog-post-demystifying-zios-dependency-injection-a-practical-guide\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-01T15:01:44+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"11 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/blog-post-demystifying-zios-dependency-injection-a-practical-guide\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/blog-post-demystifying-zios-dependency-injection-a-practical-guide\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Blog Post: Demystifying ZIO&#8217;s Dependency Injection: A Practical Guide","datePublished":"2025-11-01T15:01:44+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/blog-post-demystifying-zios-dependency-injection-a-practical-guide\/"},"wordCount":2989,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/blog-post-demystifying-zios-dependency-injection-a-practical-guide\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/blog-post-demystifying-zios-dependency-injection-a-practical-guide\/","url":"https:\/\/fatihsoysal.com\/blog\/blog-post-demystifying-zios-dependency-injection-a-practical-guide\/","name":"Blog Post: Demystifying ZIO's Dependency Injection: A Practical Guide","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-01T15:01:44+00:00","description":"Modern Scala uygulamalar\u0131 geli\u015ftirirken ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00f6netmek karma\u015f\u0131k bir s\u00fcre\u00e7 olabilir. \u00d6zellikle fonksiyonel programlama prensiplerini benimseyen ZIO gibi g\u00fc\u00e7l\u00fc bir k\u00fct\u00fcphane ile \u00e7al\u0131\u015f\u0131rken, ba\u011f\u0131ml\u0131l\u0131k enjeksiyonunun (DI) geleneksel yakla\u015f\u0131mlardan farkl\u0131 oldu\u011funu fark edebilirsiniz. Bu makale, ZIO'nun ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu mekanizmas\u0131 olan ZLayer'\u0131 derinlemesine inceleyecek ve pratik \u00f6rneklerle nas\u0131l kullan\u0131laca\u011f\u0131n\u0131 ad\u0131m ad\u0131m a\u00e7\u0131klayacakt\u0131r. Ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131z\u0131 tip g\u00fcvenli, test edilebilir ve \u00f6l\u00e7eklenebilir bir \u015fekilde y\u00f6netmek i\u00e7in ZIO'nun sundu\u011fu g\u00fcc\u00fc ke\u015ffedin.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/blog-post-demystifying-zios-dependency-injection-a-practical-guide\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/blog-post-demystifying-zios-dependency-injection-a-practical-guide\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/blog-post-demystifying-zios-dependency-injection-a-practical-guide\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Blog Post: Demystifying ZIO&#8217;s Dependency Injection: A Practical Guide"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33335","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=33335"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33335\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33335"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33335"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33335"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}