<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blog.aspnet.sk/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>michal kohut&amp;#39;s blog</title><link>http://blog.aspnet.sk/michalkohut/default.aspx</link><description>Only the change is permanent...</description><dc:language>sk-SK</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>LINQ to Entities a porovnanie IS NULL</title><link>http://blog.aspnet.sk/michalkohut/archive/2012/01/30/linq-to-entities-a-porovnanie-is-null.aspx</link><pubDate>Mon, 30 Jan 2012 20:09:00 GMT</pubDate><guid isPermaLink="false">cbdfeddd-8b45-43cb-b10b-361e40cba84b:307088</guid><dc:creator>michal.kohut</dc:creator><slash:comments>11</slash:comments><comments>http://blog.aspnet.sk/michalkohut/archive/2012/01/30/linq-to-entities-a-porovnanie-is-null.aspx#comments</comments><description>&lt;p&gt;Pred nedávnom som narazil na vcelku čudné správanie sa &lt;em&gt;LINQ To Entites&lt;/em&gt; pri dopytoch obsahujúcich podmienku testujúcu stĺpec na &lt;em&gt;null&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;
Majme dva LINQ výrazy, ktoré vyzerajú na prvý pohľad rovnako:&lt;/p&gt;

&lt;pre style="background:white;color:black;font-family:Consolas;"&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;query1&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;from&lt;/span&gt;&amp;nbsp;orderItem&amp;nbsp;&lt;span style="color:blue;"&gt;in&lt;/span&gt;&amp;nbsp;context.OrderItems
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;       &lt;span style="color:blue;"&gt;where&lt;/span&gt;&amp;nbsp;orderItem.Description == null&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;select&lt;/span&gt;&amp;nbsp;orderItem;&lt;/pre&gt;
&lt;pre style="background:white;color:black;font-family:Consolas;"&gt;&lt;pre style="background:white;color:black;font-family:Consolas;"&gt;&lt;span style="color:blue;"&gt;&lt;pre style="background:white;color:black;font-family:Consolas;"&gt;&lt;span style="color:blue;"&gt;string&lt;/span&gt; description = &lt;span style="color:blue;"&gt;null&lt;/span&gt;;
&lt;span style="color:blue;"&gt;var&lt;/span&gt; query2 = &lt;span style="color:blue;"&gt;from&lt;/span&gt; orderItem &lt;span style="color:blue;"&gt;in&lt;/span&gt; context.OrderItems
             &lt;span style="color:blue;"&gt;where&lt;/span&gt; orderItem.Description == description
             &lt;span style="color:blue;"&gt;select&lt;/span&gt; orderItem;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;Očakával by som,&amp;nbsp;že preložené SQL dotazy budú taktiež rovnaké.&amp;nbsp;To však ani zďaleka. &lt;/p&gt;

&lt;p&gt;Kým prvý vyzerá takto:&lt;/p&gt;

&lt;pre&gt;&lt;em&gt;&lt;strong&gt;SELECT&lt;/strong&gt; [Extent1].[Id] AS [Id], &lt;br /&gt;       [Extent1].[Item] AS [Item], &lt;br /&gt;       [Extent1].[UnitPrice] AS [UnitPrice], &lt;br /&gt;       [Extent1].[OrderId] AS [OrderId], &lt;br /&gt;       [Extent1].[Description] AS [Description]&lt;br /&gt;&lt;strong&gt;FROM&lt;/strong&gt;   [dbo].[OrderItems] AS [Extent1]&lt;br /&gt;&lt;strong&gt;WHERE&lt;/strong&gt;  [Extent1].&lt;strong&gt;[Description] IS NULL;&lt;/strong&gt;&lt;/em&gt;&lt;/pre&gt;

&lt;p&gt;druhý výraz je odlišný:&lt;/p&gt;

&lt;pre&gt;&lt;em&gt;&lt;strong&gt;SELECT &lt;/strong&gt;[Extent1].[Id] AS [Id],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Extent1].[Item] AS [Item],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Extent1].[UnitPrice] AS [UnitPrice],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Extent1].[OrderId] AS [OrderId],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Extent1].[Description] AS [Description]&lt;br /&gt;&lt;strong&gt;FROM&lt;/strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;[dbo].[OrderItems] AS [Extent1]&lt;br /&gt;&lt;strong&gt;WHERE&lt;/strong&gt;&amp;nbsp; [Extent1].&lt;strong&gt;[Description] = @p__linq__0;&lt;/strong&gt;&lt;/em&gt;&lt;/pre&gt;

&lt;p&gt;Čo je dôležitejšie, výsledky týchto dotazov sú úplne rozdielne. Kým prvý vráti všetky záznamy so stĺpcom&amp;nbsp;&lt;em&gt;Description&lt;/em&gt; rovným &lt;em&gt;null&lt;/em&gt; (žiadaný výsledok)&lt;em&gt;,&lt;/em&gt; druhý dotaz nevráti žiadne záznamy.&amp;nbsp;Ak by išlo o &lt;em&gt;LINQ To SQL&lt;/em&gt;,&amp;nbsp;existuje tu jednoduchý workaround, ktorý spočíva v použití metódy &lt;em&gt;object.Equals &lt;/em&gt;(tá v tomto prípade zabezpečí, že ak je parameter rovný &lt;em&gt;null, &lt;/em&gt;podmienka v SQL bude &lt;em&gt;IS NULL, &lt;/em&gt;v opačnom prípade pôjde o klasické porovnanie):&lt;span style="color:blue;"&gt;&lt;/span&gt;&lt;/p&gt;

&lt;pre style="background:white;color:black;font-family:Consolas;"&gt;&lt;span style="color:blue;"&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&lt;font color="#000000"&gt; query = &lt;/font&gt;&lt;span style="color:blue;"&gt;from&lt;/span&gt;&lt;font color="#000000"&gt; orderItem &lt;/font&gt;&lt;span style="color:blue;"&gt;in&lt;/span&gt;&lt;font color="#000000"&gt; context.OrderItems
            &lt;/font&gt;&lt;span style="color:blue;"&gt;where&lt;/span&gt;&lt;font color="#000000"&gt; &lt;span style="color:blue;"&gt;object&lt;/span&gt;.Equals(orderItem.Description,&amp;nbsp;description)
            &lt;/font&gt;&lt;span style="color:blue;"&gt;select&lt;/span&gt;&lt;font color="#000000"&gt; orderItem;&lt;/font&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Bohužial tento spôsob nefunguje pre &lt;em&gt;LINQ To Entities&lt;/em&gt;. &lt;/p&gt;
