<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;A0QDRHwyeyp7ImA9WhRVGEQ.&quot;"><id>tag:blogger.com,1999:blog-4443173340461901816</id><updated>2012-01-18T16:09:35.293+01:00</updated><category term="Mocking" /><category term="MVC" /><category term="Powershell" /><category term="IoC" /><category term="SQLServer" /><category term="Inne" /><category term="Azure" /><category term="NLog" /><category term="NDepend" /><category term="Regex" /><category term="Debugowanie" /><category term="TDD" /><category term="Tip" /><category term="Agile" /><category term="WCF" /><category term="PG.NET" /><category term="Walidacja" /><category term="log4net" /><category term="StructureMap" /><category term="konferencje" /><category term="AutoMapper" /><category term="Gotowce" /><category term="CodeGuru" /><category term="C2C" /><category term="ITAD" /><title>Dariusz Tarczyński blog</title><subtitle type="html">Blog Dariusza Tarczyńskiego: ASP.NET, C#, MVC, TDD, inżynieria oprogramowania</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://dariusztarczynski.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://dariusztarczynski.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Dariusz Tarczyński</name><uri>http://www.blogger.com/profile/10745468881018443121</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="30" height="32" src="http://3.bp.blogspot.com/__d4mtXXARcU/SQSySUGrjaI/AAAAAAAAAJY/Id00EDvvIqs/S220/avatarnowy.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>58</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/DariuszTarczynski" /><feedburner:info uri="dariusztarczynski" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;CUIHRXk-fyp7ImA9Wx9WEkQ.&quot;"><id>tag:blogger.com,1999:blog-4443173340461901816.post-3435844932413801333</id><published>2011-01-17T20:43:00.001+01:00</published><updated>2011-01-17T20:45:34.757+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-17T20:45:34.757+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="PG.NET" /><title>PG.NET XXXI spotkanie grupy</title><content type="html">&lt;p&gt;Chciałbym Was serdecznie zaprosić na 31-te spotkanie Poznańskiej Grupy .NET, które odbędzie się w &lt;b&gt;czwartek 20 stycznia&lt;/b&gt; 2011 o godz. 18:00 w siedzibie firmy &lt;b&gt;Cognifide&lt;/b&gt; (&lt;a href="http://www.google.com/url?q=http%3A%2F%2Fmapy.zumi.pl%2Findex.html%3Fturystyka%3D%26long%3D16.918429%26lat%3D52.4166594%26type%3D2%26scale%3D1a%26svActive%3Dfalse&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFrqEzfBId2JK1AvUrkZVgWobu3ElCR4Aw"&gt;Aleja Wielkopolska 4, Poznań&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;W ramach spotkania zostaną poprowadzone dwie sesje: &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;CodeRush 101 (Przemysław Włodarczak) &lt;/li&gt;    &lt;li&gt;Problemy związane z wymaganiami w projektach IT: jak je zidentyfikować i jak rozwiązywać? (Jakub Jurkiewicz):&lt;/li&gt; &lt;/ol&gt; &lt;i&gt;&lt;i&gt;        &lt;/i&gt;&lt;/i&gt;  &lt;p&gt;Udział w spotkaniu jest bezpłatny, a rejestracja uczestników znajduje się tutaj: &lt;a href="http://grupy.codeguru.pl/pgdotnet/CalendareventList/1,19934.aspx"&gt;http://grupy.codeguru.pl/pgdotnet/CalendareventList/1,19934.aspx&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4443173340461901816-3435844932413801333?l=dariusztarczynski.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/vBU7MmSc_8WxxcQmmCh27gahn04/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vBU7MmSc_8WxxcQmmCh27gahn04/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/vBU7MmSc_8WxxcQmmCh27gahn04/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vBU7MmSc_8WxxcQmmCh27gahn04/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=2xtrQCqsur4:ZkIKtlbIMFA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=2xtrQCqsur4:ZkIKtlbIMFA:0VBWazUhMmc"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=0VBWazUhMmc" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=2xtrQCqsur4:ZkIKtlbIMFA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?i=2xtrQCqsur4:ZkIKtlbIMFA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DariuszTarczynski/~4/2xtrQCqsur4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dariusztarczynski.blogspot.com/feeds/3435844932413801333/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4443173340461901816&amp;postID=3435844932413801333" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/3435844932413801333?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/3435844932413801333?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DariuszTarczynski/~3/2xtrQCqsur4/pgnet-xxxi.html" title="PG.NET XXXI spotkanie grupy" /><author><name>Dariusz Tarczyński</name><uri>http://www.blogger.com/profile/10745468881018443121</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="30" height="32" src="http://3.bp.blogspot.com/__d4mtXXARcU/SQSySUGrjaI/AAAAAAAAAJY/Id00EDvvIqs/S220/avatarnowy.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://dariusztarczynski.blogspot.com/2011/01/pgnet-xxxi.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUcAQncycCp7ImA9Wx9SEkU.&quot;"><id>tag:blogger.com,1999:blog-4443173340461901816.post-6965618015185399819</id><published>2010-12-02T11:44:00.002+01:00</published><updated>2010-12-02T11:50:43.998+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-02T11:50:43.998+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="PG.NET" /><category scheme="http://www.blogger.com/atom/ns#" term="MVC" /><title>ASP.NET MVC na 30 spotkaniu PG.NET</title><content type="html">Zapraszam wszystkich na 30 (niezła, okrągła liczba) spotkanie Poznańskiej Grupy .NET, które odbędzie się w czwartek 2 grudnia 2010 o godz. 18:00 w siedzibie firmy Cognifide (Aleja Wielkopolska 4, Poznań) - na której zaprezentuję Wam platformę ASP.NET MVC. Prezentacja będzie miała charakter wprowadzającą - rozjaśniający: czyli będziemy krok po kroku poznawali najważniejsze elementy ASP.NET MVC wersji 2, a także udogodnienia, które będzie (bo nie wydana jeszcze oficjalnie) zawierała w sobie trzecia wersja ASP.NET MVC&lt;br /&gt;
&lt;br /&gt;
Rejestracja na spotkanie jest bezpłatna: &lt;a href="http://codeguru.pl/group-132/CalendareventList/1,19535.aspx"&gt;Rejestracja @ Codeguru.pl&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4443173340461901816-6965618015185399819?l=dariusztarczynski.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/t8HJGIRBKuLrb6RWF2zhJ5rDm_4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/t8HJGIRBKuLrb6RWF2zhJ5rDm_4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/t8HJGIRBKuLrb6RWF2zhJ5rDm_4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/t8HJGIRBKuLrb6RWF2zhJ5rDm_4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=EHBrrVDIIzs:11ebpERwE6E:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=EHBrrVDIIzs:11ebpERwE6E:0VBWazUhMmc"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=0VBWazUhMmc" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=EHBrrVDIIzs:11ebpERwE6E:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?i=EHBrrVDIIzs:11ebpERwE6E:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DariuszTarczynski/~4/EHBrrVDIIzs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dariusztarczynski.blogspot.com/feeds/6965618015185399819/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4443173340461901816&amp;postID=6965618015185399819" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/6965618015185399819?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/6965618015185399819?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DariuszTarczynski/~3/EHBrrVDIIzs/aspnet-mvc-na-30-spotkaniu-pgnet.html" title="ASP.NET MVC na 30 spotkaniu PG.NET" /><author><name>Dariusz Tarczyński</name><uri>http://www.blogger.com/profile/10745468881018443121</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="30" height="32" src="http://3.bp.blogspot.com/__d4mtXXARcU/SQSySUGrjaI/AAAAAAAAAJY/Id00EDvvIqs/S220/avatarnowy.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://dariusztarczynski.blogspot.com/2010/12/aspnet-mvc-na-30-spotkaniu-pgnet.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEARn88cCp7ImA9Wx9aEUU.&quot;"><id>tag:blogger.com,1999:blog-4443173340461901816.post-5638619489201078668</id><published>2010-10-24T00:30:00.002+02:00</published><updated>2011-03-03T21:20:47.178+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-03T21:20:47.178+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MVC" /><category scheme="http://www.blogger.com/atom/ns#" term="IoC" /><category scheme="http://www.blogger.com/atom/ns#" term="StructureMap" /><category scheme="http://www.blogger.com/atom/ns#" term="Debugowanie" /><title>StructureMapControllerFactory w ASP.NET MVC</title><content type="html">&lt;p&gt;Standardowa implementacja fabryki kontrolerów &lt;em&gt;StructureMapControllerFactory &lt;/em&gt;może spowodować serię wyjątków zgłaszanych podczas próby utworzenia konkretnego kontrolera dla bieżącego żądania Http. Dzieje się tak dlatego, że domyślna tablica routingu aplikacji nie wyklucza przetwarzania plików statycznych takich jak np.&lt;strong&gt; favicon.ico&lt;/strong&gt; – jest on wykorzystywany w standardowym template dla aplikacji ASP.NET MVC 2. Efekt tego jest taki, że podczas implementacji aplikacji wygenerowanej z tego template otrzymujemy wyjątek:&lt;/p&gt;&lt;p&gt;&lt;em&gt;System.ArgumentNullException was caught     &lt;br /&gt;
&amp;#160; Message=Value cannot be null.      &lt;br /&gt;
Parameter name: key      &lt;br /&gt;
&amp;#160; Source=mscorlib      &lt;br /&gt;
&amp;#160; ParamName=key      &lt;br /&gt;
&amp;#160; StackTrace:      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; at System.Collections.Generic.Dictionary`2.FindEntry(TKey key)      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; at System.Collections.Generic.Dictionary`2.ContainsKey(TKey key)      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; at StructureMap.Util.Cache`2.get_Item(KEY key)      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; at StructureMap.BuildSession.CreateInstance(Type pluginType)      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; at StructureMap.Container.GetInstance(Type pluginType)      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; at StructureMap.ObjectFactory.GetInstance(Type pluginType)      &lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; at Komstar.Domains.Web.StructureMapControllerFactory.CreateController(RequestContext requestContext, String controllerName) in D:\…\…\Global.asax.cs:line 64      &lt;br /&gt;
&amp;#160; InnerException: &lt;/em&gt;&lt;/p&gt;&lt;p&gt;Aby rozwiązać ten problem należy dodać do routingu aplikacji następujący wpis:&lt;/p&gt;&lt;p&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:45c76a9c-ad83-491a-9edb-f5d03a1b601c" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c#"&gt;routes.IgnoreRoute("{favicon}", new { favicon = @"(./)?favicon.ico(/.*)?" });&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Teraz powinno być cicho.&lt;/p&gt;&lt;br /&gt;
&lt;div syle="border: Solid 1px Black"&gt;&lt;a href="http://www.lexstrada.pl" title="Obsługa prawna Poznań"&gt;Obsługa prawna Poznań&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4443173340461901816-5638619489201078668?l=dariusztarczynski.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/KOSnc1Ap0ldelagU5Kh4U713KAM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KOSnc1Ap0ldelagU5Kh4U713KAM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/KOSnc1Ap0ldelagU5Kh4U713KAM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KOSnc1Ap0ldelagU5Kh4U713KAM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=4LCl2prP9NU:6JDrlINCTAw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=4LCl2prP9NU:6JDrlINCTAw:0VBWazUhMmc"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=0VBWazUhMmc" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=4LCl2prP9NU:6JDrlINCTAw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?i=4LCl2prP9NU:6JDrlINCTAw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DariuszTarczynski/~4/4LCl2prP9NU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dariusztarczynski.blogspot.com/feeds/5638619489201078668/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4443173340461901816&amp;postID=5638619489201078668" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/5638619489201078668?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/5638619489201078668?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DariuszTarczynski/~3/4LCl2prP9NU/structuremapcontrollerfactory-w-aspnet.html" title="StructureMapControllerFactory w ASP.NET MVC" /><author><name>Dariusz Tarczyński</name><uri>http://www.blogger.com/profile/10745468881018443121</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="30" height="32" src="http://3.bp.blogspot.com/__d4mtXXARcU/SQSySUGrjaI/AAAAAAAAAJY/Id00EDvvIqs/S220/avatarnowy.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://dariusztarczynski.blogspot.com/2010/10/structuremapcontrollerfactory-w-aspnet.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0EBQn48eyp7ImA9WxFUGUs.&quot;"><id>tag:blogger.com,1999:blog-4443173340461901816.post-8950120240710371715</id><published>2010-06-09T20:54:00.002+02:00</published><updated>2010-07-01T09:34:13.073+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-01T09:34:13.073+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tip" /><title>Visual Studio 2010 Pro Power Tools i problem z czarną skórką</title><content type="html">&lt;p&gt;Ukazała się pierwsza wersja świetnego dodatku do Visual Studio: &lt;a href="http://visualstudiogallery.msdn.microsoft.com/en-us/d0d33361-18e2-46c0-8ff2-4adea1e34fef" target="_blank"&gt;Visual Studio 2010 Pro Power Tools&lt;/a&gt;. Nie chcę się powtarzać bo opis funkcjonalności można przeczytać np. &lt;a href="http://blogs.msdn.com/b/bharry/archive/2010/06/07/announcing-the-first-visual-studio-pro-power-tools.aspx" target="_blank"&gt;tutaj&lt;/a&gt;. Jednak zauważyłem problem w przypadku czarnych schematów kolorów IDE, których jestem zwolennikiem. Największy problem jest z jednym z ciekawszych ficzerów, a mianowicie kolorowaniem parametrów metod w oknie podpowiedzi. U mnie sprawa wyglądała następująco:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh5.ggpht.com/__d4mtXXARcU/TA_jdgyza7I/AAAAAAAAAa8/eFf4JMnvrA8/s1600-h/darktheme%5B3%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="darktheme" border="0" alt="darktheme" src="http://lh5.ggpht.com/__d4mtXXARcU/TA_jehH_z_I/AAAAAAAAAbA/9aMkwX0ULOc/darktheme_thumb%5B1%5D.jpg?imgmax=800" width="602" height="310" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Na szczęście udało mi się znaleźć rozwiązanie problemu. Należy wejść w: &lt;strong&gt;Tools-&amp;gt;Options-&amp;gt;Fonts and Colors-&amp;gt;Signature Help Tooltip Background&lt;/strong&gt; oraz odpowiednio ztuningować kolor tła i czcionek zgodnie z własnymi upodobaniami :-)&lt;/p&gt;&lt;p&gt;Hołp dis help ;-)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4443173340461901816-8950120240710371715?l=dariusztarczynski.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/SlU2qJ-Fy9vPs8hv-7PcS4z33Ig/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SlU2qJ-Fy9vPs8hv-7PcS4z33Ig/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/SlU2qJ-Fy9vPs8hv-7PcS4z33Ig/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SlU2qJ-Fy9vPs8hv-7PcS4z33Ig/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=Jrre-ZXaSiM:-9hqRNlcs8A:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=Jrre-ZXaSiM:-9hqRNlcs8A:0VBWazUhMmc"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=0VBWazUhMmc" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=Jrre-ZXaSiM:-9hqRNlcs8A:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?i=Jrre-ZXaSiM:-9hqRNlcs8A:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DariuszTarczynski/~4/Jrre-ZXaSiM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dariusztarczynski.blogspot.com/feeds/8950120240710371715/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4443173340461901816&amp;postID=8950120240710371715" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/8950120240710371715?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/8950120240710371715?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DariuszTarczynski/~3/Jrre-ZXaSiM/visual-studio-2010-pro-power-tools-i.html" title="Visual Studio 2010 Pro Power Tools i problem z czarną skórką" /><author><name>Dariusz Tarczyński</name><uri>http://www.blogger.com/profile/10745468881018443121</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="30" height="32" src="http://3.bp.blogspot.com/__d4mtXXARcU/SQSySUGrjaI/AAAAAAAAAJY/Id00EDvvIqs/S220/avatarnowy.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/__d4mtXXARcU/TA_jehH_z_I/AAAAAAAAAbA/9aMkwX0ULOc/s72-c/darktheme_thumb%5B1%5D.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://dariusztarczynski.blogspot.com/2010/06/visual-studio-2010-pro-power-tools-i.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEMSHcycSp7ImA9WxFWFUQ.&quot;"><id>tag:blogger.com,1999:blog-4443173340461901816.post-1220541136125328965</id><published>2010-06-03T21:33:00.001+02:00</published><updated>2010-06-03T22:58:09.999+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-03T22:58:09.999+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tip" /><category scheme="http://www.blogger.com/atom/ns#" term="WCF" /><title>extendedProtectionPolicy spowoduje, że Twoja aplikacja przestanie działać, czyli WCF + Windows 7 = CRASH</title><content type="html">&lt;p&gt;Straciłem ostatnio ładnych kilka godzin namierzając problem, który skutkował kompletnym zamknięciem się aplikacji zaraz po jej starcie. Co ciekawe problem pojawiał się jedynie na komputerach produkcyjnych: u mnie działało :-)&lt;/p&gt;  &lt;p&gt;Otóż jeśli tworzysz dowolnego klienta &lt;u&gt;WCF&lt;/u&gt; i posiadasz system &lt;u&gt;Windows 7&lt;/u&gt; jest niemal pewne, że Twój klient nie uruchomi się na innych systemach operacyjnych! Dlaczego? Problem tkwi w elemencie extendedProtectionPolicy, który “potajemnie” dodawany jest do pliku App.config.&lt;/p&gt;  &lt;p&gt;Więc jeśli Twoja aplikacja kończy działanie błedem zaraz po stworzeniu obiektu proxy dla klienta WCF i nie masz pojęcia o co chodzi, to &lt;u&gt;rozwiązaniem jest usunięcie tego elementu z pliku App.config&lt;/u&gt;.&lt;/p&gt;  &lt;p&gt;Mnie uratowała sesja z &lt;a href="http://pl.wikipedia.org/wiki/WinDbg" target="_blank"&gt;WinDbg&lt;/a&gt;, gdyż obiekt proxy miałem tworzony z kontenera &lt;a href="http://structuremap.sourceforge.net" target="_blank"&gt;StructureMap&lt;/a&gt; zaraz na początku w mojej aplikacji i nijak nie szło zdiagnozować problemu na komputerach produkcyjnych na których nie było żadnego środowiska programistycznego. Jednocześnie przekonałem się jak zaciemnić debugowanie może zastosowanie IoC.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4443173340461901816-1220541136125328965?l=dariusztarczynski.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/1nC8jRqWz1HuPkoMZ93xMaXPcp0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1nC8jRqWz1HuPkoMZ93xMaXPcp0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/1nC8jRqWz1HuPkoMZ93xMaXPcp0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1nC8jRqWz1HuPkoMZ93xMaXPcp0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=747x6G34-MY:hDySYpmlHbo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=747x6G34-MY:hDySYpmlHbo:0VBWazUhMmc"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=0VBWazUhMmc" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=747x6G34-MY:hDySYpmlHbo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?i=747x6G34-MY:hDySYpmlHbo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DariuszTarczynski/~4/747x6G34-MY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dariusztarczynski.blogspot.com/feeds/1220541136125328965/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4443173340461901816&amp;postID=1220541136125328965" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/1220541136125328965?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/1220541136125328965?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DariuszTarczynski/~3/747x6G34-MY/extendedprotectionpolicy-spowoduje-ze.html" title="extendedProtectionPolicy spowoduje, że Twoja aplikacja przestanie działać, czyli WCF + Windows 7 = CRASH" /><author><name>Dariusz Tarczyński</name><uri>http://www.blogger.com/profile/10745468881018443121</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="30" height="32" src="http://3.bp.blogspot.com/__d4mtXXARcU/SQSySUGrjaI/AAAAAAAAAJY/Id00EDvvIqs/S220/avatarnowy.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://dariusztarczynski.blogspot.com/2010/06/extendedprotectionpolicy-spowoduje-ze.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8FQnw9fip7ImA9Wx9aEUU.&quot;"><id>tag:blogger.com,1999:blog-4443173340461901816.post-4717460285215946268</id><published>2010-05-29T23:35:00.004+02:00</published><updated>2011-03-03T21:23:33.266+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-03T21:23:33.266+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="NDepend" /><title>NDepend 3 wchodzi na scenę!</title><content type="html">&lt;p&gt;O wersji v2 &lt;a href="http://www.ndepend.com" target="_blank"&gt;NDependa&lt;/a&gt; pisałem we &lt;a href="http://dariusztarczynski.blogspot.com/2009/09/ndepend-wiesz-z-kim-tanczysz.html" target="_blank"&gt;wcześniejszym poście&lt;/a&gt;, jednak na sporo więcej uwagi zasługuje najnowsza, trzecia wersja tego narzędzia.&lt;/p&gt;&lt;h4&gt;Co nowego w NDepend?&lt;/h4&gt;&lt;p&gt;Największą i dla mnie osobiście najbardziej przydatną nową funkcjonalnością jest &lt;strong&gt;pełna&lt;/strong&gt; integracja z Visual Studio 2005/2008/2010 IDE. Jeszcze nigdy używanie NDependa nie było tak naturalne w procesie tworzenia oprogramowania. Integracja wprowadza zupełnie nowy sposób pracy z kodem, gdyż do tej pory (przynajmniej w moim przypadku), statyczna analiza kodu przez NDependa była najefektywniejsza w połączeniu z &lt;a href="http://en.wikipedia.org/wiki/Continuous_integration" target="_blank"&gt;Continuous Integration&lt;/a&gt; (analiza przeprowadzana przez VisualNDepend była przeprowadzana wyrywkowo, jak mi się przypomniało). Integrację z Visual Studio uważam za doskonały pomysł i nie spodziewałem się, że może być ona tak pomocna!&lt;/p&gt;&lt;h4&gt;Jak to wygląda w praktyce?&lt;/h4&gt;&lt;p&gt;Zacznijmy od zainstalowania dodatku do VisualStudio, który pozwoli na integrację NDependa z VS. Po uruchomieniu VisualNDepend.exe klikamy na przycisk instalacji:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/__d4mtXXARcU/TAGIbeN5cbI/AAAAAAAAAZY/c37MF1nbsC0/s1600-h/ndepend%20install%20adin%5B4%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="ndepend install adin" border="0" alt="ndepend install adin" src="http://lh6.ggpht.com/__d4mtXXARcU/TAGIcti-bbI/AAAAAAAAAZc/cWJAeFdJW38/ndepend%20install%20adin_thumb%5B2%5D.jpg?imgmax=800" width="602" height="488" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;Po czym wybieramy do jakiego środowiska ma być wykonana integracja oraz jej typ. &lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/__d4mtXXARcU/TAGIdeO9s_I/AAAAAAAAAZg/eNvsHCDekNM/s1600-h/install%20adin%202%5B3%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="install adin 2" border="0" alt="install adin 2" src="http://lh5.ggpht.com/__d4mtXXARcU/TAGIeHOjJnI/AAAAAAAAAZk/EWdaVS1x3Yc/install%20adin%202_thumb%5B1%5D.jpg?imgmax=800" width="438" height="257" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Do wyboru mamy: pełną integrację oraz integrację light. Integracja light polega na tym, że z poziomu Visula Studio będziemy wykonywać polecenia np. CQL (Code Query Language), które zostaną przesłane i uruchomione w otwartej osobno instancji VisualNDependa. Moim zdaniem instalacja light sprawdza się najlepiej na komputerach z niewielkimi monitorami. Mnogość okien NDependa wymaga sporej powierzchni do pracy, a gdzieś jeszcze trzeba znaleźć miejsce na wyświetlenie kodu :-) Jeśli jednak dysponujemy nieco większym ekranem, a już najlepiej dwoma, trzema, czterema, (ma ktoś pięć???) monitorami, wtedy wersja Full będzie najlepszym wyborem.&lt;/p&gt;&lt;h4&gt;Analizę czas zacząć&lt;/h4&gt;&lt;p&gt;Do celów edukacyjnych przeanalizujmy zobaczmy NDependa trójkę w akcji. Jak mięso armatnie użyję biblioteki &lt;a href="http://sharpy.codeplex.com/" target="_blank"&gt;Sharpy&lt;/a&gt;. Sharpy to implementacja ASP.NET MVC ViewEngine podobna do Smarty dostępnego dla PHP. Jednak w tym momencie nie jest to istotne. Po załadowaniu źródeł należy podłączyć NDependa do otwartego pliku solution, co czynimy bezpośrednio z poziomu menu VisualStudio (przed samym załadowaniem należy wykonać Build projektu):&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/__d4mtXXARcU/TAGIfGkJ52I/AAAAAAAAAZo/BAtWztsc75A/s1600-h/attach%5B4%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="attach" border="0" alt="attach" src="http://lh6.ggpht.com/__d4mtXXARcU/TAGIgAOY-sI/AAAAAAAAAZs/zFN_FV2BE_k/attach_thumb%5B2%5D.jpg?imgmax=800" width="600" height="232" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;W tym momencie NDepend automatycznie przeskanuje projekty i zaproponuje je do analizy (przypominam, że wersji v2&amp;#160; trzeba było “ręcznie” utworzyć projekt) i to już pierwsze, ogromne udogodnienie:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/__d4mtXXARcU/TAGIhG0ViRI/AAAAAAAAAZw/0B-qTtQg4Kg/s1600-h/attach%202%5B4%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="attach 2" border="0" alt="attach 2" src="http://lh4.ggpht.com/__d4mtXXARcU/TAGIh1pn7SI/AAAAAAAAAZ0/YXmuH9xKdHE/attach%202_thumb%5B2%5D.jpg?imgmax=800" width="518" height="324" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Oczywiście nic nie stoi na przeszkodzie, aby dołączyć kolejne pliki, które nie znajdowały się w naszym solution. Upewniamy się, że checkbox “Run Analysis Now!” jest zaznaczony, po czym pozostaje kliknąć przycisk OK.&lt;/p&gt;&lt;p&gt;Po wykonaniu analizy NDepend generuje raport HTML, który pozwala na szybkie przejrzenie stanu w jakim znajduje sie kod, reszta szczegółów znajduje się już w IDE. Szybki przegląd uzyskamy za pomocą żółtego oka węża (a co!) znajdującego się w prawym, dolnym rogu IDE:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/__d4mtXXARcU/TAGIi8muSpI/AAAAAAAAAZ4/2EypaLqc4bc/s1600-h/yellow%5B3%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="yellow" border="0" alt="yellow" src="http://lh3.ggpht.com/__d4mtXXARcU/TAGIj6iSaUI/AAAAAAAAAZ8/8QAXsNTR8aY/yellow_thumb%5B1%5D.jpg?imgmax=800" width="603" height="394" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Po dwukliku na nim oczom naszym ukazuje się CQL Query Explorer:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/__d4mtXXARcU/TAGIk2A-42I/AAAAAAAAAaA/w-WRBfzW7Bc/s1600-h/cql%5B3%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="cql" border="0" alt="cql" src="http://lh6.ggpht.com/__d4mtXXARcU/TAGIl389xsI/AAAAAAAAAaE/k8pqpFpH0jA/cql_thumb%5B1%5D.jpg?imgmax=800" width="614" height="402" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;h4&gt;NDepend Search&lt;/h4&gt;&lt;p&gt;NDepend Search, to kolejny feature, który jest mega użyteczny. Mimo, że VS 2010 wprowadza możliwość “inteligentnego” wyszukiwania po nazwie metod, to NDepend Search (wywalasz z menu NDepend/NDepend Search) potrafi wyszukiwać po nazwie metody, typach, polu, assembly, przestrzeni nazw, a na dodatek pokazuje w oknie wyszukiwania złożoność danej metody / typu, a przy tym działa bardzo szybko!&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/__d4mtXXARcU/TAGIm55bh5I/AAAAAAAAAaI/qWWXikVGau4/s1600-h/search%5B3%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="search" border="0" alt="search" src="http://lh5.ggpht.com/__d4mtXXARcU/TAGIngv1ToI/AAAAAAAAAaM/3IB6MrjOU5g/search_thumb%5B1%5D.jpg?imgmax=800" width="440" height="444" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Gdy jednak potrzebujemy bardziej rozbudowanego wyszukiwania pod względem złożoności wystarczy zaznaczyć po polu wyboru Serach by “Complexity”, a do dyspozycji będziemy mieli opcje służące do szybkiego odfiltrowania interesującej nas skali złożoności:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/__d4mtXXARcU/TAGIoSLEAXI/AAAAAAAAAaQ/SWjhSYKq__4/s1600-h/search%202%5B3%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="search 2" border="0" alt="search 2" src="http://lh4.ggpht.com/__d4mtXXARcU/TAGIpbUdWlI/AAAAAAAAAaU/2yOMRrPxj28/search%202_thumb%5B1%5D.jpg?imgmax=800" width="447" height="453" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;h4&gt;NDepend Class Browser + podgląd na żywo&lt;/h4&gt;&lt;p&gt;Kolejnym przydatnym okienkiem jest NDepend Class Browser, który oprócz swojej podstawowej funkcjonalności jaką jest ułatwienie nawigowania po klasach i ich składowych, dodatkowo komunikuje się z pozostałymi oknami np. Dependency Matrix, Metrics itd, dzięki czemu po najechaniu na klasę w oknie Class Browser-a otrzymujemy informację np. o jej zależnościach w oknie Dependency Matrix:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/__d4mtXXARcU/TAGIqSXpqlI/AAAAAAAAAaY/03fw18bdh_A/s1600-h/class%20browser%5B3%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="class browser" border="0" alt="class browser" src="http://lh5.ggpht.com/__d4mtXXARcU/TAGIragSdPI/AAAAAAAAAac/ynU4_clWfK0/class%20browser_thumb%5B1%5D.jpg?imgmax=800" width="606" height="330" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;h4&gt;Podsumowanie&lt;/h4&gt;&lt;p&gt;Nowa wersja NDepend-a wnosi rzuca zupełnie inne światło na to narzędzie. Dzięki doskonałej integracji ze środowiskiem programistycznym pozwala na uruchomienie analizy w dowolnym wręcz momencie, a dodatkowe funkcjonalności takie jak chociażby wspomniany NDepend Search znacznie przyśpieszają codzienną pracę ze złożonym kodem. Sporo wody w &lt;a href="http://pl.wikipedia.org/wiki/Warta_Pozna%C5%84_%28pi%C5%82ka_no%C5%BCna%29" target="_blank"&gt;Warcie&lt;/a&gt; upłynie zanim Visual Studio będzie wyposażone w taki kombajn.&lt;/p&gt;&lt;p&gt;&lt;a href="http://ndepend.com" target="_blank"&gt;Strona NDepend.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.ndepend.com/Features.aspx" target="_blank"&gt;NDdepend Features&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;a href="http://www.lexstrada.pl" title="Obsługa prawna Poznań" target="_blank"&gt;&lt;strong&gt;Obsługa prawna Poznań&lt;/strong&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4443173340461901816-4717460285215946268?l=dariusztarczynski.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/mjDWg-cxXNAaH0x5_fL62yNHLBk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mjDWg-cxXNAaH0x5_fL62yNHLBk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/mjDWg-cxXNAaH0x5_fL62yNHLBk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mjDWg-cxXNAaH0x5_fL62yNHLBk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=eQPUBDXWxIs:fHU9xVfoTkU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=eQPUBDXWxIs:fHU9xVfoTkU:0VBWazUhMmc"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=0VBWazUhMmc" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=eQPUBDXWxIs:fHU9xVfoTkU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?i=eQPUBDXWxIs:fHU9xVfoTkU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DariuszTarczynski/~4/eQPUBDXWxIs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dariusztarczynski.blogspot.com/feeds/4717460285215946268/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4443173340461901816&amp;postID=4717460285215946268" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/4717460285215946268?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/4717460285215946268?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DariuszTarczynski/~3/eQPUBDXWxIs/ndepend-3-wchodzi-na-scene.html" title="NDepend 3 wchodzi na scenę!" /><author><name>Dariusz Tarczyński</name><uri>http://www.blogger.com/profile/10745468881018443121</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="30" height="32" src="http://3.bp.blogspot.com/__d4mtXXARcU/SQSySUGrjaI/AAAAAAAAAJY/Id00EDvvIqs/S220/avatarnowy.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/__d4mtXXARcU/TAGIcti-bbI/AAAAAAAAAZc/cWJAeFdJW38/s72-c/ndepend%20install%20adin_thumb%5B2%5D.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://dariusztarczynski.blogspot.com/2010/05/ndepend-3-wchodzi-na-scene.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkQMQn0yeyp7ImA9WxFXGUw.&quot;"><id>tag:blogger.com,1999:blog-4443173340461901816.post-1950936834191998892</id><published>2010-05-26T23:38:00.001+02:00</published><updated>2010-05-26T23:46:23.393+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-26T23:46:23.393+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tip" /><category scheme="http://www.blogger.com/atom/ns#" term="Powershell" /><title>Użyteczny skrypt w Powershell</title><content type="html">&lt;p&gt;Jak za pomocą skryptu powłoki Powershell skompilować pliki solution znajdujące się w bieżącym folderze i jego podfolderach? Oto skrypcik, który do tego wykorzystuję:&lt;/p&gt;&lt;p&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:ff29bacb-238a-43f9-8543-a30e244c9e5a" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="php"&gt;foreach($file in get-childitem -filter *.sln -recurse)
{
echo Kompiluje $file.FullName
\Windows\Microsoft.NET\Framework\v3.5\msbuild.exe /t:build /p:Platform="Any CPU" /v:q /nologo $file.FullName
}&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;&lt;p&gt;Czyli skrypt doskonale nadaję się do tzw. buildAll :-)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4443173340461901816-1950936834191998892?l=dariusztarczynski.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/IVcnBIyG-VDbwxMFHZfjNq2UECg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IVcnBIyG-VDbwxMFHZfjNq2UECg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/IVcnBIyG-VDbwxMFHZfjNq2UECg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IVcnBIyG-VDbwxMFHZfjNq2UECg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=xJ4g9D2qnmg:Y0Wo1b3wCoc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=xJ4g9D2qnmg:Y0Wo1b3wCoc:0VBWazUhMmc"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=0VBWazUhMmc" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=xJ4g9D2qnmg:Y0Wo1b3wCoc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?i=xJ4g9D2qnmg:Y0Wo1b3wCoc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DariuszTarczynski/~4/xJ4g9D2qnmg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dariusztarczynski.blogspot.com/feeds/1950936834191998892/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4443173340461901816&amp;postID=1950936834191998892" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/1950936834191998892?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/1950936834191998892?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DariuszTarczynski/~3/xJ4g9D2qnmg/uzyteczny-skrypt-w-powershell.html" title="Użyteczny skrypt w Powershell" /><author><name>Dariusz Tarczyński</name><uri>http://www.blogger.com/profile/10745468881018443121</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="30" height="32" src="http://3.bp.blogspot.com/__d4mtXXARcU/SQSySUGrjaI/AAAAAAAAAJY/Id00EDvvIqs/S220/avatarnowy.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://dariusztarczynski.blogspot.com/2010/05/uzyteczny-skrypt-w-powershell.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkYGR38_fSp7ImA9WxFQGUk.&quot;"><id>tag:blogger.com,1999:blog-4443173340461901816.post-8777312540345572538</id><published>2010-05-15T20:16:00.004+02:00</published><updated>2010-05-15T20:28:46.145+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-15T20:28:46.145+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MVC" /><category scheme="http://www.blogger.com/atom/ns#" term="Debugowanie" /><title>Debugowanie ścieżek ASP.NET MVC: Routes Debugger step by step</title><content type="html">&lt;p&gt;&lt;a href="http://lh5.ggpht.com/__d4mtXXARcU/S-7k02p7iVI/AAAAAAAAAYw/kY9bqcVfN-U/s1600-h/errorroad%5B6%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="errorroad" border="0" alt="errorroad" align="left" src="http://lh5.ggpht.com/__d4mtXXARcU/S-7k1lh41rI/AAAAAAAAAY0/GUFMfEGukSs/errorroad_thumb%5B4%5D.jpg?imgmax=800" width="313" height="210" /&gt;&lt;/a&gt; Routing ASP.NET MVC może zrobić sporo zamieszania, jeśli w naszej aplikacji korzystamy z zaawansowanego sterowania pomiędzy kontrolerami i odpowiadającymi im widokami. Dla dużych aplikacji (w obecnej chwili pracuję nad taką, która posiada ponad 120 kontrolerów – i nie ma tu problemów z refaktoryzacją) odpowiednie pokierowanie przepływem żądań to całkiem skomplikowany problem.&lt;/p&gt;&lt;p&gt;Są dwie metody debugowania ścieżek:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Metoda empiryczna, czyli zmieniamy tabelę ścieżek, klikamy F5, po czym zamykamy oczy. &lt;/li&gt;
&lt;li&gt;Za pomocą biblioteki RoutesDebug – i tą metodę opiszę za chwilę. &lt;/li&gt;
&lt;/ol&gt;&lt;h4&gt;RoutesDebug, czyli&lt;/h4&gt;&lt;p&gt;RoutesDebug to pojedyńcza bilblioteka dostępna za darmo, która po dołączeniu do naszej aplikacji MVC oraz odpowiednim skonfigurowaniu (co jest dziecinnie proste) stanie się domyślnym RouteHandlerem.&lt;/p&gt;&lt;h4&gt;Czyli zaczynamy&lt;/h4&gt;&lt;p&gt;1. Pobieramy bibliotekę RoutesDebug.dll&lt;/p&gt;&lt;p&gt;&lt;iframe style="padding-bottom: 0px; background-color: #fcfcfc; padding-left: 0px; width: 98px; padding-right: 0px; height: 115px; padding-top: 0px" title="Preview" marginheight="0" src="http://cid-53e5f49ba36f4048.skydrive.live.com/embedicon.aspx/Blog/RouteDebug-Binary.zip" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;/p&gt;&lt;p&gt;2. W Visual Studio dodajemy referencję do niej w naszej aplikacji ASP.NET MVC&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/__d4mtXXARcU/S-7k2lw_PCI/AAAAAAAAAY4/myX_vX9xKlw/s1600-h/add_ref%5B5%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="add_ref" border="0" alt="add_ref" src="http://lh6.ggpht.com/__d4mtXXARcU/S-7k3bYW2qI/AAAAAAAAAY8/3YU-8xl-lDs/add_ref_thumb%5B3%5D.jpg?imgmax=800" width="471" height="379" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;3. Czas na rejestrację naszego nowego RouteHandlera. Przechodzimy do pliku Global.asax.cs i dodajemy jedną (!) linijkę:&lt;/p&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:86d90ebb-7c32-4f5b-a442-58c363dbd4e8" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c#"&gt;protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();

