{"id":2847,"date":"2019-10-26T23:04:58","date_gmt":"2019-10-26T20:04:58","guid":{"rendered":"https:\/\/gokhan-gokalp.com\/?p=2847"},"modified":"2019-10-27T12:20:10","modified_gmt":"2019-10-27T09:20:10","slug":"getting-started-with-clean-architecture-using-asp-net-core-01","status":"publish","type":"post","link":"https:\/\/gokhan-gokalp.com\/tr\/getting-started-with-clean-architecture-using-asp-net-core-01\/","title":{"rendered":"Getting Started with Clean Architecture using ASP.NET Core &#8211; 01"},"content":{"rendered":"<p>Biliyoruz ki <strong>maintenance<\/strong> i\u015flemi, uygulaman\u0131n kendisini yazmaktan her zaman daha maliyetli bir operasyondur. Her ne yaparsak yapal\u0131m, de\u011fi\u015fmeyen tek ger\u00e7ek maintenance maliyetidir, de\u011fil mi?<\/p>\n<p><a href=\"\/wp-content\/uploads\/2019\/09\/cost_main.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2852 lazyload\" data-src=\"\/wp-content\/uploads\/2019\/09\/cost_main.jpg\" alt=\"\" width=\"1285\" height=\"450\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/09\/cost_main.jpg 1285w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/09\/cost_main-300x105.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/09\/cost_main-768x269.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/09\/cost_main-1024x359.jpg 1024w\" data-sizes=\"(max-width: 1285px) 100vw, 1285px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1285px; --smush-placeholder-aspect-ratio: 1285\/450;\" \/><\/a><\/p>\n<p>Bu maliyeti etkileyen en \u00f6nemli etkenlerden birisi de, uygulaman\u0131n architecture&#8217;\u0131n\u0131n se\u00e7imidir. Edindi\u011fim ge\u00e7mi\u015f tecr\u00fcbelerim do\u011frultusunda iki farkl\u0131 makale serisi olarak, &#8220;<em>iyi bir architecture design edebilmek i\u00e7in nelere dikkat etmeliyiz<\/em>&#8221; ve &#8220;<em>clean architecture nedir<\/em>&#8221; konular\u0131na de\u011finmeye \u00e7al\u0131\u015faca\u011f\u0131m.<\/p>\n<p>Peki,<\/p>\n<p>\u2015 <em>Robert C. Martin<\/em>, iyi bir architecture&#8217;\u0131 <strong>Clean Architecture<\/strong> kitab\u0131nda, a\u015fa\u011f\u0131daki gibi tan\u0131mlamaktad\u0131r;<\/p>\n<blockquote><p><em>Good architecture makes the system easy to <strong>understand<\/strong>, easy to <strong>develop<\/strong>, easy to <strong>maintain<\/strong>, and easy to <strong>deploy<\/strong>. The ultimate goal is to minimize the lifetime cost of the system and to maximize programmer productivity.<\/em><\/p><\/blockquote>\n<p>Zaten bir architecture design ederken temel gayelerimiz de bunlard\u0131r, de\u011fil mi? San\u0131r\u0131m clean architecture&#8217;\u0131n \u00f6nemi, bu gayeler ile ba\u015fl\u0131yor. Bana g\u00f6re iyi bir architecture design edebilmek i\u00e7in dikkat etmemiz gereken ba\u015fl\u0131ca iki temel kavram bulunmaktad\u0131r. &#8220;<em>Coupling<\/em>&#8221; ve &#8220;<em>Separation of Concerns<\/em>&#8221; kavramlar\u0131.<\/p>\n<p>Haydi hat\u0131rlayal\u0131m&#8230;<\/p>\n<h2>Coupling<\/h2>\n<p>K\u0131saca coupling&#8217;in tan\u0131m\u0131n\u0131 hat\u0131rlayal\u0131m. Coupling i\u00e7in, mod\u00fcller aras\u0131ndaki ba\u011f\u0131ml\u0131l\u0131klar\u0131n derecesinin bir \u00f6l\u00e7\u00fct\u00fcd\u00fcr diyebiliriz.<\/p>\n<p>Bildi\u011fimiz gibi genelde bunu ise, <strong>loosely coupling<\/strong> ve <strong>tightly coupling<\/strong> olarak ele al\u0131r\u0131z. \u0130yi bir architecture&#8217;a sahip uygulama geli\u015ftirmek istiyorsak, uygulamam\u0131z\u0131\/mod\u00fcllerimizi loosely coupled olarak geli\u015ftirmemiz gerekmektedir.<\/p>\n<p>\u00d6zetle, mod\u00fcllerimiz birbirlerine &#8220;s\u0131k\u0131 s\u0131k\u0131ya&#8221; ba\u011fl\u0131 olmamal\u0131d\u0131rlar. &#8220;Geni\u015fletilebilir&#8221; ve kolayl\u0131kla &#8220;de\u011fi\u015ftirilebilir&#8221; olmal\u0131d\u0131rlar.<\/p>\n<h2>Separation of Concerns (SoC)<\/h2>\n<p>Bir di\u011fer \u00f6nemli kavram ise separation of concerns(<em><a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/architecture\/modern-web-apps-azure\/architectural-principles?WT.mc_id=DT-MVP-5003382\" target=\"_blank\" rel=\"noopener noreferrer\">SoC<\/a>)<\/em>. Buradaki temel hedef, design veya kod taraf\u0131ndaki farkl\u0131 concern&#8217;lerin ayn\u0131 yerde handle edilmeye \u00e7al\u0131\u015f\u0131lmas\u0131n\u0131 engellemektir. Bu konu asl\u0131nda, <em>SOLID<\/em> prensiplerinden birisi olan &#8220;<em>Single Responsibility<\/em>&#8221; prensibi ile olduk\u00e7a ilgilidir.<\/p>\n<p>\u00d6rne\u011fin, business logic i\u00e7erisinde data access i\u015flemlerini de handle etmek veya <em>UI<\/em> representation i\u015flemlerini de ger\u00e7ekle\u015ftirmek gibi d\u00fc\u015f\u00fcnebiliriz. Bir s\u00fcre sonra ortaya binlerce sat\u0131rl\u0131k <strong>god class&#8217;lar<\/strong> ve <strong>spagetti kodlar<\/strong> \u00e7\u0131kmaya ba\u015fl\u0131yor.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2019\/09\/pasta.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2859 lazyload\" data-src=\"\/wp-content\/uploads\/2019\/09\/pasta.png\" alt=\"\" width=\"800\" height=\"400\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/09\/pasta.png 800w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/09\/pasta-300x150.png 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/09\/pasta-768x384.png 768w\" data-sizes=\"(max-width: 800px) 100vw, 800px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 800px; --smush-placeholder-aspect-ratio: 800\/400;\" \/><\/a><\/p>\n<blockquote><p><em>San\u0131r\u0131m spagetti sadece bir besin \u00f6\u011fesi iken g\u00fczel.<\/em><\/p><\/blockquote>\n<p>Bu tarz i\u015flemler, <em>SoC<\/em>&#8216;\u00fc ihlal etmektedir. Hat\u0131rlayal\u0131m, iyi bir architecture, kolay &#8220;maintain&#8221; edilebilmeli, daha az &#8220;coupled&#8221; ve kolayca &#8220;extend&#8221; edilebiliyor olmal\u0131d\u0131r.<\/p>\n<p><em>SoC<\/em>, \u00f6zellikle layered bir architecture design edebilmek i\u00e7in olduk\u00e7a \u00f6nemli bir kavramd\u0131r. Mod\u00fcllerimizin olabildi\u011fince loosely coupled ve <strong>high cohesion<\/strong> olmas\u0131na dikkat etmeliyiz. \u0130\u00e7lerindeki sorumluluk ili\u015fkisi olabildi\u011fince <strong>y\u00fcksek<\/strong> ve <strong>alakal\u0131<\/strong> olmal\u0131d\u0131r, farkl\u0131 concern&#8217;ler ile ilgilenmemelidirler.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2019\/09\/cohesion.jpg\"><img decoding=\"async\" class=\"aligncenter wp-image-2857 lazyload\" data-src=\"\/wp-content\/uploads\/2019\/09\/cohesion.jpg\" alt=\"\" width=\"584\" height=\"305\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/09\/cohesion.jpg 731w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/09\/cohesion-300x157.jpg 300w\" data-sizes=\"(max-width: 584px) 100vw, 584px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 584px; --smush-placeholder-aspect-ratio: 584\/305;\" \/><\/a><\/p>\n<h2>Layered Architecture<\/h2>\n<p>Layered architecture, biz yaz\u0131l\u0131mc\u0131lar\u0131n hayat\u0131nda b\u00fcy\u00fck bir yere sahiptir san\u0131r\u0131m. En az\u0131ndan benim i\u00e7in \u00f6yle.<\/p>\n<p>Layered architecture arkas\u0131ndaki ana prensip&#8217;lerden birisi, <em>SoC<\/em>&#8216;d\u00fcr. Hedef ise database, domain veya <em>UI<\/em> code&#8217;unun birbirlerine kar\u0131\u015fmas\u0131n\u0131 engellemek ve sorumluluklar\u0131n\u0131 ay\u0131rmakt\u0131r.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2019\/09\/nlayered.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2862 lazyload\" data-src=\"\/wp-content\/uploads\/2019\/09\/nlayered.jpg\" alt=\"\" width=\"273\" height=\"463\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/09\/nlayered.jpg 273w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/09\/nlayered-177x300.jpg 177w\" data-sizes=\"(max-width: 273px) 100vw, 273px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 273px; --smush-placeholder-aspect-ratio: 273\/463;\" \/><\/a><\/p>\n<p>Layered architecture genelde, yukar\u0131daki gibi bir form&#8217;da kar\u015f\u0131m\u0131za gelmektedir. Buradaki dependency ak\u0131\u015f\u0131 ise, presentation&#8217;dan, data access layer&#8217;a do\u011frudur. Asl\u0131nda bakarsan\u0131z, her ne kadar <em>SoC<\/em>&#8216;\u00fc ve loosely coupling&#8217;i sa\u011flamaya \u00e7al\u0131\u015f\u0131yor olsak da, layer&#8217;lar aras\u0131nda bir hiyerar\u015fi, dependency s\u00f6z konusudur.<\/p>\n<p>Clean architecture&#8217;\u0131n arkas\u0131ndaki ana prensip&#8217;lerden birisi ise, <em>Dependency Inversion<\/em> prensibidir. Bu prensip ile mimari i\u00e7erisindeki mod\u00fcllerimizi birbirinden ve farkl\u0131 teknolojilerden daha <strong>decoupled<\/strong> bir hale getirebilmek m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2019\/10\/clean_architecture.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2899 lazyload\" data-src=\"\/wp-content\/uploads\/2019\/10\/clean_architecture.jpg\" alt=\"\" width=\"752\" height=\"533\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/10\/clean_architecture.jpg 752w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/10\/clean_architecture-300x213.jpg 300w\" data-sizes=\"(max-width: 752px) 100vw, 752px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 752px; --smush-placeholder-aspect-ratio: 752\/533;\" \/><\/a><\/p>\n<p>G\u00f6rsele bir de bu \u015fekilde bakal\u0131m.<\/p>\n<p><em>Uncle Bob<\/em>&#8216;un &#8220;Clean Architecture&#8221; olarak adland\u0131rd\u0131\u011f\u0131 concept veya <em>Alistair Cockburn<\/em>&#8216;un &#8220;Hexagonal Architecture&#8221; olarak adland\u0131rd\u0131\u011f\u0131 design yukar\u0131daki gibidir. Dependency inversion uygulanm\u0131\u015f, domain-centric bir design.<\/p>\n<p>Yukar\u0131dan a\u015fa\u011f\u0131ya do\u011fru hiyerar\u015fik bir ak\u0131\u015f yerine, application domain&#8217;i, yani business logic ve domain modellerin i\u00e7erisinde bar\u0131nd\u0131\u011f\u0131 b\u00f6l\u00fcm\u00fc core olarak ortada konumland\u0131rmaktad\u0131r. Ayr\u0131ca di\u011fer t\u00fcm mod\u00fcllerin ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 da tersine \u00e7evirmektedir. Dependency ak\u0131\u015f\u0131 ise her zaman ortaya, yani core k\u0131sma do\u011fru ger\u00e7ekle\u015fmektedir. Plug-in yap\u0131s\u0131 gibi d\u00fc\u015f\u00fcnebiliriz. Tak, \u00e7\u0131kart.<\/p>\n<p>Bu yakla\u015f\u0131m ise bize, herhangi bir par\u00e7ay\u0131 istedi\u011fimiz gibi kolayl\u0131kla extend edebilme, test edebilme ve de\u011fi\u015ftirebilme yeteneklerini kazand\u0131rmaktad\u0131r.<\/p>\n<h2>Neden Clean Architecture?<\/h2>\n<ol>\n<li><strong>De\u011fi\u015ftirilmesi zor:\u00a0<\/strong>Business ihtiya\u00e7lar\u0131 genelde bitmez. Her zaman uygulamam\u0131za yeni \u00f6zellikler eklemeye ihtiya\u00e7 duyar\u0131z. E\u011fer d\u00fczg\u00fcn bir architecture in\u015fa etmez isek, bu de\u011fi\u015fiklikleri implemente etmemiz hem zorla\u015facak, hem de projeyi daha karma\u015f\u0131k bir hale getirecektir. Ayr\u0131ca projeyi maintain edilebilmesi zor ve k\u0131r\u0131lganl\u0131\u011f\u0131 fazla bir yap\u0131ya do\u011fru itmi\u015f olabiliriz.<\/li>\n<li><strong>Test etmesi zor:<\/strong> \u0130yi in\u015fa edilmemi\u015f bir architecture&#8217;da, test edilebilirlik bi o kadar zordur. Ya business logic her tarafa duplicate bir \u015fekilde yay\u0131lm\u0131\u015ft\u0131r, ya <em>UI<\/em> ile i\u00e7 i\u00e7e ge\u00e7mi\u015ftir, yada component&#8217;ler birbirlerine s\u0131k\u0131 s\u0131k\u0131ya ba\u011fl\u0131d\u0131r. K\u0131r\u0131lganl\u0131k \u00e7ok fazla olunca, geni\u015fletilebilirlik de zorla\u015f\u0131yor ve yapt\u0131\u011f\u0131m\u0131z bir de\u011fi\u015fikli\u011fin nereleri etkiledi\u011fini g\u00f6rebilme ve test edebilme i\u015flemlerimiz de zorla\u015f\u0131yor.<\/li>\n<li><strong>Database&#8217;lerden, framework&#8217;lerden ve external library&#8217;lerden ba\u011f\u0131ms\u0131zl\u0131k<\/strong>: Bir di\u011fer \u00f6nemli konu ise, core application domain layer&#8217;\u0131n database&#8217;lerden, framework&#8217;lerden veya external librirary&#8217;lerden olabildi\u011fince soyut tutabilmektir. Buda bize, istedi\u011fimiz bir zaman farkl\u0131 bir y\u00f6ntemle, farkl\u0131 bir framework&#8217;le ilerleyebilme, yani flexibility yetene\u011fini kazand\u0131racakt\u0131r.<\/li>\n<\/ol>\n<p><a href=\"\/wp-content\/uploads\/2019\/09\/clean-architecture-ex-1.jpeg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2867 lazyload\" data-src=\"\/wp-content\/uploads\/2019\/09\/clean-architecture-ex-1.jpeg\" alt=\"\" width=\"1000\" height=\"750\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/09\/clean-architecture-ex-1.jpeg 1000w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/09\/clean-architecture-ex-1-300x225.jpeg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/09\/clean-architecture-ex-1-768x576.jpeg 768w\" data-sizes=\"(max-width: 1000px) 100vw, 1000px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1000px; --smush-placeholder-aspect-ratio: 1000\/750;\" \/><\/a><\/p>\n<blockquote><p><em>Yukar\u0131daki makas&#8217;\u0131, bir b\u0131\u00e7ak ile yer de\u011fi\u015ftirmeye \u00e7al\u0131\u015ft\u0131\u011f\u0131m\u0131z\u0131 d\u00fc\u015f\u00fcnebiliyor musunuz?<\/em><\/p><\/blockquote>\n<h2>\u0130yi Bir Architecture&#8217;a Sahip Uygulama Nedir?<\/h2>\n<p>Genelde iyi bir architecture&#8217;a sahip uygulamadan, a\u015fa\u011f\u0131daki concern&#8217;leri cover edebiliyor olmas\u0131n\u0131 bekleriz.<\/p>\n<ol>\n<li><strong>Testability:<\/strong> Geli\u015ftirdi\u011fimiz kod\/component par\u00e7alar\u0131n\u0131n, bireysel olarak her birinin kolayca test edilebilir olmas\u0131 gerekmektedir.<\/li>\n<li><strong>Maintainability:<\/strong> Bildi\u011fimiz gibi her \u015feyden \u00f6nce uygulaman\u0131n s\u00fcrd\u00fcr\u00fclebilir olmas\u0131 b\u00fcy\u00fck bir \u00f6nem ta\u015f\u0131maktad\u0131r. Kolay bir \u015fekilde maintenance i\u015flemlerini ger\u00e7ekle\u015ftirebiliyor olmal\u0131y\u0131z.<\/li>\n<li><strong>Extendability:<\/strong> Mevcut mod\u00fclleri, component&#8217;leri y\u0131kmadan\/de\u011fi\u015ftirmeden, onlar\u0131 kolayl\u0131kla geni\u015fletebiliyor olmal\u0131y\u0131z.<\/li>\n<li><strong>Reusability:<\/strong> Geli\u015ftirmi\u015f oldu\u011fumuz mod\u00fcller, tekrar kullan\u0131labilir olmal\u0131d\u0131r.<\/li>\n<li><strong>Readability:<\/strong> Ekibe yeni bir developer kat\u0131ld\u0131\u011f\u0131nda, kolayca projeye adapte olabilmesi de, di\u011fer maddeler kadar b\u00fcy\u00fck bir \u00f6nem ta\u015f\u0131maktad\u0131r.<\/li>\n<\/ol>\n<p><a href=\"\/wp-content\/uploads\/2019\/09\/clean-architecture-ex-2.jpeg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2869 lazyload\" data-src=\"\/wp-content\/uploads\/2019\/09\/clean-architecture-ex-2.jpeg\" alt=\"\" width=\"1000\" height=\"750\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/09\/clean-architecture-ex-2.jpeg 1000w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/09\/clean-architecture-ex-2-300x225.jpeg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/09\/clean-architecture-ex-2-768x576.jpeg 768w\" data-sizes=\"(max-width: 1000px) 100vw, 1000px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1000px; --smush-placeholder-aspect-ratio: 1000\/750;\" \/><\/a><\/p>\n<blockquote><p><em>Yukar\u0131daki g\u00f6rsele tekrar bakt\u0131\u011f\u0131m\u0131zda di\u011fer aletleri etkilemeden makas&#8217;\u0131, b\u0131\u00e7ak ile\u00a0 de\u011fi\u015ftirebilmenin ne kadar da daha kolay olaca\u011f\u0131n\u0131 g\u00f6rebiliriz.<\/em><\/p><\/blockquote>\n<h2>Clean Architecture Konsepti<\/h2>\n<p>Peki, \u015fimdi clean architecture konsept&#8217;inin detaylar\u0131na bir bakal\u0131m.<\/p>\n<p>\u00d6ncelikle a\u015fa\u011f\u0131da g\u00f6r\u00fcyor oldu\u011fumuz <em>Hexagonal<\/em> architecture, clean architecture konsept&#8217;inin uygulanm\u0131\u015f bir \u00f6rne\u011fidir.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2019\/10\/clean_architecture_2.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2900 lazyload\" data-src=\"\/wp-content\/uploads\/2019\/10\/clean_architecture_2.jpg\" alt=\"\" width=\"752\" height=\"533\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/10\/clean_architecture_2.jpg 752w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/10\/clean_architecture_2-300x213.jpg 300w\" data-sizes=\"(max-width: 752px) 100vw, 752px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 752px; --smush-placeholder-aspect-ratio: 752\/533;\" \/><\/a><\/p>\n<p>&#8220;Application Domain&#8221; layer, en i\u00e7 core layer&#8217;d\u0131r. Architecture&#8217;\u0131n kalbi. Herhangi bir dependency&#8217;si bulunmamaktad\u0131r. Database, <em>UI<\/em> vb. framework&#8217;lerden isolated bir \u015fekilde ortada konumlanmaktad\u0131r. \u0130\u00e7erisinde ba\u015fl\u0131ca <strong>domain entity&#8217;lerini<\/strong>, <strong>use-case&#8217;leri<\/strong> ve <strong>external interface&#8217;leri<\/strong> bar\u0131nd\u0131rmaktad\u0131r.<\/p>\n<p>Etraf\u0131nda ise, &#8220;input&#8221; ve &#8220;output&#8221; port&#8217;lar\u0131 bulunmaktad\u0131r. Etraf\u0131ndaki implementasyon&#8217;lar ise, &#8220;adapter&#8221; olarak adland\u0131r\u0131lmaktad\u0131r. Bu adapt\u00f6r&#8217;ler ise, port&#8217;lar\u0131 implemente etmektedir.<\/p>\n<h3>Entities<\/h3>\n<ul>\n<li>Uygulamam\u0131z\u0131n business objeleridir.<\/li>\n<li>Bu objeler, hi\u00e7 bir de\u011fi\u015fiklikten etkilenmemelidirler.<\/li>\n<\/ul>\n<h3>Use-Cases<\/h3>\n<ul>\n<li>Her bir use-case, business action&#8217;lar\u0131m\u0131z\u0131 temsil etmektedir.<\/li>\n<li>Sistemdeki t\u00fcm business rule&#8217;lar\u0131n\u0131 implemente ve encapsulate ederler.<\/li>\n<li>Her biri, <strong>single responsibility<\/strong> prensibine uymaktad\u0131r. Yani, tek bir concern ile ilgilenmektedir.<\/li>\n<li>Bir use-case i\u00e7erisinde herhangi bir data&#8217;ya ihtiya\u00e7 var ise, &#8220;<em>input<\/em>&#8221; port&#8217;lar\u0131 arac\u0131l\u0131\u011f\u0131 ile al\u0131nmaktad\u0131r. Use-case data&#8217;n\u0131n nereden geldi\u011fi ile ilgilenmez.<\/li>\n<li>Data&#8217;y\u0131 persist etmek veya bir yerlere g\u00f6ndermek i\u00e7in ise, &#8220;<em>output<\/em>&#8221; port&#8217;lar\u0131 kullan\u0131lmaktad\u0131r.<\/li>\n<\/ul>\n<p><a href=\"\/wp-content\/uploads\/2019\/09\/clean_use_cases_1.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2873 lazyload\" data-src=\"\/wp-content\/uploads\/2019\/09\/clean_use_cases_1.png\" alt=\"\" width=\"326\" height=\"477\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/09\/clean_use_cases_1.png 326w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/09\/clean_use_cases_1-205x300.png 205w\" data-sizes=\"(max-width: 326px) 100vw, 326px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 326px; --smush-placeholder-aspect-ratio: 326\/477;\" \/><\/a><\/p>\n<p>\u00d6rne\u011fin yukar\u0131daki project yap\u0131s\u0131na bakarsak, &#8220;<em>Services<\/em>&#8221; klas\u00f6r\u00fc alt\u0131nda sadece &#8220;<em>MovieService<\/em>&#8221; class&#8217;\u0131 bulunmakta. Sizce bu service&#8217;in, ne i\u015f yapt\u0131\u011f\u0131 yeterince a\u00e7\u0131k m\u0131?<\/p>\n<p>Birde use-case yakla\u015f\u0131m\u0131n\u0131n uyguland\u0131\u011f\u0131, single responsible olan service&#8217;lere bir bakal\u0131m.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2019\/09\/clean_usecases_2.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2874 lazyload\" data-src=\"\/wp-content\/uploads\/2019\/09\/clean_usecases_2.jpg\" alt=\"\" width=\"406\" height=\"534\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/09\/clean_usecases_2.jpg 406w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/09\/clean_usecases_2-228x300.jpg 228w\" data-sizes=\"(max-width: 406px) 100vw, 406px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 406px; --smush-placeholder-aspect-ratio: 406\/534;\" \/><\/a><\/p>\n<p>&#8220;<em>MovieUseCases<\/em>&#8221; klas\u00f6r\u00fc alt\u0131nda, &#8220;<em>CreateMovieHandler<\/em>&#8221; ve &#8220;<em>GetBestMoviesForKidsHandler<\/em>&#8221; use-case&#8217;leri bulunmakta. \u015eimdi business use-cases&#8217;lerinin ne oldu\u011fu ve sorumluluklar\u0131 daha a\u00e7\u0131k de\u011fil mi? God classes <em>vs<\/em> single responsible classes.<\/p>\n<h3>Interfaces\/Adapters<\/h3>\n<ul>\n<li>Core layer&#8217;da tan\u0131mlanan interface&#8217;lerin implementasyonlar\u0131d\u0131r.<\/li>\n<li>Data&#8217;y\u0131 persist veya retrive edecek olan bir k\u0131s\u0131m olabilir. &#8220;<em>Domain<\/em>&#8221; ile &#8220;<em>Infrastructure<\/em>&#8221; aras\u0131ndaki bir translator gibi d\u00fc\u015f\u00fcnebiliriz.<\/li>\n<\/ul>\n<p><a href=\"\/wp-content\/uploads\/2019\/09\/clean_architecture_2.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2871 lazyload\" data-src=\"\/wp-content\/uploads\/2019\/09\/clean_architecture_2.jpg\" alt=\"\" width=\"752\" height=\"533\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/09\/clean_architecture_2.jpg 752w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/09\/clean_architecture_2-300x213.jpg 300w\" data-sizes=\"(max-width: 752px) 100vw, 752px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 752px; --smush-placeholder-aspect-ratio: 752\/533;\" \/><\/a><\/p>\n<p>Yukar\u0131daki g\u00f6rsele tekrar bakt\u0131\u011f\u0131m\u0131zda, dependency&#8217;i invert edebilmek i\u00e7in yani ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 ters \u00e7evirebilmek ad\u0131na port&#8217;lar\u0131n, domain layer&#8217;da tan\u0131mlanm\u0131\u015f olan interface&#8217;ler oldu\u011funu g\u00f6rebiliriz.<\/p>\n<p>Etraf\u0131ndakiler ise port&#8217;lar\u0131n implementasyonlar\u0131&#8217;d\u0131r. Yani adapter&#8217;ler. Bu bir &#8220;<em>Infrastructure<\/em>&#8221; k\u0131sm\u0131nda <em>SQL<\/em> Server olabilir, veya bir <em>NoSQL<\/em> implementasyonu olabilir. &#8220;<em>Presentation<\/em>&#8221; k\u0131sm\u0131nda bir <em>Web UI<\/em>\u00a0veya bir <em>REST API<\/em> olabilir.<\/p>\n<p>G\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi konsept olarak core domain layer, tamamen etraf\u0131ndaki mod\u00fcller&#8217;den, teknolojilerden isolated ve decoupled bir \u015fekilde ortada konumlanmaktad\u0131r. T\u00fcm dependency flow&#8217;u ise, i\u00e7eriye do\u011fru ger\u00e7ekle\u015fmektedir.<\/p>\n<h2>Son s\u00f6zler&#8230;<\/h2>\n<p>Bu noktaya kadar &#8220;<em>neden clean architecture<\/em>&#8221; konusu ve genel konseptten bahsetmeye \u00e7al\u0131\u015ft\u0131m. Biliyorum bu makale biraz soyut gelebilir, bu sebeple makalenin bir sonraki b\u00f6l\u00fcm\u00fcnde ise clean architecture&#8217;\u0131n .<em>NET Core<\/em> ile implementasyonundan bahsediyor olaca\u011f\u0131m.<\/p>\n<h2>Referanslar<\/h2>\n<blockquote><p><em>https:\/\/blog.cleancoder.com\/uncle-bob\/2012\/08\/13\/the-clean-architecture.html<br \/>\nhttps:\/\/docs.microsoft.com\/en-us\/dotnet\/architecture\/modern-web-apps-azure\/architectural-principles?WT.mc_id=DT-MVP-5003382<\/em><br \/>\n<em>https:\/\/pusher.com\/tutorials\/clean-architecture-introduction<\/em><br \/>\n<em>https:\/\/www.freecodecamp.org\/news\/a-quick-introduction-to-clean-architecture-990c014448d2\/<br \/>\nhttps:\/\/slides.com\/gokgokalp\/aspnet-core-clean-architecture#\/<br \/>\n<\/em><\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Biliyoruz ki maintenance i\u015flemi, uygulaman\u0131n kendisini yazmaktan her zaman daha maliyetli bir operasyondur. Her ne yaparsak yapal\u0131m, de\u011fi\u015fmeyen tek ger\u00e7ek maintenance maliyetidir, de\u011fil mi? Bu maliyeti etkileyen en \u00f6nemli etkenlerden birisi de, uygulaman\u0131n architecture&#8217;\u0131n\u0131n se\u00e7imidir. Edindi\u011fim ge\u00e7mi\u015f tecr\u00fcbelerim do\u011frultusunda iki farkl\u0131 makale serisi olarak, &#8220;iyi&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/gokhan-gokalp.com\/tr\/getting-started-with-clean-architecture-using-asp-net-core-01\/\">Devam\u0131n\u0131 okuyun<span class=\"screen-reader-text\">Getting Started with Clean Architecture using ASP.NET Core &#8211; 01<\/span><\/a><\/div>\n","protected":false},"author":1,"featured_media":2913,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[505,68,417],"tags":[526,543,546,548,544,547,545],"class_list":["post-2847","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net-core","category-architectural","category-asp-net-core","tag-net-core","tag-clean-architecture","tag-coupling","tag-dotnet-core","tag-hexagonal-architecture","tag-layered-architecture","tag-separation-of-concerns","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"tr","enabled_languages":["en","tr"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"tr":{"title":true,"content":true,"excerpt":false}}},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Getting Started with Clean Architecture using ASP.NET Core - 01 - G\u00f6khan G\u00f6kalp<\/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:\/\/gokhan-gokalp.com\/getting-started-with-clean-architecture-using-asp-net-core-01\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Getting Started with Clean Architecture using ASP.NET Core - 01 - G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"og:url\" content=\"https:\/\/gokhan-gokalp.com\/getting-started-with-clean-architecture-using-asp-net-core-01\/\" \/>\n<meta property=\"og:site_name\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"article:published_time\" content=\"2019-10-26T20:04:58+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-10-27T09:20:10+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/10\/clean-architecture-bg.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"951\" \/>\n\t<meta property=\"og:image:height\" content=\"516\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/getting-started-with-clean-architecture-using-asp-net-core-01\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/getting-started-with-clean-architecture-using-asp-net-core-01\\\/\"},\"author\":{\"name\":\"G\u00f6khan G\u00f6kalp\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"headline\":\"Getting Started with Clean Architecture using ASP.NET Core &#8211; 01\",\"datePublished\":\"2019-10-26T20:04:58+00:00\",\"dateModified\":\"2019-10-27T09:20:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/getting-started-with-clean-architecture-using-asp-net-core-01\\\/\"},\"wordCount\":3102,\"commentCount\":11,\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"image\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/getting-started-with-clean-architecture-using-asp-net-core-01\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2019\\\/10\\\/clean-architecture-bg.jpg\",\"keywords\":[\".net core\",\"clean architecture\",\"coupling\",\"dotnet core\",\"hexagonal architecture\",\"layered architecture\",\"separation of concerns\"],\"articleSection\":[\".NET Core\",\"Architectural\",\"ASP.NET Core\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/getting-started-with-clean-architecture-using-asp-net-core-01\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/getting-started-with-clean-architecture-using-asp-net-core-01\\\/\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/getting-started-with-clean-architecture-using-asp-net-core-01\\\/\",\"name\":\"Getting Started with Clean Architecture using ASP.NET Core - 01 - G\u00f6khan G\u00f6kalp\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/getting-started-with-clean-architecture-using-asp-net-core-01\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/getting-started-with-clean-architecture-using-asp-net-core-01\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2019\\\/10\\\/clean-architecture-bg.jpg\",\"datePublished\":\"2019-10-26T20:04:58+00:00\",\"dateModified\":\"2019-10-27T09:20:10+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/getting-started-with-clean-architecture-using-asp-net-core-01\\\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/getting-started-with-clean-architecture-using-asp-net-core-01\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/getting-started-with-clean-architecture-using-asp-net-core-01\\\/#primaryimage\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2019\\\/10\\\/clean-architecture-bg.jpg\",\"contentUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2019\\\/10\\\/clean-architecture-bg.jpg\",\"width\":951,\"height\":516},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/getting-started-with-clean-architecture-using-asp-net-core-01\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Getting Started with Clean Architecture using ASP.NET Core &#8211; 01\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"description\":\"C# &amp; Python lover\",\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/gokhan-gokalp.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"pronouns\":\"he\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"contentUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"caption\":\"G\u00f6khan G\u00f6kalp\"},\"logo\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\"},\"sameAs\":[\"https:\\\/\\\/gokhan-gokalp.com\"],\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/tr\\\/author\\\/gok-gokalp\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Getting Started with Clean Architecture using ASP.NET Core - 01 - G\u00f6khan G\u00f6kalp","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:\/\/gokhan-gokalp.com\/getting-started-with-clean-architecture-using-asp-net-core-01\/","og_locale":"tr_TR","og_type":"article","og_title":"Getting Started with Clean Architecture using ASP.NET Core - 01 - G\u00f6khan G\u00f6kalp","og_url":"https:\/\/gokhan-gokalp.com\/getting-started-with-clean-architecture-using-asp-net-core-01\/","og_site_name":"G\u00f6khan G\u00f6kalp","article_published_time":"2019-10-26T20:04:58+00:00","article_modified_time":"2019-10-27T09:20:10+00:00","og_image":[{"width":951,"height":516,"url":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/10\/clean-architecture-bg.jpg","type":"image\/jpeg"}],"author":"G\u00f6khan G\u00f6kalp","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"G\u00f6khan G\u00f6kalp","Tahmini okuma s\u00fcresi":"15 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/gokhan-gokalp.com\/getting-started-with-clean-architecture-using-asp-net-core-01\/#article","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/getting-started-with-clean-architecture-using-asp-net-core-01\/"},"author":{"name":"G\u00f6khan G\u00f6kalp","@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"headline":"Getting Started with Clean Architecture using ASP.NET Core &#8211; 01","datePublished":"2019-10-26T20:04:58+00:00","dateModified":"2019-10-27T09:20:10+00:00","mainEntityOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/getting-started-with-clean-architecture-using-asp-net-core-01\/"},"wordCount":3102,"commentCount":11,"publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"image":{"@id":"https:\/\/gokhan-gokalp.com\/getting-started-with-clean-architecture-using-asp-net-core-01\/#primaryimage"},"thumbnailUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/10\/clean-architecture-bg.jpg","keywords":[".net core","clean architecture","coupling","dotnet core","hexagonal architecture","layered architecture","separation of concerns"],"articleSection":[".NET Core","Architectural","ASP.NET Core"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/gokhan-gokalp.com\/getting-started-with-clean-architecture-using-asp-net-core-01\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/gokhan-gokalp.com\/getting-started-with-clean-architecture-using-asp-net-core-01\/","url":"https:\/\/gokhan-gokalp.com\/getting-started-with-clean-architecture-using-asp-net-core-01\/","name":"Getting Started with Clean Architecture using ASP.NET Core - 01 - G\u00f6khan G\u00f6kalp","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/getting-started-with-clean-architecture-using-asp-net-core-01\/#primaryimage"},"image":{"@id":"https:\/\/gokhan-gokalp.com\/getting-started-with-clean-architecture-using-asp-net-core-01\/#primaryimage"},"thumbnailUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/10\/clean-architecture-bg.jpg","datePublished":"2019-10-26T20:04:58+00:00","dateModified":"2019-10-27T09:20:10+00:00","breadcrumb":{"@id":"https:\/\/gokhan-gokalp.com\/getting-started-with-clean-architecture-using-asp-net-core-01\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gokhan-gokalp.com\/getting-started-with-clean-architecture-using-asp-net-core-01\/"]}]},{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/gokhan-gokalp.com\/getting-started-with-clean-architecture-using-asp-net-core-01\/#primaryimage","url":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/10\/clean-architecture-bg.jpg","contentUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/10\/clean-architecture-bg.jpg","width":951,"height":516},{"@type":"BreadcrumbList","@id":"https:\/\/gokhan-gokalp.com\/getting-started-with-clean-architecture-using-asp-net-core-01\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gokhan-gokalp.com\/"},{"@type":"ListItem","position":2,"name":"Getting Started with Clean Architecture using ASP.NET Core &#8211; 01"}]},{"@type":"WebSite","@id":"https:\/\/gokhan-gokalp.com\/#website","url":"https:\/\/gokhan-gokalp.com\/","name":"G\u00f6khan G\u00f6kalp","description":"C# &amp; Python lover","publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/gokhan-gokalp.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe","name":"G\u00f6khan G\u00f6kalp","pronouns":"he","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","url":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","contentUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","caption":"G\u00f6khan G\u00f6kalp"},"logo":{"@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659"},"sameAs":["https:\/\/gokhan-gokalp.com"],"url":"https:\/\/gokhan-gokalp.com\/tr\/author\/gok-gokalp\/"}]}},"_links":{"self":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/2847","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/comments?post=2847"}],"version-history":[{"count":43,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/2847\/revisions"}],"predecessor-version":[{"id":2916,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/2847\/revisions\/2916"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media\/2913"}],"wp:attachment":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media?parent=2847"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/categories?post=2847"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/tags?post=2847"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}