&lt;h2&gt;Workarounds&amp;nbsp;&lt;/h2&gt;
&lt;p&gt;Existuje však niekoľko iných možností ako docieliť požadované správanie: &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Možnosť 1&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Nejde práve o najestetickejšie riešenie, ale výsledkom je vždy správny (a jednoduchý) SQL dotaz, ktorý&amp;nbsp;je posielaný do databázy:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="background:white;color:black;font-family:Consolas;"&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;query&amp;nbsp;=&amp;nbsp;description&amp;nbsp;==&amp;nbsp;&lt;span style="color:blue;"&gt;null&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;	?&amp;nbsp;(&lt;span style="color:blue;"&gt;from&lt;/span&gt;&amp;nbsp;orderItem&amp;nbsp;&lt;span style="color:blue;"&gt;in&lt;/span&gt;&amp;nbsp;context.OrderItems
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;where&lt;/span&gt;&amp;nbsp;orderItem.Description&amp;nbsp;==&amp;nbsp;&lt;span style="color:blue;"&gt;null&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;select&lt;/span&gt;&amp;nbsp;orderItem)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;(&lt;span style="color:blue;"&gt;from&lt;/span&gt;&amp;nbsp;orderItem&amp;nbsp;&lt;span style="color:blue;"&gt;in&lt;/span&gt;&amp;nbsp;context.OrderItems
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;where&lt;/span&gt;&amp;nbsp;orderItem.Description&amp;nbsp;==&amp;nbsp;description
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;select&lt;/span&gt;&amp;nbsp;orderItem);&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Možnosť 2&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Inou možnosťou je výraz:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="background:white;color:black;font-family:Consolas;"&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;query&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;from&lt;/span&gt;&amp;nbsp;orderItem&amp;nbsp;&lt;span style="color:blue;"&gt;in&lt;/span&gt;&amp;nbsp;context.OrderItems
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;where&lt;/span&gt;&amp;nbsp;(description&amp;nbsp;==&amp;nbsp;&lt;span style="color:blue;"&gt;null&lt;/span&gt;)&amp;nbsp;?&amp;nbsp;orderItem.Description&amp;nbsp;==&amp;nbsp;&lt;span style="color:blue;"&gt;null&lt;/span&gt;&amp;nbsp;:&amp;nbsp;orderItem.Description&amp;nbsp;==&amp;nbsp;description
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;select&lt;/span&gt;&amp;nbsp;orderItem;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;Priemetnutím do SQL ale dostávame poriadnu divočinu (i keď ide o funkčné riešenie):&lt;/p&gt;

&lt;pre&gt;&lt;em&gt;&lt;strong&gt;SELECT&lt;/strong&gt; [Extent1].[Id] AS [Id], &lt;br /&gt;       [Extent1].[Item] AS [Item], &lt;br /&gt;       [Extent1].[UnitPrice] AS [UnitPrice], &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Extent1].[OrderId] AS [OrderId], &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Extent1].[Description] AS [Description]&lt;br /&gt;&lt;strong&gt;FROM&lt;/strong&gt;&amp;nbsp;&amp;nbsp; [dbo].[OrderItems] AS [Extent1]&lt;br /&gt;&lt;strong&gt;WHERE&lt;/strong&gt;&amp;nbsp;&lt;strong&gt; (CASE &lt;br /&gt;	WHEN (@p__linq__0 IS NULL) THEN CASE &lt;br /&gt;	WHEN (&lt;/strong&gt;[Extent1]&lt;strong&gt;.[Description] IS NULL) THEN cast(1 as bit) ELSE cast(0 as bit) &lt;br /&gt;	END &lt;br /&gt;	WHEN (&lt;/strong&gt;[Extent1]&lt;strong&gt;.[Description] = @p__linq__1) THEN cast(1 as bit) &lt;br /&gt;	WHEN (&lt;/strong&gt;[Extent1]&lt;strong&gt;.[Description] &amp;lt;&amp;gt; @p__linq__1) THEN cast(0 as bit) &lt;br /&gt;	END) = 1;&lt;/strong&gt;&lt;/em&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Možnosť 3&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Dalšou alternatívou je výraz:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="background:white;color:black;font-family:Consolas;"&gt;&lt;span style="color:blue;"&gt;&lt;pre style="background:white;color:black;font-family:Consolas;"&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;query&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;from&lt;/span&gt;&amp;nbsp;orderItem&amp;nbsp;&lt;span style="color:blue;"&gt;in&lt;/span&gt;&amp;nbsp;context.OrderItems
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;where&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;	((description&amp;nbsp;==&amp;nbsp;&lt;span style="color:blue;"&gt;null&lt;/span&gt;&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;orderItem.Description&amp;nbsp;==&amp;nbsp;&lt;span style="color:blue;"&gt;null&lt;/span&gt;)&amp;nbsp;||
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;orderItem.Description&amp;nbsp;==&amp;nbsp;description)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;select&lt;/span&gt;&amp;nbsp;orderItem;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;V tomto prípade je vygenerovaný dotaz o niečo jednoduchší ako predošlá verzia:&lt;/p&gt;

&lt;pre&gt;&lt;em&gt;&lt;strong&gt;SELECT&lt;/strong&gt; [Extent1].[Id] AS [Id],&lt;br /&gt;       [Extent1].[Item] AS [Item],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Extent1].[UnitPrice] AS [UnitPrice],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Extent1].[OrderId] AS [OrderId],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Extent1].[Description] AS [Description]&lt;br /&gt;&lt;strong&gt;FROM&lt;/strong&gt;&amp;nbsp;&amp;nbsp; [dbo].[OrderItems] AS [Extent1]&lt;br /&gt;&lt;/em&gt;&lt;em&gt;&lt;strong&gt;WHERE&amp;nbsp; ((@p__linq__0 IS NULL)&lt;br /&gt;	AND (&lt;/strong&gt;[Extent1]&lt;/em&gt;&lt;em&gt;&lt;strong&gt;.[Description] IS NULL))&lt;br /&gt;	OR (&lt;/strong&gt;[Extent1]&lt;strong&gt;.[Description] = @p__linq__1);&lt;/strong&gt;&lt;/em&gt;&lt;/pre&gt;&lt;strong&gt;
&lt;/strong&gt;
&lt;p&gt;&amp;nbsp;Existujú samozrejme i ďalšie spôsoby ako obísť tento nepríjemný &amp;quot;bug&amp;quot; v &lt;em&gt;LINQ To Entities.&amp;nbsp;&lt;/em&gt;A kto vie, možno sa niekedy dočkáme i oficiálnej opravy:) &lt;/p&gt;

&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
		&lt;script src="http://connect.facebook.net/en_US/all.js#xfbml=1"&gt;&lt;/script&gt;&lt;fb:like href="" show_faces="true" width="450" font=""&gt;&lt;/fb:like&gt;&lt;img src="http://blog.aspnet.sk/aggbug.aspx?PostID=307088" width="1" height="1"&gt;</description><category domain="http://blog.aspnet.sk/michalkohut/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blog.aspnet.sk/michalkohut/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://blog.aspnet.sk/michalkohut/archive/tags/LINQ+To+Entities/default.aspx">LINQ To Entities</category></item><item><title>Prečo mi Visual Studio štartuje tak dlho ?</title><link>http://blog.aspnet.sk/michalkohut/archive/2011/11/13/logy-visual-studia.aspx</link><pubDate>Sun, 13 Nov 2011 14:05:00 GMT</pubDate><guid isPermaLink="false">cbdfeddd-8b45-43cb-b10b-361e40cba84b:307058</guid><dc:creator>michal.kohut</dc:creator><slash:comments>0</slash:comments><comments>http://blog.aspnet.sk/michalkohut/archive/2011/11/13/logy-visual-studia.aspx#comments</comments><description>&lt;p&gt;Ako nadšený fanúšik Visual Studia si neodpustím doň nainštalovať a vyskúšať takmer každé &lt;em&gt;rozšírenie&lt;/em&gt; (po našom &lt;em&gt;extension&lt;/em&gt;), ktoré sa mi zdá byť aspoň trochu použiteľné. Výsledkom však v konečnom dôsledku je, že štart prostredia potom trvá niekoľko násobne dlhšie.  Otázka je, čo teraz s tým? Mám vypnúť všetky rozšírenia? Nebude stačiť, ak nájdem len tie, ktorých štart trvá najdlhšie? Ale ako to zistiť?&lt;/p&gt;