RegisterRoutes(RouteTable.Routes);

//Powstań RoutesDebugerze:
RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);

}&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To wszystko. Teraz po uruchomieniu aplikacji powinniśmy ujrzeć stronę na, której prezentowana jest tablica ścieżek w naszej aplikacji.&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/__d4mtXXARcU/S-7k4ZNgovI/AAAAAAAAAZA/uRW-w7ua9bs/s1600-h/routesdebug1%5B3%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="routesdebug1" border="0" alt="routesdebug1" src="http://lh3.ggpht.com/__d4mtXXARcU/S-7k5HaItmI/AAAAAAAAAZE/sUkHWfBZ47Q/routesdebug1_thumb%5B1%5D.jpg?imgmax=800" width="569" height="409" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Tak naprawdę to jest to nasza konsola testowa :-) Ok, dla przykładu stworzyłem bardzo prostą aplikacyjkę, która zawiera następujące rejestracje scieżek:&lt;/p&gt;&lt;br /&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:0a7e1c7b-e088-42c8-9ba8-53b09813fbe9" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c#"&gt;public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(null, "Articles/{id}",
new { controller = "Articles", action = "Show" },
new { id = @"\d{1,9}" }
);

routes.MapRoute(null, "Articles/Show/{id}",
new { controller = "Articles", action = "Show" },
new { id = @"\d{1,9}" }
);

routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);

}&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Do kontrolera Articles będziemy dopuszczać jedynie ścieżki które spełniają następujące wymagania:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Zawierają numer artykułu, który za pomocą prostego wyrażenia regularnego testowany jest, czy jest liczbą&lt;/li&gt;
&lt;li&gt;Jeśli nie podamy nazwy metody, to przyjmujemy, że chodzi o metodę Show&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Natomiast w konsoli testowej widzimy, że dla wywołania ścieżki: &lt;a href="http://localhost/Articles/Show/1"&gt;http://localhost/Articles/Show/1&lt;/a&gt; pasujące są wpisy w tablicy:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Articles/Show{id}&lt;/li&gt;
&lt;li&gt;{controller}/{action}/{id}&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;gdzie jako parametr przekazujemy nasz ID, czyli tutaj liczbę 1, kontroler to ArticlesController, a akcja to Show. Ale w naszym przykładzie zarejestrowałem także scieżkę, w której podanie nazwy akcji jest opcjonalne, przetestujmy więc ją:&lt;/p&gt;&lt;p&gt;&lt;a href="http://localhost/Articles/1234"&gt;http://localhost/Articles/1234&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/__d4mtXXARcU/S-7k6DLAi-I/AAAAAAAAAZI/kjnY50JIwYY/s1600-h/routesdebug3%5B3%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="routesdebug3" border="0" alt="routesdebug3" src="http://lh3.ggpht.com/__d4mtXXARcU/S-7k7Atsa5I/AAAAAAAAAZM/aLpzy-OS0oI/routesdebug3_thumb%5B1%5D.jpg?imgmax=800" width="550" height="396" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;czyli ścieżka także została rozpoznana, a pusta nazwa akcji została automatycznie uzupełniona przez wywołanie akcji Show, zgodnie z tym co podaliśmy w naszej tablicy routingu. Pozostał ostatni test, czyli test na niepoprawne dane, wpisujemy &lt;a href="http://localhsot/Articles/darek"&gt;http://localhsot/Articles/darek&lt;/a&gt; –&amp;gt; to nie jest liczba :-)&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/__d4mtXXARcU/S-7k8A07DMI/AAAAAAAAAZQ/CMQd_h4q7Gc/s1600-h/routesdebug4%5B3%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="routesdebug4" border="0" alt="routesdebug4" src="http://lh3.ggpht.com/__d4mtXXARcU/S-7k9OZU0SI/AAAAAAAAAZU/TJYD5eqFbs4/routesdebug4_thumb%5B1%5D.jpg?imgmax=800" width="560" height="403" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;ścieżki nie zostały dopasowane, czyli wszystko działa.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4443173340461901816-8777312540345572538?l=dariusztarczynski.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/7xIiRhxMlmLK1A4e_wsk9NAHT9I/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7xIiRhxMlmLK1A4e_wsk9NAHT9I/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/7xIiRhxMlmLK1A4e_wsk9NAHT9I/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7xIiRhxMlmLK1A4e_wsk9NAHT9I/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=BM1b3CzzyOM:4uUUYhuCfkA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=BM1b3CzzyOM:4uUUYhuCfkA:0VBWazUhMmc"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=0VBWazUhMmc" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=BM1b3CzzyOM:4uUUYhuCfkA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?i=BM1b3CzzyOM:4uUUYhuCfkA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DariuszTarczynski/~4/BM1b3CzzyOM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dariusztarczynski.blogspot.com/feeds/8777312540345572538/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4443173340461901816&amp;postID=8777312540345572538" title="Komentarze (2)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/8777312540345572538?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/8777312540345572538?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DariuszTarczynski/~3/BM1b3CzzyOM/debugowanie-sciezek-aspnet-mvc-routes.html" title="Debugowanie ścieżek ASP.NET MVC: Routes Debugger step by step" /><author><name>Dariusz Tarczyński</name><uri>http://www.blogger.com/profile/10745468881018443121</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="30" height="32" src="http://3.bp.blogspot.com/__d4mtXXARcU/SQSySUGrjaI/AAAAAAAAAJY/Id00EDvvIqs/S220/avatarnowy.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/__d4mtXXARcU/S-7k1lh41rI/AAAAAAAAAY0/GUFMfEGukSs/s72-c/errorroad_thumb%5B4%5D.jpg?imgmax=800" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://dariusztarczynski.blogspot.com/2010/05/debugowanie-sciezek-aspnet-mvc-routes.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0MFRn85fSp7ImA9WxBUEkQ.&quot;"><id>tag:blogger.com,1999:blog-4443173340461901816.post-102543822256630171</id><published>2010-02-26T10:12:00.008+01:00</published><updated>2010-02-27T19:30:17.125+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-27T19:30:17.125+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="AutoMapper" /><title>AutoMapper. A co jeśli w naszym kodzie brak konwencji?</title><content type="html">&lt;p&gt;&lt;a href="http://automapper.codeplex.com/"&gt;&amp;#160;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="copier" border="0" alt="copier" align="right" src="http://lh6.ggpht.com/__d4mtXXARcU/S4ljBD6ghJI/AAAAAAAAAYI/w-nPpXWnBuo/copier%5B4%5D.jpg?imgmax=800" width="234" height="179" /&gt; Automapper&lt;/a&gt; jest biblioteką ułatwiającą konwersje między dwoma typami. Wykorzystując wspomnianą bibliotekę nie ma już konieczności pisania przydługiego kodu własnych konwerterów. Jak to się dzieje, że Automapper potrafi z typu:&lt;/p&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:ea80b745-269b-45e8-9d44-925f5bbfccae" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c#"&gt;public class BlogPost
{
    public string Title;
    public string Description;
    public string Body;
    public int Level;
    public DateTime CreationDate;
}&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;wyczarować np. klasę?:&lt;/p&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:92ad8f36-eeb2-4c7d-a21d-4a4804250e67" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c#"&gt;public class BlipPost
{
    public string BlipBody;
    public DateTime DateOfBlip;
}&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;za pomocą wywołania jednej linijki kodu?:&lt;/p&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:504e0bc1-9e82-4c4e-ae87-2c0fbbf1bcfd" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c#"&gt;//konwertujemy obiekt myPostObject z typu źródłowego (BlogPost) do typu docelowego (BlipPost)
Mapper.Map&amp;lt;BlogPost, BlipPost&amp;gt;(myPostObject); &lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Otóż domyśla się on - za pomocą ogólnych konwencji nazewniczych - jakiemu typowi z klasy docelowej (BlipPost) będzie odpowiadał typ z klasy źródłowej (BlogPost). Świetnie. Jednak niechaj będzie błogosławiony ten, którego kod konwencji się trzyma. Prosty przykład, dla którego Automapper polegnie na samym wejściu:&lt;/p&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:d6680af7-3317-4b3a-a9c7-b7b4d3c60c0c" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c#"&gt;public class Osoba
{
    public string Imie;
    public string NazwiskoRodowe;
    public string Nazwisko;
    public DateTime Urodziny;
}&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Uwierzcie lub nie, ale Automapper nie da rady sobie zmapować tak prostej klasy na nic – jedynym efektem jego pracy będzie przepiękny wyjątek mapowania.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Wstań, powiedz nie jestem sam…&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Można by Automapera o kant … potłuc, gdyby nie umożliwiał poradzenie sobie z podobnymi problemami.&lt;/p&gt;&lt;p&gt;Z pomocą przychodzi własny TypeConverter, który po zaimplementowaniu jednej metody Convert będzie płodził nowe klasy docelowe w sposób jaki mu powiemy. &lt;/p&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:67b3033e-92a9-4015-96cc-b0087fc20f24" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c#"&gt;public class ToBlipPostConverter : ITypeConverter&amp;lt;BlogPost, BlipPost&amp;gt;
{
#region ITypeConverter&amp;lt;BlogPost, BlipPost&amp;gt; Members

public BlipPost Convert(ResolutionContext context)
{
    BlogPost old = context.SourceValue as BlogPost;
    //if old != null
    var blip = new BlipPost();
    blip.Id = old.Id;
    blip.Data = old.DataPosta;
    blip.Level = old.Poziom;
    blip.Body = old.Tresc;
    
    return blip;
}

#endregion
}&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Teraz wystarczy jedynie poinformować Automappera do używania naszej klasy konwertera dla podanych typów:&lt;/p&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:9fc74ce2-a66d-4524-bef4-cb4e3f1ef78c" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c#"&gt;Mapper.CreateMap&amp;lt;BlogPost, BlipPost&amp;gt;().ConvertUsing&amp;lt;ToBlipPostConverter&amp;gt;();&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pisanie własnych konwerterów nieco mija się z celem, jednak sygnalizuję tylko problem na jaki może się natknąć deweloper. &lt;br /&gt;
&lt;br /&gt;
No i tyle. Więcej można przeczytać na stronie projektu: &lt;a href="http://automapper.codeplex.com/wikipage?title=Custom%20Type%20Converters&amp;amp;referringTitle=Home"&gt;Type Converters&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4443173340461901816-102543822256630171?l=dariusztarczynski.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4Z7z0LQrUvxUZk1Uip6EHM5_OCY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4Z7z0LQrUvxUZk1Uip6EHM5_OCY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4Z7z0LQrUvxUZk1Uip6EHM5_OCY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4Z7z0LQrUvxUZk1Uip6EHM5_OCY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=jRlqce92OE4:NUhd7_2XLn8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=jRlqce92OE4:NUhd7_2XLn8:0VBWazUhMmc"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=0VBWazUhMmc" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=jRlqce92OE4:NUhd7_2XLn8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?i=jRlqce92OE4:NUhd7_2XLn8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DariuszTarczynski/~4/jRlqce92OE4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dariusztarczynski.blogspot.com/feeds/102543822256630171/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4443173340461901816&amp;postID=102543822256630171" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/102543822256630171?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/102543822256630171?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DariuszTarczynski/~3/jRlqce92OE4/automapper-co-jesli-w-naszym-kodzie.html" title="AutoMapper. A co jeśli w naszym kodzie brak konwencji?" /><author><name>Dariusz Tarczyński</name><uri>http://www.blogger.com/profile/10745468881018443121</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="30" height="32" src="http://3.bp.blogspot.com/__d4mtXXARcU/SQSySUGrjaI/AAAAAAAAAJY/Id00EDvvIqs/S220/avatarnowy.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/__d4mtXXARcU/S4ljBD6ghJI/AAAAAAAAAYI/w-nPpXWnBuo/s72-c/copier%5B4%5D.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://dariusztarczynski.blogspot.com/2010/02/automapper-co-jesli-w-naszym-kodzie.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0AFRnwyfyp7ImA9WxBVFE0.&quot;"><id>tag:blogger.com,1999:blog-4443173340461901816.post-4149143126281453587</id><published>2010-02-17T11:23:00.006+01:00</published><updated>2010-02-17T12:21:57.297+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-17T12:21:57.297+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="konferencje" /><title>Konferencje .NET w najbliższym czasie</title><content type="html">&lt;b&gt;26 marzec 2010 (piątek)&lt;/b&gt; Poznań &lt;a href="http://2010.4developers.org.pl/"&gt;4Developers&lt;/a&gt; &lt;br /&gt;
4Developers to konferencja dla programistów tworzona przez programistów. Jest to największe przedsięwzięcie tego typu w Polsce – 700 uczestników, 4 równoległe ścieżki i ponad 30 prelegentów. 4Developers to profesjonalna, techniczna konferencja przeznaczona dla developerów i managerów projektów, kadry kierowniczej działów informatycznych, a także wszystkich studentów zainteresowanych programowaniem. Zapraszamy do dyskusji, wymiany doświadczeń i szukania rozwiązań dla wyzwań związanych z tworzeniem i rozwijaniem oprogramowania. 4Developers podzielona jest na cztery niezależne ścieżki związane z technologiami i problemami spotykanymi w nowoczesnych firmach zajmujących się produkcją oprogramowania [źródło 4developers]&lt;br /&gt;
- Ja będę tam!&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;17 kwiecień 2010 (sobota)&lt;/b&gt; Warszawa &lt;a href="http://c2c.org.pl/default.aspx"&gt;Communities2Communities 2010&lt;/a&gt;&lt;br /&gt;
C2C to doskonała okazja do spotkania i wysłuchania sesji najwyższej klasy specjalistów z Polski i ze świata, do wymiany doświadczeń i spotkania osób o podobnych zainteresowaniach.Tegoroczna konferencja, podobnie jak ta z ubiegłego roku, obejmuje aż trzy ścieżki tematyczne: przeznaczoną dla profesjonalistów IT, SQL Server oraz .NET. Na każdą ze ścieżek przypada pięć sesji - każda z nich będzie prowadzona na poziomie 300-400 wg skali MSFT, w profesjonalny sposób, przez najlepszych specjalistów, bez zbędnego marketingowego bełkotu. Jak udowodniła zeszłoroczna konferencja, sesje na poszczególnych ścieżkach były na podobnym poziomie jak te prowadzone na konferencjach typu TechEd czy MTS. [Żródło C2c]&lt;br /&gt;
- Ja będę tam!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4443173340461901816-4149143126281453587?l=dariusztarczynski.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/gS3MiXyg7OPi2G-Ry2CfA9iz4LM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gS3MiXyg7OPi2G-Ry2CfA9iz4LM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/gS3MiXyg7OPi2G-Ry2CfA9iz4LM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gS3MiXyg7OPi2G-Ry2CfA9iz4LM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=-3MNxxBBfQE:BsmutWZpNSA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=-3MNxxBBfQE:BsmutWZpNSA:0VBWazUhMmc"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=0VBWazUhMmc" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=-3MNxxBBfQE:BsmutWZpNSA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?i=-3MNxxBBfQE:BsmutWZpNSA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DariuszTarczynski/~4/-3MNxxBBfQE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dariusztarczynski.blogspot.com/feeds/4149143126281453587/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4443173340461901816&amp;postID=4149143126281453587" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/4149143126281453587?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/4149143126281453587?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DariuszTarczynski/~3/-3MNxxBBfQE/konferencje-net-w-najblizszym-czasie.html" title="Konferencje .NET w najbliższym czasie" /><author><name>Dariusz Tarczyński</name><uri>http://www.blogger.com/profile/10745468881018443121</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="30" height="32" src="http://3.bp.blogspot.com/__d4mtXXARcU/SQSySUGrjaI/AAAAAAAAAJY/Id00EDvvIqs/S220/avatarnowy.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://dariusztarczynski.blogspot.com/2010/02/konferencje-net-w-najblizszym-czasie.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUGRH87fCp7ImA9WxBWE0g.&quot;"><id>tag:blogger.com,1999:blog-4443173340461901816.post-4869214564501385021</id><published>2010-02-04T21:44:00.002+01:00</published><updated>2010-02-05T09:23:45.104+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-05T09:23:45.104+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Inne" /><title>Offtopic: Firefox jest wszędzie</title><content type="html">&lt;p&gt;Dziś zwróciłem uwagę na dziwnie wyglądający przycisk Start Windows 7:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/__d4mtXXARcU/S2sxvpoWW1I/AAAAAAAAAXc/TkZFNvWzhBk/s1600-h/1%5B2%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="1" border="0" alt="1" src="http://lh3.ggpht.com/__d4mtXXARcU/S2sxwM3vSZI/AAAAAAAAAXg/11ZjSwVjvhk/1_thumb.jpg?imgmax=800" width="65" height="54" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Pomyślałem sobie: gdzieś już widziałem ten kawałek wystający poza obręb ikony… Szybkie nałożenie podejrzanej ikony (znam jedną ikonę z ogonem):&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/__d4mtXXARcU/S2sxwa-tPRI/AAAAAAAAAXk/hqvA9Vf7bdM/s1600-h/2%5B2%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="2" border="0" alt="2" src="http://lh6.ggpht.com/__d4mtXXARcU/S2sxw-b_r7I/AAAAAAAAAXo/UYr_4f5QfoA/2_thumb.jpg?imgmax=800" width="65" height="54" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;… i jeszcze troszkę wyostrzamy ….&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/__d4mtXXARcU/S2sxxP2EUtI/AAAAAAAAAXs/JcRdj9TxzCY/s1600-h/3%5B2%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="3" border="0" alt="3" src="http://lh3.ggpht.com/__d4mtXXARcU/S2sxxqM5TwI/AAAAAAAAAXw/40J5qjGqAdQ/3_thumb.jpg?imgmax=800" width="65" height="54" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;I dostaliśmy podpalonego lista. Tylko skąd on tam się wziął?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4443173340461901816-4869214564501385021?l=dariusztarczynski.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/BHo9-tSUHgD-CUvHAcYK3huNr74/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BHo9-tSUHgD-CUvHAcYK3huNr74/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/BHo9-tSUHgD-CUvHAcYK3huNr74/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BHo9-tSUHgD-CUvHAcYK3huNr74/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=ZRK8WW9cR4E:fYvmBnY_EtY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=ZRK8WW9cR4E:fYvmBnY_EtY:0VBWazUhMmc"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=0VBWazUhMmc" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=ZRK8WW9cR4E:fYvmBnY_EtY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?i=ZRK8WW9cR4E:fYvmBnY_EtY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DariuszTarczynski/~4/ZRK8WW9cR4E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dariusztarczynski.blogspot.com/feeds/4869214564501385021/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4443173340461901816&amp;postID=4869214564501385021" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/4869214564501385021?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/4869214564501385021?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DariuszTarczynski/~3/ZRK8WW9cR4E/offtopic-firefox-jest-wszedzie.html" title="Offtopic: Firefox jest wszędzie" /><author><name>Dariusz Tarczyński</name><uri>http://www.blogger.com/profile/10745468881018443121</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="30" height="32" src="http://3.bp.blogspot.com/__d4mtXXARcU/SQSySUGrjaI/AAAAAAAAAJY/Id00EDvvIqs/S220/avatarnowy.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/__d4mtXXARcU/S2sxwM3vSZI/AAAAAAAAAXg/11ZjSwVjvhk/s72-c/1_thumb.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://dariusztarczynski.blogspot.com/2010/02/offtopic-firefox-jest-wszedzie.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU4CR38_cSp7ImA9WxBXEE8.&quot;"><id>tag:blogger.com,1999:blog-4443173340461901816.post-1664538051743546393</id><published>2010-01-20T23:50:00.001+01:00</published><updated>2010-01-20T23:52:46.149+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-20T23:52:46.149+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Inne" /><title>No i Visual Studio 2010 Beta 2 sie popsuło. Samo :-(</title><content type="html">&lt;p&gt;&lt;a href="http://lh5.ggpht.com/__d4mtXXARcU/S1eItI1JqlI/AAAAAAAAAXQ/wuVy3mrGWxU/s1600-h/Untitled%5B2%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Untitled" border="0" alt="Untitled" src="http://lh5.ggpht.com/__d4mtXXARcU/S1eIuFqlszI/AAAAAAAAAXU/NphmfLFPDvg/Untitled_thumb.png?imgmax=800" width="244" height="169" /&gt;&lt;/a&gt;Z tego co pamiętam, to zostało mi jeszcze ok 130 dni testów. Będę żądał zwrotu pieniędzy lub wymiany na nowe.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4443173340461901816-1664538051743546393?l=dariusztarczynski.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/TuZ9LUyehpdw3qGo1T0XVBDhVMU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/TuZ9LUyehpdw3qGo1T0XVBDhVMU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/TuZ9LUyehpdw3qGo1T0XVBDhVMU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/TuZ9LUyehpdw3qGo1T0XVBDhVMU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=FW2wFS11LQs:Y9YlJKf_fRo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=FW2wFS11LQs:Y9YlJKf_fRo:0VBWazUhMmc"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=0VBWazUhMmc" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=FW2wFS11LQs:Y9YlJKf_fRo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?i=FW2wFS11LQs:Y9YlJKf_fRo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DariuszTarczynski/~4/FW2wFS11LQs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dariusztarczynski.blogspot.com/feeds/1664538051743546393/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4443173340461901816&amp;postID=1664538051743546393" title="Komentarze (2)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/1664538051743546393?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/1664538051743546393?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DariuszTarczynski/~3/FW2wFS11LQs/no-i-visual-studio-2010-beta-2-sie.html" title="No i Visual Studio 2010 Beta 2 sie popsuło. Samo :-(" /><author><name>Dariusz Tarczyński</name><uri>http://www.blogger.com/profile/10745468881018443121</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="30" height="32" src="http://3.bp.blogspot.com/__d4mtXXARcU/SQSySUGrjaI/AAAAAAAAAJY/Id00EDvvIqs/S220/avatarnowy.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/__d4mtXXARcU/S1eIuFqlszI/AAAAAAAAAXU/NphmfLFPDvg/s72-c/Untitled_thumb.png?imgmax=800" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://dariusztarczynski.blogspot.com/2010/01/no-i-visual-studio-2010-beta-2-sie.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4HQn4_eCp7ImA9WxBQGEQ.&quot;"><id>tag:blogger.com,1999:blog-4443173340461901816.post-3282907035433600167</id><published>2010-01-14T19:06:00.006+01:00</published><updated>2010-01-19T10:22:13.040+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-19T10:22:13.040+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MVC" /><title>Mój ASP.NET MVC stack</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/__d4mtXXARcU/S0-AU5cloAI/AAAAAAAAAWw/q21rHBHl6Mc/s1600-h/home-repair-tools-ga-6.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 180px;" src="http://2.bp.blogspot.com/__d4mtXXARcU/S0-AU5cloAI/AAAAAAAAAWw/q21rHBHl6Mc/s200/home-repair-tools-ga-6.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5426697172511203330" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;Postanowiłem spisać technologie, biblioteki, które używam w pracy z projektami ASP.NET MVC, ewentualnie “nowinki”, które zostały przetestowane w boju, ale ze względu na silną obsadę czekają na lepsze czasy i napewdno niedługo zostaną przeze mnie ponownie użyte. Oto one, zaczynająć od "pierwszego składu":&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;strong&gt;Architektura&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://github.com/codai/Sharp-Architecture/downloads"&gt;S#arp Architecture&lt;/a&gt;: podstawowy stack, który zawiera w sobie wszystko to, co potrzebne jest do stworzenia aplikacji ASP.NET MVC. Korzysta z Castle.Windsor co podmieniam na Ninject.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hibernate.org/343.html"&gt;NHibernate&lt;/a&gt;, doskonale wszystkim znany ORM &lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/netframework/aa904594.aspx"&gt;Linq&lt;/a&gt;2SQL, tam gdzie nie ma NHibernate :-)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluentnhibernate.org/downloads"&gt;Fluent Nhibernate&lt;/a&gt; biblioteka konfiguracji NHibernate bez konieczności użycia plików XML oparty o konwencję / Fluent Interfaces.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ninject.org/"&gt;Ninject&lt;/a&gt; jako lekki framework DI / IoC. &lt;/li&gt;
&lt;li&gt;&lt;a href="http://ninject.org/"&gt;MVCContrib&lt;/a&gt;: projekt rozszerzający standardową funkcjonalność dostępną w gołym ASP.NET MVC&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt;, jQuery UI, jQuery plugins: biblioteka javascript, zbiór kontrolek JS, chyba każdemu znana.&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;Poczekalnia&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://www.google.pl/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=3&amp;amp;ved=0CBcQFjAC&amp;amp;url=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FADO.NET_Entity_Framework&amp;amp;ei=qFxPS-ShL57ymwPP24mfCg&amp;amp;usg=AFQjCNEGJMwGhwqARkq-dY1kYLmIsayYJg&amp;amp;sig2=9Fw3ROZxYF1denhIZ2uexw"&gt;Entity Framework&lt;/a&gt; 4, jako zamiennik NHibernate. Zauważyłem, że EF idzie w całkiem fajną, ciekawą stronę umożliwiając MDD, dobrze integruje się z VS. Myślę, że niedługo będzie poważną alternatywą dla NHibernate.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://sparkviewengine.com/"&gt;Spark View Engine&lt;/a&gt;, jako zamiennik standardowego view engine. Fajne rozwiązanie PartialViews, daje mniejszy bałagan w kodzie widoku.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.google.pl/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;ved=0CAkQFjAA&amp;amp;url=http%3A%2F%2Fcode.google.com%2Fp%2Ffubumvc%2F&amp;amp;ei=glxPS9G0FIOEmgON1MCeCg&amp;amp;usg=AFQjCNHOSTwjaY-SFcW9kTkWoizNEhRmFA&amp;amp;sig2=ig0gBkhGRpKoV0SKRBRiKQ"&gt;FubuMVC&lt;/a&gt;, framework implementujący wzorzec &lt;a href="http://msdn.microsoft.com/en-us/library/ms978723.aspx"&gt;Front Controller&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.google.pl/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=2&amp;amp;ved=0CA0QFjAB&amp;amp;url=http%3A%2F%2Flozanotek.com%2Fblog%2Farchive%2F2009%2F09%2F25%2FMVC_Turbine.aspx&amp;amp;ei=lVxPS4OaLoiEmgOK3oyhCg&amp;amp;usg=AFQjCNFVczqbLC8uo5OnPi_oWTtzrd1B1g&amp;amp;sig2=sTTO7pXZ70bWLiEy4URWig"&gt;MVCTurbine&lt;/a&gt;: “The whole purpose of MVC Turbine is to speed your MVC development by having the plug-in handle all &lt;em&gt;churn&lt;/em&gt; of the runtime and allow you to focus on what your application &lt;strong&gt;&lt;em&gt;needs to do&lt;/em&gt;&lt;/strong&gt;, rather than &lt;strong&gt;&lt;em&gt;how to do&lt;/em&gt;&lt;/strong&gt; it.”&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;Coś byście dorzucili? :-)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4443173340461901816-3282907035433600167?l=dariusztarczynski.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/uLiG4C9wNWcAOq2oE092uey6EJ8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uLiG4C9wNWcAOq2oE092uey6EJ8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/uLiG4C9wNWcAOq2oE092uey6EJ8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uLiG4C9wNWcAOq2oE092uey6EJ8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=9SnKSzPpTBY:ZoBsSynZdUc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=9SnKSzPpTBY:ZoBsSynZdUc:0VBWazUhMmc"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=0VBWazUhMmc" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=9SnKSzPpTBY:ZoBsSynZdUc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?i=9SnKSzPpTBY:ZoBsSynZdUc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DariuszTarczynski/~4/9SnKSzPpTBY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dariusztarczynski.blogspot.com/feeds/3282907035433600167/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4443173340461901816&amp;postID=3282907035433600167" title="Komentarze (6)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/3282907035433600167?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/3282907035433600167?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DariuszTarczynski/~3/9SnKSzPpTBY/moj-aspnet-mvc-stack.html" title="Mój ASP.NET MVC stack" /><author><name>Dariusz Tarczyński</name><uri>http://www.blogger.com/profile/10745468881018443121</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="30" height="32" src="http://3.bp.blogspot.com/__d4mtXXARcU/SQSySUGrjaI/AAAAAAAAAJY/Id00EDvvIqs/S220/avatarnowy.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/__d4mtXXARcU/S0-AU5cloAI/AAAAAAAAAWw/q21rHBHl6Mc/s72-c/home-repair-tools-ga-6.jpg" height="72" width="72" /><thr:total>6</thr:total><feedburner:origLink>http://dariusztarczynski.blogspot.com/2010/01/moj-aspnet-mvc-stack.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkcGRHw6fip7ImA9WxBQFEo.&quot;"><id>tag:blogger.com,1999:blog-4443173340461901816.post-3214521090864083575</id><published>2010-01-13T22:13:00.003+01:00</published><updated>2010-01-14T14:00:25.216+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-14T14:00:25.216+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MVC" /><title>Wzorzec “POST Redirect GET” w ASP.NET MVC</title><content type="html">&lt;p&gt;Jednym z największych problemów w aplikacjach internetowych jest podwójne przesłanie danych za pomocą metody POST na szczęście prawidłowo korzystając z mechanizmów ASP.NET MVC można się przed tym obronić – ale o tym za chwilę. Na początek krótkie wyjaśnienie tego w czym cały problem.&lt;/p&gt;  &lt;p&gt;Wyobraźmy sobie formularz w którym podajemy: Numer karty kredytowej, datę jej ważności, kwotę w eurogąbkach, którą przelewamy na konto oraz przycisk “Wyślij”, czyli standardowy mechanizm płacenia za płatne treści (taaak wiadomo jakie :-) ) w Internecie.&amp;#160; Formularz w oparciu o metodę POST prześle dane do serwera, gdzie zostanie odpalona jakaś skomplikowana logika, którą nie będziemy się teraz przejmować. Efekt jest taki, że na naszym koncie mamy mniej eurogąbek niż mieliśmy jeszcze minutę temu. Wszystko pięknie, ale po drodze coś mogło pójść nie tak i nie otrzymaliśmy informacji zwrotnej, że przelew się udał. Co gorsza strona może prosić o odświeżenie znanym chyba każdemu użytkownikowi, &lt;strong&gt;najczęściej niepoprawnie zaimplementowanych&lt;/strong&gt; stron, komunikatem:&lt;/p&gt;  &lt;p&gt;&lt;a href="SupportingFileReference://8e6426ec-02ea-46d7-96ab-76ceea6da67a"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="com" border="0" alt="com" src="http://lh3.ggpht.com/__d4mtXXARcU/S043j-XRVUI/AAAAAAAAAWs/1Yl94Bm3USU/com_thumb1.jpg?imgmax=800" width="291" height="99" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Co zrobi przeciętny użytkownik? Tak: kliknie przycisk Prześlij ponownie. I to kosztowny błąd, bo na jego koncie jest dwa razy mniej eurogąbek. &lt;/p&gt;  &lt;p&gt;Problem z formularzami wykorzystującymi metodę POST pojawia się gdy:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Odświeżamy stronę. &lt;/li&gt;    &lt;li&gt;Zapisujemy stronę do Zakładek przeglądarki internetowej. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;strong&gt;Rozwiązanie: PRG&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Wzorzec projektowy &lt;a href="http://en.wikipedia.org/wiki/Post/Redirect/Get"&gt;PRG&lt;/a&gt; polega na:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Przesłaniu formularza w sposób standardowy metodą POST. &lt;/li&gt;    &lt;li&gt;Przekierowanie, a ściślej mówiąc, zwrócenie kodu 303 / 302. &lt;/li&gt;    &lt;li&gt;Zażądanie załadowania “nowej” strony z użyciem GET. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;strong&gt;PRG i ASP.NET MVC&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Jak to się powinno zrobić w ASP.NET MVC? Służy do tego: znana chyba każdemu – a niestarty często nie do końca przez wszystkich zrozumiana metoda - &lt;em&gt;RedirectToAction wraz z TempData&lt;/em&gt; przechowujący dane pomiędzy żądaniami.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:67191dc0-214b-455d-8d18-5664a3137bff" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="c#"&gt;[HttpPost]&lt;br /&gt;public ActionResult Edit(InputData input)    &lt;br /&gt;{&lt;br /&gt;    if (ModelState.IsValid)      &lt;br /&gt;    {&lt;br /&gt;        //jakas logika...   &lt;br /&gt;        TempData["ResultMessage"] = "Transfer eurogabek zakonczony!";  &lt;br /&gt;        return RedirectToAction("index");    &lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return View(input);    &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Tak zaimplementowana logika nie spowoduje ponownego przesłania danych przy odświeżeniu strony i to właśnie tak powinny być zaprojektowane formularze korzystające z POST.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4443173340461901816-3214521090864083575?l=dariusztarczynski.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/bVDSi9N9VRTC8PvaQMmgiyVGDXs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bVDSi9N9VRTC8PvaQMmgiyVGDXs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/bVDSi9N9VRTC8PvaQMmgiyVGDXs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bVDSi9N9VRTC8PvaQMmgiyVGDXs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=qXxdMxpPkCw:LfJRgmWKt3g:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=qXxdMxpPkCw:LfJRgmWKt3g:0VBWazUhMmc"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=0VBWazUhMmc" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=qXxdMxpPkCw:LfJRgmWKt3g:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?i=qXxdMxpPkCw:LfJRgmWKt3g:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DariuszTarczynski/~4/qXxdMxpPkCw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dariusztarczynski.blogspot.com/feeds/3214521090864083575/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4443173340461901816&amp;postID=3214521090864083575" title="Komentarze (2)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/3214521090864083575?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/3214521090864083575?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DariuszTarczynski/~3/qXxdMxpPkCw/wzorzec-post-redirect-get-w-aspnet-mvc.html" title="Wzorzec “POST Redirect GET” w ASP.NET MVC" /><author><name>Dariusz Tarczyński</name><uri>http://www.blogger.com/profile/10745468881018443121</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="30" height="32" src="http://3.bp.blogspot.com/__d4mtXXARcU/SQSySUGrjaI/AAAAAAAAAJY/Id00EDvvIqs/S220/avatarnowy.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/__d4mtXXARcU/S043j-XRVUI/AAAAAAAAAWs/1Yl94Bm3USU/s72-c/com_thumb1.jpg?imgmax=800" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://dariusztarczynski.blogspot.com/2010/01/wzorzec-post-redirect-get-w-aspnet-mvc.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQFRnk8eip7ImA9WxBWE0g.&quot;"><id>tag:blogger.com,1999:blog-4443173340461901816.post-574028812262073282</id><published>2009-12-10T23:14:00.004+01:00</published><updated>2010-02-05T09:25:17.772+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-05T09:25:17.772+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tip" /><title>TIP: SQL Management Studio Express Error 29506</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__d4mtXXARcU/SyFz88AuW3I/AAAAAAAAAWg/8aegZivFi1g/s1600-h/sql+management+error.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 154px;" src="http://1.bp.blogspot.com/__d4mtXXARcU/SyFz88AuW3I/AAAAAAAAAWg/8aegZivFi1g/s200/sql+management+error.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5413735717814557554" /&gt;&lt;/a&gt;&lt;br /&gt;
Kiedy próba zainstalowania SQL Management Studio Express (thank's God It's freeware) kończy się błędem 29506, to znaczy, że instalujesz leciwe już oprogramowanie na systemie operacyjnym z obsługą UAC, kiedy to producenci tego oprogramowania dopiero snuli plany o UAC...&lt;br /&gt;
Więc co by się pozbyć tego breakpointa:&lt;br /&gt;
&lt;br /&gt;
1. Uruchom polecenie CMD jako Administrator.&lt;br /&gt;
2. Uruchom instalator z poziomu CMD czyli: C:\SQLManagement.msi (lub coś w ten deseń).&lt;br /&gt;
&lt;br /&gt;
Thanks Google...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4443173340461901816-574028812262073282?l=dariusztarczynski.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/l5grP7FSzQQegYU2Qkg7mpn_o5U/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/l5grP7FSzQQegYU2Qkg7mpn_o5U/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/l5grP7FSzQQegYU2Qkg7mpn_o5U/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/l5grP7FSzQQegYU2Qkg7mpn_o5U/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=sAiunBI8SQA:7v14768eAvg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=sAiunBI8SQA:7v14768eAvg:0VBWazUhMmc"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=0VBWazUhMmc" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=sAiunBI8SQA:7v14768eAvg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?i=sAiunBI8SQA:7v14768eAvg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DariuszTarczynski/~4/sAiunBI8SQA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dariusztarczynski.blogspot.com/feeds/574028812262073282/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4443173340461901816&amp;postID=574028812262073282" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/574028812262073282?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/574028812262073282?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DariuszTarczynski/~3/sAiunBI8SQA/tip-sql-management-studio-express-error.html" title="TIP: SQL Management Studio Express Error 29506" /><author><name>Dariusz Tarczyński</name><uri>http://www.blogger.com/profile/10745468881018443121</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="30" height="32" src="http://3.bp.blogspot.com/__d4mtXXARcU/SQSySUGrjaI/AAAAAAAAAJY/Id00EDvvIqs/S220/avatarnowy.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/__d4mtXXARcU/SyFz88AuW3I/AAAAAAAAAWg/8aegZivFi1g/s72-c/sql+management+error.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://dariusztarczynski.blogspot.com/2009/12/tip-sql-management-studio-express-error.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QHRXs4eyp7ImA9WxNVF0g.&quot;"><id>tag:blogger.com,1999:blog-4443173340461901816.post-485298127452310469</id><published>2009-10-28T19:28:00.005+01:00</published><updated>2009-10-28T19:42:14.533+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-28T19:42:14.533+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tip" /><category scheme="http://www.blogger.com/atom/ns#" term="Inne" /><title>Pomocne w testowaniu witryn na wielu przeglądarkach</title><content type="html">&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__d4mtXXARcU/SuiObwOS8HI/AAAAAAAAAWY/lVToMu912Uw/s1600-h/browsers.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 150px; height: 139px;" src="http://4.bp.blogspot.com/__d4mtXXARcU/SuiObwOS8HI/AAAAAAAAAWY/lVToMu912Uw/s200/browsers.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5397720760856014962" /&gt;&lt;/a&gt;&lt;br /&gt;Jedną z trudniejszą z rzeczy z jaką spotyka się każdy web developer jest dostosowanie działania witryny i jej optymalizacja wynikająca ze zróżnicowania dostępnych przeglądarek. Każdy spotka się prędzej czy później z piekłem przeglądarek wynikającym z ich wojny o rynek :-) Aktualny ranking firmy &lt;a href="http://gemius.pl" target="_blank"&gt;Gemius&lt;/a&gt; na temat popularności przeglądarek internetowych w naszym kraju przedstawia się następująco:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;Firefox 3.x&lt;/strong&gt; 48,97%&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Internet Explorer 7.x&lt;/strong&gt; 17,23%&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Internet Explorer 6.x&lt;/strong&gt; 9,34%&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Internet Explorer 8.x&lt;/strong&gt; 7,74%&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Opera 9.x&lt;/strong&gt; 5,49%&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Do tego dochodzą różne konfiguracje wymienionych wyżej przeglądarek takie jak ustawienia javascript, flash, różne rozdzielczości ekranu itd.&lt;/p&gt;  &lt;p&gt;Oto kilka przydatnych narzędzi w testowaniu witryn na wielu przeglądarkach i ich konfiguracjach, które zarazem nie zamienią naszego komputera w śmietnik.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://browsershots.org/" target="_blank"&gt;Browsershots.org&lt;/a&gt; Robi zrzuty ekranowe podanego przez nas adresu www. &lt;strong&gt;Zalety&lt;/strong&gt;: prostota, długa lista obsługiwanych przeglądarek &lt;strong&gt;Wady&lt;/strong&gt;: czasami trzeba czekać na wyniki kilkanaście minut, witryna musi być dostępna publicznie, niektóre maszyny testujące potrafią się zawieszać. Dodatkowo w sieci istnieje wiele innych witryn o podobnym działaniu: np. komercyjny i rozbudowany &lt;a href="http://crossbrowsertesting.com/" target="_blank"&gt;CrossBrowserTesting.com&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=21EABB90-958F-4B64-B5F1-73D0A413C8EF&amp;amp;displaylang=en" target="_blank"&gt;Internet Explorer Application Compatibility VPC Image&lt;/a&gt; Zestaw obrazów VPC systemu operacyjnego WindowsXp wraz z zainstalowanymi przeglądarkami Internet Explorer w wersji 6, 7, 8 (do wyboru). &lt;strong&gt;Zalety:&lt;/strong&gt; otrzymujemy podręczne środowisko testowe, &lt;strong&gt;Wady: &lt;/strong&gt;trzeba mieć odpowiednie zasoby sprzętowe na uruchomienie kilku maszyn wirtualnych. VPC działają jeszcze do stycznia 2010 r.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://expression.microsoft.com/en-us/dd565874.aspx" target="_blank"&gt;Expression Web Super Preview&lt;/a&gt; Umożliwia podgląd wyrenderowanej witryny z poziomu programu Microsoft Expression Web. &lt;strong&gt;Zalety:&lt;/strong&gt; zintegrowanie podglądu witryny z procesem tworzenia. &lt;strong&gt;Wady: &lt;/strong&gt;wymagany Expression Web&lt;/p&gt;  &lt;p&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/35" target="_blank"&gt;Firefox IE View&lt;/a&gt; Wtyczka do przeglądarki Firefox umożliwiająca przełączanie silnika renderującego z/na Internet Explorer-a. &lt;strong&gt;Zalety: &lt;/strong&gt;szybkość działania.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4443173340461901816-485298127452310469?l=dariusztarczynski.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ZNSODBopxQ_4oyGImqd5Apau5ao/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZNSODBopxQ_4oyGImqd5Apau5ao/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ZNSODBopxQ_4oyGImqd5Apau5ao/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZNSODBopxQ_4oyGImqd5Apau5ao/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=dUXlU1jc2bI:vBo9mLhEQEo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=dUXlU1jc2bI:vBo9mLhEQEo:0VBWazUhMmc"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=0VBWazUhMmc" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=dUXlU1jc2bI:vBo9mLhEQEo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?i=dUXlU1jc2bI:vBo9mLhEQEo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DariuszTarczynski/~4/dUXlU1jc2bI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dariusztarczynski.blogspot.com/feeds/485298127452310469/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4443173340461901816&amp;postID=485298127452310469" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/485298127452310469?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/485298127452310469?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DariuszTarczynski/~3/dUXlU1jc2bI/pomocne-w-testowaniu-witryn-na-wielu.html" title="Pomocne w testowaniu witryn na wielu przeglądarkach" /><author><name>Dariusz Tarczyński</name><uri>http://www.blogger.com/profile/10745468881018443121</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="30" height="32" src="http://3.bp.blogspot.com/__d4mtXXARcU/SQSySUGrjaI/AAAAAAAAAJY/Id00EDvvIqs/S220/avatarnowy.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/__d4mtXXARcU/SuiObwOS8HI/AAAAAAAAAWY/lVToMu912Uw/s72-c/browsers.gif" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://dariusztarczynski.blogspot.com/2009/10/pomocne-w-testowaniu-witryn-na-wielu.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkEAQHY-eCp7ImA9WxNVGU0.&quot;"><id>tag:blogger.com,1999:blog-4443173340461901816.post-2468579463412956634</id><published>2009-10-22T10:18:00.005+02:00</published><updated>2009-10-30T13:10:41.850+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-30T13:10:41.850+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="PG.NET" /><title>PG.NET XXII Spotkanie grupy</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__d4mtXXARcU/SuAVh4qN8pI/AAAAAAAAAWQ/padpyVJkuwk/s1600-h/pozdotnet_logo.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 96px;" src="http://3.bp.blogspot.com/__d4mtXXARcU/SuAVh4qN8pI/AAAAAAAAAWQ/padpyVJkuwk/s200/pozdotnet_logo.gif" alt="" id="BLOGGER_PHOTO_ID_5395336025479180946" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Chciałbym Was zaprosić na XXII spotkanie Poznańskiej Grupy .NET, które odbędzie się w &lt;span style="font-weight: bold;"&gt;czwartek 29 października 2009&lt;/span&gt; w siedzibie firmy Cognifide (Aleja Wielkopolska 4, Poznań). Będę na nim prezentował bardzo przydatne narzędzie jakim jest &lt;a href="http://ndepend.com/"&gt;NDepend&lt;/a&gt;. Oprócz mojej prezentacji nie zabraknie nowinek ze świata .NET, które przedstawi &lt;a href="http://marekblotny.blogspot.com/"&gt;Marek Błotny&lt;/a&gt;. Na koniec będzie o Silverlight 3, Blend 3, .NET RIA Services o czym opowie nam &lt;a href="http://www.martinkruszynski.blogspot.com/"&gt;Marcin Kruszyński&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Szczegółowa agenda:&lt;/span&gt;&lt;br /&gt;18:00 - 18:10 Wstęp&lt;br /&gt;18:10 - 18:30 Nowinki ze Świata .NET (Marek Błotny)&lt;br /&gt;18:30 - 19:00 NDepend (Dariusz Tarczyński)&lt;br /&gt;19:00 - 19:15 Przerwa&lt;br /&gt;19:15 - 21:00 Silverlight 3, Blend 3, .NET RIA Services - najciekawsze cechy (Marcin Kruszyński)&lt;br /&gt;&lt;br /&gt;Udział w spotkaniu jest bezpłatny, a rejestracja uczestników znajduje się tutaj: &lt;a href="http://ms-groups.pl/pg.net/22_Spotkanie/default.aspx"&gt;Rejestracja&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;EDIT @ 2009.10.30&lt;/span&gt;&lt;br /&gt;Prezentację oraz materiały do niej można pobrać stąd&lt;br /&gt;&lt;iframe title ="Preview" scrolling="no" marginheight="0" marginwidth="0" frameborder="0" style="width:98px;height:115px;padding:0;background-color:#fcfcfc;" src="http://cid-53e5f49ba36f4048.skydrive.live.com/embedicon.aspx/Blog/NDEPEND.zip"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4443173340461901816-2468579463412956634?l=dariusztarczynski.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/C8w3RMzWu9UfWF4ZmJonLXAUHIA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/C8w3RMzWu9UfWF4ZmJonLXAUHIA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/C8w3RMzWu9UfWF4ZmJonLXAUHIA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/C8w3RMzWu9UfWF4ZmJonLXAUHIA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=sczFjbkqro4:2f8ni1xXSTA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=sczFjbkqro4:2f8ni1xXSTA:0VBWazUhMmc"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=0VBWazUhMmc" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=sczFjbkqro4:2f8ni1xXSTA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?i=sczFjbkqro4:2f8ni1xXSTA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DariuszTarczynski/~4/sczFjbkqro4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dariusztarczynski.blogspot.com/feeds/2468579463412956634/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4443173340461901816&amp;postID=2468579463412956634" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/2468579463412956634?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/2468579463412956634?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DariuszTarczynski/~3/sczFjbkqro4/pgnet-xxii-spotkanie-grupy.html" title="PG.NET XXII Spotkanie grupy" /><author><name>Dariusz Tarczyński</name><uri>http://www.blogger.com/profile/10745468881018443121</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="30" height="32" src="http://3.bp.blogspot.com/__d4mtXXARcU/SQSySUGrjaI/AAAAAAAAAJY/Id00EDvvIqs/S220/avatarnowy.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/__d4mtXXARcU/SuAVh4qN8pI/AAAAAAAAAWQ/padpyVJkuwk/s72-c/pozdotnet_logo.gif" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://dariusztarczynski.blogspot.com/2009/10/pgnet-xxii-spotkanie-grupy.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkMNRn49cSp7ImA9WxNXGUQ.&quot;"><id>tag:blogger.com,1999:blog-4443173340461901816.post-6088641587074463992</id><published>2009-10-06T10:20:00.003+02:00</published><updated>2009-10-08T10:28:17.069+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-08T10:28:17.069+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="PG.NET" /><title>PG.NET XXI Spotkanie grupy</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__d4mtXXARcU/Ss2ifnNxLuI/AAAAAAAAAWI/zxG-QuAVAXc/s1600-h/pozdotnet_logo.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 96px;" src="http://3.bp.blogspot.com/__d4mtXXARcU/Ss2ifnNxLuI/AAAAAAAAAWI/zxG-QuAVAXc/s200/pozdotnet_logo.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5390142993018728162" /&gt;&lt;/a&gt;&lt;br /&gt;Gościem XXI spotkania (&lt;span style="font-weight:bold;"&gt;2009-10-08 19:00&lt;/span&gt;, Aleja Wielkopolska 4, siedziba firmy Cognifide) Poznańskiej Grupy .NET będzie Bartosz Nyczkowski, który pracuje w Microsoft, w grupie, która jest odpowiedzialna na wydajność serwerowych wersji Microsoft Windows.&lt;br /&gt;&lt;br /&gt;Oto zagadnienia, które omówi:&lt;br /&gt;- Jak wygląda cykl życia projektu w przypadku Microsoft Windows?&lt;br /&gt;- W jaki sposób jest testowana wydajność systemu?&lt;br /&gt;- Jak od strony praktycznej wygląda praca nad usprawnieniami?&lt;br /&gt;- Jak wygląda współpraca z klientami?&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ms-groups.pl/pg.net/21_Spotkanie/Lists/Rejestracja/NewForm.aspx?Source=http://ms-groups.pl/pg.net/21_Spotkanie/"&gt;Rejestracja na spotkanie&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4443173340461901816-6088641587074463992?l=dariusztarczynski.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/eSX9jBuATHfBD-UNEku9tvUOK8w/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eSX9jBuATHfBD-UNEku9tvUOK8w/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/eSX9jBuATHfBD-UNEku9tvUOK8w/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eSX9jBuATHfBD-UNEku9tvUOK8w/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=6T-Z7418ngg:tLs2GfYalZI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=6T-Z7418ngg:tLs2GfYalZI:0VBWazUhMmc"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=0VBWazUhMmc" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=6T-Z7418ngg:tLs2GfYalZI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?i=6T-Z7418ngg:tLs2GfYalZI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DariuszTarczynski/~4/6T-Z7418ngg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dariusztarczynski.blogspot.com/feeds/6088641587074463992/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4443173340461901816&amp;postID=6088641587074463992" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/6088641587074463992?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/6088641587074463992?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DariuszTarczynski/~3/6T-Z7418ngg/pgnet-xxi-spotkanie-grupy.html" title="PG.NET XXI Spotkanie grupy" /><author><name>Dariusz Tarczyński</name><uri>http://www.blogger.com/profile/10745468881018443121</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="30" height="32" src="http://3.bp.blogspot.com/__d4mtXXARcU/SQSySUGrjaI/AAAAAAAAAJY/Id00EDvvIqs/S220/avatarnowy.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/__d4mtXXARcU/Ss2ifnNxLuI/AAAAAAAAAWI/zxG-QuAVAXc/s72-c/pozdotnet_logo.gif" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://dariusztarczynski.blogspot.com/2009/10/pgnet-xxi-spotkanie-grupy.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8DQnY9fip7ImA9WxNQEkQ.&quot;"><id>tag:blogger.com,1999:blog-4443173340461901816.post-6244661430754323592</id><published>2009-09-18T18:19:00.001+02:00</published><updated>2009-09-18T18:21:13.866+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-18T18:21:13.866+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Agile" /><title>Agile Poznań: III Spotkanie</title><content type="html">&lt;p&gt;Spotkanie Poznańskiej Grupy Praktyków Agile odbędzie sie w siedzibie Cognifide    &lt;br /&gt;(&lt;a title="Mapka Google" href="http://maps.google.com/maps?f=q&amp;amp;hl=en&amp;amp;q=Aleja+Wielkopolska+4,+Pozna%C5%84,+Poznan,+Greater+Poland,+Poland&amp;amp;sll=51.568627,-0.116905&amp;amp;sspn=0.008669,0.017831&amp;amp;ie=UTF8&amp;amp;cd=1&amp;amp;geocode=0,52.416800,16.918610&amp;amp;ll=52.416621,16.917894&amp;amp;spn=0.01115,0.013776&amp;amp;z=16&amp;amp;iwloc=addr" target="_blank"&gt;Al.Wielkopolskie 4, Poznań&lt;/a&gt;) &lt;strong&gt;6 października o godzinie 18:00&lt;/strong&gt;. &lt;/p&gt;  &lt;p&gt;Wojciech Buras poprowadzi prezentacje &amp;quot;TDD w prawdziwym swiecie&amp;quot;,    &lt;br /&gt;podczas której omówione zostaną miedzy innymi następujące kwestie:     &lt;br /&gt;1. Najczęstsze problemy z przełożeniem designu na kod i testy.     &lt;br /&gt;2. Czym jest i czym nie jest TDD?     &lt;br /&gt;3. Przykład ewolucji designu z pomocą TDD.     &lt;br /&gt;4. Promowanie testowalności.     &lt;br /&gt;5. Zastosowanie na linii frontu. &lt;/p&gt;  &lt;p&gt;Warto się wybrać!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4443173340461901816-6244661430754323592?l=dariusztarczynski.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/0stCqWuXopnEQTAS8BUe037mrlw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0stCqWuXopnEQTAS8BUe037mrlw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/0stCqWuXopnEQTAS8BUe037mrlw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0stCqWuXopnEQTAS8BUe037mrlw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=M11Fna3dtlo:cz6vWYcW4dQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=M11Fna3dtlo:cz6vWYcW4dQ:0VBWazUhMmc"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=0VBWazUhMmc" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=M11Fna3dtlo:cz6vWYcW4dQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?i=M11Fna3dtlo:cz6vWYcW4dQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DariuszTarczynski/~4/M11Fna3dtlo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dariusztarczynski.blogspot.com/feeds/6244661430754323592/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4443173340461901816&amp;postID=6244661430754323592" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/6244661430754323592?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/6244661430754323592?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DariuszTarczynski/~3/M11Fna3dtlo/agile-poznan-iii-spotkanie.html" title="Agile Poznań: III Spotkanie" /><author><name>Dariusz Tarczyński</name><uri>http://www.blogger.com/profile/10745468881018443121</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="30" height="32" src="http://3.bp.blogspot.com/__d4mtXXARcU/SQSySUGrjaI/AAAAAAAAAJY/Id00EDvvIqs/S220/avatarnowy.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://dariusztarczynski.blogspot.com/2009/09/agile-poznan-iii-spotkanie.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEcARHk7eSp7ImA9WxNRGUw.&quot;"><id>tag:blogger.com,1999:blog-4443173340461901816.post-6889636257590693107</id><published>2009-09-14T09:49:00.004+02:00</published><updated>2009-09-14T10:14:05.701+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-14T10:14:05.701+02:00</app:edited><title>PG.NET: XX Spotkanie grupy</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__d4mtXXARcU/Sq32uNAVHbI/AAAAAAAAAVo/tJ60zUmegrw/s1600-h/pozdotnet_logo.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 96px;" src="http://1.bp.blogspot.com/__d4mtXXARcU/Sq32uNAVHbI/AAAAAAAAAVo/tJ60zUmegrw/s200/pozdotnet_logo.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5381228403403070898" /&gt;&lt;/a&gt;&lt;br /&gt;
Zapraszamy na pierwsze po wakacjach spotkanie Poznańskiej Grupy .NET.&lt;br /&gt;
20. spotkanie PG.NET odbędzie się w &lt;span style="font-weight:bold;"&gt;czwartek 24 września&lt;/span&gt; (Aleja Wielkopolska 4, siedziba firmy Cognifide) &lt;b&gt;od godz. 18:00&lt;/b&gt;. Zapowiada się bardzo, bardzo interesująco!&lt;br /&gt;
&lt;br /&gt;
Agenda:&lt;br /&gt;
18:00 - 18:15 - Wstęp i kilka spraw organizacyjnych&lt;br /&gt;
18:20 - 18:35 - Nowinki w świecie .NET - Skrót informacji ze  swiata technologii .NET przygotowany przez Marka Błotnego (Cognifide)&lt;br /&gt;
18:40 - 19:00 - Hudson Continuous Integration Engine - Kilka informacji na temat alternatywnego narzędzia CI przedstawi Michał Korsak (ITSoftware.pl)&lt;br /&gt;
19:15 - 20:00 - Instalator WiX - Bartek Szafko (Advisor)&lt;br /&gt;
&lt;br /&gt;
W czasie spotkania wśród uczestników rozlosujemy kilka licencji na oprogramowanie firm JetBrains, Developer Express, Telerik oraz Nevron.&lt;br /&gt;
&lt;br /&gt;
Po spotkaniu, już tradycyjnie zapraszamy na część dyskusyjno-nieformalną :)&lt;br /&gt;
[&lt;a href="http://ms-groups.pl/pg.net"&gt;Rejestracja, strona grupy&lt;/a&gt;]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4443173340461901816-6889636257590693107?l=dariusztarczynski.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/jmmU789BwNYql0X6nzb45xSXl_s/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jmmU789BwNYql0X6nzb45xSXl_s/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/jmmU789BwNYql0X6nzb45xSXl_s/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jmmU789BwNYql0X6nzb45xSXl_s/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=QntYNva4SMA:U_c-YurwdvM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=QntYNva4SMA:U_c-YurwdvM:0VBWazUhMmc"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=0VBWazUhMmc" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=QntYNva4SMA:U_c-YurwdvM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?i=QntYNva4SMA:U_c-YurwdvM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DariuszTarczynski/~4/QntYNva4SMA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dariusztarczynski.blogspot.com/feeds/6889636257590693107/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4443173340461901816&amp;postID=6889636257590693107" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/6889636257590693107?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/6889636257590693107?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DariuszTarczynski/~3/QntYNva4SMA/pgnet-xx-spotkanie-grupy.html" title="PG.NET: XX Spotkanie grupy" /><author><name>Dariusz Tarczyński</name><uri>http://www.blogger.com/profile/10745468881018443121</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="30" height="32" src="http://3.bp.blogspot.com/__d4mtXXARcU/SQSySUGrjaI/AAAAAAAAAJY/Id00EDvvIqs/S220/avatarnowy.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/__d4mtXXARcU/Sq32uNAVHbI/AAAAAAAAAVo/tJ60zUmegrw/s72-c/pozdotnet_logo.gif" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://dariusztarczynski.blogspot.com/2009/09/pgnet-xx-spotkanie-grupy.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEANSHo-cSp7ImA9WxNQEU0.&quot;"><id>tag:blogger.com,1999:blog-4443173340461901816.post-5613773392480168070</id><published>2009-09-07T22:11:00.002+02:00</published><updated>2009-09-16T15:13:19.459+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-16T15:13:19.459+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="NDepend" /><title>NDepend. Wiesz z kim tańczysz?</title><content type="html">&lt;p&gt;Po konkretnej nieobecności w trybie online powracam do życia - z kolejnymi wpisami znanej treści, tym razem słów kilka o niezwykle użytecznym narzędziu: &lt;a href="http://www.ndepend.com"&gt;NDepend&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Czym jest owy NDepend? To narzędzie dla .NET, którego autorem jest &lt;a href="http://codebetter.com/blogs/patricksmacchia/"&gt;Patrick Smacchia&lt;/a&gt;. Służy ono do badania i raportowania złożoności oraz jakości tworzonego kodu. Na chwilę obecną posiada &lt;a href="http://ndepend.com/Features.aspx#Metrics"&gt;82 metryki&lt;/a&gt; wyświetlające bardzo szczegółowe dane. Dodatkowo generator raportów sprawiają, że nawet “nieprogramista” może ocenić w jakiej kondycji jest dostarczony mu kod – narzędzie wszechstronne oraz wręcz nieograniczone. Możliwość integracji z NAnt-em lub MSBuild-em dostarczają automatów do wykonywania tego wszystkiego o czym troszkę napisze za chwilę.&lt;/p&gt;  &lt;p&gt;Zacznijmy od początku. Po uruchomieniu NDependa wskazujemy zestaw bibliotek, które chcemy poddać analizie. Nie mam nic mądrego pod ręką, dlatego posłużę się bibliotekami &lt;a href="http://www.mbunit.com"&gt;MbUnit&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/__d4mtXXARcU/SqVo2kTqDDI/AAAAAAAAAUg/BzkYMEbMHhw/s1600-h/1%5B2%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="1" border="0" alt="1" src="http://lh3.ggpht.com/__d4mtXXARcU/SqVo24E-fbI/AAAAAAAAAUk/2ivwZKtXNto/1_thumb.jpg?imgmax=800" width="244" height="176" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Program od razu przystępuję do akcji, a oczom naszym ukazuje się dłuuugi raport.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/__d4mtXXARcU/SqVo3o7LhqI/AAAAAAAAAUo/JTNIkUpw99c/s1600-h/2%5B2%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="2" border="0" alt="2" src="http://lh6.ggpht.com/__d4mtXXARcU/SqVo4Kr8cCI/AAAAAAAAAUs/eF4AzFpe22U/2_thumb.jpg?imgmax=800" width="154" height="244" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I tak, na pierwszy rzut widzimy:&lt;/p&gt;  &lt;p&gt;ilość instrukcji IL, ilość linii, kodu, (uwaga) pokrycie kodu przez komentarze, ilość klas, ilość typów itd. O ile niektóre z tych danych, z praktycznego punktu widzenia, możemy potraktować statystycznie, o tyle już np. zależności między samymi klasami, martwy kod, konwencje nazewnicze mogą być tym, czego właśnie szukamy.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Kto, kogo, gdzie…&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Wspomniane zależności między modułami mogą być bardzo skomplikowane, przedzieranie się pomiędzy nimi za pomocą Reflectora często po kilkudziesięciu minutach powoduje odruch wymiotny na widok kolejnego “dziedzica”. Na szczęście NDepend jest w stanie to wszystko ogarnąć i mimo że kod nadal pozostaje zakręcony, to my w tym gąszczu powiązań dość szybko możemy dojść do celu.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/__d4mtXXARcU/SqVo4japVAI/AAAAAAAAAUw/dFzUGf3b4_g/s1600-h/4%5B2%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="4" border="0" alt="4" src="http://lh4.ggpht.com/__d4mtXXARcU/SqVo5AuqZhI/AAAAAAAAAU0/hFMxRu00ikg/4_thumb.jpg?imgmax=800" width="244" height="182" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Refaktoryzacja kodu z tym okienkiem staje się wiele prostsza. Często graf może wydawać się zbyt obszerny: &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/__d4mtXXARcU/SqVtp2Xml-I/AAAAAAAAAVQ/UznBpFXVraM/s1600-h/DiagramBoxAndArrowGraphBig%5B2%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="DiagramBoxAndArrowGraphBig" border="0" alt="DiagramBoxAndArrowGraphBig" src="http://lh3.ggpht.com/__d4mtXXARcU/SqVtqQvsYJI/AAAAAAAAAVU/m4iEqZroRcQ/DiagramBoxAndArrowGraphBig_thumb.jpg?imgmax=800" width="244" height="118" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Na szczęście do dyspozycji mamy dodatkowe dokowalne okienko: Dependency Matrix:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/__d4mtXXARcU/SqVo58dTmwI/AAAAAAAAAU4/yzF5cmRS9Hs/s1600-h/5%5B2%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="5" border="0" alt="5" src="http://lh4.ggpht.com/__d4mtXXARcU/SqVo6Yl9_3I/AAAAAAAAAU8/sOlsX8xK9gs/5_thumb.jpg?imgmax=800" width="244" height="195" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Skóra węża?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Kolejnym bardzo interesującym widokiem jest okno Metrics. Przypomina ono nieco skórę węża (tak, widzę tam skórę węża :-) ), a ma za zadanie wykonanie rentgena naszego kodu: każda bryła w ogólności symbolizuje klasę, która to składa się z mniejszych kwadracików – naszych metod. Im metoda ma więcej linii kodu, tym kwadracik jest większy. Sczegółowość możemy zawężać przełącznikiem widniejącym u góry okienka, natomiast zbiorcze informacje widzimy w okienku Info.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/__d4mtXXARcU/SqVp-EPgr1I/AAAAAAAAAVI/GYFrdsaA2-8/s1600-h/6%5B2%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="6" border="0" alt="6" src="http://lh4.ggpht.com/__d4mtXXARcU/SqVp-q_oiPI/AAAAAAAAAVM/opgau8hSUj4/6_thumb.jpg?imgmax=800" width="244" height="175" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;CQL&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;To nie wszystko! NDepend posiada wbudowany interpreter języka zwanego CQL (Code Query Language). Dzięki niemu piszemy kwerendy zbliżone do języka SQL, które to pozwalają odpytywać się NDependa o interesujące nas dane o naszym kodzie.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Operator projekcji: SELECT&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;METHODS – odpytania do metod&lt;/li&gt;    &lt;li&gt;FIELDS – odpytania do pól&lt;/li&gt;    &lt;li&gt;TYPES – odpytania do typów&lt;/li&gt;    &lt;li&gt;NAMESPACES – odpytania do&amp;#160; przestrzeni nazw&lt;/li&gt;    &lt;li&gt;ASSEMBLIES – odpytania operujące na bibliotekach&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Operator informujący: WARN&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;WARN IF – jeśli spełniony jest warunek&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Aby utworzyć kwerendę należy skorzystać z okna CQL Query Edition, które posiada wbudowane podpowiadanie składni z możliwością wizualnego modyfikowania jej parametrów:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/__d4mtXXARcU/SqVo7BWwsQI/AAAAAAAAAVA/vQA4j-kuB-w/s1600-h/7%5B2%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="7" border="0" alt="7" src="http://lh5.ggpht.com/__d4mtXXARcU/SqVo7rJRXtI/AAAAAAAAAVE/U6mjBu6yR7g/7_thumb.jpg?imgmax=800" width="244" height="176" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Przykłady:&lt;/p&gt;  &lt;p&gt;1. Wyświetl metody publiczne, które mają więcej niż 30 linii kodu:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;SELECT METHODS WHERE NbLinesOfCode &amp;gt; &lt;b&gt;30&lt;/b&gt; AND IsPublic&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;2. Wyświetl 10 najbardziej złożonych metod i uszereguj metody ze względu na ich złożoność:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;SELECT TOP &lt;b&gt;10&lt;/b&gt; METHODS ORDER BY CyclomaticComplexity&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;3. Moja konwencja nazewnicza zabrania nazywania pól statycznych zaczynających się od przedrostka m_ Ostrzeż mnie jeśli znajdziesz takie wystąpienia:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;WARN IF Count &amp;gt; &lt;b&gt;0&lt;/b&gt; IN SELECT FIELDS WHERE NameLike &amp;quot;^m_&amp;quot; AND IsStatic&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Słowo końcowe&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;NDepend to naprawdę niezły kombajn, kilka godzin może okazać się niewystarczające, aby zgłębić możliwości jakie drzemią w tym narzędziu. Warto go poznać, gdyż może uratować nam skórę podczas następnej refaktoryzacji kodu.    &lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;a rev="vote-for" href="http://dotnetomaniak.pl/Dariusz-Tarczy%C5%84ski-blog-NDepend-Wiesz-z-kim-ta%C5%84czysz"&gt;&lt;img alt="Promuj" src="http://dotnetomaniak.pl/image.axd?url=http%3A%2F%2Fdariusztarczynski.blogspot.com%2F2009%2F09%2Fndepend-wiesz-z-kim-tanczysz.html&amp;textBackColor=000000" style="border:0px"/&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4443173340461901816-5613773392480168070?l=dariusztarczynski.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/6ZrTSjI-yUowIQBIlW-fudMkXrg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6ZrTSjI-yUowIQBIlW-fudMkXrg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/6ZrTSjI-yUowIQBIlW-fudMkXrg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6ZrTSjI-yUowIQBIlW-fudMkXrg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=zCFqCZCZggU:ZpGqVFPhcmo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=zCFqCZCZggU:ZpGqVFPhcmo:0VBWazUhMmc"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=0VBWazUhMmc" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=zCFqCZCZggU:ZpGqVFPhcmo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?i=zCFqCZCZggU:ZpGqVFPhcmo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DariuszTarczynski/~4/zCFqCZCZggU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dariusztarczynski.blogspot.com/feeds/5613773392480168070/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4443173340461901816&amp;postID=5613773392480168070" title="Komentarze (4)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/5613773392480168070?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/5613773392480168070?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DariuszTarczynski/~3/zCFqCZCZggU/ndepend-wiesz-z-kim-tanczysz.html" title="NDepend. Wiesz z kim tańczysz?" /><author><name>Dariusz Tarczyński</name><uri>http://www.blogger.com/profile/10745468881018443121</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="30" height="32" src="http://3.bp.blogspot.com/__d4mtXXARcU/SQSySUGrjaI/AAAAAAAAAJY/Id00EDvvIqs/S220/avatarnowy.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/__d4mtXXARcU/SqVo24E-fbI/AAAAAAAAAUk/2ivwZKtXNto/s72-c/1_thumb.jpg?imgmax=800" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://dariusztarczynski.blogspot.com/2009/09/ndepend-wiesz-z-kim-tanczysz.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU4DR344cCp7ImA9WxFVFUk.&quot;"><id>tag:blogger.com,1999:blog-4443173340461901816.post-7283639054962919946</id><published>2009-05-16T20:27:00.006+02:00</published><updated>2010-06-14T21:32:56.038+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-14T21:32:56.038+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MVC" /><title>ASP.NET MVC oraz IIS 6</title><content type="html">&lt;p&gt;Hostowanie aplikacji utworzonej za pomocą frameworka ASP.NET MVC na serwerze IIS 6 jest niestety bardzo problematyczne. Utworzone w ten spos&amp;#243;b aplikacje wyświetlają niemiły (i w tym przypadku niezrozumiały) komunikat: 404 Not Found. Dlaczego tak się dzieje? &lt;/p&gt;&lt;p&gt;Żądania przychodzące do serwera są przetwarzane poprzez odpowiednie filtry ISAPI (pomijam dla uproszczenia inne zachodzace tam procesy), zgodnie z mapowaniem odpowiednich rozszerzeń. I tak na przykład .ASPX trafia do filtra aspnet_isapi.dll. Routing ASP.NET MVC wymaga użycia modułu IHTTPModule i wywołania UrlRoutingModule. Niestety to wymaga przejścia przez wymieniony wcześniej filtr aspnet_isapi.dll - a ten domyślnie nie jest w tym przypadku żądany, a serwer wyświetla nam błąd 404.&lt;/p&gt;&lt;p&gt;Ok, jak wyjść z opresji?&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Metoda 1: Prosta&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Odrazu ostrzegam: ta metoda nie nadaje się do zastosowania w dużych, obciążonych witrynach. Zaraz okaże się dlaczego.&lt;/p&gt;&lt;p&gt;Rozwiązanie to opiera się o wildcard. Polega to na tym, że wszystkie żądania przychodzące do serwera będą puszczane przez aspnet_isapi.dll. Zaletą jest prostota, wadą: każde żądanie: nawet o obrazek, plik .css, plik multimedialny i każdy inny plik będzie wiązał się przejściem przez handler DefaultHttpHandler/StaticFileHandler. Takie rozwiązanie oznacza brak cachowania żądań oraz kompresji. Marnotrawstwo zasob&amp;#243;w serwera, a to dla mocno obciążonych maszyn oznacza problemy.&lt;/p&gt;&lt;p&gt;Ok, ale dla developerskich zastosowań takie rozwiązanie będzie wystarczające, więc zaczynamy konfigurację:&lt;/p&gt;&lt;p&gt;1. Otwieramy przystawkę &lt;em&gt;Internetowe Uslugi Informacyjne &lt;/em&gt;i klikamy &lt;em&gt;właściwości&lt;/em&gt; naszej aplikacji MVC.&lt;/p&gt;&lt;p&gt;2. Przechodzimy na kartę: &lt;em&gt;Katalog macierzysty &lt;/em&gt;oraz klikamy przycisk &lt;em&gt;Konfiguracja&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/__d4mtXXARcU/Sg8oaSD78VI/AAAAAAAAATk/L1CyrPcpT0A/s1600-h/screen_02%202009.05.16%2020.02%5B3%5D.gif"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="screen_02 2009.05.16 20.02" src="http://lh3.ggpht.com/__d4mtXXARcU/Sg8Fhlet6sI/AAAAAAAAATo/FCueis0ItCw/screen_02%202009.05.16%2020.02_thumb%5B3%5D.gif?imgmax=800" width="260" height="218" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;3. Klikamy przycisk &lt;em&gt;Insert, &lt;/em&gt;wpisujemy rozszerzenie: .mvc potem lokalizację: &lt;em&gt;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll &lt;/em&gt;oraz &lt;u&gt;odznaczamy&lt;/u&gt; opcję &lt;em&gt;Sprawdz, czy plik istnieje.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;Metoda 2: Zmiana ścieżki routingu&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Metoda ta polega na dodaniu rozszerzenia .aspx po nazwie kontrolera, czyli stworzenia ścieżki routingu w ten deseń: &lt;em&gt;{controller}.aspx/{action}/{id}&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Niestety tracimy nasze czyste ścieżki, kt&amp;#243;re zapewniało nam MVC.&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Metoda 3: URL Rewriting&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Ta metoda to nic innego jak zautomatyzowanie metody drugiej (odpada nam zmiana ścieżek). Musimy skonfigurować przepisywanie ścieżek tak, aby moduł dopisał znane ASP.NET rozszerzenie i przepuscił je przez odpowiedni filtr.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4443173340461901816-7283639054962919946?l=dariusztarczynski.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/UM2ouqRDr2-Rl_zpEUv6Jqryo8s/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UM2ouqRDr2-Rl_zpEUv6Jqryo8s/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/UM2ouqRDr2-Rl_zpEUv6Jqryo8s/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UM2ouqRDr2-Rl_zpEUv6Jqryo8s/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=PtHv_1_7njE:zZpfRFwIdXY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=PtHv_1_7njE:zZpfRFwIdXY:0VBWazUhMmc"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=0VBWazUhMmc" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=PtHv_1_7njE:zZpfRFwIdXY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?i=PtHv_1_7njE:zZpfRFwIdXY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DariuszTarczynski/~4/PtHv_1_7njE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dariusztarczynski.blogspot.com/feeds/7283639054962919946/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4443173340461901816&amp;postID=7283639054962919946" title="Komentarze (3)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/7283639054962919946?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/7283639054962919946?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DariuszTarczynski/~3/PtHv_1_7njE/aspnet-mvc-oraz-iis-6.html" title="ASP.NET MVC oraz IIS 6" /><author><name>Dariusz Tarczyński</name><uri>http://www.blogger.com/profile/10745468881018443121</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="30" height="32" src="http://3.bp.blogspot.com/__d4mtXXARcU/SQSySUGrjaI/AAAAAAAAAJY/Id00EDvvIqs/S220/avatarnowy.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/__d4mtXXARcU/Sg8Fhlet6sI/AAAAAAAAATo/FCueis0ItCw/s72-c/screen_02%202009.05.16%2020.02_thumb%5B3%5D.gif?imgmax=800" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://dariusztarczynski.blogspot.com/2009/05/aspnet-mvc-oraz-iis-6.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A04DRH49fip7ImA9WxVUF08.&quot;"><id>tag:blogger.com,1999:blog-4443173340461901816.post-4783969179409304955</id><published>2009-03-22T14:39:00.001+01:00</published><updated>2009-03-22T14:52:55.066+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-22T14:52:55.066+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MVC" /><category scheme="http://www.blogger.com/atom/ns#" term="Walidacja" /><title>Walidacja danych w ASP.NET MVC za pomocą xVal</title><content type="html">&lt;p&gt;Pierwsza zasada programisty: nigdy nie ufaj danym wejściowym. Sama walidacja tych danych może zostać przeprowadzona na wiele sposob&amp;#243;w, przekazując odpowiedzialność od warstwy najwyższej do najniższej. Takie podejście pozwala na eliminowanie zagrożenia w wielu przypadkach jeszcze bez przesłania danych do serwera. (Jeśli ktoś nie lubi czytać przydługich wstęp&amp;#243;w, może przejść od razu do punktu: &amp;quot;Dlaczego xVal?&amp;quot;). &lt;/p&gt;  &lt;br/&gt;&lt;strong&gt;Walidacja po stronie warstwy prezentacji &lt;/strong&gt;  &lt;pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;TextBox&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ID&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;TextBox1&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;runat&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;RequiredFieldValidator&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ID&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;reqVal&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;runat&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;server&amp;quot;&lt;/span&gt; &lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;       &lt;span style="color: #ff0000"&gt;ErrorMessage&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;Please enter a value&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ControlToValidate&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;TextBox1&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;Button&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ID&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;Button1&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;runat&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Text&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;Button&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;Należy pamiętać, że walidacja po stronie klienta (JavaScript) ZAWSZE musi iść w parze z walidacją po stronie serwera. W przeciwnym razie, to tak jak by w og&amp;#243;le tej walidacji nie było! Wywołanie metody PageIsValid:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;&lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Button1_Click(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; sender, EventArgs e) &lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;{ &lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;  &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (Page.IsValid) &lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;  { &lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    &lt;span style="color: #008000"&gt;// TextBox1 posiada wartość.&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;  } &lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;}&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;&lt;strong&gt;Walidacja po stronie logiki biznesowej&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Validate (EmailAddress myEmailAddress) &lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;{ &lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;  &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (myEmailAddress.ContactPersonId &amp;lt;= 0) &lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;  { &lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; InvalidOperationException(&amp;quot;&lt;span style="color: #8b0000"&gt;Błąd, brak odpowiedniego ContactPersonId!&lt;/span&gt;&amp;quot;); &lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;  } &lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;  &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.IsNullOrEmpty(myEmailAddress.Email))&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;  { &lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; InvalidOperationException(&amp;quot;&lt;span style="color: #8b0000"&gt;Błąd, brak emaila!&lt;/span&gt;&amp;quot;); &lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;  } &lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;  &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!IsValidEmailAddress(myEmailAddress.Email)) &lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;  { &lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; InvalidOperationException(&amp;quot;&lt;span style="color: #8b0000"&gt;Błąd, wprowadzony email jest błędny!&lt;/span&gt;&amp;quot;); &lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;  } &lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;} &lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; Save(EmailAddress myEmailAddress) &lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;{ &lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;  Validate (myEmailAddress);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;  myEmailAddress.Id = EmailAddressDB.Save(myEmailAddress);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;  &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; myEmailAddress.Id; &lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;} &lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;&lt;strong&gt;Walidacja po stronie serwera SQL&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=ALTER&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;ALTER&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=TABLE&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;TABLE&lt;/a&gt;  dbo.Category &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=ADD&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;ADD&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=CONSTRAINT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;CONSTRAINT&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;CK_Category &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=CHECK&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;CHECK&lt;/a&gt; (SortOrder &amp;gt;= 0  &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=AND&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;AND&lt;/a&gt; SortOrder &amp;lt;= 100)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=GO&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;GO&lt;/a&gt;   &lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;&lt;strong&gt;Wykorzystanie dostępnego frameworka do walidacji danych, np:&lt;/strong&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc467894.aspx" target="_blank"&gt;Enterpirse Library Validation Application Block&lt;/a&gt; &lt;/li&gt;&lt;br /&gt;  &lt;li&gt;&lt;a href="http://nhforge.org/media/p/7.aspx" target="_blank"&gt;NHibernate.Validator&lt;/a&gt; &lt;/li&gt;&lt;br /&gt;  &lt;li&gt;&lt;a href="http://xval.codeplex.com/" target="_blank"&gt;xVal&lt;/a&gt; &lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Przedstawione frameworki r&amp;#243;żnią się przeznaczeniem. Ja przedstawię w tym poście świeży jeszcze projekt &lt;strong&gt;xVal&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;&lt;strong&gt;Dlaczego xVal?&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;  &lt;li&gt;Stworzony do użycia z ASP.NET MVC &lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Wspiera walidację client-side oraz server-side &lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Możliwość lokalizacji językowej komunikat&amp;#243;w &lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Oparty o przyjęte &amp;quot;dobre techniki&amp;quot; &lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Możliwość włączenia do projektu bez konieczności przeprowadzania &amp;quot;wielkich&amp;quot; zmian &lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Lekki, 1 plik .dll do podłączenia &lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Open source &lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Mało znany, bo nowy :-) &lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh5.ggpht.com/__d4mtXXARcU/ScY_mJKe3qI/AAAAAAAAASc/CjEhgysxozo/s1600-h/image-thumb%5B3%5D.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="249" alt="image-thumb" src="http://lh5.ggpht.com/__d4mtXXARcU/ScY_nTyNtEI/AAAAAAAAASg/765tO3Ls-OY/image-thumb_thumb%5B1%5D.png?imgmax=800" width="644" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Zaczynamy. xVal - validation framework for ASP.NET MVC applications.&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;br/&gt;Po stronie modelu, xVal opiera swoje działanie o atrybuty. Z tego względu atrybuty naszych klas musimy odpowiednio oznaczyć atrybutami. W moim projekcie posiadam klasę Order.cs, kt&amp;#243;rą będę poddawał torturom walidacji:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Order&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;{&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    [Required] [StringLength(15)]&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; ClientName { &lt;span style="color: #0000ff"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;; }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt; &lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    [Range(1, 20)]&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; NumberOfProducts { &lt;span style="color: #0000ff"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;; }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt; &lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    [Required] [DataType(DataType.Date)]&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; DateTime Date { &lt;span style="color: #0000ff"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;; }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;}&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;Objaśnienie zastosowanych atrybut&amp;#243;w:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;[Required] : dany atrybut jest wymagany, nie może być pusty. &lt;/li&gt;&lt;br /&gt;  &lt;li&gt;[StringLength(n)] : dany atrybut musi posiadać odpowiednią długość, dla typu String. &lt;/li&gt;&lt;br /&gt;  &lt;li&gt;[Range(n, m)] : dany atrybut musi być z przedziału od, do. &lt;/li&gt;&lt;br /&gt;  &lt;li&gt;[DataType(typ)] : dany atrybut musi być zgodny z podanym typem. &lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;Należy jeszcze dodać referencję do: &lt;em&gt;System.ComponentModel.DataAnnotations.dll&lt;/em&gt;&lt;br /&gt;&lt;br/&gt;Nadszedł czas na kontroler. Ja wszystkie operacje dotyczące składania zam&amp;#243;wień będę przeprowadzał w &lt;em&gt;HomeController&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; HomeController : Controller&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;{&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    [AcceptVerbs(HttpVerbs.Get)]&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ViewResult CreateOrder()&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; View();&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt; &lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    [AcceptVerbs(HttpVerbs.Post)]&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ActionResult CreateOrder(Order order)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;        OrderManager.PlaceOrder(order);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; RedirectToAction(&amp;quot;&lt;span style="color: #8b0000"&gt;Completed&lt;/span&gt;&amp;quot;);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt; &lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ViewResult Completed()&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; View();&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;}&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;Klasa OrderManager:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; OrderManager&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;{&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; PlaceOrder(Order order)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;        var errors = DataAnnotationsValidationRunner.GetErrors(order);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (errors.Any())&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;            &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; RulesException(errors);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt; &lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;        &lt;span style="color: #008000"&gt;// Business rule: Nie można składać zam&amp;#243;wień w niedzielę&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt;(order.Date.DayOfWeek == DayOfWeek.Sunday)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;            &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; RulesException(&amp;quot;&lt;span style="color: #8b0000"&gt;ArrivalDate&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color: #8b0000"&gt;Nie można skłdać zam&amp;#243;wień na niedzielę!&lt;/span&gt;&amp;quot;, order);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt; &lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;        &lt;span style="color: #008000"&gt;// Todo: zapis do bazy danych, pliku xml lub cokolwiek innego&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;}&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;Czas na widok CreateOrder.aspx&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;h1&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Zam&amp;#243;wienie pluszowego misia&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;h1&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;&lt;span style="color: black; background-color: #ffff00"&gt;&amp;lt;%&lt;/span&gt; using(Html.BeginForm()) { &lt;span style="color: black; background-color: #ffff00"&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;        Nazwa: &lt;span style="color: black; background-color: #ffff00"&gt;&amp;lt;%&lt;/span&gt;= Html.TextBox(&amp;quot;order.ClientName&amp;quot;) &lt;span style="color: black; background-color: #ffff00"&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;        &lt;span style="color: black; background-color: #ffff00"&gt;&amp;lt;%&lt;/span&gt;= Html.ValidationMessage(&amp;quot;order.ClientName&amp;quot;) &lt;span style="color: black; background-color: #ffff00"&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;        Ilość misi&amp;#243;w: &lt;span style="color: black; background-color: #ffff00"&gt;&amp;lt;%&lt;/span&gt;= Html.TextBox(&amp;quot;order.NumberOfProducts&amp;quot;)&lt;span style="color: black; background-color: #ffff00"&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;        &lt;span style="color: black; background-color: #ffff00"&gt;&amp;lt;%&lt;/span&gt;= Html.ValidationMessage(&amp;quot;order.NumberOfProducts&amp;quot;)&lt;span style="color: black; background-color: #ffff00"&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;        Data dostawy: &lt;span style="color: black; background-color: #ffff00"&gt;&amp;lt;%&lt;/span&gt;= Html.TextBox(&amp;quot;order.Date&amp;quot;)&lt;span style="color: black; background-color: #ffff00"&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;        &lt;span style="color: black; background-color: #ffff00"&gt;&amp;lt;%&lt;/span&gt;= Html.ValidationMessage(&amp;quot;order.Date&amp;quot;)&lt;span style="color: black; background-color: #ffff00"&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;                &lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt; &lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;input&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;submit&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;&lt;span style="color: black; background-color: #ffff00"&gt;&amp;lt;%&lt;/span&gt; } &lt;span style="color: black; background-color: #ffff00"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;Potrzebujemy jeszcze prostą i niezmienną klasę ValidationRunnera, gdyż&amp;#160; DataAnnotations takiej nie posiada:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;&lt;span style="color: #0000ff"&gt;internal&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; DataAnnotationsValidationRunner&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;{&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IEnumerable&amp;lt;ErrorInfo&amp;gt; GetErrors(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; instance)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; from prop &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; TypeDescriptor.GetProperties(instance).Cast&amp;lt;PropertyDescriptor&amp;gt;()&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;               from attribute &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; prop.Attributes.OfType&amp;lt;ValidationAttribute&amp;gt;()&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;               where !attribute.IsValid(prop.GetValue(instance))&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;               select &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ErrorInfo(prop.Name, attribute.FormatErrorMessage(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.Empty), instance);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;}&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;Musimy jeszcze zmodyfikować napisany wcześniej szkielet metody &lt;em&gt;CreateOrder&lt;/em&gt; w kontrolerze &lt;em&gt;HomeController&lt;/em&gt;, tak aby błędy były przechowywane w stanie modelu.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;[AcceptVerbs(HttpVerbs.Post)]&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ActionResult CreateOrder(Order order)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;{&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    &lt;span style="color: #0000ff"&gt;try&lt;/span&gt; {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;        OrderManager.PlaceOrder(order);                &lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    &lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;(RulesException ex) {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;        ex.AddModelStateErrors(ModelState, &amp;quot;&lt;span style="color: #8b0000"&gt;order&lt;/span&gt;&amp;quot;);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt; &lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; ModelState.IsValid ? RedirectToAction(&amp;quot;&lt;span style="color: #8b0000"&gt;Completed&lt;/span&gt;&amp;quot;)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;                              : (ActionResult) View();&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;}&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;Tym oto sposobem zakończyliśmy walidację po stronie serwera. Czeka nas jeszcze implementacja sprawdzanie po stronie klienta.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/__d4mtXXARcU/ScY_nzppoqI/AAAAAAAAASk/BcRwbNZpoJY/s1600-h/screen_02%202009.03.22%2014.18%5B3%5D.gif"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="456" alt="screen_02 2009.03.22 14.18" src="http://lh5.ggpht.com/__d4mtXXARcU/ScY_oRHJtuI/AAAAAAAAASo/3xTT5vUGVEI/screen_02%202009.03.22%2014.18_thumb%5B1%5D.gif?imgmax=800" width="644" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;&lt;strong&gt;Walidacja po stronie klienta (Client-side validation). &lt;/strong&gt;&lt;br /&gt;Wszystko czego będziemy potrzebować do wykonania walidacji za pomocą javascriptu, to biblioteka &lt;a href="http://plugins.jquery.com/project/validate" target="_blank"&gt;jquery.validate.js&lt;/a&gt; oraz xVal.jquery.validate.js (ten znajduje się w folderze z projektem xVal). Należy je skopiować do folderu z naszymi skryptami (/Scripts) oraz podlinkować je do naszego MasterPage.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;head&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;script&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;src&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;&amp;lt;%= ResolveUrl(&amp;quot;&lt;/span&gt;~/&lt;span style="color: #ff0000"&gt;Scripts&lt;/span&gt;/&lt;span style="color: #ff0000"&gt;jquery&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;1&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;2&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;6&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;js&lt;/span&gt;&amp;quot;)%&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&amp;quot;&amp;gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;script&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;src&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;&amp;lt;%= ResolveUrl(&amp;quot;&lt;/span&gt;~/&lt;span style="color: #ff0000"&gt;Scripts&lt;/span&gt;/&lt;span style="color: #ff0000"&gt;jquery&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;validate&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;js&lt;/span&gt;&amp;quot;)%&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&amp;quot;&amp;gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;script&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;src&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;&amp;lt;%= ResolveUrl(&amp;quot;&lt;/span&gt;~/&lt;span style="color: #ff0000"&gt;Scripts&lt;/span&gt;/&lt;span style="color: #ff0000"&gt;xVal&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;jquery&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;validate&lt;/span&gt;.&lt;span style="color: #ff0000"&gt;js&lt;/span&gt;&amp;quot;)%&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&amp;quot;&amp;gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;head&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br/&gt;Czas teraz na import helper&amp;#243;w xVal, najlepiej zrobić to raz w pliku Web.config:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;system.web&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;pages&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;namespaces&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;        &lt;span style="color: #008000"&gt;&amp;lt;!-- leave rest as-is --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;add&lt;/span&gt; &lt;span style="color: #ff0000"&gt;namespace&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;xVal.Html&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;namespaces&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;pages&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;system.web&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;Wracamy do widoku oraz dodajemy linijkę służącą do wymuszenia walidacji po stronie klienta. Będzie ona zastosowana dla kontrolek prefixowanych przez nazwę &lt;em&gt;order&lt;/em&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; background-color: #ffffff"&gt;&lt;span style="color: black; background-color: #ffff00"&gt;&amp;lt;%&lt;/span&gt;= Html.ClientSideValidation&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Order&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;(&amp;quot;order&amp;quot;) &lt;span style="color: black; background-color: #ffff00"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;Od tej pory walidacja po stronie klienta powinna być uruchamiana, &amp;quot;potajemnie&amp;quot; korzystając oczwyiście z atrybut&amp;#243;w, kt&amp;#243;re definiowaliśmy wcześniej. Super!&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;W załączniku przesyłam zlokalizowany przeze nnie na nasz język plik z komunikatami.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;iframe style="border-right: #dde5e9 1px solid; padding-right: 0px; border-top: #dde5e9 1px solid; padding-left: 0px; padding-bottom: 0px; margin: 3px; border-left: #dde5e9 1px solid; width: 240px; padding-top: 0px; border-bottom: #dde5e9 1px solid; height: 66px; background-color: #ffffff" marginwidth="0" marginheight="0" src="http://cid-53e5f49ba36f4048.skydrive.live.com/embedrowdetail.aspx/Blog/xVal.Messages.pl-PL.js" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4443173340461901816-4783969179409304955?l=dariusztarczynski.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/GjdTlP_lV1j9avh3RQApnQGl15E/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GjdTlP_lV1j9avh3RQApnQGl15E/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/GjdTlP_lV1j9avh3RQApnQGl15E/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GjdTlP_lV1j9avh3RQApnQGl15E/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=tO4p0zhFDUc:GPvg4xGCttY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=tO4p0zhFDUc:GPvg4xGCttY:0VBWazUhMmc"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=0VBWazUhMmc" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=tO4p0zhFDUc:GPvg4xGCttY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?i=tO4p0zhFDUc:GPvg4xGCttY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DariuszTarczynski/~4/tO4p0zhFDUc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dariusztarczynski.blogspot.com/feeds/4783969179409304955/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4443173340461901816&amp;postID=4783969179409304955" title="Komentarze (3)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/4783969179409304955?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/4783969179409304955?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DariuszTarczynski/~3/tO4p0zhFDUc/walidacja-danych-w-aspnet-mvc-za-pomoca.html" title="Walidacja danych w ASP.NET MVC za pomocą xVal" /><author><name>Dariusz Tarczyński</name><uri>http://www.blogger.com/profile/10745468881018443121</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="30" height="32" src="http://3.bp.blogspot.com/__d4mtXXARcU/SQSySUGrjaI/AAAAAAAAAJY/Id00EDvvIqs/S220/avatarnowy.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/__d4mtXXARcU/ScY_nTyNtEI/AAAAAAAAASg/765tO3Ls-OY/s72-c/image-thumb_thumb%5B1%5D.png?imgmax=800" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://dariusztarczynski.blogspot.com/2009/03/walidacja-danych-w-aspnet-mvc-za-pomoca.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEIESX88eSp7ImA9WxVUEUs.&quot;"><id>tag:blogger.com,1999:blog-4443173340461901816.post-2043687887003047942</id><published>2009-03-16T00:43:00.001+01:00</published><updated>2009-03-16T01:15:08.171+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-16T01:15:08.171+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Inne" /><category scheme="http://www.blogger.com/atom/ns#" term="C2C" /><title>C2C '09 - relacja</title><content type="html">&lt;p&gt;&lt;a href="http://2009.c2c.org.pl"&gt;Communities 2 Communities 2009&lt;/a&gt; już za nami, chciałbym kr&amp;#243;tko podsumować całe spotkanie.&lt;/p&gt;  &lt;p&gt;Po pierwsze: podziękowania dla Adama Najmanowicza z Cognifide za zasponsorowania busa dla członk&amp;#243;w PG.NET! &lt;/p&gt;  &lt;p&gt;M&amp;#243;j poniższy komentarz dotyczy jedynie &lt;a href="http://2009.c2c.org.pl/pl/sessions.aspx"&gt;ścieżki&lt;/a&gt; .NET. Mam nadzieję, że organizatorzy udostępnią jakieś video z SQLa :-)&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;1. Marek Byszewski, &amp;quot;Tour de VSTS 2010&amp;quot;.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Prezentacja była szybkim przeglądem możliwości Visual Studio Team System 2010. Marek dość sprawnie prezentował możliwości debugera historycznego, zarządzania kodem oraz continuos integration za pomocą Visual Studio.&amp;#160; Aplikacja jeszcze nie jest wolna od wad - o czym można było się przekonać na własne oczy. Marek jednak dość sprawnie przechodził pomiędzy nie do końca udanymi pr&amp;#243;bami, całość wypadła w miarę sprawnie. Na szczęście (moim zdaniem) plan Marka został wykonany prawie do końa, nie licząc paru problem&amp;#243;w technicznych o kt&amp;#243;rych wspomniałem. Merytorycznie nie zobaczyłem nic wielkiego, czegoś czego do tej pory bym nie znał. Ocena 7,5/10.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2. Julia Lerman, &amp;quot;My favorite Entity Framework. Tips &amp;amp; Tricks&amp;quot;.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.oreillynet.com/pub/au/3141"&gt;Julia&lt;/a&gt; zaprezentowała wybrane problemy z kt&amp;#243;rymi spotyka się większość progrmist&amp;#243;w wykorzystujących EntityFramework oraz przestawiała sposoby ich rozwiązania. Prezentacja była prowadzona po angielsku, nie było jednak żadnych problem&amp;#243;w ze zrozumieniem przekazu - Julie z niczym się nie śpieszyła i płynnie przedstawiała kolejne punkty prezentacji. Doskonały kontakt z publiką, dużo energii w przekazywaniu wiedzy, pełen profesjonalizm. Ciekawe przykłady z życia wzięte i brak niezrozumiałej teorii. Ocena 10/10.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;3. Piotr Leszczyński, &amp;quot;Kolejny kontener Dependency Injection? NIE - dziękuję! Czyli o koncepcji meta-kontenera sł&amp;#243;w kilka&amp;quot;.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Tak naprawdę zastanawiałem się o czym będzie ta sesja. Koncepcja &lt;a href="http://metacontainer.codeplex.com"&gt;meta-kontenera&lt;/a&gt; nie była mi za bardzo znana, a chciałem się dowiedzieć u źr&amp;#243;dła &amp;quot;o so chosi&amp;quot;. Pomyślałem sobie, że pewnie będzie o IoC - trochę tak było. Szybkie wprowadzenie do tematyki Inversion Of Control, dependency injection, oraz przejście do meritum prezentacji, czyli meta-kontenera. Słuchałem, słuchałem i cały czas zastanawiałem się gdzie jest to odkrycie. Widziałem idee opartą o jeden wielki wzorzec fabryki, ale wydawało mi się, że jest coś jeszcze poza tym. Zadałem Piotrkowi pytanie &amp;quot;Jaki cel przyświecał wymyśleniu meta-kontenera i do czego jest mi on potrzebny, skoro wszystko to, co chcę zrobić z IoC udustępnia mi m&amp;#243;j obecny, ulubiony kontener?&amp;quot;. Piotrek odpowiedział, że uniezależnie mnie to od zmiany licencji mojego kontenera w przyszłości. Pytanie kolejne: &amp;quot;A co jeśli Wy zmienicie licencję meta-kontenera?&amp;quot;. Odpowiedz: &amp;lt;brak&amp;gt;. Odniosłem wrażenie, że prezentacja była pewnym środkiem na przedstawienie produktu, natomiast to co najciekawsze w samym IoC zostało potraktowane po macoszemu. Ocena: 6/10.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;4. Ingo Rammer, &amp;quot;Hardcore Production Debugging of .NET Applications&amp;quot;.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.thinktecture.com/ingo/"&gt;Ingo&lt;/a&gt; dał czadu! Wyśmienita wręcz prezentacja narzędzi służących do debugowania gotowego managed-kodu, była wykonana w spos&amp;#243;b jaki najbardziej przypadł mi do gustu. Narzędzia, kt&amp;#243;re przedstawiał Ingo, ani nie posiadały fajowskich wizualnych bajer&amp;#243;w, nie miały latającego menu, ani pomocy w postaci spinacza. Mimo to, zostały zaprezentowane w taki spos&amp;#243;b, że nie spuszczałem wzroku z ekranu projektora. Absolutnie nie było żadnej rzeczy do kt&amp;#243;rej m&amp;#243;głbym się przyczepić. Ocena 11/10.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;5. Udi Dahan. &amp;quot;Avoid a Failed SOA - Business and Autonomous Components to the Rescue&amp;quot;.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.udidahan.com/"&gt;Udi&lt;/a&gt; to wielki autorytet w naszym małym świecie :-) Byłem przekonany, że pod względem merytorycznym nie mam się o co martwić i dowiem się rzeczy, o kt&amp;#243;rych nawet nie śniłem, na pewno bedzie pro. Było pro. Niestety tematyka sesji była dla mnie nieco &amp;quot;akademicka&amp;quot;. Rozumiem, że nie samym pisaniem kodu człowiek żyje, ale nie było nawet jednej linijki kodu :-( Udi potrafił nad jednym slajdem przegadać dobre 10 minut, mimo tego nie &amp;quot;lał wody&amp;quot;. Za przydatność informacji dałbym 5/10, za prezentację 10/10. Końcowa ocena: 7/10.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;6. Artur Paluszyński, &amp;quot;Interakcyjne sceny 3D w Windows Presentation Foundation&amp;quot;.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.artpal.pl/o-mnie/"&gt;Artur&lt;/a&gt; prezentował techniki 3D za pomocą WPF-a. Prezentacja dość spokojna, mimo to ciekawa. Wszystko o czym m&amp;#243;wił Artur uznawałem za godne uwagi. Zwracałem jednak uwagę na formę prezentacji &amp;quot;per Państwo&amp;quot;. Artur, jesteśmy na C2C, tu wszyscy jesteśmy kumplami po fachu! Końcowa ocena 9/10.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;7. Konferencja C2C 2009. Ocena końcowa.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Szkoda, że nie była bliżej Poznania :-)&amp;#160; - jednak z mojej strony dla organizatorow tego przedsięwzięcia - WIELKIE BRAWA. Kawał dobrej roboty. Zdecydowanie najlepsza tego typu impreza w kraju!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4443173340461901816-2043687887003047942?l=dariusztarczynski.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/AGQEKTrLOR5Q3BmG-K8XcHJWUqc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AGQEKTrLOR5Q3BmG-K8XcHJWUqc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/AGQEKTrLOR5Q3BmG-K8XcHJWUqc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AGQEKTrLOR5Q3BmG-K8XcHJWUqc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=yweZImdrP38:SAtM8P0WEeI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=yweZImdrP38:SAtM8P0WEeI:0VBWazUhMmc"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=0VBWazUhMmc" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=yweZImdrP38:SAtM8P0WEeI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?i=yweZImdrP38:SAtM8P0WEeI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DariuszTarczynski/~4/yweZImdrP38" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dariusztarczynski.blogspot.com/feeds/2043687887003047942/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4443173340461901816&amp;postID=2043687887003047942" title="Komentarze (6)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/2043687887003047942?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/2043687887003047942?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DariuszTarczynski/~3/yweZImdrP38/c2c-relacja.html" title="C2C &amp;#39;09 - relacja" /><author><name>Dariusz Tarczyński</name><uri>http://www.blogger.com/profile/10745468881018443121</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="30" height="32" src="http://3.bp.blogspot.com/__d4mtXXARcU/SQSySUGrjaI/AAAAAAAAAJY/Id00EDvvIqs/S220/avatarnowy.gif" /></author><thr:total>6</thr:total><feedburner:origLink>http://dariusztarczynski.blogspot.com/2009/03/c2c-relacja.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A04GSHw9eSp7ImA9WxVVGEQ.&quot;"><id>tag:blogger.com,1999:blog-4443173340461901816.post-1634271551437632719</id><published>2009-03-13T00:18:00.001+01:00</published><updated>2009-03-13T00:18:49.261+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-13T00:18:49.261+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="PG.NET" /><title>Po XVII spotkaniu PG.NET. Krótka relacja.</title><content type="html">&lt;p&gt;To już po 17 spotkaniu PG.NET, na kt&amp;#243;rej to gościliśmy Raymonda Lewallena, importowaną gwiazdę z za oceanu :-)&lt;/p&gt;  &lt;p&gt;Zajebiście ciekawa prezentacja o &lt;a href="http://en.wikipedia.org/wiki/Behavior_Driven_Development"&gt;BDD&lt;/a&gt;, ale przy okazji&amp;#160; - o mojej preferowanej metodologii - TDD. Występ Raymonda był bardzo udany. W spos&amp;#243;b bardzo zrozumiały przedstawił o co tak naprawdę chodzi w BDD. Wiele można poczytać o tym podejściu w &lt;a href="http://www.google.pl/search?q=behavior+driven+development&amp;amp;ie=utf-8&amp;amp;oe=utf-8&amp;amp;aq=t&amp;amp;rls=org.mozilla:pl:official&amp;amp;client=firefox-a"&gt;internecie&lt;/a&gt;, jednak dopiero Raymond troszkę zaraził mnię tym podejściem, wyjaśniając przy tym r&amp;#243;żne niuanse z tym związane.&lt;/p&gt;  &lt;p&gt;Spotkanie &amp;quot;w cztery oczy&amp;quot;, po spotkaniu, w restauracji na Starym Rynku r&amp;#243;wnież podniosło kilka ważnych spraw, często nie związanych z BDD :-) Osobiście jednak dostało mi się od Raymonda za (do tej pory tak myślałem) &amp;quot;rewolucyjne&amp;quot; podejście do uruchamiania task&amp;#243;w &lt;a href="http://cruisecontrol.sourceforge.net/"&gt;CruiseControl&lt;/a&gt;-a i innych &lt;a href="http://nant.sourceforge.net/"&gt;NAnt&amp;#243;w&lt;/a&gt;, i &lt;a href="http://msbuildtasks.tigris.org/"&gt;MSBuild&amp;#243;w&lt;/a&gt; z poziomu plik&amp;#243;w .bat :-( No c&amp;#243;ż, może rozwiązanie nie jest idealne, ale pracuję nad wersją 2.0 (powered by PowerShell) :-)&lt;/p&gt;  &lt;p&gt;Raymond obiecał wr&amp;#243;cić za rok. No to czekamy!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4443173340461901816-1634271551437632719?l=dariusztarczynski.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/0vr93TqlaGd3U5qDj1ML4xFGpYc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0vr93TqlaGd3U5qDj1ML4xFGpYc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/0vr93TqlaGd3U5qDj1ML4xFGpYc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0vr93TqlaGd3U5qDj1ML4xFGpYc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=adaqHQy6-rQ:4PZhuLlsqqk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=adaqHQy6-rQ:4PZhuLlsqqk:0VBWazUhMmc"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?d=0VBWazUhMmc" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DariuszTarczynski?a=adaqHQy6-rQ:4PZhuLlsqqk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DariuszTarczynski?i=adaqHQy6-rQ:4PZhuLlsqqk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DariuszTarczynski/~4/adaqHQy6-rQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://dariusztarczynski.blogspot.com/feeds/1634271551437632719/comments/default" title="Komentarze do posta" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4443173340461901816&amp;postID=1634271551437632719" title="Komentarze (0)" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/1634271551437632719?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4443173340461901816/posts/default/1634271551437632719?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DariuszTarczynski/~3/adaqHQy6-rQ/po-xvii-spotkaniu-pgnet-krotka-relacja.html" title="Po XVII spotkaniu PG.NET. Krótka relacja." /><author><name>Dariusz Tarczyński</name><uri>http://www.blogger.com/profile/10745468881018443121</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="30" height="32" src="http://3.bp.blogspot.com/__d4mtXXARcU/SQSySUGrjaI/AAAAAAAAAJY/Id00EDvvIqs/S220/avatarnowy.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://dariusztarczynski.blogspot.com/2009/03/po-xvii-spotkaniu-pgnet-krotka-relacja.html</feedburner:origLink></entry></feed>

