{"id":33718,"date":"2014-08-06T19:37:00","date_gmt":"2014-08-06T16:37:00","guid":{"rendered":"https:\/\/fatihboy.com\/?p=33718"},"modified":"2021-06-22T11:03:12","modified_gmt":"2021-06-22T08:03:12","slug":"profesyonel-projelerimizde-dependency-injection-yaklasimi","status":"publish","type":"post","link":"https:\/\/fatihboy.com\/en\/profesyonel-projelerimizde-dependency-injection-yaklasimi\/","title":{"rendered":"Profesyonel Projelerimizde Dependency Injection Yakla\u015f\u0131m\u0131"},"content":{"rendered":"<p>&nbsp;&nbsp; <a href=\"\/en\/?tag=dependency-injection\">Dependency Injection makele serisi<\/a>nde geldi\u011fimiz noktada s\u0131ra geldi bir solution \u00fczerinden konuyu \u00f6rneklemeye. Asl\u0131nda, bu makalemde payla\u015facaklar\u0131m \u00f6rneklemeden \u00f6te olacak. Amac\u0131m i\u015f hayat\u0131n\u0131zda kullanabilece\u011finiz bir yakla\u015f\u0131m, bir metodolojiyi sizlerle payla\u015fmak. Bu sebeple dikkatle okuman\u0131z\u0131 tavsiye ederim. \u00d6ncelikle, <b>gev\u015fek ba\u011fl\u0131 (loosely coupled)<\/b> uygulamalar geli\u015ftirmenin ne kadar \u00f6nemli oldu\u011funu bir kez daha hat\u0131rlatmak isterim. Hatta \u00f6nemli olmakta da \u00f6te bir yaz\u0131l\u0131m geli\u015ftiricinin hayat\u0131n\u0131 kolayla\u015ft\u0131rd\u0131\u011f\u0131n\u0131 s\u00f6ylemeliyim. Solution\u2019\u0131m\u0131z makalelerimde hep \u00f6rnekledi\u011fimiz \u00f6\u011frenci i\u015flemleri olsun.<\/p>\n\n\n\n<p>&nbsp;&nbsp; Kodlamaya ba\u015flamadan \u00f6nce elimize ka\u011f\u0131d\u0131 kalemi al\u0131p tasar\u0131ma ba\u015flayal\u0131m. Akt\u00f6rlerimiz kimler? bu akt\u00f6rler aras\u0131 etkile\u015fimler nedir? Bu etkile\u015fimlerde ne t\u00fcr veriler kullan\u0131lmakta? Ka\u011f\u0131da yazd\u0131\u011f\u0131m\u0131z bu notlar asl\u0131nda biz fark\u0131nda olmasak da uygulamam\u0131z\u0131n ilk sat\u0131rlar\u0131 olmaya ba\u015flad\u0131lar bile. Ka\u011f\u0131t \u00fczerindeki tasar\u0131m\u0131m\u0131z\u0131n ard\u0131ndan bir Visual Studio a\u00e7arak <b>Enterprisecoding.DIOrnek <\/b>ad\u0131yla bir solution olu\u015ftural\u0131m. Solution\u2019\u0131m\u0131z gereksiz detaylarla u\u011fra\u015fmamak ve konuya odaklanmak ad\u0131na bir <u>konsol<\/u> uygulamas\u0131 olsun. Hemen ard\u0131ndan biraz \u00f6nce tasarlad\u0131\u011f\u0131m\u0131z domain\u2019imizi anlataca\u011f\u0131m\u0131z <b>Enterprisecoding.DIOrnek.Domain<\/b> projesini olu\u015ftural\u0131m. <em>Enterprisecoding.DIOrnek.Domain<\/em> bir s\u0131n\u0131f k\u00fct\u00fcphanesi projesi olmal\u0131.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2014\/08\/lkProjeler.png\"><img decoding=\"async\" src=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2014\/08\/lkProjeler_thumb.png\" alt=\"Solution'\u0131m\u0131zda yer alan projeler\"\/><\/a><\/figure>\n\n\n\n<p>&nbsp;&nbsp; <em>Enterprisecoding.DIOrnek.Domain<\/em> projesi aktif bir i\u015f mant\u0131\u011f\u0131 kodu bar\u0131nd\u0131rmamal\u0131. Bu proje ile amac\u0131m\u0131z sadece ger\u00e7ek hayattaki modelimizi (<em>Domain\u2019imizi<\/em>) programsal olarak anlatabilmek. Dolay\u0131s\u0131yla i\u00e7erisinde POCO s\u0131n\u0131flar\u0131 ve aray\u00fczler d\u0131\u015f\u0131nda bir \u015fey bar\u0131nd\u0131rmamal\u0131;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2014\/08\/Enterprisecoding.DIOrnek.Domain.png\"><img decoding=\"async\" src=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2014\/08\/Enterprisecoding.DIOrnek.Domain_thumb.png\" alt=\"Enterprisecoding.DIOrnek.Domain projesinin son hali\"\/><\/a><\/figure>\n\n\n\n<p>&nbsp;&nbsp; Yukar\u0131da da g\u00f6r\u00fcld\u00fc\u011f\u00fc gibi projede g\u00fcnl\u00fckleri tutacak, verileri saklayacak ve \u00f6\u011frenci i\u015flemlerini ger\u00e7ekle\u015ftirecek <b>atomik depolar\u0131m\u0131z\u0131n tan\u0131m\u0131<\/b> var. Ek olarak; \u00f6\u011frenci verisini ta\u015f\u0131yacak bir de <b>POCO<\/b> s\u0131n\u0131f\u0131m\u0131z. <em>Enterprisecoding.DIOrnek<\/em> konsol uygulamam\u0131z\u0131n referanslar\u0131m\u0131z aras\u0131na hemen <em>Enterprisecoding.DIOrnek.Domain<\/em> projesini ekleyelim. Bir ba\u015fka deyi\u015fle, uygulamam\u0131z\u0131 modelledi\u011fimiz domain\u2019imizden haberdar edelim. Bu ad\u0131mla art\u0131k uygulamam\u0131z domain\u2019imiz i\u00e7erisinde neler yapabilece\u011fini bilecek. Burada dikkat etmemiz gereken nokta <b>uygulamam\u0131z\u0131n sadece neler yapabilece\u011fini bilmesi<\/b>\u2026 Nas\u0131l yap\u0131ld\u0131\u011f\u0131 konusunda hi\u00e7bir fikri yok. Zaten olmamal\u0131 da. <a href=\"\/en\/?p=12402\">Serinin ilk makelesi<\/a>ndeki prensibimizi hat\u0131rlay\u0131n \ud83d\ude09<\/p>\n\n\n\n<p>&nbsp;&nbsp; \u015eimdi. Madem uygulamam\u0131z art\u0131k bu domain \u00fczerinde neler yapabilece\u011fini biliyor. Bu durumda \u00f6\u011frenci deposu ile a\u015fa\u011f\u0131daki gibi bir kod yazabiliriz;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">var ogrenci = new Ogrenci {\n               No = 12345,\n               Adi = \"Fatih\",\n               Soyadi = \"Boy\",\n               Bolum = \"Bilgisayar M\u00fchendisli\u011fi\"\n           };\n\nvar kayitBasariliMi = ogrenciDeposu.Kaydet(ogrenci);\nConsole.WriteLine(kayitBasariliMi ? \"\u00d6\u011frenci ba\u015far\u0131yla kaydedildi\" : \"\u00d6\u011frenci kaydedilemedi\");<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Dikkat ederseniz \u00f6\u011frenci deposunun nas\u0131l ilklendi\u011fini payla\u015fm\u0131yorum, hen\u00fcz Ninject\u2019i kullanmad\u0131k. \u00c7\u00fcnk\u00fc Ninject amac\u0131m\u0131za, gev\u015fek ba\u011fl\u0131 sisteme, ula\u015fmak i\u00e7in sadece bir ara\u00e7. S\u0131ras\u0131 geldi\u011finde kullanaca\u011f\u0131m\u0131z bir ara\u00e7. Uygulamam\u0131 sadece Domain\u2019imde belirtti\u011fim POCO ve aray\u00fczleri kullanarak geli\u015ftirmeye ba\u015flad\u0131m. <b>Nas\u0131l<\/b>\u2019\u0131n\u0131 \u00f6nemsemedi\u011fim i\u00e7in i\u015flevlerin tam ve eksiksiz oldu\u011funu varsay\u0131yorum. Hatta, i\u015f mant\u0131\u011f\u0131 kodlar\u0131n\u0131 bir ba\u015fka geli\u015ftiricinin yazd\u0131\u011f\u0131n\u0131 varsayal\u0131m. Bu noktada uygulamam\u0131 a\u00e7arak test etmek, i\u015f mant\u0131\u011f\u0131n\u0131 de\u011fil; ama kendi kodlar\u0131m\u0131 do\u011fru yazd\u0131\u011f\u0131m\u0131 g\u00f6rebilmek amac\u0131yla bu aray\u00fczlerin birer \u00f6rne\u011fine ihtiyac\u0131m var. \u0130\u015fte tam da bu noktada art\u0131k s\u0131ra geldi yeni bir proje\u2019yi daha solution\u2019a eklemeye<b>. Enterprisecoding.DIOrnek.Domain.Moq<\/b> ad\u0131yla bir s\u0131n\u0131f k\u00fct\u00fcphanesi olu\u015ftural\u0131m ve \u00e7\u0131kt\u0131s\u0131n\u0131n Enterprisecoding.DIOrnek projesi ile ayn\u0131 dizin oldu\u011funu garanti edelim;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2014\/08\/MoqCiktiKlasoru.png\"><img decoding=\"async\" src=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2014\/08\/MoqCiktiKlasoru_thumb.png\" alt=\"Moq projesinin \u00e7\u0131kt\u0131 klas\u00f6r ayar\u0131\"\/><\/a><\/figure>\n\n\n\n<p>&nbsp;&nbsp; Projemiz domain\u2019imizi anlataca\u011f\u0131 i\u00e7in Enterprisecoding.DIOrnek.Domain proje referans\u0131n\u0131 da ekleyelim. Bu projede mocking yaparak aray\u00fczlerimin bo\u015f implemantasyonlar\u0131n\u0131 yapmay\u0131 planl\u0131yorum. S\u0131f\u0131r i\u015f mant\u0131\u011f\u0131\u2026 Bunun i\u00e7in de Moq k\u00fct\u00fcphanesini tercih ediyorum. Bu sebeple projemize <a href=\"http:\/\/www.nuget.org\/packages\/Moq\/\">Moq Nuget paketi<\/a>ni de ekleyelim;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2014\/08\/MoqNugetPaketi.png\"><img decoding=\"async\" src=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2014\/08\/MoqNugetPaketi_thumb.png\" alt=\"Moq Nuget paketinin eklenmesi\"\/><\/a><\/figure>\n\n\n\n<p>&nbsp;&nbsp; Moq k\u00fct\u00fcphanesi kolay bir \u015fekilde sahte s\u0131n\u0131flarla ilgili aray\u00fczleri implemente etmemi sa\u011flayacak. Detaylar\u0131n\u0131 bilmiyorsan\u0131z da \u00f6nemli de\u011fil.<\/p>\n\n\n\n<p>&nbsp;&nbsp; Proje i\u00e7erisinde hemen bir Modul s\u0131n\u0131f\u0131 a\u00e7\u0131p \u00f6nceki makalelerimizde \u00f6\u011frendi\u011fimiz \u015fekilde bir Ninject mod\u00fcl\u00fc olu\u015ftural\u0131m. Daha sonra da mod\u00fcl\u00fcm\u00fcz\u00fc i\u00e7erisinde a\u015fa\u011f\u0131daki \u015fekilde sahte s\u0131n\u0131flar\u0131m\u0131z\u0131 olu\u015ftural\u0131m.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public sealed class Modul : NinjectModule {\n    public override void Load() {\n        var gunlukDeposuMock = new Mock&lt;IGunlukDeposu>();\n        var ogrenciDeposuMock = new Mock&lt;IOgrenciDeposu>();\n        var veriDeposuMock = new Mock&lt;IVeriDeposu>();\n\n        veriDeposuMock.Setup(veriDeposuOrnegi =&amp;gt; veriDeposuOrnegi.Kaydet(It.IsAny&lt;object>())).Returns(635428485297202582);\n\n        ogrenciDeposuMock.Setup(ogrenciDeposuOrnegi => ogrenciDeposuOrnegi.Kaydet(It.IsAny&lt;Ogrenci>())).Returns(true);\n\n        Bind&lt;IGunlukDeposu>().ToConstant(gunlukDeposuMock.Object);\n        Bind&lt;IOgrenciDeposu>().ToConstant(ogrenciDeposuMock.Object);\n        Bind&lt;IVeriDeposu>().ToConstant(veriDeposuMock.Object);\n    }\n}<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Moq ile ilk defa kar\u015f\u0131la\u015f\u0131yorsan\u0131z yukar\u0131daki sat\u0131rlar kafan\u0131z\u0131 kar\u0131\u015ft\u0131rm\u0131\u015f olabilir. \u00dcz\u00fclmenize gerek yok. Sadece bu sat\u0131rlarda bo\u015f bir VeriDeposu s\u0131n\u0131f\u0131 olu\u015fturup Kaydet fonksiyonunda her zaman i\u00e7in 635428485297202582 de\u011ferinin d\u00f6nmesini sa\u011flad\u0131\u011f\u0131m\u0131z\u0131 bilmeniz yeterli. Benzer \u015fekilde bo\u015f bir OgrenciDeposu s\u0131n\u0131f\u0131 da sadece her kaydet dedi\u011fimizde true yan\u0131t\u0131n\u0131 verecektir. Unutmay\u0131n, konsol projemizde bu s\u0131n\u0131flar\u0131n\u0131n i\u00e7inin nas\u0131l oldu\u011fu ile ilgilenmiyoruz; hatta i\u00e7lerini ba\u015fkas\u0131n\u0131n yazd\u0131\u011f\u0131n\u0131 varsay\u0131yoruz.<\/p>\n\n\n\n<p>&nbsp;&nbsp; \u015eimdi tekrardan Konsol projemize geri d\u00f6nerek Ninject yard\u0131m\u0131yla bu bo\u015f s\u0131n\u0131flar\u0131 \/ sahte domain implemantasyonunu kullanal\u0131m;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">using Com.Enterprisecoding.DIOrnek.Domain.Depo;\nusing Com.Enterprisecoding.DIOrnek.Domain.Varlik;\nusing Ninject;\nusing System;\n\nnamespace Com.Enterprisecoding.DIOrnek {\n    class Program {\n        static void Main() {\n            var ogrenci = new Ogrenci {\n                No = 12345,\n                Adi = \"Fatih\",\n                Soyadi = \"Boy\",\n                Bolum = \"Bilgisayar M\u00fchendisli\u011fi\"\n            };\n\n            var kernel = new StandardKernel();\n\n            kernel.Load(\"DIOrnek.Domain.Moq.dll\");\n\n            var ogrenciDeposu = kernel.Get&lt;IOgrenciDeposu>();\n\n            var kayitBasariliMi = ogrenciDeposu.Kaydet(ogrenci);\n            Console.WriteLine(kayitBasariliMi ? \"\u00d6\u011frenci ba\u015far\u0131yla kaydedildi\" : \"\u00d6\u011frenci kaydedilemedi\");\n        }\n    }\n}<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Geldi\u011fimiz noktada neden b\u00f6ylesi bir patikay\u0131 tercih etti\u011fimiz sorusu akl\u0131n\u0131za gelebilir. Basit; amac\u0131m\u0131z projenin h\u0131zla ilerleyebilmesi. Bunun i\u00e7in de birden fazla ki\u015finin ayn\u0131 anda \u00e7al\u0131\u015fabilmesi gerekir. Yani i\u015f mant\u0131\u011f\u0131 kodlar\u0131 geli\u015ftirilirken paralelde \u00f6ny\u00fczlerde beklenmeden geli\u015ftirilmeli, test edilmeli. Ancak bu sayede ekip \u00fcyelerinin hepsi tam zamanl\u0131 ve y\u00fcksek verimli olarak kullan\u0131labilir. Bak\u0131n, i\u015f mant\u0131\u011f\u0131na dair bir sat\u0131r kod yazmad\u0131k; ama bunu beklemeye gerek kalmaks\u0131z\u0131n \u00f6ny\u00fcz geli\u015ftirebildik. \u0130\u015f mant\u0131\u011f\u0131 taraf\u0131nda her \u015feyin do\u011fru yap\u0131ld\u0131\u011f\u0131n\u0131 varsayd\u0131k\u2026<\/p>\n\n\n\n<p>&nbsp;&nbsp; Ok. Diyelim ki \u00f6ny\u00fcz geli\u015ftirilirken bir ba\u015fka ekip \u00fcyesi de i\u015f mant\u0131\u011f\u0131n\u0131 geli\u015ftirmeye ba\u015flad\u0131. Hemen solution\u2019a yeni bir proje daha ekleyelim. Projemiz <b>Enterprisecoding.DIOrnek.Domain.Imp<\/b> ad\u0131yla yine bir s\u0131n\u0131f k\u00fct\u00fcphanesi olsun. Yeni projemize domain\u2019imizin referans\u0131n\u0131 ekleyelim. Moq projesinden farkl\u0131 olarak bu defa ger\u00e7ekten i\u015f mant\u0131\u011f\u0131n\u0131 da yazal\u0131m;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2014\/08\/ImpProjesi.png\"><img decoding=\"async\" src=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2014\/08\/ImpProjesi_thumb.png\" alt=\"Imp projesi\"\/><\/a><\/figure>\n\n\n\n<p>&nbsp;&nbsp; Yine bu projede de bir Modul s\u0131n\u0131f\u0131 olu\u015fturup NinjectModule\u2019den t\u00fcretelim;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">using Com.Enterprisecoding.DIOrnek.Domain.Depo;\nusing Com.Enterprisecoding.DIOrnek.Domain.Imp.Depo;\nusing Ninject.Modules;\n\nnamespace Com.Enterprisecoding.DIOrnek.Domain.Imp {\n    public sealed class Modul : NinjectModule {\n        public override void Load() {\n            Bind&lt;IGunlukDeposu>().To&lt;GunlukDeposu>().InSingletonScope();\n            Bind&lt;IOgrenciDeposu>().To&lt;OgrenciDeposu>().InSingletonScope();\n            Bind&lt;IVeriDeposu>().To&lt;VeriDeposu>().InSingletonScope();\n\n        }\n    }\n}<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Bu defa her \u015fey ger\u00e7ek oldu\u011fu i\u00e7in i\u015fimiz daha kolay. Singleton ba\u011flam\u0131 ile ilgili aray\u00fczlere t\u00fcr ba\u011flamas\u0131 yapt\u0131m. Geli\u015ftirme s\u00fcrecinde testlerimi normal \u015fekilde yapt\u0131m.<\/p>\n\n\n\n<p>&nbsp;&nbsp; T\u00fcm bunlar ard\u0131ndan geriye d\u00f6n\u00fcp bakt\u0131\u011f\u0131m\u0131zda elimizde sahte s\u0131n\u0131flar \u00fczerinden geli\u015ftirdi\u011fimiz bir aray\u00fcz\u00fcm\u00fcz ve Domain\u2019imizin ger\u00e7ek implemantasyonu var; fakat hen\u00fcz bu ikisi birle\u015fik de\u011fil. \u0130\u015fin g\u00fczel taraf\u0131 birle\u015ftirmek i\u00e7in yapmam\u0131z gereken tek \u015fey konsol uygulamas\u0131nda art\u0131k yeni mod\u00fcl\u00fc y\u00fcklemek;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">kernel.Load(\"DIOrnek.Domain.Imp.dll\");<\/pre>\n\n\n\n<p>&nbsp;&nbsp; Bu kadar basit\u2026 Hatta daha \u00f6nceden sizlerle payla\u015ft\u0131\u011f\u0131m y\u00f6ntemlerle gidecek olursak, bu \u015fekilde hard-coded bir y\u00fckleme yerine dinamik olarak ilerleyebilmemiz de m\u00fcmk\u00fcn. \u00d6nemli olan konsol projenizde hi\u00e7bir \u015fekilde implemantasyon projelerine dair bir referans bulunmamas\u0131. Yani konsol uygulaman\u0131z\u0131n i\u015f mant\u0131\u011f\u0131n\u0131 (<em>nas\u0131l\u2019\u0131<\/em>) bilmemesi&#8230; Gev\u015fek ba\u011fl\u0131 bir tasar\u0131m\u0131n meyvesi i\u00e7in tam da bu noktada, bir implemantasyon ba\u015fka bir implemantasyona ger\u00e7erken al\u0131nacakt\u0131r. \u00d6rne\u011fimizi basit tutmak ad\u0131na kodu hard-coded \u015fekilde sade yazmay\u0131 tercih ettim.<\/p>\n\n\n\n<p>&nbsp;&nbsp; G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi uygulamam\u0131 gev\u015fek ba\u011fl\u0131 olarak tasarlam\u0131\u015f olmak bana ayn\u0131 anda t\u00fcm ekip \u00fcyelerimi kullanabilmeyi sa\u011flad\u0131. Bu da projenin daha k\u0131sa s\u00fcrede tamamlanmas\u0131 anlam\u0131na gelecektir. Daha esnek olma konusuna geldi\u011fimizde ise\u2026 \u00f6rne\u011fimizden devam edelim;<\/p>\n\n\n\n<p>&nbsp;&nbsp; Varsayal\u0131m ki uygulaman\u0131z\u0131 satt\u0131n\u0131z. Hatta o kadar ba\u015far\u0131l\u0131 oldu ki onlarca, y\u00fczlerce m\u00fc\u015fteriniz var. Bir sorununuz var; ba\u015fta \u00f6n g\u00f6rmedi\u011finiz kadar yo\u011fun kullan\u0131l\u0131yor ve performans\u0131n\u0131n artt\u0131r\u0131lmas\u0131 \u015fart. Bu noktada tek yapaca\u011f\u0131n\u0131z daha \u00f6nceden text dosyalar\u0131 ile i\u015flem yapan versiyonu veritaban\u0131 ile i\u015flem yapan ile de\u011fi\u015ftirmek. Ayn\u0131 Moq versiyonu yerine Imp versiyonunu kullanmak gibi. Hi\u00e7bir fark\u0131 yok. Hemen <b>Enterprisecoding.DIOrnek.Domain.DB<\/b> ad\u0131yla yeni bir proje a\u00e7\u0131p i\u015fe koyulabilirsiniz. \u0130\u015finiz bitti\u011finde tek yapman\u0131z gereken daha \u00f6nce oldu\u011fu gibi yeni mod\u00fcl\u00fcn y\u00fcklenmesini sa\u011flamak.<\/p>\n\n\n\n<p><strong>Pro Tip;<\/strong><\/p>\n\n\n\n<p>&nbsp;&nbsp; Yukar\u0131da sizlerle payla\u015ft\u0131\u011f\u0131m bu tasar\u0131m ile ilgili g\u00f6rd\u00fc\u011f\u00fcm en \u00f6nemli yanl\u0131\u015fl\u0131k domain\u2019in do\u011fru ve ayr\u0131lm\u0131\u015f \u015fekilde tasarlanmam\u0131\u015f olmas\u0131d\u0131r. Domain\u2019inizin i\u015f modelini do\u011fru yans\u0131tmamas\u0131 er ya da ge\u00e7 duvara toslaman\u0131za neden olacakt\u0131r. Bu \u00e7arpan\u0131n \u015fiddeti ise projenizin b\u00fcy\u00fckl\u00fc\u011f\u00fc ile do\u011fru orant\u0131l\u0131 olacakt\u0131r.<\/p>\n\n\n\n<p>&nbsp;&nbsp; Domain\u2019inizin do\u011fru \u015fekilde ayr\u0131lmam\u0131\u015f olmas\u0131, i\u015f mant\u0131\u011f\u0131 kodlar\u0131\/k\u00fct\u00fcphaneleri ile \u00e7ok i\u00e7li-d\u0131\u015fl\u0131 olmas\u0131 (<em>yani ba\u011f\u0131ml\u0131 olmas\u0131<\/em>) ileryen zamanlarda az \u00f6nce \u00f6rnekledi\u011fim implemantasyon ge\u00e7i\u015flerinde kesinlikle problem olacakt\u0131r. Asla unutmay\u0131n; domain implemantasyonu s\u0131ras\u0131nda kulland\u0131\u011f\u0131n\u0131z bir pdf k\u00fct\u00fcphanesine ait s\u0131n\u0131f\u0131n Domain modelinizde bir\/birka\u00e7 fonksiyonda parametre olarak kullan\u0131lmas\u0131 sizin bir ba\u015fka pdf k\u00fct\u00fcphanesine ge\u00e7i\u015finizi imkans\u0131z hale getirebilir.<\/p>\n\n\n\n<p><strong>Kaynak Kod;<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2014\/08\/Download.png\" alt=\"Download\"\/><\/figure>\n\n\n\n<p>Bu makalemde payla\u015ft\u0131\u011f\u0131m solution kodlar\u0131n\u0131 Github respository\u2019si \u00fczerinden inceleyebilir &amp; indirebilirsiniz : <a title=\"https:\/\/github.com\/fatihboy\/DIOrnek\" href=\"https:\/\/github.com\/fatihboy\/DIOrnek\">https:\/\/github.com\/fatihboy\/DIOrnek<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>&nbsp;&nbsp; Dependency Injection makele serisinde geldi\u011fimiz noktada s\u0131ra geldi bir solution \u00fczerinden konuyu \u00f6rneklemeye. Asl\u0131nda, bu makalemde payla\u015facaklar\u0131m \u00f6rneklemeden \u00f6te olacak. Amac\u0131m i\u015f hayat\u0131n\u0131zda kullanabilece\u011finiz bir yakla\u015f\u0131m, bir metodolojiyi sizlerle payla\u015fmak. Bu sebeple dikkatle okuman\u0131z\u0131 tavsiye ederim. \u00d6ncelikle, gev\u015fek ba\u011fl\u0131 (loosely coupled) uygulamalar geli\u015ftirmenin ne kadar \u00f6nemli oldu\u011funu bir kez daha hat\u0131rlatmak isterim. Hatta \u00f6nemli&#8230;<\/p>\n<p><a class=\"read-more\" href=\"https:\/\/fatihboy.com\/en\/profesyonel-projelerimizde-dependency-injection-yaklasimi\/\">Read More<\/a><\/p>","protected":false},"author":1,"featured_media":33719,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[77,28],"tags":[315],"class_list":["post-33718","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-csharp","category-turkce","tag-dependency-injection"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.7 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Profesyonel Projelerimizde Dependency Injection Yakla\u015f\u0131m\u0131 - Fatih Boy<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihboy.com\/en\/profesyonel-projelerimizde-dependency-injection-yaklasimi\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Profesyonel Projelerimizde Dependency Injection Yakla\u015f\u0131m\u0131 - Fatih Boy\" \/>\n<meta property=\"og:description\" content=\"&nbsp;&nbsp; Dependency Injection makele serisinde geldi\u011fimiz noktada s\u0131ra geldi bir solution \u00fczerinden konuyu \u00f6rneklemeye. Asl\u0131nda, bu makalemde payla\u015facaklar\u0131m \u00f6rneklemeden \u00f6te olacak. Amac\u0131m i\u015f hayat\u0131n\u0131zda kullanabilece\u011finiz bir yakla\u015f\u0131m, bir metodolojiyi sizlerle payla\u015fmak. Bu sebeple dikkatle okuman\u0131z\u0131 tavsiye ederim. \u00d6ncelikle, gev\u015fek ba\u011fl\u0131 (loosely coupled) uygulamalar geli\u015ftirmenin ne kadar \u00f6nemli oldu\u011funu bir kez daha hat\u0131rlatmak isterim. Hatta \u00f6nemli...Read More\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihboy.com\/en\/profesyonel-projelerimizde-dependency-injection-yaklasimi\/\" \/>\n<meta property=\"og:site_name\" content=\"Fatih Boy\" \/>\n<meta property=\"article:published_time\" content=\"2014-08-06T16:37:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-06-22T08:03:12+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/fatihboy.com\/wp-content\/uploads\/2021\/06\/business.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1800\" \/>\n\t<meta property=\"og:image:height\" content=\"1200\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Fatih Boy\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Boy\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihboy.com\/profesyonel-projelerimizde-dependency-injection-yaklasimi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihboy.com\/profesyonel-projelerimizde-dependency-injection-yaklasimi\/\"},\"author\":{\"name\":\"Fatih Boy\",\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158\"},\"headline\":\"Profesyonel Projelerimizde Dependency Injection Yakla\u015f\u0131m\u0131\",\"datePublished\":\"2014-08-06T16:37:00+00:00\",\"dateModified\":\"2021-06-22T08:03:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihboy.com\/profesyonel-projelerimizde-dependency-injection-yaklasimi\/\"},\"wordCount\":1588,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158\"},\"image\":{\"@id\":\"https:\/\/fatihboy.com\/profesyonel-projelerimizde-dependency-injection-yaklasimi\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/fatihboy.com\/wp-content\/uploads\/2021\/06\/business.jpg\",\"keywords\":[\"Dependency Injection\"],\"articleSection\":[\"C#\",\"T\u00fcrk\u00e7e\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihboy.com\/profesyonel-projelerimizde-dependency-injection-yaklasimi\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihboy.com\/profesyonel-projelerimizde-dependency-injection-yaklasimi\/\",\"url\":\"https:\/\/fatihboy.com\/profesyonel-projelerimizde-dependency-injection-yaklasimi\/\",\"name\":\"Profesyonel Projelerimizde Dependency Injection Yakla\u015f\u0131m\u0131 - Fatih Boy\",\"isPartOf\":{\"@id\":\"https:\/\/fatihboy.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/fatihboy.com\/profesyonel-projelerimizde-dependency-injection-yaklasimi\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/fatihboy.com\/profesyonel-projelerimizde-dependency-injection-yaklasimi\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/fatihboy.com\/wp-content\/uploads\/2021\/06\/business.jpg\",\"datePublished\":\"2014-08-06T16:37:00+00:00\",\"dateModified\":\"2021-06-22T08:03:12+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihboy.com\/profesyonel-projelerimizde-dependency-injection-yaklasimi\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihboy.com\/profesyonel-projelerimizde-dependency-injection-yaklasimi\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fatihboy.com\/profesyonel-projelerimizde-dependency-injection-yaklasimi\/#primaryimage\",\"url\":\"https:\/\/fatihboy.com\/wp-content\/uploads\/2021\/06\/business.jpg\",\"contentUrl\":\"https:\/\/fatihboy.com\/wp-content\/uploads\/2021\/06\/business.jpg\",\"width\":1800,\"height\":1200},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihboy.com\/profesyonel-projelerimizde-dependency-injection-yaklasimi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/fatihboy.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Profesyonel Projelerimizde Dependency Injection Yakla\u015f\u0131m\u0131\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihboy.com\/#website\",\"url\":\"https:\/\/fatihboy.com\/\",\"name\":\"Fatih Boy\",\"description\":\"Ki\u015fisel Web Sitesi\",\"publisher\":{\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihboy.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158\",\"name\":\"Fatih Boy\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/5b3de123ad95a2ffe30b75a54cee98b55f65185c6d6805b35088a3d945f2feb4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/5b3de123ad95a2ffe30b75a54cee98b55f65185c6d6805b35088a3d945f2feb4?s=96&d=mm&r=g\",\"caption\":\"Fatih Boy\"},\"logo\":{\"@id\":\"https:\/\/fatihboy.com\/#\/schema\/person\/image\/\"},\"sameAs\":[\"https:\/\/fatihboy.com\"],\"url\":\"https:\/\/fatihboy.com\/en\/author\/fatih\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Profesyonel Projelerimizde Dependency Injection Yakla\u015f\u0131m\u0131 - Fatih Boy","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:\/\/fatihboy.com\/en\/profesyonel-projelerimizde-dependency-injection-yaklasimi\/","og_locale":"en_US","og_type":"article","og_title":"Profesyonel Projelerimizde Dependency Injection Yakla\u015f\u0131m\u0131 - Fatih Boy","og_description":"&nbsp;&nbsp; Dependency Injection makele serisinde geldi\u011fimiz noktada s\u0131ra geldi bir solution \u00fczerinden konuyu \u00f6rneklemeye. Asl\u0131nda, bu makalemde payla\u015facaklar\u0131m \u00f6rneklemeden \u00f6te olacak. Amac\u0131m i\u015f hayat\u0131n\u0131zda kullanabilece\u011finiz bir yakla\u015f\u0131m, bir metodolojiyi sizlerle payla\u015fmak. Bu sebeple dikkatle okuman\u0131z\u0131 tavsiye ederim. \u00d6ncelikle, gev\u015fek ba\u011fl\u0131 (loosely coupled) uygulamalar geli\u015ftirmenin ne kadar \u00f6nemli oldu\u011funu bir kez daha hat\u0131rlatmak isterim. Hatta \u00f6nemli...Read More","og_url":"https:\/\/fatihboy.com\/en\/profesyonel-projelerimizde-dependency-injection-yaklasimi\/","og_site_name":"Fatih Boy","article_published_time":"2014-08-06T16:37:00+00:00","article_modified_time":"2021-06-22T08:03:12+00:00","og_image":[{"width":1800,"height":1200,"url":"https:\/\/fatihboy.com\/wp-content\/uploads\/2021\/06\/business.jpg","type":"image\/jpeg"}],"author":"Fatih Boy","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Fatih Boy","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihboy.com\/profesyonel-projelerimizde-dependency-injection-yaklasimi\/#article","isPartOf":{"@id":"https:\/\/fatihboy.com\/profesyonel-projelerimizde-dependency-injection-yaklasimi\/"},"author":{"name":"Fatih Boy","@id":"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158"},"headline":"Profesyonel Projelerimizde Dependency Injection Yakla\u015f\u0131m\u0131","datePublished":"2014-08-06T16:37:00+00:00","dateModified":"2021-06-22T08:03:12+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihboy.com\/profesyonel-projelerimizde-dependency-injection-yaklasimi\/"},"wordCount":1588,"commentCount":0,"publisher":{"@id":"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158"},"image":{"@id":"https:\/\/fatihboy.com\/profesyonel-projelerimizde-dependency-injection-yaklasimi\/#primaryimage"},"thumbnailUrl":"https:\/\/fatihboy.com\/wp-content\/uploads\/2021\/06\/business.jpg","keywords":["Dependency Injection"],"articleSection":["C#","T\u00fcrk\u00e7e"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihboy.com\/profesyonel-projelerimizde-dependency-injection-yaklasimi\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/fatihboy.com\/profesyonel-projelerimizde-dependency-injection-yaklasimi\/","url":"https:\/\/fatihboy.com\/profesyonel-projelerimizde-dependency-injection-yaklasimi\/","name":"Profesyonel Projelerimizde Dependency Injection Yakla\u015f\u0131m\u0131 - Fatih Boy","isPartOf":{"@id":"https:\/\/fatihboy.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/fatihboy.com\/profesyonel-projelerimizde-dependency-injection-yaklasimi\/#primaryimage"},"image":{"@id":"https:\/\/fatihboy.com\/profesyonel-projelerimizde-dependency-injection-yaklasimi\/#primaryimage"},"thumbnailUrl":"https:\/\/fatihboy.com\/wp-content\/uploads\/2021\/06\/business.jpg","datePublished":"2014-08-06T16:37:00+00:00","dateModified":"2021-06-22T08:03:12+00:00","breadcrumb":{"@id":"https:\/\/fatihboy.com\/profesyonel-projelerimizde-dependency-injection-yaklasimi\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihboy.com\/profesyonel-projelerimizde-dependency-injection-yaklasimi\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fatihboy.com\/profesyonel-projelerimizde-dependency-injection-yaklasimi\/#primaryimage","url":"https:\/\/fatihboy.com\/wp-content\/uploads\/2021\/06\/business.jpg","contentUrl":"https:\/\/fatihboy.com\/wp-content\/uploads\/2021\/06\/business.jpg","width":1800,"height":1200},{"@type":"BreadcrumbList","@id":"https:\/\/fatihboy.com\/profesyonel-projelerimizde-dependency-injection-yaklasimi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/fatihboy.com\/"},{"@type":"ListItem","position":2,"name":"Profesyonel Projelerimizde Dependency Injection Yakla\u015f\u0131m\u0131"}]},{"@type":"WebSite","@id":"https:\/\/fatihboy.com\/#website","url":"https:\/\/fatihboy.com\/","name":"Fatih Boy","description":"Ki\u015fisel Web Sitesi","publisher":{"@id":"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihboy.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihboy.com\/#\/schema\/person\/6b06a41d42eed36eaa0780fbeb774158","name":"Fatih Boy","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fatihboy.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/5b3de123ad95a2ffe30b75a54cee98b55f65185c6d6805b35088a3d945f2feb4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5b3de123ad95a2ffe30b75a54cee98b55f65185c6d6805b35088a3d945f2feb4?s=96&d=mm&r=g","caption":"Fatih Boy"},"logo":{"@id":"https:\/\/fatihboy.com\/#\/schema\/person\/image\/"},"sameAs":["https:\/\/fatihboy.com"],"url":"https:\/\/fatihboy.com\/en\/author\/fatih\/"}]}},"brizy_media":[],"_links":{"self":[{"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/posts\/33718","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/comments?post=33718"}],"version-history":[{"count":1,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/posts\/33718\/revisions"}],"predecessor-version":[{"id":33720,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/posts\/33718\/revisions\/33720"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/media\/33719"}],"wp:attachment":[{"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/media?parent=33718"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/categories?post=33718"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihboy.com\/en\/wp-json\/wp\/v2\/tags?post=33718"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}