&lt;br /&gt;

&lt;p&gt;&lt;em&gt;Visual Studio 2010&lt;/em&gt; (uvedený spôsob by mal fungovať s menšími obmenami i pre staršie verzie) je možné spustiť z príkazového riadku s prepínačom &lt;em&gt;/Log&lt;/em&gt;:&lt;/p&gt;

&lt;img src="http://blog.aspnet.sk/blogs/michalkohut/LogVisualStudio/01.png" alt="" /&gt;

&lt;p&gt;Tento prepínač zabezpečí, že VS bude celú svoju aktivitu (vrátane načítavania jednotlivých rozšírení) zaznamenávať do súboru. Ak nie je explicitne uvedený výstupný súbor, záznamy budú implicitne uložené v súbore:&lt;/p&gt;

&lt;pre&gt;%APPDATA%\Microsoft\VisualStudio\10.0\ActivityLog.xml&lt;/pre&gt;

&lt;p&gt;V tomto adresári sa nachádza i príslušný XSL súbor &lt;em&gt;ActivityLog.xsl&lt;/em&gt;, ktorý zabezpečuje omnoho čitateľnejšie zobrazenie XML súboru v prehliadači:&lt;/p&gt;

&lt;img src="http://blog.aspnet.sk/blogs/michalkohut/LogVisualStudio/02.png" alt="" /&gt;

&lt;br /&gt;

&lt;p&gt;Pri znalosti jazyka XSL je možné súbor ActivityLog.xsl samozrejme ľubovoľne prispôsobiť a upraviť tak zobrazenie ActivityLog.xml v prehliadači. Jedno také veľmi šikovné hotové prispôsobenie sa mi podarilo nájsť.&lt;/p&gt; 

&lt;p&gt;Táto vylepšená verzia:
&lt;ol&gt;
&lt;li&gt;zobrazuje dobu načítania jednotlivých balíkov,
&lt;li&gt;zobrazuje vizuálny indikátor každú 1 sekundu (konfigurovateľný parameter),
&lt;li&gt;zobrazí riadok &amp;quot;End package load&amp;quot; červenou farbou v prípade, že čas načítavania balíka prekročí 500ms (konfigurovateľný &lt;em&gt;threshold&lt;/em&gt;),
&lt;li&gt;zobrazí červenou každý riadok, ktorého trvanie prekročí konfigurovateľnú hodnotu (implicitne 500ms).
&lt;/ol&gt;
&lt;/p&gt;

&lt;br /&gt;

&lt;p&gt;Úvodná tabuľka &lt;strong&gt;Summary&lt;/strong&gt; ostala v podstate nezmenená, obsahuje sumárnu informáciu o celkovom počte správ rozdelených podľa jednotlivých úrovní:&lt;/p&gt;

&lt;img src="http://blog.aspnet.sk/blogs/michalkohut/LogVisualStudio/03.png" alt="" /&gt;

&lt;p&gt;Novinkou je tabuľka &lt;strong&gt;Hot Spots&lt;/strong&gt;, ktorá zobrazuje celkový prehľad všetkých &amp;quot;bodov&amp;quot;, v ktorých sa Visual Studio zdržalo dlhšie ako bol prednastavený časový limit - vyššie spomínaný &lt;em&gt;threshold&lt;/em&gt;. Takto je v podstate okamžite možné lokalizovať &lt;em&gt;problémové miesta&lt;/em&gt; štartu VS.&lt;/p&gt;

&lt;img src="http://blog.aspnet.sk/blogs/michalkohut/LogVisualStudio/04.png" alt="" /&gt;

&lt;br /&gt;

&lt;p&gt;Použitie tohto modifikovaného XSL súboru je veľmi jednoduché. Jediné, čo treba urobiť je skopírovať ho do adresára, kde sa nachádza príslušný log súbor, v tomto prípade &lt;em&gt;ActivityLog.xml&lt;/em&gt;. Po otvorení XML súboru v internetovom prehliadači bude XSL súbor &lt;em&gt;ActivityLog.xsl&lt;/em&gt; automaticky použitý pre transformáciu a renderovanie XML súboru.&lt;/p&gt;

&lt;p&gt;A samozrejme linka na upravený &lt;a href="https://github.com/lcorneliussen/ActivityLogProfiler/blob/master/ActivityLogProfiler.xsl"&gt;ActivityLog.xml&lt;/a&gt;, ktorého autorom je Lars Corneliussen.&lt;/p&gt;


		&lt;script src="http://connect.facebook.net/en_US/all.js#xfbml=1"&gt;&lt;/script&gt;&lt;fb:like href="" show_faces="true" width="450" font=""&gt;&lt;/fb:like&gt;&lt;img src="http://blog.aspnet.sk/aggbug.aspx?PostID=307058" width="1" height="1"&gt;</description><category domain="http://blog.aspnet.sk/michalkohut/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blog.aspnet.sk/michalkohut/archive/tags/Visual+Studio+2010/default.aspx">Visual Studio 2010</category></item><item><title>Entity Framework a mazanie objektov pri odloženom vyhodnocovaní</title><link>http://blog.aspnet.sk/michalkohut/archive/2011/10/03/entity-framework-a-odlo-en-233-vyhodnocovanie.aspx</link><pubDate>Mon, 03 Oct 2011 17:58:00 GMT</pubDate><guid isPermaLink="false">cbdfeddd-8b45-43cb-b10b-361e40cba84b:307009</guid><dc:creator>michal.kohut</dc:creator><slash:comments>0</slash:comments><comments>http://blog.aspnet.sk/michalkohut/archive/2011/10/03/entity-framework-a-odlo-en-233-vyhodnocovanie.aspx#comments</comments><description>&lt;p&gt;Jednou z veľmi užitočných vlastností &lt;em&gt;Entity Framework&lt;/em&gt;-u je bezpochyby odložené vyhodnocovanie dotazov. Inými slovami povedané, objekty sú získavané z databázy len ak je to skutočne nevyhnutné - ak s nimi chceme voľačo robiť. Odložené vyhodnocovanie alebo tiež &lt;em&gt;Lazy Loading&lt;/em&gt; má svoje výhody ako i nevýhody. Na jednej strane dokáže zvýšiť produktivitu pri menšom množstve kódu, na strane druhej programátor stráca kontrolu nad tým, kedy dochádza k prístupu do databázy.&lt;/p&gt;

