﻿
{"id":12504,"date":"2019-11-15T10:33:43","date_gmt":"2019-11-15T10:33:43","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=12504"},"modified":"2019-11-15T10:33:43","modified_gmt":"2019-11-15T10:33:43","slug":"c-unit-of-work-design-patternunit-of-work-tasarim-deseni","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/c-unit-of-work-design-patternunit-of-work-tasarim-deseni\/","title":{"rendered":"C# Unit of Work Design Pattern(Unit of Work Tasar\u0131m Deseni)"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde veritaban\u0131 i\u015flemlerini toplu halde ger\u00e7ekle\u015ftirmemizi sa\u011flayan ve olas\u0131 bir hata durumunda topyek\u00fcn geri al\u0131nabilmesine olanak tan\u0131yan bir kurumsal tasar\u0131m kal\u0131b\u0131 olan Unit Of Work Design Pattern&#8217;\u0131 inceliyor olaca\u011f\u0131z.<\/p>\n<h3>Unit Of Work Design Pattern Nedir?<\/h3>\n<p>Unit Of Work tasar\u0131m deseni, yaz\u0131l\u0131m uygulamam\u0131zda veritaban\u0131yla ilgili her bir aksiyonun anl\u0131k olarak veritaban\u0131na yans\u0131t\u0131lmas\u0131n\u0131 engelleyen ve buna nazaran t\u00fcm aksiyonlar\u0131 biriktirip bir b\u00fct\u00fcn olarak bir defada tek bir connection \u00fczerinden ger\u00e7ekle\u015ftirilmesini sa\u011flayan ve b\u00f6ylece veritaban\u0131 maliyetlerini olduk\u00e7a minimize eden bir tasar\u0131m desenidir. <\/p>\n<p>Yukar\u0131da veritaban\u0131 maliyetlerinin minimize edilmesinden bahsettik. Bu ifadeyi konumuzun esintisi a\u00e7\u0131s\u0131ndan biraz daha a\u00e7arsak e\u011fer \u015f\u00f6yle izahatte bulunabiliriz; .NET \u00e7at\u0131s\u0131 alt\u0131nda kullan\u0131lan veritaban\u0131 mimarisi Ado.NET yahut herhangi bir ORM<span style=\"font-size:12px;\">(\u00f6rn; Entity Framework)<\/span> arac\u0131 ile veritaban\u0131na yap\u0131lan herhangi bir <em>insert<\/em>, <em>update<\/em> yahut <em>delete<\/em> iste\u011fi varsay\u0131lan olarak bir transaction i\u00e7erisinde execute edilmektedir. Hal b\u00f6yleyken her bir istek olduk\u00e7a maliyetli bir \u015fekilde i\u015flenecektir. <em><strong>Neden mi?<\/strong><\/em> \u00c7\u00fcnk\u00fc, transaction mekanizmas\u0131 veritaban\u0131nda olu\u015fan t\u00fcm aktiviteleri takip edebilmekte ve b\u00f6ylece olas\u0131 bir aksakl\u0131k, hata ya da s\u00fcre\u00e7te taraf\u0131m\u0131zca belirlenmi\u015f \u015fartlar do\u011frultusunda yap\u0131lan t\u00fcm i\u015flemleri geri alabilmektedir. Dolay\u0131s\u0131yla transaction bu sorumlulu\u011fu kar\u015f\u0131l\u0131ks\u0131z yapmayaca\u011f\u0131ndan dolay\u0131 faturay\u0131 y\u00fcksek maliyet olarak kesmektedir. Bunun yan\u0131nda her bir sorguya \u00f6zel bir transaction devreye girdi\u011fini d\u00fc\u015f\u00fcn\u00fcrsek maliyetimiz kat be kat artmakta ve veritaban\u0131n\u0131 inan\u0131lmaz \u00f6l\u00e7\u00fcde yormaktad\u0131r. \u0130\u015fte nedeni budur!<\/p>\n<p><strong>Peki bu maliyeti minimize edecek \u00e7\u00f6z\u00fcm nedir?<\/strong><br \/>\nBu sorunun cevab\u0131n\u0131 verebilmek i\u00e7in transaction yap\u0131lanmas\u0131n\u0131n genellikle bilinen bir \u00f6zelli\u011fine tekrar de\u011finmek gerekmektedir. Transaction, i\u00e7erisinde bir veya birden fazla sorguyu kontrol edebilme kapasitesine sahip mekanizmad\u0131r. Dolay\u0131s\u0131yla her bir operatif sorgu i\u00e7in transaction devreye sokmaktansa t\u00fcm sorgular\u0131m\u0131z\u0131 kapsayacak bir adet transaction\u0131n devreye girmesi maliyeti olduk\u00e7a minimize edecektir. \u0130\u015fte bu \u00e7\u00f6z\u00fcm\u00fcn teknik ad\u0131 Unit Of Work&#8217;t\u00fcr. <\/p>\n<p>Unit Of Work tasar\u0131m\u0131na tam teferruatl\u0131 giri\u015f yapmadan \u00f6nce ilk olarak ORM ara\u00e7lar\u0131ndan Entity Framework Core kullanarak g\u00f6nderdi\u011fimiz sorgular\u0131 <em>SQL Server Profiler<\/em> uygulamas\u0131ndan takip edelim ve her istekte olu\u015fturulan ve bize y\u00fcksek maliyete sebep olan transactionlar\u0131 Unit Of Work tasar\u0131m\u0131n\u0131n k\u0131ymetini anlayabilmek i\u00e7in g\u00f6zlerimizle g\u00f6relim \ud83d\ude42 <\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    &#x5B;ApiController]\r\n    &#x5B;Route(&quot;api\/&#x5B;controller]&quot;)]\r\n    public class CompanyController : ControllerBase\r\n    {\r\n        CompanyContext _companyContext;\r\n        public CompanyController(CompanyContext companyContext)\r\n        {\r\n            _companyContext = companyContext;\r\n        }\r\n        public bool DatabaseBusiness()\r\n        {\r\n            _companyContext.Add(new Company\r\n            {\r\n                Name = &quot;Gen\u00e7Ay A.\u015e&quot;\r\n            });\r\n            _companyContext.SaveChanges();\r\n\r\n            _companyContext.Add(new Company\r\n            {\r\n                Name = &quot;NG A.\u015e&quot;\r\n            });\r\n            _companyContext.SaveChanges();\r\n\r\n            _companyContext.Products.AddRange(new List&lt;Product&gt; {\r\n                new Product{  CompanyId = 1, Name = &quot;X&quot;, Quantity = 10 },\r\n                new Product{  CompanyId = 1, Name = &quot;Y&quot;, Quantity = 11 },\r\n                new Product{  CompanyId = 1, Name = &quot;Z&quot;, Quantity = 12 },\r\n                new Product{  CompanyId = 2, Name = &quot;A&quot;, Quantity = 13 },\r\n                new Product{  CompanyId = 2, Name = &quot;B&quot;, Quantity = 14 },\r\n            }.ToArray());\r\n            _companyContext.SaveChanges();\r\n\r\n            return true;\r\n        }\r\n    }\r\n<\/pre>\n<p>Yukaridaki \u00f6rnek &#8220;Company(Controller)&#8221; s\u0131n\u0131f\u0131na g\u00f6z atarsan\u0131z e\u011fer &#8220;DatabaseBusiness&#8221; metodu i\u00e7erisinde birden fazla veritaban\u0131 i\u015flemi ger\u00e7ekle\u015ftirilmekte ve s\u00fcre\u00e7te her bir i\u015flem &#8220;SaveChanges&#8221; metodu ile execute edilmektedir. \u0130lgili endpointe yap\u0131lan request neticesinde veritaban\u0131 sunucusunda generate edilen SQL kodlar\u0131n\u0131 izleyebilmek i\u00e7in <em>Microsoft SQL Server Management Studio<\/em> edit\u00f6r\u00fcyle beraber y\u00fcklenen <em>SQL Server Profiler<\/em> uygulamas\u0131n\u0131 a\u00e7\u0131n\u0131z ve ard\u0131ndan a\u015fa\u011f\u0131daki g\u00f6rselde belirtilen talimatlar\u0131 uygulay\u0131n\u0131z.<\/p>\n<table>\n<tr>\n<td><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/11\/C-Unit-of-Work-Design-PatternUnit-of-Work-Tasar\u0131m-Deseni.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/11\/C-Unit-of-Work-Design-PatternUnit-of-Work-Tasar\u0131m-Deseni-300x234.png\" alt=\"C# Unit of Work Design Pattern(Unit of Work Tasar\u0131m Deseni)\" width=\"300\" height=\"234\" class=\"aligncenter size-medium wp-image-12524\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/11\/C-Unit-of-Work-Design-PatternUnit-of-Work-Tasar\u0131m-Deseni-300x234.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/11\/C-Unit-of-Work-Design-PatternUnit-of-Work-Tasar\u0131m-Deseni.png 521w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/td>\n<td>Hangi sunucuda \u00e7al\u0131\u015f\u0131yorsan\u0131z ona ba\u011flan\u0131n\u0131z.<\/td>\n<\/tr>\n<tr>\n<td>\u0130lgili sunucuda execute edilen sorgular\u0131n \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131 transactionlar\u0131 g\u00f6rebilmek i\u00e7in Profiler uygulamas\u0131nda transactionlara \u00f6zel ayarlama yapmam\u0131z gerekmektedir. Bunun i\u00e7in kar\u015f\u0131m\u0131za gelen <em><strong>Trace Properties<\/strong><\/em> penceresinde <em><strong>Events Selection<\/strong><\/em> sekmesine ge\u00e7erek sa\u011f altta bulunan <em><strong>Show all events<\/strong><\/em> kutucu\u011funu i\u015faretleyerek t\u00fcm \u00f6zellikleri listeleyiniz ve oradan <strong><em>Transactions<\/em><\/strong> kategorisi alt\u0131ndaki uygun alanlar\u0131 se\u00e7erek g\u00f6r\u00fclebilir hale getiriniz.<\/td>\n<td><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/11\/C-Unit-of-Work-Design-PatternUnit-of-Work-Tasar\u0131m-Deseni-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/11\/C-Unit-of-Work-Design-PatternUnit-of-Work-Tasar\u0131m-Deseni-1.png\" alt=\"C# Unit of Work Design Pattern(Unit of Work Tasar\u0131m Deseni)\" width=\"917\" height=\"535\" class=\"aligncenter size-full wp-image-12526\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/11\/C-Unit-of-Work-Design-PatternUnit-of-Work-Tasar\u0131m-Deseni-1.png 917w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/11\/C-Unit-of-Work-Design-PatternUnit-of-Work-Tasar\u0131m-Deseni-1-300x175.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/11\/C-Unit-of-Work-Design-PatternUnit-of-Work-Tasar\u0131m-Deseni-1-768x448.png 768w\" sizes=\"auto, (max-width: 917px) 100vw, 917px\" \/><\/a><\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\">Ve t\u00fcm bu i\u015flemler neticesinde a\u015fa\u011f\u0131daki ekran g\u00f6r\u00fcnt\u00fcs\u00fcnde oldu\u011fu gibi sunucuya gelen her bir istek neticesinde transaction olu\u015fturuldu\u011funu g\u00f6zlemleyiniz.<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/11\/C-Unit-of-Work-Design-PatternUnit-of-Work-Tasar\u0131m-Deseni.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/11\/C-Unit-of-Work-Design-PatternUnit-of-Work-Tasar\u0131m-Deseni.gif\" alt=\"C# Unit of Work Design Pattern(Unit of Work Tasar\u0131m Deseni)\" width=\"800\" height=\"465\" class=\"aligncenter size-full wp-image-12532\" \/><\/a><\/td>\n<\/tr>\n<\/table>\n<p>Evet&#8230; Yukar\u0131da g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere her bir SaveChanges SQL sunucusunda bir transaction olu\u015fturmakta ve i\u00e7erisinde i\u015flem yapmaktad\u0131r. Nihayetinde bizim amac\u0131m\u0131z burada \u015fahit oldu\u011fumuz maliyeti minimize etmektir. &#8220;<em><strong>La hoca yeter art\u0131k gir \u015fu Unit Of Work denen z\u0131mb\u0131rt\u0131ya<\/strong><\/em>&#8221; dedi\u011finizi duyar gibiyim \ud83d\ude42 Tamam. Malum konuya girece\u011fiz merak etmeyin \ud83d\ude42 Biraz daha sabretmenizi rica ediyorum \ud83d\ude09<\/p>\n<p>Yukar\u0131daki \u00f6rne\u011fimize geri d\u00f6necek olursak, her bir SaveChanges metodunda bir transaction olu\u015fturuyorsak e\u011fer \u00e7\u00f6z\u00fcm olarak her bir i\u015flem neticesinde de\u011fil t\u00fcm i\u015flemler neticesinde tek bir SaveChanges \u00e7a\u011f\u0131rmay\u0131 tercih edebiliriz. Bunun i\u00e7in metot i\u00e7eri\u011fini a\u015fa\u011f\u0131daki gibi d\u00fczenleyelim ve ard\u0131ndan test edelim;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    &#x5B;ApiController]\r\n    &#x5B;Route(&quot;api\/&#x5B;controller]&quot;)]\r\n    public class CompanyController : ControllerBase\r\n    {\r\n        CompanyContext _companyContext;\r\n        public CompanyController(CompanyContext companyContext)\r\n        {\r\n            _companyContext = companyContext;\r\n        }\r\n        public bool DatabaseBusiness()\r\n        {\r\n            _companyContext.Add(new Company\r\n            {\r\n                Name = &quot;Gen\u00e7Ay A.\u015e&quot;\r\n            });\r\n\r\n            _companyContext.Add(new Company\r\n            {\r\n                Name = &quot;NG A.\u015e&quot;\r\n            });\r\n\r\n            _companyContext.Products.AddRange(new List&lt;Product&gt; {\r\n                new Product{  CompanyId = 1, Name = &quot;X&quot;, Quantity = 10 },\r\n                new Product{  CompanyId = 1, Name = &quot;Y&quot;, Quantity = 11 },\r\n                new Product{  CompanyId = 1, Name = &quot;Z&quot;, Quantity = 12 },\r\n                new Product{  CompanyId = 2, Name = &quot;A&quot;, Quantity = 13 },\r\n                new Product{  CompanyId = 2, Name = &quot;B&quot;, Quantity = 14 },\r\n            }.ToArray());\r\n            _companyContext.SaveChanges();\r\n\r\n            return true;\r\n        }\r\n    }\r\n<\/pre>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/11\/C-Unit-of-Work-Design-PatternUnit-of-Work-Tasar\u0131m-Deseni-1.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/11\/C-Unit-of-Work-Design-PatternUnit-of-Work-Tasar\u0131m-Deseni-1.gif\" alt=\"C# Unit of Work Design Pattern(Unit of Work Tasar\u0131m Deseni)\" width=\"800\" height=\"465\" class=\"aligncenter size-full wp-image-12539\" \/><\/a><\/p>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere t\u00fcm operasyonlar\u0131 tek bir SaveChanges ile execute etti\u011fimizde tek bir transaction ile kontrol edilmekte ve s\u00fcre\u00e7 daha az maliyetli ve sa\u011fl\u0131kl\u0131 bir hale getirilmi\u015f bulunmaktad\u0131r. \u0130\u015fte, Unit Of Work desenide asl\u0131nda bu mant\u0131\u011f\u0131n ta kendisini benimsemekte ve t\u00fcm i\u015flemleri tek seferde tek transaction i\u00e7erisinde execute etmeye odaklanmaktad\u0131r.<\/p>\n<p>Tabi ki de Unit Of Work tasar\u0131m deseni kullan\u0131l\u0131rken bu \u015fekilde bir kullan\u0131mdan ziyade daha kompleks bir tasar\u0131m i\u00e7erisine yerle\u015ftirilmektedir. O halde \u015fimdi gelin Unit Of Work&#8217;\u00fcn hangi tasar\u0131mlarla nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ele alal\u0131m&#8230;<\/p>\n<h3>Unit Of Work Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h3>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/11\/C-Unit-of-Work-Design-PatternUnit-of-Work-Tasar\u0131m-Deseni-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/11\/C-Unit-of-Work-Design-PatternUnit-of-Work-Tasar\u0131m-Deseni-2.png\" alt=\"C# Unit of Work Design Pattern(Unit of Work Tasar\u0131m Deseni)\" width=\"642\" height=\"156\" class=\"aligncenter size-full wp-image-12547\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/11\/C-Unit-of-Work-Design-PatternUnit-of-Work-Tasar\u0131m-Deseni-2.png 642w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/11\/C-Unit-of-Work-Design-PatternUnit-of-Work-Tasar\u0131m-Deseni-2-300x73.png 300w\" sizes=\"auto, (max-width: 642px) 100vw, 642px\" \/><\/a><br \/>\nUnit Of Work, toplu veritaban\u0131 i\u015flemlerini tek seferde bir kereye mahsus execute eden ve b\u00f6ylece bu toplu i\u015flem neticesinde ka\u00e7 kay\u0131t\u0131n etkilendi\u011fini rapor olarak sunabilen bir tasar\u0131m desenidir. Genellikle <a href=\"https:\/\/www.gencayyildiz.com\/blog\/c-repository-design-patternrepository-tasarim-deseni\/\" rel=\"noopener noreferrer\" target=\"_blank\">Repository Design Pattern<\/a> ile birlikte kullan\u0131lmas\u0131 tercih edilen Unit Of Work, ayr\u0131ca <span style=\"font-size:10px\">(genellikle)<\/span> transaction kontrol\u00fcyle beraber kullan\u0131larak tek bir merkezden t\u00fcm sorgu s\u00fcre\u00e7lerini kontrol edebilmektedir. T\u00fcm bunlar\u0131n yan\u0131nda, kullan\u0131c\u0131 taraf\u0131ndan ad\u0131m ad\u0131m(zincirleme) yap\u0131lan operasyonlarda s\u00fcre\u00e7 tam teferruatl\u0131 sonland\u0131r\u0131lmadan vazge\u00e7ildi\u011fi taktirde o noktaya kadar yap\u0131lan t\u00fcm de\u011fi\u015fikliklerin geriye al\u0131nmas\u0131 gerekmektedir. \u0130\u015fte buradaki i\u015f maliyetini Unit Of Work ortadan kald\u0131rmakta ve zincir sonlanmaks\u0131z\u0131n hi\u00e7bir entitynin de\u011ferini veritaban\u0131nda fiziksel olarak de\u011fi\u015ftirtmemektedir.<\/p>\n<h3>Repository Design Pattern \u0130le Unit Of Work Kullan\u0131m\u0131?<\/h3>\n<p>Biz bu makalemizde Unit Of Work tasar\u0131m desenini transaction kontrol\u00fcyle birlikte Repository deseniyle b\u00fct\u00fcnle\u015fik olarak ele alaca\u011f\u0131z.<br \/>\n\u0130lk olarak Repository imzam\u0131z\u0131 olu\u015ftural\u0131m;<br \/>\n<span style=\"color:orange;font-size:11px;\">Dikkat! Kodu \u015fi\u015firmemek ad\u0131na basit i\u015flemleri yapan bir Repository tasarlad\u0131m<\/span><\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public interface IRepository&lt;T&gt; where T : class\r\n    {\r\n        List&lt;T&gt; Get();\r\n        bool Add(T model);\r\n        bool Add&lt;A&gt;(A model) where A : class;\r\n        bool Remove(T model);\r\n        int Save();\r\n    }\r\n<\/pre>\n<p>Ard\u0131ndan Unit Of Work imzam\u0131z\u0131 olu\u015ftural\u0131m;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public interface IUnitOfWork : IDisposable\r\n    {\r\n        bool Commit(bool state = true);\r\n    }\r\n<\/pre>\n<p>\u015eimdi Repository s\u0131n\u0131f\u0131m\u0131z\u0131 olu\u015ftural\u0131m ve gerekli yap\u0131lanman\u0131n ard\u0131ndan Unit Of Work stratejisini uygulayal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Repository&lt;T&gt; : ControllerBase, IRepository&lt;T&gt;, IUnitOfWork where T : class\r\n    {\r\n        protected CompanyContext _companyContext;\r\n        IDbContextTransaction transaction = null;\r\n        public Repository(CompanyContext companyContext)\r\n        {\r\n            _companyContext = companyContext;\r\n            transaction = _companyContext.Database.BeginTransaction();\r\n        }\r\n        &#x5B;NonAction]\r\n        public List&lt;T&gt; Get() =&gt; _companyContext.Set&lt;T&gt;().ToList();\r\n        &#x5B;NonAction]\r\n        public bool Add(T model)\r\n        {\r\n            _companyContext.Set&lt;T&gt;().Add(model);\r\n            return true;\r\n        }\r\n        &#x5B;NonAction]\r\n        public bool Add&lt;A&gt;(A model) where A : class\r\n        {\r\n            _companyContext.Set&lt;A&gt;().Add(model);\r\n            return true;\r\n        }\r\n        &#x5B;NonAction]\r\n        public bool Remove(T model)\r\n        {\r\n            _companyContext.Set&lt;T&gt;().Remove(model);\r\n            return true;\r\n        }\r\n        &#x5B;NonAction]\r\n        public int Save() =&gt; _companyContext.SaveChanges();\r\n        &#x5B;NonAction]\r\n        public bool Commit(bool state = true)\r\n        {\r\n            Save();\r\n            if (state)\r\n                transaction.Commit();\r\n            else\r\n                transaction.Rollback();\r\n\r\n            Dispose();\r\n            return true;\r\n        }\r\n        public void Dispose()\r\n        {\r\n            _companyContext.Dispose();\r\n        }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funda <em><strong>4.<\/strong><\/em> sat\u0131ra odaklan\u0131rsan\u0131z e\u011fer <em><strong>8.<\/strong><\/em> sat\u0131rda context \u00fczerinden ba\u015flat\u0131larak elde edilen transaction &#8220;IDbContextTransaction&#8221; tipinden referans taraf\u0131ndan i\u015faretlenmektedir. Entity Framework yap\u0131lanmas\u0131nda context \u00fczerinden ne zaman BeginTransaction() metodu ile bir transaction ba\u015flat\u0131ls\u0131n, bu ba\u015flat\u0131lan transaction devrede olaca\u011f\u0131ndan dolay\u0131 sorgu isteklerinde otomatik olu\u015fturulan transactionlar ezilmi\u015f olacakt\u0131r. Dolay\u0131s\u0131yla s\u00fcre\u00e7te bize e\u015flik edecek transaction elimizde bulunmaktad\u0131r ve taraf\u0131m\u0131zca kontrol edilebilir bir \u00f6zelliktedir. <em><strong>33.<\/strong><\/em> sat\u0131rda ise Commit metodu arac\u0131l\u0131\u011f\u0131yla hem Save fonksiyonu \u00e7al\u0131\u015ft\u0131r\u0131lmakta hemde mevcut transaction optional parameter de\u011ferine g\u00f6re ya Commit edilmekte ya da Rollback ile t\u00fcm i\u015flemler geri al\u0131nmaktad\u0131r.<\/p>\n<p>Bu \u00e7al\u0131\u015fma neticesinde mevcut Controller s\u0131n\u0131flar\u0131m\u0131z\u0131 ilgili Repository s\u0131n\u0131f\u0131ndan t\u00fcretelim ve a\u015fa\u011f\u0131daki \u00e7al\u0131\u015fmalar\u0131 ger\u00e7ekle\u015ftirelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    &#x5B;ApiController]\r\n    &#x5B;Route(&quot;api\/&#x5B;controller]&quot;)]\r\n    public class CompanyController : Repository&lt;Company&gt;\r\n    {\r\n        public CompanyController(CompanyContext companyContext) : base(companyContext)\r\n        { }\r\n        public bool DatabaseBusiness()\r\n        {\r\n            Add(new Company\r\n            {\r\n                Name = &quot;Gen\u00e7Ay A.\u015e&quot;\r\n            });\r\n            Add(new Company\r\n            {\r\n                Name = &quot;NG A.\u015e&quot;\r\n            });\r\n\r\n            Add(new Product { CompanyId = 1, Name = &quot;X&quot;, Quantity = 10 });\r\n            Add(new Product { CompanyId = 1, Name = &quot;Y&quot;, Quantity = 11 });\r\n            Add(new Product { CompanyId = 1, Name = &quot;Z&quot;, Quantity = 12 });\r\n\r\n            Add(new Product { CompanyId = 2, Name = &quot;A&quot;, Quantity = 13 });\r\n            Add(new Product { CompanyId = 2, Name = &quot;B&quot;, Quantity = 14 });\r\n\r\n            Commit();\r\n\r\n            return true;\r\n        }\r\n    }\r\n<\/pre>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/11\/C-Unit-of-Work-Design-PatternUnit-of-Work-Tasar\u0131m-Deseni-2.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/11\/C-Unit-of-Work-Design-PatternUnit-of-Work-Tasar\u0131m-Deseni-2.gif\" alt=\"C# Unit of Work Design Pattern(Unit of Work Tasar\u0131m Deseni)\" width=\"800\" height=\"465\" class=\"aligncenter size-full wp-image-12566\" \/><\/a><\/p>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere Unit Of Work tasar\u0131m deseni sayesinde t\u00fcm isteklerimiz tek bir seferde veritaban\u0131na g\u00f6nderilmekte ve hepsi manuel bir \u015fekilde ba\u015flatt\u0131\u011f\u0131m\u0131z transaction ile y\u00f6netilmektedir. B\u00f6ylece maliyet olduk\u00e7a d\u00fc\u015fmekte ve dolayl\u0131 yoldan g\u00f6zle g\u00f6r\u00fcl\u00fcr bir performans art\u0131\u015f\u0131 s\u00f6z konusu olmaktad\u0131r. Ayriyetten burada endpointlerin Commit fonksiyonunu \u00e7a\u011f\u0131rma sorumlulu\u011funu \u00fcstlenmesi dikkat edilmesi gereken bir husustur. Nihayetinde kaz gelecek yerden tavuk esirgenmez misali, onca performans getirisine o kadarc\u0131k zahmet g\u00f6z ard\u0131 edilebilir olsa gerektir \ud83d\ude42<\/p>\n<h3>Son Dedikodular<\/h3>\n<p>Unit Of Work tasar\u0131m\u0131na istinaden internette yap\u0131lan ara\u015ft\u0131rmalarda kar\u015f\u0131n\u0131za \u00f6zellikle m\u00fchimlik te\u015fkil eden iki hususta yorumlar gelebilir. Bu yorumlardan ilki Entity Framework ile Unit Of Work tasar\u0131m\u0131n\u0131n kullan\u0131lmas\u0131n\u0131n pekte tavsiye edilmemesi \u00fczerinedir. Bunun nedeni, Entity Framework&#8217;\u00fcn kendi b\u00fcnyesinde Unit Of Work bar\u0131nd\u0131rmas\u0131ndan dolay\u0131d\u0131r. Hatta bu konuda ciddi ciddi i\u00e7erikler olu\u015fturup muhalif olanlar bile vard\u0131r. Bu konu \u00fczerine benim nacizane tavsiyem Unit Of Work kullan\u0131m olarak Entity Framework&#8217;\u00fcn b\u00fcnyesine \u00e7ok fazla temas etmedi\u011fi taktirde g\u00f6n\u00fcl rahatl\u0131\u011f\u0131yla kullan\u0131labilir. Bir di\u011fer husus ise internetteki bir\u00e7ok kaynakta context nesnesinin Dispose edilmesi \u00fczerinedir. Evet, bizde bu i\u00e7eri\u011fimizde Dispose etmi\u015f bulunmaktay\u0131z. Lakin stackoverflow&#8217;da ki <a href=\"https:\/\/stackoverflow.com\/a\/53529235\" rel=\"noopener noreferrer\" target=\"_blank\">\u015fu<\/a> arkada\u015f\u0131nda s\u00f6yledi\u011fi gibi Entity Framework Core yap\u0131lanmas\u0131 Dependency Injection ile elde edilen context nesnesini otomatik dispose etmekte ve bu i\u015flemi bizim yapmam\u0131za gerek kalmamaktad\u0131r. Ve bu mant\u0131\u011fa istinaden bizler context nesnesini yine dispose etmeyi lakin bu i\u015flemi ger\u00e7ekle\u015ftirirken p\u00fcr dikkat olmay\u0131 unutmamal\u0131y\u0131z.<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Bu i\u00e7eri\u011fimizde veritaban\u0131 i\u015flemlerini toplu halde ger\u00e7ekle\u015ftirmemizi sa\u011flayan ve olas\u0131 bir hata durumunda topyek\u00fcn geri al\u0131nabilmesine olanak tan\u0131yan bir kurumsal tasar\u0131m kal\u0131b\u0131 olan Unit Of Work Design Pattern&#8217;\u0131 inceliyor olaca\u011f\u0131z. Unit Of Work&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":12547,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[153],"tags":[750,3062,1115,3061,3060],"class_list":["post-12504","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-design-pattern","tag-design-pattern","tag-sql-server-profiler","tag-tasarim-desenleri","tag-unit-of-work-design-pattern","tag-unit-of-work-tasarim-deseni"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/12504","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=12504"}],"version-history":[{"count":65,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/12504\/revisions"}],"predecessor-version":[{"id":12577,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/12504\/revisions\/12577"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/12547"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=12504"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=12504"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=12504"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}