{"componentChunkName":"component---src-templates-blog-post-js","path":"/blog/automapper-flatten","result":{"data":{"markdownRemark":{"html":"<p>Od dawna wiedziałem, że <a href=\"https://automapper.org/\">AutoMapper</a> ma bardzo wygodną - domyślną - funkcję, automatycznego rozpoznawania poprawnego mapowania między zagnieżdżonymi obiektami a ich spłaszczonymi wersjami. Przykładowo:</p>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-csharp line-numbers\"><code class=\"language-csharp\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">Car</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">public</span> <span class=\"token return-type class-name\"><span class=\"token keyword\">string</span></span> Vin <span class=\"token punctuation\">{</span><span class=\"token keyword\">get</span><span class=\"token punctuation\">;</span><span class=\"token keyword\">set</span><span class=\"token punctuation\">;</span><span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">public</span> <span class=\"token return-type class-name\"><span class=\"token keyword\">string</span></span> Model <span class=\"token punctuation\">{</span><span class=\"token keyword\">get</span><span class=\"token punctuation\">;</span><span class=\"token keyword\">set</span><span class=\"token punctuation\">;</span><span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">public</span> <span class=\"token return-type class-name\">Person</span> Owner <span class=\"token punctuation\">{</span><span class=\"token keyword\">get</span><span class=\"token punctuation\">;</span><span class=\"token keyword\">set</span><span class=\"token punctuation\">;</span><span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">Person</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">public</span> <span class=\"token return-type class-name\"><span class=\"token keyword\">string</span></span> Id <span class=\"token punctuation\">{</span><span class=\"token keyword\">get</span><span class=\"token punctuation\">;</span><span class=\"token keyword\">set</span><span class=\"token punctuation\">;</span><span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">public</span> <span class=\"token return-type class-name\"><span class=\"token keyword\">string</span></span> FirstName <span class=\"token punctuation\">{</span><span class=\"token keyword\">get</span><span class=\"token punctuation\">;</span><span class=\"token keyword\">set</span><span class=\"token punctuation\">;</span><span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">public</span> <span class=\"token return-type class-name\"><span class=\"token keyword\">string</span></span> LastName <span class=\"token punctuation\">{</span><span class=\"token keyword\">get</span><span class=\"token punctuation\">;</span><span class=\"token keyword\">set</span><span class=\"token punctuation\">;</span><span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>Możemy bez problemu zmapować na spłaszczoną wersję:</p>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-csharp line-numbers\"><code class=\"language-csharp\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">CarDto</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">public</span> <span class=\"token return-type class-name\"><span class=\"token keyword\">string</span></span> Vin <span class=\"token punctuation\">{</span><span class=\"token keyword\">get</span><span class=\"token punctuation\">;</span><span class=\"token keyword\">set</span><span class=\"token punctuation\">;</span><span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">public</span> <span class=\"token return-type class-name\"><span class=\"token keyword\">string</span></span> Model <span class=\"token punctuation\">{</span><span class=\"token keyword\">get</span><span class=\"token punctuation\">;</span><span class=\"token keyword\">set</span><span class=\"token punctuation\">;</span><span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">public</span> <span class=\"token return-type class-name\"><span class=\"token keyword\">string</span></span> OwnerId <span class=\"token punctuation\">{</span><span class=\"token keyword\">get</span><span class=\"token punctuation\">;</span><span class=\"token keyword\">set</span><span class=\"token punctuation\">;</span><span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">public</span> <span class=\"token return-type class-name\"><span class=\"token keyword\">string</span></span> OwnerFirstName <span class=\"token punctuation\">{</span><span class=\"token keyword\">get</span><span class=\"token punctuation\">;</span><span class=\"token keyword\">set</span><span class=\"token punctuation\">;</span><span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">public</span> <span class=\"token return-type class-name\"><span class=\"token keyword\">string</span></span> OwnerLastName <span class=\"token punctuation\">{</span><span class=\"token keyword\">get</span><span class=\"token punctuation\">;</span><span class=\"token keyword\">set</span><span class=\"token punctuation\">;</span><span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>Wystarczy zdefiniować zwykłe mapowanie między typami <code class=\"language-text\">Car</code> i <code class=\"language-text\">CarDto</code> - AutoMapper sam rozpozna, że \"podobiekt\" <code class=\"language-text\">Owner</code> należy \"spłaszyczyć\" do właściwości z prefiksem <code class=\"language-text\">Owner*</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-csharp line-numbers\"><code class=\"language-csharp\">configuration<span class=\"token punctuation\">.</span><span class=\"token generic-method\"><span class=\"token function\">CreateMap</span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;</span>Car<span class=\"token punctuation\">,</span> CarDto<span class=\"token punctuation\">></span></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<p>Co zrobić, gdy potrzebujemy wykonywać mapowanie w drugą stronę? To znaczy - mamy spłaszczony obiekt, a chcemy mapować do zagnieżdżonego obiektu (każdy przyzna, że lepsza jest taka struktura niż litania właściwości z takim samym prefiksem). Okazuje się, że to jest banalnie proste - wysatrczy przy definiowaniu mapowania dodać <code class=\"language-text\">ReverseMap</code>, tj.:</p>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-csharp line-numbers\"><code class=\"language-csharp\">configuration<span class=\"token punctuation\">.</span><span class=\"token generic-method\"><span class=\"token function\">CreateMap</span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;</span>Car<span class=\"token punctuation\">,</span> CarDto<span class=\"token punctuation\">></span></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">ReverseMap</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span></span></pre></div>\n<p>Co więcej, dodając specjalne metody typu <code class=\"language-text\">ForMember</code> czy <code class=\"language-text\">ForPath</code> możemy \"customizować\" tę odwrotną mapę - tak jakbyśmy konfigurowali zwykłe mapowanie.</p>\n<p>Całkiem zgrabne, prawda?</p>","excerpt":"Od dawna wiedziałem, że AutoMapper ma bardzo wygodną - domyślną - funkcję, automatycznego rozpoznawania poprawnego mapowania między zagnieżdżonymi obiektami a…","frontmatter":{"date":"18 February, 2020","path":"/blog/automapper-flatten","title":"AutoMapper - flatten"},"fields":{"readingTime":{"text":"1 min read"}}}},"pageContext":{}},"staticQueryHashes":["3649515864","63159454"]}