{"id":823,"date":"2016-09-25T23:06:51","date_gmt":"2016-09-25T20:06:51","guid":{"rendered":"https:\/\/gokhan-gokalp.com\/?p=823"},"modified":"2016-09-25T23:20:18","modified_gmt":"2016-09-25T20:20:18","slug":"repository-pattern-yaklasimi-yerine-command-query-object-pattern-yaklasimi","status":"publish","type":"post","link":"https:\/\/gokhan-gokalp.com\/tr\/repository-pattern-yaklasimi-yerine-command-query-object-pattern-yaklasimi\/","title":{"rendered":"Repository Pattern Yakla\u015f\u0131m\u0131 Yerine Command\/Query Object Pattern Yakla\u015f\u0131m\u0131"},"content":{"rendered":"<p>Merhaba arkada\u015flar.<\/p>\n<p>Bu makale konumuzda data access layer i\u00e7in <strong>Repository Pattern<\/strong>&#8216;i yerine, <strong>Command\/Query Object Pattern<\/strong>&#8216;inin kullan\u0131m\u0131 ve faydalar\u0131 inceliyor olaca\u011f\u0131z.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2016\/09\/dao.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-825 lazyload\" data-src=\"\/wp-content\/uploads\/2016\/09\/dao.jpg\" alt=\"dao\" width=\"440\" height=\"387\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/09\/dao.jpg 440w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/09\/dao-300x264.jpg 300w\" data-sizes=\"(max-width: 440px) 100vw, 440px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 440px; --smush-placeholder-aspect-ratio: 440\/387;\" \/><\/a><\/p>\n<p>Sizlerinde bildi\u011fi gibi uzun zamanlard\u0131r data access layer&#8217;lar\u0131m\u0131z i\u00e7in, vazge\u00e7ilmez bir hal alm\u0131\u015ft\u0131r Repository Pattern&#8217;i. Peki bunca zamand\u0131r k\u00f6t\u00fc tasar\u0131mlardan s\u0131yr\u0131labilmek ve ba\u011f\u0131ml\u0131l\u0131k y\u00f6netimi(dependency management) ad\u0131na\u00a0birde SOLID SOLID diye ba\u011f\u0131r\u0131rken ilk prensiplerinden birisi olan <strong>Single Responsibility<\/strong>&#8216;e bakt\u0131\u011f\u0131m\u0131zda, Repository Pattern&#8217;i ne derecede uyuyor? ve zamanla git gide b\u00fcy\u00fcmeye ve\u00a0hantalla\u015fmaya ba\u015fl\u0131yor.<\/p>\n<p>Asl\u0131nda konumuz burada\u00a0Repository Pattern&#8217;ini kullanmam\u0131z veya kullanmamam\u0131z de\u011fil. Bu sebepten \u00f6t\u00fcr\u00fc kullanmamal\u0131y\u0131z da demek yanl\u0131\u015f olur. As\u0131l ama\u00e7 ise b\u00fcy\u00fcyen bir sisteme sahip olacaksak, daha iyi bir <strong>separation of concerns <\/strong>i\u00e7in neler\u00a0yap\u0131lmal\u0131d\u0131r.\u00a0Unutulmamal\u0131d\u0131r ki her patterni spesifik bir problemi \u00e7\u00f6zmek i\u00e7in tasarlanm\u0131\u015ft\u0131r. Var olmayan bir sorunu \u00e7\u00f6zmek i\u00e7in de\u011fil.<\/p>\n<h4>Command\/Query Object Pattern&#8217;i Nedir?<\/h4>\n<p>Command\/Query Object pattern&#8217;i, data access&#8217;e eri\u015fim i\u00e7in kullan\u0131lan pattern&#8217;lerden birisidir.\u00a0Bu yakla\u015f\u0131m ile t\u00fcm database\u00a0i\u015flemleri\u00a0b\u00fcy\u00fck data access god class&#8217;lar\u0131 yerine,\u00a0Command ve Query&#8217;lerden\u00a0olu\u015fur. Bu sayede her bir class, isolated bir \u015fekilde k\u00fc\u00e7\u00fck par\u00e7alardan\u00a0ve Single Responsibility prensibine de uygun olu\u015fmaktad\u0131r. \u00d6te yandan\u00a0uygulama architecture&#8217;\u0131m\u0131z\u0131 d\u0131\u015f kaynaklardan veya de\u011fi\u015fimlerden korumak istiyorsak, bunun en iyi yolu ise kendi abstraction&#8217;\u0131m\u0131z\u0131 olu\u015fturmakt\u0131r. Command\/Query Object pattern&#8217;i ise bunun bir yoludur.<\/p>\n<p>Dilerseniz konuya biraz \u00f6rnek \u00fczerinden devam edelim. Varsayal\u0131m ki a\u015fa\u011f\u0131daki gibi bir repository\u00a0interface&#8217;imiz\u00a0olsun.<\/p>\n<pre class=\"lang:default decode:true\">public interface IProductRepository\r\n{\r\n    Product GetProductDetailById(int id);\r\n    void CreateProduct(Product product);\r\n}<\/pre>\n<p>Peki bu interface&#8217;i implemente edecek olan &#8220;ProductRepository&#8221; g\u00fcn ge\u00e7tik\u00e7e ve farkl\u0131 ihtiya\u00e7lar do\u011fduk\u00e7a ne hale gelecek? \u0130\u015fte as\u0131l sorun burada ba\u015fl\u0131yor. Repository pattern&#8217;i ile\u00a0business logic k\u0131sm\u0131n\u0131, data source&#8217;dan ba\u015far\u0131l\u0131 bir \u015fekilde hep ay\u0131rd\u0131k. Fakat bir s\u00fcre sonra repository&#8217;ler, git gide b\u00fcy\u00fcyen kodlar\u00a0ve method&#8217;lar ile bir god class haline geliyorlar. Bunun yan\u0131nda ba\u015fka bir dezavantaj\u0131na da bakmak gerekirse:<\/p>\n<pre class=\"lang:c# decode:true\">public class ProductRepository : IProductRepository\r\n{\r\n    public void CreateProduct(Product product)\r\n    {\r\n        \/\/loglama vb. i\u015flemler\r\n        \/\/return...\r\n    }\r\n\r\n    public Product GetProductDetailById(int id)\r\n    {\r\n        \/\/loglama vb. i\u015flemler\r\n        \/\/return...\r\n    }\r\n}<\/pre>\n<p>Loglama gibi i\u015flemleri ger\u00e7ekle\u015ftirmek ise, duplicate logic&#8217;lere\u00a0sebep olmaktad\u0131r. Elbette <strong>Template Pattern<\/strong>&#8216;i ile bu sorun a\u015f\u0131labilir ve b\u00fcy\u00fcyen sistemlerdeki bu tarz problemler i\u00e7in ise \u00e7\u00f6z\u00fcm\u00a0<strong>Decomposition<\/strong>.\u00a0Haydi gelin Command\/Query Object Pattern&#8217;ini implemente ederek bir bakal\u0131m.<\/p>\n<p>\u00d6ncelikle &#8220;ICommand&#8221; ve &#8220;IQuery&#8221; isimlerinde iki adet interface tan\u0131mlayal\u0131m.<\/p>\n<pre class=\"lang:c# decode:true \">public interface ICommand\r\n{\r\n    void Execute(IDbConnection db);\r\n}\r\n\r\npublic interface IQuery&lt;T&gt;\r\n{\r\n    T Execute(IDbConnection dbConnection);\r\n}<\/pre>\n<p>Tan\u0131mlam\u0131\u015f oldu\u011fumuz interface&#8217;ler Execute method&#8217;lar\u0131na sahip ve parametre olarak &#8220;<em>System.Data<\/em>&#8221; namespace&#8217;i alt\u0131nda bulunan &#8220;IDbConnection&#8221; interface&#8217;ini al\u0131yor.\u00a0Yukar\u0131da tan\u0131mlam\u0131\u015f oldu\u011fumuz repository interface&#8217;inde bulunan method&#8217;lar\u0131, s\u0131ras\u0131yla kodlayal\u0131m. Kodlamaya ba\u015flamadan \u00f6nce &#8220;Product&#8221; entity&#8217;sini a\u015fa\u011f\u0131daki gibi tan\u0131mlayal\u0131m.<\/p>\n<pre class=\"lang:c# decode:true\">public class Product\r\n{\r\n    public int Id { get; set; }\r\n    public string Name { get; set; }\r\n}<\/pre>\n<p>&#8220;GetProductDetailById&#8221; method&#8217;u i\u00e7in &#8220;ProductDetailByIdQuery&#8221; isminde bir class tan\u0131mlayal\u0131m ve IQuery&lt;T&gt; interface&#8217;ini a\u015fa\u011f\u0131daki gibi implemente edelim.<\/p>\n<pre class=\"lang:c# decode:true \">public class ProductDetailByIdQuery : IQuery&lt;Product&gt;\r\n{\r\n    private readonly int _id;\r\n    public ProductDetailByIdQuery(int id)\r\n    {\r\n        _id = id;\r\n    }\r\n\r\n    public Product Execute(IDbConnection dbConnection)\r\n    {\r\n        \/\/ Query...\r\n        return new Product() { Id = _id };\r\n    }\r\n}<\/pre>\n<p>Constructor \u00fczerinden &#8220;id&#8221; property&#8217;sini inject ediyoruz ve &#8220;Execute&#8221; method&#8217;u i\u00e7erisinde istenen i\u015flemleri ger\u00e7ekle\u015ftiriyoruz. Bu Query s\u0131n\u0131f\u0131 art\u0131k sadece Product&#8217;\u0131n Detail bilgisini, &#8220;id&#8221; property&#8217;si ile getirmekle y\u00fck\u00fcml\u00fc. \u015eimdi &#8220;CreateProduct&#8221; method&#8217;u i\u00e7in ise &#8220;CreateProductCommand&#8221; isminde bir class olu\u015ftural\u0131m ve &#8220;ICommand&#8221; interface&#8217;ini a\u015fa\u011f\u0131daki gibi implemente edelim.<\/p>\n<pre class=\"lang:c# decode:true \">public class CreateProductCommand : ICommand\r\n{\r\n    private readonly Product _product;\r\n    public CreateProductCommand(Product product)\r\n    {\r\n        _product = product;\r\n    }\r\n\r\n    public void Execute(IDbConnection dbConnection)\r\n    {\r\n        \/\/ Commands...\r\n    }\r\n}<\/pre>\n<p>Query&#8217;de oldu\u011fu gibi burada da constructor \u00fczerinden create edece\u011fimiz &#8220;Product&#8221; entity&#8217;sini inject ediyoruz ve ilgili i\u015flemleri &#8220;Execute&#8221; method&#8217;u i\u00e7erisinde &#8220;dbConnection&#8221; \u00fczerinden ger\u00e7ekle\u015ftiriyoruz. Art\u0131k bu class&#8217;da sadece yeni bir Product Create etmek ile y\u00fck\u00fcml\u00fc.<\/p>\n<p>G\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi her bir i\u015flem k\u00fc\u00e7\u00fck par\u00e7alardan ve ufak sorumluluklardan olu\u015fmaktad\u0131r. \u015eimdi database i\u015flemlerini daha kolay y\u00f6netebilmek i\u00e7in ise &#8220;IDbConnection&#8221; interface&#8217;ini wrap&#8217;leyecek bir context olu\u015ftural\u0131m.<\/p>\n<pre class=\"lang:c# decode:true \">public interface IFooDatabase\r\n{\r\n    T Execute&lt;T&gt;(IQuery&lt;T&gt; query);\r\n    void Execute(ICommand command);\r\n}<\/pre>\n<p>\u0130\u00e7erisinde iki farkl\u0131 &#8220;Execute&#8221; method&#8217;u bulunmaktad\u0131r. Birisi query&#8217;leri handle ederken di\u011feri command&#8217;lar\u0131 handle etmektedir.<\/p>\n<pre class=\"lang:c# decode:true \">public class FooDatabase : IFooDatabase\r\n{\r\n    private readonly IDbConnection _dbConnection;\r\n    public FooDatabase(IDbConnection dbConnection)\r\n    {\r\n        _dbConnection = dbConnection;\r\n    }\r\n\r\n    public T Execute&lt;T&gt;(IQuery&lt;T&gt; query)\r\n    {\r\n        return query.Execute(_dbConnection);\r\n    }\r\n\r\n    public void Execute(ICommand command)\r\n    {\r\n        command.Execute(_dbConnection);\r\n    }\r\n}<\/pre>\n<p>Wrap&#8217;leme\u00a0i\u015fleminide tamamlad\u0131\u011f\u0131m\u0131za g\u00f6re art\u0131k &#8220;FooDatabase&#8221; context&#8217;ini kullanarak, Command\/Query Object pattern&#8217;inin \u00f6rnek kullan\u0131m\u0131na bir bakal\u0131m.<\/p>\n<pre class=\"lang:c# decode:true\">public class ProductController\r\n{\r\n    private readonly IFooDatabase _fooDatabase;\r\n    public ProductController(IFooDatabase fooDatabase)\r\n    {\r\n        _fooDatabase = fooDatabase;\r\n    }\r\n\r\n    public void UpdateProduct(int productId, string productName)\r\n    {\r\n        var product = _fooDatabase.Execute(new ProductDetailByIdQuery(productId));\r\n\r\n        if (product == null)\r\n        {\r\n            product = new Product() { Name = productName };\r\n\r\n            _fooDatabase.Execute(new CreateProductCommand(product));\r\n        }\r\n    }\r\n}<\/pre>\n<p>&#8220;UpdateProduct&#8221; method&#8217;una dikkat etti\u011fimizde t\u00fcm i\u015flemlerimiz &#8220;IFooDatabase&#8221; interface&#8217;i \u00fczerindeki &#8220;Execute&#8221; method&#8217;u \u00fczerinden ilerlemektedir. &#8220;_fooDatabase.Execute(new ProductDetailByIdQuery(productId))&#8221; sat\u0131r\u0131 ile Product bilgisini \u00e7ekebilirken, &#8220;_fooDatabase.Execute(new CreateProductCommand(product))&#8221; sat\u0131r\u0131 ile de yeni bir Product yaratabilmekteyiz.<\/p>\n<p>Bir makalenin daha sonuna geldik. Burada b\u00fcy\u00fcyen bir sistemde daha iyi bir &#8220;separation of concerns&#8221; \u00fcn\u00a0ve\u00a0decomposition&#8217;\u0131n nas\u0131l uygulanabilece\u011fi y\u00f6ntemlerinden birini g\u00f6rd\u00fck. Hangisini kullan\u0131p\u00a0kullanmamak karar\u0131, ilgili domain&#8217;izin complexity&#8217;sine g\u00f6re sizlere kalm\u0131\u015f.<\/p>\n<p>Umar\u0131m keyifli bir makale olmu\u015ftur.<\/p>\n<p>Takipte kal\u0131n.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Merhaba arkada\u015flar. Bu makale konumuzda data access layer i\u00e7in Repository Pattern&#8216;i yerine, Command\/Query Object Pattern&#8216;inin kullan\u0131m\u0131 ve faydalar\u0131 inceliyor olaca\u011f\u0131z. Sizlerinde bildi\u011fi gibi uzun zamanlard\u0131r data access layer&#8217;lar\u0131m\u0131z i\u00e7in, vazge\u00e7ilmez bir hal alm\u0131\u015ft\u0131r Repository Pattern&#8217;i. Peki bunca zamand\u0131r k\u00f6t\u00fc tasar\u0131mlardan s\u0131yr\u0131labilmek ve ba\u011f\u0131ml\u0131l\u0131k y\u00f6netimi(dependency management)&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/gokhan-gokalp.com\/tr\/repository-pattern-yaklasimi-yerine-command-query-object-pattern-yaklasimi\/\">Devam\u0131n\u0131 okuyun<span class=\"screen-reader-text\">Repository Pattern Yakla\u015f\u0131m\u0131 Yerine Command\/Query Object Pattern Yakla\u015f\u0131m\u0131<\/span><\/a><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[68],"tags":[282,279,280,278,283,284,99,277,281],"class_list":["post-823","post","type-post","status-publish","format-standard","hentry","category-architectural","tag-abstraction","tag-command-query-object-pattern","tag-command-query-object-pattern-kullanimi","tag-commandquery-object-pattern","tag-decomposition","tag-decomposition-nedir","tag-repository-pattern","tag-repository-pattern-nedir","tag-template-pattern","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"tr","enabled_languages":["en","tr"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"tr":{"title":false,"content":false,"excerpt":false}}},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Repository Pattern Yakla\u015f\u0131m\u0131 Yerine Command\/Query Object Pattern Yakla\u015f\u0131m\u0131 - 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\/repository-pattern-yaklasimi-yerine-command-query-object-pattern-yaklasimi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Repository Pattern Yakla\u015f\u0131m\u0131 Yerine Command\/Query Object Pattern Yakla\u015f\u0131m\u0131 - G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"og:url\" content=\"https:\/\/gokhan-gokalp.com\/repository-pattern-yaklasimi-yerine-command-query-object-pattern-yaklasimi\/\" \/>\n<meta property=\"og:site_name\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"article:published_time\" content=\"2016-09-25T20:06:51+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2016-09-25T20:20:18+00:00\" \/>\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=\"5 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/repository-pattern-yaklasimi-yerine-command-query-object-pattern-yaklasimi\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/repository-pattern-yaklasimi-yerine-command-query-object-pattern-yaklasimi\\\/\"},\"author\":{\"name\":\"G\u00f6khan G\u00f6kalp\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"headline\":\"Repository Pattern Yakla\u015f\u0131m\u0131 Yerine Command\\\/Query Object Pattern Yakla\u015f\u0131m\u0131\",\"datePublished\":\"2016-09-25T20:06:51+00:00\",\"dateModified\":\"2016-09-25T20:20:18+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/repository-pattern-yaklasimi-yerine-command-query-object-pattern-yaklasimi\\\/\"},\"wordCount\":836,\"commentCount\":12,\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"keywords\":[\"Abstraction\",\"Command Query Object Pattern\",\"Command Query Object Pattern Kullan\u0131m\u0131\",\"Command\\\/Query Object Pattern\",\"Decomposition\",\"Decomposition nedir\",\"Repository Pattern\",\"Repository Pattern Nedir\",\"Template Pattern\"],\"articleSection\":[\"Architectural\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/repository-pattern-yaklasimi-yerine-command-query-object-pattern-yaklasimi\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/repository-pattern-yaklasimi-yerine-command-query-object-pattern-yaklasimi\\\/\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/repository-pattern-yaklasimi-yerine-command-query-object-pattern-yaklasimi\\\/\",\"name\":\"Repository Pattern Yakla\u015f\u0131m\u0131 Yerine Command\\\/Query Object Pattern Yakla\u015f\u0131m\u0131 - G\u00f6khan G\u00f6kalp\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\"},\"datePublished\":\"2016-09-25T20:06:51+00:00\",\"dateModified\":\"2016-09-25T20:20:18+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/repository-pattern-yaklasimi-yerine-command-query-object-pattern-yaklasimi\\\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/repository-pattern-yaklasimi-yerine-command-query-object-pattern-yaklasimi\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/repository-pattern-yaklasimi-yerine-command-query-object-pattern-yaklasimi\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Repository Pattern Yakla\u015f\u0131m\u0131 Yerine Command\\\/Query Object Pattern Yakla\u015f\u0131m\u0131\"}]},{\"@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=1777985325\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1777985325\",\"contentUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1777985325\",\"caption\":\"G\u00f6khan G\u00f6kalp\"},\"logo\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1777985325\"},\"sameAs\":[\"https:\\\/\\\/gokhan-gokalp.com\"],\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/tr\\\/author\\\/gok-gokalp\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Repository Pattern Yakla\u015f\u0131m\u0131 Yerine Command\/Query Object Pattern Yakla\u015f\u0131m\u0131 - 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\/repository-pattern-yaklasimi-yerine-command-query-object-pattern-yaklasimi\/","og_locale":"tr_TR","og_type":"article","og_title":"Repository Pattern Yakla\u015f\u0131m\u0131 Yerine Command\/Query Object Pattern Yakla\u015f\u0131m\u0131 - G\u00f6khan G\u00f6kalp","og_url":"https:\/\/gokhan-gokalp.com\/repository-pattern-yaklasimi-yerine-command-query-object-pattern-yaklasimi\/","og_site_name":"G\u00f6khan G\u00f6kalp","article_published_time":"2016-09-25T20:06:51+00:00","article_modified_time":"2016-09-25T20:20:18+00:00","author":"G\u00f6khan G\u00f6kalp","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"G\u00f6khan G\u00f6kalp","Tahmini okuma s\u00fcresi":"5 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/gokhan-gokalp.com\/repository-pattern-yaklasimi-yerine-command-query-object-pattern-yaklasimi\/#article","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/repository-pattern-yaklasimi-yerine-command-query-object-pattern-yaklasimi\/"},"author":{"name":"G\u00f6khan G\u00f6kalp","@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"headline":"Repository Pattern Yakla\u015f\u0131m\u0131 Yerine Command\/Query Object Pattern Yakla\u015f\u0131m\u0131","datePublished":"2016-09-25T20:06:51+00:00","dateModified":"2016-09-25T20:20:18+00:00","mainEntityOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/repository-pattern-yaklasimi-yerine-command-query-object-pattern-yaklasimi\/"},"wordCount":836,"commentCount":12,"publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"keywords":["Abstraction","Command Query Object Pattern","Command Query Object Pattern Kullan\u0131m\u0131","Command\/Query Object Pattern","Decomposition","Decomposition nedir","Repository Pattern","Repository Pattern Nedir","Template Pattern"],"articleSection":["Architectural"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/gokhan-gokalp.com\/repository-pattern-yaklasimi-yerine-command-query-object-pattern-yaklasimi\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/gokhan-gokalp.com\/repository-pattern-yaklasimi-yerine-command-query-object-pattern-yaklasimi\/","url":"https:\/\/gokhan-gokalp.com\/repository-pattern-yaklasimi-yerine-command-query-object-pattern-yaklasimi\/","name":"Repository Pattern Yakla\u015f\u0131m\u0131 Yerine Command\/Query Object Pattern Yakla\u015f\u0131m\u0131 - G\u00f6khan G\u00f6kalp","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/#website"},"datePublished":"2016-09-25T20:06:51+00:00","dateModified":"2016-09-25T20:20:18+00:00","breadcrumb":{"@id":"https:\/\/gokhan-gokalp.com\/repository-pattern-yaklasimi-yerine-command-query-object-pattern-yaklasimi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gokhan-gokalp.com\/repository-pattern-yaklasimi-yerine-command-query-object-pattern-yaklasimi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/gokhan-gokalp.com\/repository-pattern-yaklasimi-yerine-command-query-object-pattern-yaklasimi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gokhan-gokalp.com\/"},{"@type":"ListItem","position":2,"name":"Repository Pattern Yakla\u015f\u0131m\u0131 Yerine Command\/Query Object Pattern Yakla\u015f\u0131m\u0131"}]},{"@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=1777985325","url":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1777985325","contentUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1777985325","caption":"G\u00f6khan G\u00f6kalp"},"logo":{"@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1777985325"},"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\/823","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=823"}],"version-history":[{"count":5,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/823\/revisions"}],"predecessor-version":[{"id":829,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/823\/revisions\/829"}],"wp:attachment":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media?parent=823"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/categories?post=823"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/tags?post=823"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}