&lt;p&gt;Nepozornosť (alebo povrchná znalosť:)) pri práci s odloženým vyhodnocovaním dokáže niekedy pripraviť naozaj nemilé prekvapenia. Pred nedávnom som takto narazil na jednu záludnosť pri realizácii jednoduchej operácie mazanie entít. Majme dve triedy reprezentujúce doménové modely:&lt;/p&gt;
 
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;User&lt;/span&gt;
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;int&lt;/span&gt;&amp;nbsp;Id&amp;nbsp;{&amp;nbsp;&lt;span style="color:blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color:blue;"&gt;set&lt;/span&gt;;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;nbsp;Name&amp;nbsp;{&amp;nbsp;&lt;span style="color:blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color:blue;"&gt;set&lt;/span&gt;;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;virtual&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Address&lt;/span&gt;&amp;nbsp;Address&amp;nbsp;{&amp;nbsp;&lt;span style="color:blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color:blue;"&gt;set&lt;/span&gt;;&amp;nbsp;}
}
 
&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Address&lt;/span&gt;
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;int&lt;/span&gt;&amp;nbsp;Id&amp;nbsp;{&amp;nbsp;&lt;span style="color:blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color:blue;"&gt;set&lt;/span&gt;;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;nbsp;Street&amp;nbsp;{&amp;nbsp;&lt;span style="color:blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color:blue;"&gt;set&lt;/span&gt;;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;nbsp;City&amp;nbsp;{&amp;nbsp;&lt;span style="color:blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color:blue;"&gt;set&lt;/span&gt;;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;virtual&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;ICollection&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;User&lt;/span&gt;&amp;gt;&amp;nbsp;Users&amp;nbsp;{&amp;nbsp;&lt;span style="color:blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color:blue;"&gt;set&lt;/span&gt;;&amp;nbsp;}
}&lt;/pre&gt;

&lt;p&gt;Pri prístupe &lt;em&gt;Code First&lt;/em&gt; v &lt;em&gt;EF 4.1&lt;/em&gt; obsahuje vygenerovaný databazový model dve tabuľky &lt;strong&gt;Users&lt;/strong&gt; a &lt;strong&gt;Addresses&lt;/strong&gt;, pričom tabuľka Users obsahuje &lt;strong&gt;FK&lt;/strong&gt; (nullable foreign key) na tabuľku Address:&lt;/p&gt;

&lt;img src="http://blog.aspnet.sk/blogs/michalkohut/EF/01.png" alt="" /&gt;

&lt;p&gt;Mapovanie DB modelov, prístup k nim i k ich súvisiacim entitám funguje bez problémov, zväčša ide o jednoduchý a čitateľný kód. Ťažkosti môžu nastať, ak chceme nejakú adresu zmazať. Fragment kódu pre zmazanie adresy s &lt;strong&gt;Id == 1&lt;/strong&gt;, by mohol vyzerať nasledovne:&lt;/p&gt;

&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt;&amp;nbsp;(&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;context&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;TestContext&lt;/span&gt;())
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;address&amp;nbsp;=&amp;nbsp;context.Addresses.Find(1);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Addresses.Remove(address);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.SaveChanges();
}&lt;/pre&gt;

&lt;p&gt;Očakávané správanie je zmazanie danej adresy z databázy a nastavenie príslušných cudzích kľúčov &lt;strong&gt;Address_Id&lt;/strong&gt; v tabuľke Users na &lt;strong&gt;NULL&lt;/strong&gt; (pre tých používateľov, ktorí mali danú adresu priradenú). V skutočnosti však pri volaní metódy &lt;strong&gt;context.SaveChanges()&lt;/strong&gt; obdržíme výnimku typu &lt;strong&gt;DbUpdateException&lt;/strong&gt;:&lt;/p&gt;
&lt;img src="http://blog.aspnet.sk/blogs/michalkohut/EF/02.png" alt="" /&gt;
&lt;p&gt;Vnútorná výnimka obsahuje správu:&lt;/p&gt;
&lt;pre&gt;The DELETE statement conflicted with the REFERENCE constraint Address_Users. The conflict occurred in database DbName, table dbo.Users, column &amp;#39;Address_Id&amp;#39;.The statement has been terminated.&lt;/pre&gt;

&lt;p&gt;Problém, ktorý nastal, súvisí práve s odloženým vyhodnocovaním v &lt;em&gt;Entity Framework&lt;/em&gt;-u. Objekt typu &lt;strong&gt;Address&lt;/strong&gt; má navigačnú vlastnosť, ktorá reprezentuje kolekciu všetkých používateľov, ktorí majú pridelenú danú adresu. Pri mazaní adresy je nevyhnutné, aby relevantné cudzie kľúče používateľov (tie ktoré odkazujúce na túto adresu) boli &amp;quot;vynulované&amp;quot;. Na to je ale potrebné všetkých týchto používateľov explicitne načítať. I keď fragment kódu pre mazanie adresy, ktorý je uvedený vyššie, pôsobí jednoducho a intuitívne, Entity Framework si s ním neporadí.&lt;/p&gt;

&lt;p&gt;Riešenie spočíva vo využití explicitného načítania tzv. &lt;em&gt;related properties&lt;/em&gt;, v tomto prípade kolekcie súvisiacich používateľov s danou adresou:&lt;/p&gt;

&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt;&amp;nbsp;(&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;context&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;TestContext&lt;/span&gt;())
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;address&amp;nbsp;=&amp;nbsp;context.Addresses.Find(1);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Entry(address).Collection(c&amp;nbsp;=&amp;gt;&amp;nbsp;c.Users).Load();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Addresses.Remove(address);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.SaveChanges();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}&lt;/pre&gt;

&lt;p&gt;V tomto prípade by ma naozaj potešilo, keby fungoval prvý zápis - čiže verzia bez &amp;quot;čudného&amp;quot; riadku, obsahujúceho volanie metódy &lt;strong&gt;Load()&lt;/strong&gt;. Kto vie aké vylepšenia prinesú ďalšie verzie EF...&lt;/p&gt;

		&lt;script src="http://connect.facebook.net/en_US/all.js#xfbml=1"&gt;&lt;/script&gt;&lt;fb:like href="" show_faces="true" width="450" font=""&gt;&lt;/fb:like&gt;&lt;img src="http://blog.aspnet.sk/aggbug.aspx?PostID=307009" width="1" height="1"&gt;</description><category domain="http://blog.aspnet.sk/michalkohut/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blog.aspnet.sk/michalkohut/archive/tags/Entity+framework/default.aspx">Entity framework</category></item><item><title>Konfigurácia knižnice Automapper s Unity IOC</title><link>http://blog.aspnet.sk/michalkohut/archive/2011/09/10/konfigur-225-cia-automapper-a-s-ioc.aspx</link><pubDate>Sat, 10 Sep 2011 15:06:00 GMT</pubDate><guid isPermaLink="false">cbdfeddd-8b45-43cb-b10b-361e40cba84b:306990</guid><dc:creator>michal.kohut</dc:creator><slash:comments>0</slash:comments><comments>http://blog.aspnet.sk/michalkohut/archive/2011/09/10/konfigur-225-cia-automapper-a-s-ioc.aspx#comments</comments><description>&lt;p&gt;S mapovaním nejakého objektu na iný objekt sa stretol hádam každý programátor. Ide o zvlášť &amp;quot;populárnu&amp;quot; činnosť v projektoch využívajúcich architektúry ako MVC alebo MVVM. Fragmenty kódu, kde sú mapované vlastnosti modelu na vlastnosti príslušného viewmodelu a naopak vedia poriadne pokaziť estetický dojem z kódu. Ich písanie je navyše nudné, otravné a čo je najhoršie - opakujúce sa.&lt;/p&gt;

&lt;h2&gt;AutoMapper&lt;/h2&gt;

&lt;p&gt;Našťastie existujú nástroje, ktoré toto mapovanie robia za nás. Jedným z takých je knižnica &lt;a href="http://automapper.org"&gt;AutoMapper&lt;/a&gt;, ktorej autorom je Jimmy Bogard (spoluautor kníh ASP.NET MVC in Action a ASP.NET MVC 2 in Action). Jej aktuálnu verziu je možné do projektu nainštalovať prostredníctvom PM konzoly príkazom:&lt;/p&gt;&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;PM&amp;gt;&amp;nbsp;Install-Package&amp;nbsp;AutoMapper
&lt;/pre&gt;

Väčšina návodov na použitie AutoMapper-a používa statickú triedu &lt;strong&gt;Mapper&lt;/strong&gt;, obvykle v dvoch základných krokoch:
&lt;ol&gt;
&lt;li&gt;definícia mapovania:
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:#2b91af;"&gt;Mapper&lt;/span&gt;.CreateMap&amp;lt;SourceType,&amp;nbsp;TargetType&amp;gt;();
&lt;/pre&gt;
&lt;li&gt;samotné mapovanie:
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;target&amp;nbsp;=&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Mapper&lt;/span&gt;.Map&amp;lt;SourceType,&amp;nbsp;TargetType&amp;gt;(source);
&lt;/pre&gt;
&lt;/ol&gt;

&lt;p&gt;Problém spojený so statickými triedami a metódami však nastane v prípade potreby jednotkového testovania zdrojového kódu a jeho izolácie. Statické triedy a statické metódy sú elementami procedurálného kódu a ich tzv. &lt;a href="http://en.wikipedia.org/wiki/Mock_object"&gt;mockovanie&lt;/a&gt; v prípade potreby izolácie nejakej testovanej komponenty je nemožné. Trieda Mapper z knižnice AutoMapper je však len akýmsi wrapper-om pre dve triedy, ktoré poskytujú skutočnú funkcionalitu - &lt;strong&gt;Configuration&lt;/strong&gt; a &lt;strong&gt;MappingEngine&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;AutoMapper a Unity&lt;/h2&gt;

&lt;p&gt;Cieľom je teda integrovať AutoMapper do projektu, v ktorom je použitý niektorý z DI (&lt;a href="http://martinfowler.com/articles/injection.html"&gt;Dependency Injection&lt;/a&gt;) kontajnerov. V tomto konkrétnom prípade pôjde o DI kontajner &lt;a href="http://unity.codeplex.com/"&gt;Unity&lt;/a&gt; od spoločnosti MIcrosoft. Princíp by mal ale bude fungovať pre ľubovoľný iný DI kontajner.&lt;/p&gt; 
Základný &lt;em&gt;resolving&lt;/em&gt; pre kľúčové typy knižnice AutoMapper-a by mal vyzerať nasledovne:
&lt;ul&gt;
&lt;li&gt;žiadosť pre rozhranie &lt;strong&gt;IConfiguration&lt;/strong&gt; vráti typ &lt;strong&gt;Configuration&lt;/strong&gt;,
&lt;li&gt;žiadosť pre rozhranie &lt;strong&gt;IConfigurationProvider&lt;/strong&gt; vráti typ &lt;strong&gt;Configuration&lt;/strong&gt; a
&lt;li&gt;žiadosť pre rozhranie &lt;strong&gt;IMappingEngine&lt;/strong&gt; vráti typ &lt;strong&gt;MappingEngine&lt;/strong&gt;.
&lt;/ul&gt;

&lt;p&gt;Konkrétna konfigurácia kontajnera Unity by mala byť jasná, za zmienku možno stojí spôsob registrovania samotného typu Configuration. Inštancia triedy Configuration je vytváraná pomocou factory metódy, ktorá volá priamo konštruktor triedy Configuration. Parameter ContainerControlledLifetimeManager určuje životnosť inštancie triedy Configuration - v tomto prípade to znamená Singleton, nakoľko chceme mať v celej aplikácii jedinú inštanciu tejto triedy, ktorá bude obsahovať konfiguráciu pre všetky mapovania.&lt;/p&gt;

&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&lt;/span&gt;&amp;nbsp;container&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;UnityContainer&lt;/span&gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;container.RegisterType&amp;lt;&lt;span style="color:#2b91af;"&gt;Configuration&lt;/span&gt;&amp;gt;(&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;ContainerControlledLifetimeManager&lt;/span&gt;(),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;InjectionFactory&lt;/span&gt;((c)&amp;nbsp;=&amp;gt;&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Configuration&lt;/span&gt;(&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;TypeMapFactory&lt;/span&gt;(),&amp;nbsp;&lt;span style="color:#2b91af;"&gt;MapperRegistry&lt;/span&gt;.AllMappers())));
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;container.RegisterType&amp;lt;&lt;span style="color:#2b91af;"&gt;IConfiguration&lt;/span&gt;,&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Configuration&lt;/span&gt;&amp;gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;container.RegisterType&amp;lt;&lt;span style="color:#2b91af;"&gt;IConfigurationProvider&lt;/span&gt;,&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Configuration&lt;/span&gt;&amp;gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;container.RegisterType&amp;lt;&lt;span style="color:#2b91af;"&gt;IMappingEngine&lt;/span&gt;,&amp;nbsp;&lt;span style="color:#2b91af;"&gt;MappingEngine&lt;/span&gt;&amp;gt;();&lt;/pre&gt;

&lt;p&gt;Použitie objektu typu IMappingEngine pre realizáciu samotného mapovania:&lt;/p&gt;

&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;mappingEngine&amp;nbsp;=&amp;nbsp;container.Resolve&amp;lt;&lt;span style="color:#2b91af;"&gt;IMappingEngine&lt;/span&gt;&amp;gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;target&amp;nbsp;=&amp;nbsp;mappingEngine.Map&amp;lt;&lt;span style="color:#2b91af;"&gt;SourceType&lt;/span&gt;,&amp;nbsp;&lt;span style="color:#2b91af;"&gt;TargetType&lt;/span&gt;&amp;gt;(source);&lt;/pre&gt;

&lt;h2&gt;Registrácia mapovania&lt;/h2&gt;

&lt;p&gt;Pravdepodobne nie je žiadúce, aby sme mali všetky konkrétne mapovania definované niekde na jednom mieste a radšej uprednostníme trochu modulárnejšie riešenie. Keďže máme k dispozícii DI kontajner, pôjde to celkom ľahko. Najprv vytvoríme rozhranie, ktoré bude definovať konkrétne mapovanie typov. Pre ilustráciu uvediem i príklad implementácie tohto rozhrania:&lt;/p&gt;

&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;interface&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;IMappingRegistration&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;void&lt;/span&gt;&amp;nbsp;RegisterMapping(&lt;span style="color:#2b91af;"&gt;IConfiguration&lt;/span&gt;&amp;nbsp;configuration);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;/pre&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;SampleMappingRegistration&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span style="color:#2b91af;"&gt;IMappingRegistration&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;void&lt;/span&gt;&amp;nbsp;RegisterMapping(&lt;span style="color:#2b91af;"&gt;IConfiguration&lt;/span&gt;&amp;nbsp;configuration)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;configuration.CreateMap&amp;lt;&lt;span style="color:#2b91af;"&gt;SourceType&lt;/span&gt;,&amp;nbsp;&lt;span style="color:#2b91af;"&gt;TargetType&lt;/span&gt;&amp;gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;

&lt;p&gt;Takto vytvorené mapovanie je následne potrebné registrovať v konfigurácii pre Unity kontajner:&lt;/p&gt;

&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;container.RegisterType&amp;lt;&lt;span style="color:#2b91af;"&gt;IMappingRegistration&lt;/span&gt;,&amp;nbsp;&lt;span style="color:#2b91af;"&gt;SampleMappingRegistration&lt;/span&gt;&amp;gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;container.RegisterType&amp;lt;&lt;span style="color:#2b91af;"&gt;IMappingRegistration&lt;/span&gt;,&amp;nbsp;&lt;span style="color:#2b91af;"&gt;AnotherMappingRegistration&lt;/span&gt;&amp;gt;();
&lt;/pre&gt;

&lt;p&gt;No a na záver už len ostáva niekde pri štarte aplikácie (Bootstrap) všetky tieto mapovania registrovať:&lt;/p&gt;

&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;config&amp;nbsp;=&amp;nbsp;container.Resolve&amp;lt;&lt;span style="color:#2b91af;"&gt;IConfiguration&lt;/span&gt;&amp;gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;mappings&amp;nbsp;=&amp;nbsp;container.ResolveAll&amp;lt;&lt;span style="color:#2b91af;"&gt;IMappingRegistration&lt;/span&gt;&amp;gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;foreach&lt;/span&gt;&amp;nbsp;(&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;mappingRegistration&amp;nbsp;&lt;span style="color:blue;"&gt;in&lt;/span&gt;&amp;nbsp;mappings)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mappingRegistration.RegisterMapping(config);&lt;/pre&gt;

&lt;p&gt;Výsledkom je vlastne distribúcia definícií konkrétnych mapovaní do viacerých  tried (implementujúcich rozhranie IMappingRegistration). Navyše celý tento spôsob integrovania knižnice AutoMapper do projektu nevytvára žiadne väzby na statickú triedu Mapper, náš kód ostáva testovateľný, čistý a &lt;em&gt;loosely coupled&lt;/em&gt;.&lt;/p&gt;
		&lt;script src="http://connect.facebook.net/en_US/all.js#xfbml=1"&gt;&lt;/script&gt;&lt;fb:like href="" show_faces="true" width="450" font=""&gt;&lt;/fb:like&gt;&lt;img src="http://blog.aspnet.sk/aggbug.aspx?PostID=306990" width="1" height="1"&gt;</description><category domain="http://blog.aspnet.sk/michalkohut/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blog.aspnet.sk/michalkohut/archive/tags/Dependency+Injection/default.aspx">Dependency Injection</category><category domain="http://blog.aspnet.sk/michalkohut/archive/tags/Inversion+of+Control/default.aspx">Inversion of Control</category><category domain="http://blog.aspnet.sk/michalkohut/archive/tags/TDD/default.aspx">TDD</category></item><item><title>Ako skonvertovať fragment kódu do formátu HTML vo VS 2010 </title><link>http://blog.aspnet.sk/michalkohut/archive/2011/08/24/ako-skop-237-rova-fragment-k-243-du-do-form-225-tu-html-priamo-vo-vs-2010.aspx</link><pubDate>Wed, 24 Aug 2011 17:18:00 GMT</pubDate><guid isPermaLink="false">cbdfeddd-8b45-43cb-b10b-361e40cba84b:306977</guid><dc:creator>michal.kohut</dc:creator><slash:comments>0</slash:comments><comments>http://blog.aspnet.sk/michalkohut/archive/2011/08/24/ako-skop-237-rova-fragment-k-243-du-do-form-225-tu-html-priamo-vo-vs-2010.aspx#comments</comments><description>&lt;h1&gt;Alebo funkcia HTML Copy z Productivity Power Tools&lt;/h1&gt;
&lt;p&gt;Keď som písal svoj prvý blog, čo vlastne nebolo tak dávno, zasekol som sa na chvíľu pri probléme ako čo najjednoduchšie a najrýchlejšie dostanem &lt;strong&gt;kód z VS do HTML&lt;/strong&gt;. Cieľom bolo samozrejme, aby kód vyzeral presne rovnako.  Musím sa priznať, že som pôvodne očakával nejaké jednoduché klikacie menu pre formátovanie textu, ktoré bude dostupné pri tvorení nového článku v Blog Management-e. Fakt, že musím písať text v HTML ma teda trošku prekvapil. Na druhej strane ale treba priznať, že priame použitie jazyka HTML ponúka široké možnosti formátovania textu a v podstate i celého článku.&lt;/p&gt;

&lt;p&gt;Takže som začal hľadať vhodný nástroj/spôsob ako skonvertovať zdrojový kód v C# do jazyka HTML. Vyskúšal som online tool &lt;a href="http://www.manoli.net/csharpformat/"&gt;manoli&lt;/a&gt;, addiny &lt;a href="http://copysourceashtml.codeplex.com/"&gt;CopySourceAsHtml&lt;/a&gt;, &lt;a href="http://code4blog.codeplex.com/"&gt;Code4Blog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Neviem, či bol problém vo mne, ale akosi ani jednému z nich som neprišiel na chuť. Až potom som sa niekde dočítal, že rošírenie pre &lt;a href="http://visualstudiogallery.msdn.microsoft.com/d0d33361-18e2-46c0-8ff2-4adea1e34fef"&gt;VS 2010 Productivity Power Tools&lt;/a&gt; obsahuje funkciu nazvanú &lt;strong&gt;HTML Copy&lt;/strong&gt;. Funguje to presne tak ako som chcel, aby to fungovalo. Jednoducho a hlavne rýchlo. Navyše keďže som už toto rozšírenie mal nainštalované, nepotreboval som inštalovať nič naviac.&lt;/p&gt;

&lt;h2&gt;Ako na to&lt;/h2&gt;

&lt;p&gt;Fragment kódu, ktorý má byť konvertovaný stačí jednoducho označiť a dať kopírovať (príkaz &lt;strong&gt;Copy&lt;/strong&gt; z kontextového menu alebo staré známe &lt;strong&gt;CTRL-C&lt;/strong&gt;). &lt;/p&gt;

&lt;img src="http://blog.aspnet.sk/blogs/michalkohut/HtmlCopy_002.png" alt="Copy article" /&gt;

&lt;p&gt;Obsah clipboardu je teraz potrebné vložiť do editora podporujúceho jazyk HTML (napríklad Windows Live Writer). Keďže však je tento článok o tom, ako celý tento proces zvládnuť vo VS 2010, nepotrebujeme Windows Live Writer ani nič podobné. Vo VS vyberieme z hlavného menu File -&amp;gt; New -&amp;gt; File... -&amp;gt; HTML Page (názov súboru momentálne nie je dôležitý). Kopírovaný text vložíme pomocou príkazu &lt;strong&gt;Paste Alternate&lt;/strong&gt; (dostupný v kontextovom menu alebo v hlavnom menu Edit -&amp;gt; Paste Alternate.&lt;/p&gt;

&lt;img src="http://blog.aspnet.sk/blogs/michalkohut/HtmlCopy_003.png" alt="Paste article" /&gt;

&lt;p&gt;Kód v takejto podobe vyzerá na prvý pohľad dosť odstrašujúco. Po prekonaní prvotného šoku však je možné postupne rozpoznať známe HTML elementy. Nakoniec zistíme, že orientovať sa v tomto kóde nie je až taký problém. Základné nastavenia funkcie &lt;strong&gt;HTMLCopy&lt;/strong&gt; sú dostupné v Tools -&amp;gt; Options -&amp;gt; Productivity Power Tools -&amp;gt; HTML Copy.&lt;/p&gt;

&lt;img src="http://blog.aspnet.sk/blogs/michalkohut/HtmlCopy_001.png" alt="HTML Copy Setttings" /&gt;

&lt;p&gt;A na záver naformátovaný kód v prehliadači:&lt;/p&gt;

&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Linq;
&lt;span style="color:blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Web.Mvc;
&lt;span style="color:blue;"&gt;using&lt;/span&gt;&amp;nbsp;MvcMusicStore.Models;
 
&lt;span style="color:blue;"&gt;namespace&lt;/span&gt;&amp;nbsp;MvcMusicStore.Controllers
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;StoreController&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Controller&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;MusicStoreEntities&lt;/span&gt;&amp;nbsp;_storeDb&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;MusicStoreEntities&lt;/span&gt;();
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;ActionResult&lt;/span&gt;&amp;nbsp;Index()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;genres&amp;nbsp;=&amp;nbsp;_storeDb.Genres;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;return&lt;/span&gt;&amp;nbsp;View(genres);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;ActionResult&lt;/span&gt;&amp;nbsp;Browse(&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;nbsp;genre)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;genreModel&amp;nbsp;=&amp;nbsp;_storeDb.Genres.Include(&lt;span style="color:#a31515;"&gt;&amp;quot;Albums&amp;quot;&lt;/span&gt;).Single(g&amp;nbsp;=&amp;gt;&amp;nbsp;g.Name&amp;nbsp;==&amp;nbsp;genre);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;return&lt;/span&gt;&amp;nbsp;View(genreModel);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;ActionResult&lt;/span&gt;&amp;nbsp;Details(&lt;span style="color:blue;"&gt;int&lt;/span&gt;&amp;nbsp;id)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;album&amp;nbsp;=&amp;nbsp;_storeDb.Albums.Find(id);
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;return&lt;/span&gt;&amp;nbsp;View(album);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&lt;span style="color:#2b91af;"&gt;ChildActionOnly&lt;/span&gt;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;ActionResult&lt;/span&gt;&amp;nbsp;GenreMenu()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;genres&amp;nbsp;=&amp;nbsp;_storeDb.Genres.ToList();
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;return&lt;/span&gt;&amp;nbsp;PartialView(genres);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}
&lt;/pre&gt;
		&lt;script src="http://connect.facebook.net/en_US/all.js#xfbml=1"&gt;&lt;/script&gt;&lt;fb:like href="" show_faces="true" width="450" font=""&gt;&lt;/fb:like&gt;&lt;img src="http://blog.aspnet.sk/aggbug.aspx?PostID=306977" width="1" height="1"&gt;</description><category domain="http://blog.aspnet.sk/michalkohut/archive/tags/Visual+Studio+2010/default.aspx">Visual Studio 2010</category></item><item><title>Manuálna validácia atribútov z DataAnnotations</title><link>http://blog.aspnet.sk/michalkohut/archive/2011/08/21/manu-225-lna-valid-225-cia-atrib-250-tov-z-dataannotations.aspx</link><pubDate>Sun, 21 Aug 2011 09:19:00 GMT</pubDate><guid isPermaLink="false">cbdfeddd-8b45-43cb-b10b-361e40cba84b:306976</guid><dc:creator>michal.kohut</dc:creator><slash:comments>0</slash:comments><comments>http://blog.aspnet.sk/michalkohut/archive/2011/08/21/manu-225-lna-valid-225-cia-atrib-250-tov-z-dataannotations.aspx#comments</comments><description>Validácia vstupných dát (prichádzajúcich od používateľa, zo vzdialenej databázy, zo súboru alebo od akéhokoľvek iného zdroja) je nevyhnutnou súčasťou takmer každej aplikácie. Samotný validačný proces možno zjednodušene charakterizovať ako proces zabezpečenia spoľahlivého a bezpečného “bindingu” týchto dát na biznis modely aplikácie. Niekedy môže byť tento proces veľmi zložitý a nepochybne existuje viacero možností ako validačnú logiku navrhnúť.
&lt;br /&gt;&lt;br /&gt;

Framework &lt;strong&gt;ASP.NET MVC 3&lt;/strong&gt; poskytuje rozšíriteľný a vysoko prispôsobivý mechanizmus ako validovať vstupné dáta pre modely. Od vlastného písania všetkých validačných metód, cez možnosti implementácie rozhrania &lt;font face="Courier New"&gt;IValidatableObject&lt;/font&gt;, cez tvorbu vlastných &lt;font face="Courier New"&gt;ModelBinder&lt;/font&gt;-ov obsahujúcich validačné pravidlá, cez použitie elegantných atribútov z &lt;font face="Courier New"&gt;DataAnnotations&lt;/font&gt; až po písanie vlastných &lt;font face="Courier New"&gt;ModelValidatorProvider&lt;/font&gt;-ov. 
&lt;br /&gt;&lt;br /&gt;

Zámerne som použil výraz elegantné atribúty, pretože ide podľa môjho názoru o veľmi čistý a jednoduchý spôsob ako validovať vstupné dáta (aj keď prináša isté obmedzenia). Pre jeho použitie stačí jednotlivé vlastnosti modelu &lt;em&gt;dekorovať&lt;/em&gt; vhodnými atribútmi &lt;font face="Courier New"&gt;(Required, StringLength, ...)&lt;/font&gt; a následne v akcii triedy controller-a, ktorá prijíma ako vstupný parameter model, je výsledok validácie tohto modelu dostupný vo vlastnosti &lt;font face="Courier New"&gt;ModelState.IsValid&lt;/font&gt;. 
&lt;br /&gt;&lt;br /&gt;

Problém môže nastať ak potrebujeme takýto alebo podobný mechanizmus využiť niekde mimo UI frameworku (akým je ASP.NET MVC), kde dostupný nie je. Stále však máme k dispozícii menný priestor &lt;strong&gt;System.ComponentModel.DataAnnotations&lt;/strong&gt;, a tak riešenie nemusí byť až také náročné. 
Assembly System.ComponentModel.DataAnnotations obsahuje všetko potrebné k vytvoreniu validačnej logiky presne podľa našich požiadaviek. Ako príklad použijem odľahčenú verziu mierne upraveného návrhového vzoru Command, ktorý sme používali na jednom z predošlých projektov.
&lt;br /&gt;&lt;br /&gt;

Ak píšem o validácii modelu, pod pojmom model mám v nasledujúcom kontexte na mysli triedu &lt;font face="Courier New"&gt;Command&lt;/font&gt; (a jej potomkov). Začneme definovaním jednoduchého rozhrania &lt;font face="Courier New"&gt;ICommand&lt;/font&gt;, ktoré deklaruje jedinú metódu pre validáciu, &lt;font face="Courier New"&gt;Validate()&lt;/font&gt;. Tu sa možno naskytá otázka prečo nevyužiť existujúce rozhranie &lt;font face="Courier New"&gt;IValidatableObject&lt;/font&gt;. Teoreticky to možné je, akurát mi vadí v tomto prípade zbytočný parameter &lt;font face="Courier New"&gt;ValidationContext&lt;/font&gt;, ktorý prijíma metóda &lt;font face="Courier New"&gt;IValidatableObject.Validate&lt;/font&gt;. A navyše názov &lt;font face="Courier New"&gt;ICommand&lt;/font&gt; lepšie zapadá do našej architektúry.

&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Collections.Generic;
&lt;span style="color:blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.ComponentModel.DataAnnotations;
 
&lt;span style="color:blue;"&gt;namespace&lt;/span&gt;&amp;nbsp;Test.Infrastructure.CommandEngine
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;interface&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;ICommand&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;ValidationResult&lt;/span&gt;&amp;gt;&amp;nbsp;Validate();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/pre&gt;

Rozhranie je priamo implementované abstraktnou triedou &lt;font face="Courier New"&gt;Command&lt;/font&gt;, ktorá delí validačný proces na dve časti 
&lt;ol&gt;
 &lt;li&gt;&lt;strong&gt;AutoValidate&lt;/strong&gt; - validácia vlastností modelu (property-level)&lt;/li&gt;
 &lt;li&gt;&lt;strong&gt;CustomValidate&lt;/strong&gt; - validácia samotného modelu (model-level)&lt;/li&gt;
&lt;/ol&gt;

Metóda &lt;font face="Courier New"&gt;AutoValidate&lt;/font&gt; je implementovaná priamo v tejto abstraktnej triede a realizuje validáciu vlastností modelu, pomocou statickej metódy &lt;font face="Courier New"&gt;Validator.TryValidateObject&lt;/font&gt;. 
&lt;br /&gt;Metóda &lt;font face="Courier New"&gt;CustomValidate&lt;/font&gt; je metóda, ktorá môže byť podľa potreby prekrytá už v konkrétnej implementácii &lt;font face="Courier New"&gt;Command&lt;/font&gt;-u.

&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Collections.Generic;
&lt;span style="color:blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.ComponentModel.DataAnnotations;
&lt;span style="color:blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Linq;
 
&lt;span style="color:blue;"&gt;namespace&lt;/span&gt;&amp;nbsp;Test.Infrastructure.CommandEngine
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Command&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span style="color:#2b91af;"&gt;ICommand&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;ValidationResult&lt;/span&gt;&amp;gt;&amp;nbsp;Validate()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;results&amp;nbsp;=&amp;nbsp;AutoValidate();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;return&lt;/span&gt;&amp;nbsp;results.Union(CustomValidate());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;ValidationResult&lt;/span&gt;&amp;gt;&amp;nbsp;AutoValidate()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;results&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;ValidationResult&lt;/span&gt;&amp;gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Validator&lt;/span&gt;.TryValidateObject(&lt;span style="color:blue;"&gt;this&lt;/span&gt;,&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;ValidationContext&lt;/span&gt;(&lt;span style="color:blue;"&gt;this&lt;/span&gt;,&amp;nbsp;&lt;span style="color:blue;"&gt;null&lt;/span&gt;,&amp;nbsp;&lt;span style="color:blue;"&gt;null&lt;/span&gt;),&amp;nbsp;results,&amp;nbsp;&lt;span style="color:blue;"&gt;true&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;return&lt;/span&gt;&amp;nbsp;results;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;virtual&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;ValidationResult&lt;/span&gt;&amp;gt;&amp;nbsp;CustomValidate()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;yield&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;break&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/pre&gt;

Konkrétna implementácia triedy &lt;font face="Courier New"&gt;Command&lt;/font&gt; by teda mohla vyzerať takto: 

&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt;&amp;nbsp;System;
&lt;span style="color:blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.ComponentModel.DataAnnotations;
&lt;span style="color:blue;"&gt;using&lt;/span&gt;&amp;nbsp;Test.Infrastructure.CommandEngine;
 
&lt;span style="color:blue;"&gt;namespace&lt;/span&gt;&amp;nbsp;Test.Infrastructure.Commands
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;UserCreateCommand&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Command&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&lt;span style="color:#2b91af;"&gt;Required&lt;/span&gt;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Guid&lt;/span&gt;&amp;nbsp;Id&amp;nbsp;{&amp;nbsp;&lt;span style="color:blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color:blue;"&gt;set&lt;/span&gt;;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&lt;span style="color:#2b91af;"&gt;Required&lt;/span&gt;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&lt;span style="color:#2b91af;"&gt;StringLength&lt;/span&gt;(20)]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;nbsp;Username&amp;nbsp;{&amp;nbsp;&lt;span style="color:blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color:blue;"&gt;set&lt;/span&gt;;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&lt;span style="color:#2b91af;"&gt;Email&lt;/span&gt;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;nbsp;Email&amp;nbsp;{&amp;nbsp;&lt;span style="color:blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color:blue;"&gt;set&lt;/span&gt;;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/pre&gt;

Takže ostáva už len zavolať metódu pre validovanie:

&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt;&amp;nbsp;System;
&lt;span style="color:blue;"&gt;using&lt;/span&gt;&amp;nbsp;Test.Infrastructure.Common;
 
&lt;span style="color:blue;"&gt;namespace&lt;/span&gt;&amp;nbsp;Test.Infrastructure.CommandEngine
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;CommandEngine&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;void&lt;/span&gt;&amp;nbsp;Handle(&lt;span style="color:#2b91af;"&gt;ICommand&lt;/span&gt;&amp;nbsp;command)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ValidateCommand(command);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:green;"&gt;apply&amp;nbsp;some&amp;nbsp;rules&amp;nbsp;and&amp;nbsp;execute&amp;nbsp;the&amp;nbsp;command&lt;/span&gt;&lt;span style="color:green;"&gt;&amp;nbsp;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:green;"&gt;...&lt;/span&gt;&lt;span style="color:green;"&gt;&amp;nbsp;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;void&lt;/span&gt;&amp;nbsp;ValidateCommand(&lt;span style="color:#2b91af;"&gt;ICommand&lt;/span&gt;&amp;nbsp;command)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;errors&amp;nbsp;=&amp;nbsp;command.Validate();
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;if&lt;/span&gt;&amp;nbsp;(!errors.IsNullOrEmpty())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;throw&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;ApplicationException&lt;/span&gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}
&lt;/pre&gt;

Len pre úplnosť doplním ostatné detaily kódu: Metóda &lt;font face="Courier New"&gt;IsNullOrEmpty()&lt;/font&gt; je jednoduchou extension metódou pre &lt;font face="Courier New"&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/font&gt;, atribút &lt;font face="Courier New"&gt;[Email]&lt;/font&gt; je atribút vytvorený odvodením z triedy &lt;font face="Courier New"&gt;RegularExpressionAttribute&lt;/font&gt; a v kóde používame vlastnú verziu &lt;font face="Courier New"&gt;ValidationExcetion&lt;/font&gt;.
&lt;br /&gt;
		&lt;script src="http://connect.facebook.net/en_US/all.js#xfbml=1"&gt;&lt;/script&gt;&lt;fb:like href="" show_faces="true" width="450" font=""&gt;&lt;/fb:like&gt;&lt;img src="http://blog.aspnet.sk/aggbug.aspx?PostID=306976" width="1" height="1"&gt;</description><category domain="http://blog.aspnet.sk/michalkohut/archive/tags/ASP.NET+MVC+3/default.aspx">ASP.NET MVC 3</category><category domain="http://blog.aspnet.sk/michalkohut/archive/tags/.NET/default.aspx">.NET</category></item></channel></rss>