{"id":1161,"date":"2022-01-14T00:11:44","date_gmt":"2022-01-13T21:11:44","guid":{"rendered":"http:\/\/delimuhendis.org\/?p=1161"},"modified":"2022-12-20T22:56:51","modified_gmt":"2022-12-20T22:56:51","slug":"net-core-ve-web-api-dynamic-mapping-automapper","status":"publish","type":"post","link":"https:\/\/www.delimuhendis.org\/?p=1161","title":{"rendered":"Net Core ve Web API: Dynamic Mapping (AutoMapper)"},"content":{"rendered":"\n<p>Merhaba arkada\u015flar, bildi\u011finiz \u00fczere .Net Core ve Web API derslerine ba\u015flad\u0131k. \u0130lk dersimizde Dependecy Injection&#8217;a teorik bir giri\u015f yap\u0131p, Microsoft&#8217;un kendi Dependency Injection k\u00fct\u00fcphanesi ve 3rd party bir k\u00fct\u00fcphane olan Autofac&#8217;i kullanarak \u00f6rnekler yapt\u0131k. O yaz\u0131m\u0131za da <a href=\"http:\/\/delimuhendis.org\/net-core-ve-web-api-dependency-injection-autofac\/\" data-type=\"URL\" data-id=\"http:\/\/delimuhendis.org\/net-core-ve-web-api-dependency-injection-autofac\/\">buradan<\/a> ula\u015fabilirsiniz.<\/p>\n\n\n\n<p>Database Entity&#8217;leri bir \u00e7ok sebepten dolay\u0131 Frontend tarafta kullan\u0131lmaz. Entity Framework, ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 \u00fczere entity&#8217;leri kullan\u0131r. Ve veritaban\u0131 i\u015flemleri de bu entityler vas\u0131tas\u0131yla ger\u00e7ekle\u015fir. Peki e\u011fer entity&#8217;leri frontend&#8217;te kullanam\u0131yorsak, frontend&#8217;teki verileri nas\u0131l veritaban\u0131na kaydedece\u011fiz? Modellerin yada Dto&#8217;lar\u0131n de\u011ferlerinin entitylere setlenmesi gerekir. Her ne kadar k\u00fc\u00e7\u00fck projeler \u00e7ok y\u00fcksek miktarda property&#8217;lere sahip s\u0131n\u0131flar\u0131 bar\u0131nd\u0131rmasa da, projeler b\u00fcy\u00fcd\u00fck\u00e7e ve mod\u00fcllerin birbirleri olan ili\u015fkileri fazlala\u015ft\u0131k\u00e7a s\u0131n\u0131flar\u0131n i\u00e7indeki property&#8217;lerin say\u0131s\u0131 da artar. Dolay\u0131s\u0131yla model\/dto property de\u011ferlerinin entitylere setlenme i\u015flemi g\u00fc\u00e7 bir hale gelir.<\/p>\n\n\n\n<p>\u0130\u015fte bu noktada, AutoMapper devreye giriyor ve birka\u00e7 sat\u0131r kodla devasa verileri nesneler aras\u0131nda setleyebiliyoruz. Hadi ba\u015flayal\u0131m!<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>AutoMapper.Extensions.Microsoft.DependencyInjection<\/code><\/pre>\n\n\n\n<p>Yukar\u0131daki NuGet paketini projemize ekliyoruz.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public void ConfigureServices(IServiceCollection services)\n    {\n        services.AddAutoMapper(typeof(Startup));\n        services.AddControllersWithViews();\n    }<\/code><\/pre>\n\n\n\n<p>Startup s\u0131n\u0131f\u0131m\u0131z i\u00e7erisinde ConfigureServices methodunu yukar\u0131daki gibi AddAutoMapper() methodunu \u00e7a\u011f\u0131rarak projeye AutoMapper ekleme i\u015flemi tamamlan\u0131r. <\/p>\n\n\n\n<p>\u015eimdi a\u015fa\u011f\u0131daki gibi SampleModel ad\u0131nda bir s\u0131n\u0131f olu\u015fturuyoruz.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class SampleModel\n{\n    public Guid Id { get; set; }\n    public string Name { get; set; }\n    public string Surname { get; set; }\n    public DateTime Birthdate { get; set; }\n    public string Job { get; set; }\n}<\/code><\/pre>\n\n\n\n<p> Bu bizim \u00f6n tarafta verilerimizin tutulaca\u011f\u0131 s\u0131n\u0131f olacak. Bunun d\u0131\u015f\u0131nda arka tarafta kullan\u0131lacak DataModel isimli s\u0131n\u0131f\u0131 da a\u015fa\u011f\u0131daki gibi olu\u015fturuyoruz.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> public class DataModel\n {\n    public Guid Id { get; set; }\n    public string Name { get; set; }\n    public string Surname { get; set; }\n    public DateTime Birthdate { get; set; }\n    public string Job { get; set; }\n }<\/code><\/pre>\n\n\n\n<p>\u015eimdi AutoMapper kullan\u0131larak bir <em>SampleModel<\/em> nesnesindeki datalar, <em>DataModel<\/em> s\u0131n\u0131f\u0131ndan bir nesneye aktar\u0131lacak. Bu i\u015flem i\u00e7in son bir ad\u0131m\u0131m\u0131z kald\u0131 ve o da MappingProfile s\u0131n\u0131f\u0131n\u0131 olu\u015fturmak ve AutoMapper&#8217;a maplemelerin yap\u0131laca\u011f\u0131 s\u0131n\u0131flar\u0131 bildirmek. Bunu yapabilmek ad\u0131na <em>SampleDataMappingProfile<\/em> isminde a\u015fa\u011f\u0131daki gibi bir s\u0131n\u0131f olu\u015fturuyoruz.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class SampleDataMappingProfile:Profile\n{\n    public SampleDataMappingProfile()\n    {\n        CreateMap&lt;SampleModel, DataModel&gt;().ReverseMap();\n    }\n}<\/code><\/pre>\n\n\n\n<p>Dependency Injection yard\u0131m\u0131yla AutoMapper instance&#8217;\u0131n\u0131 al\u0131yoruz ve onun yard\u0131m\u0131yla Maplemeyi yap\u0131yoruz. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class HomeController : Controller\n{\n    \/\/ AutoMapper nesnesi\n    private readonly IMapper _mapper;\n    public HomeController(IMapper mapper)\n    {\n        _mapper = mapper;\n    }\n\n    public IActionResult Index()\n    {\n        \/\/ model nesnesi yerine veri kayna\u011f\u0131 olan nesne gelecek\n        var model = new SampleModel() { Id = Guid.NewGuid(), Name = \"Test\", Surname = \"Test\", Birthdate = DateTime.Now };\n        var mapped = _mapper.Map&lt;DataModel&gt;(model);\n        return View();\n    }\n}<\/code><\/pre>\n\n\n\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi model nesnesinin t\u00fcm de\u011ferleri oldu\u011fu gibi mapped nesnesine tek sat\u0131r kodla aktar\u0131ld\u0131. Bu y\u00f6ntem, 4-5 tane property&#8217;si olan s\u0131n\u0131flar i\u00e7in \u00e7ok \u00f6nemli olmasa da 30-40 property&#8217;li s\u0131n\u0131flarda yaz\u0131l\u0131mc\u0131y\u0131 b\u00fcy\u00fck bir y\u00fckten kurtarmaktad\u0131r. Bir sonraki derste g\u00f6r\u00fc\u015fmek \u00fczere.  \u0130yi Kodlamalar!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Merhaba arkada\u015flar, bildi\u011finiz \u00fczere .Net Core ve Web API derslerine ba\u015flad\u0131k. \u0130lk dersimizde Dependecy Injection&#8217;a teorik bir giri\u015f yap\u0131p, Microsoft&#8217;un&hellip;<\/p>\n","protected":false},"author":1,"featured_media":1368,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[46,65,154,177,195,349,369,370,414,608,609],"class_list":["post-1161","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programlama","tag-api","tag-automapper","tag-dersleri","tag-dto","tag-entity","tag-kullanimi","tag-mapper","tag-mapping","tag-net-core","tag-web","tag-web-api"],"_links":{"self":[{"href":"https:\/\/www.delimuhendis.org\/index.php?rest_route=\/wp\/v2\/posts\/1161","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.delimuhendis.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.delimuhendis.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.delimuhendis.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.delimuhendis.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1161"}],"version-history":[{"count":2,"href":"https:\/\/www.delimuhendis.org\/index.php?rest_route=\/wp\/v2\/posts\/1161\/revisions"}],"predecessor-version":[{"id":1456,"href":"https:\/\/www.delimuhendis.org\/index.php?rest_route=\/wp\/v2\/posts\/1161\/revisions\/1456"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.delimuhendis.org\/index.php?rest_route=\/wp\/v2\/media\/1368"}],"wp:attachment":[{"href":"https:\/\/www.delimuhendis.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1161"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.delimuhendis.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1161"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.delimuhendis.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1161"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}