<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" version="2.0">
  <channel>
    <title>René Stein - .NET Framework</title>
    <link>http://blog.renestein.net/</link>
    <description>Názory vzešlé z mesaliance humanitní skepse a technologického optimismu</description>
    <image>
      <url>http://blog.renestein.net/themes/discreetBlogBlue/SpotImages/sfinga_rss.jpg</url>
      <title>René Stein - .NET Framework</title>
      <link>http://blog.renestein.net/</link>
    </image>
    <language>cs-CZ</language>
    <copyright>René Stein</copyright>
    <lastBuildDate>Tue, 28 Jun 2022 15:49:57 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 1.9.7174.0</generator>
    <managingEditor>rene@renestein.net</managingEditor>
    <webMaster>rene@renestein.net</webMaster>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=686b1337-1376-47da-94bb-2cdd6e96eac5</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,686b1337-1376-47da-94bb-2cdd6e96eac5.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.renestein.net/CommentView,guid,686b1337-1376-47da-94bb-2cdd6e96eac5.aspx</wfw:comment>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=686b1337-1376-47da-94bb-2cdd6e96eac5</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
V animovaném gifu je ukázka z jednoho příkladu, který jsem ukazoval minulý týden.<br /><a href="http://blog.renestein.net/content/binary/Open-Live-Writer/V-animovanm-gifu-je-ukz.---Komern-vsuvka_F973/c1%5B3%5D.gif"><img width="640" height="355" title="c1[3]" style="display: inline;" alt="c1[3]" src="http://blog.renestein.net/content/binary/Open-Live-Writer/V-animovanm-gifu-je-ukz.---Komern-vsuvka_F973/c1%5B3%5D_thumb.gif" /></a></p>
        <p>
Předpokládám, že se dá snadno poznat, čeho se příklad týká.<img width="16" height="16" alt="" src="https://static.xx.fbcdn.net/images/emoji.php/v9/ta5/1.5/16/1f642.png" /></p>
        <p>
A dávám to sem, protože mám vyřízeny všechny resty, které se týkají inhouse kurzů
objednaných v době covidové a přesunutých na lepší časy. Lepší časy sice kvůli válce
na Ukrajině nepřišly, ale přesto jsem stihnul za poslední 4 měsíce dokončit více kurzů
než za celé předchozí dva roky.
</p>
        <p>
A proto i tady píšu, že jestli jste ode mě poslední rok obdrželi email "inhouse kurzy
se prozatím objednat nedají a neřeknu vám přesný termín, kdy je zase bude možné objednat",
tak už tato informace neplatí.
</p>
        <p>
Příklad dole je napsán v C++ 20. A jestli jste se zaradovali, že v C++ 20 jsou coroutines,
ale pak jste zjistili, že ve standardní knihovně si "co_awaitování" moc neužijete,
ukážu vám svou knihovnu, kde jsou všechny typy potřebné pro psaní paralelizovaného
a asynchronního kódu.
</p>
        <p>
A jestli jste ještě třeba nepřešli z C++ 98 na C++ 11 (C++ 14, C++ 17) a potřebujete
do nové spletité syntaktické džungle průvodce, který vám proseká cestu k jednoduššímu
jazyku, který se za tím starým bordelem skrývá, můžeme se také domluvit.
</p>
        <p>
Objednat se dají samozřejmě ale i kurzy, kde hlavní roli hraje C# a třeba .NET 6. 
</p>
        <p>
A pokud nechcete řešit nějaké triviality, které si může člověk, který není líný, přečíst
a nastudovat v každém druhém tutorialu a přežvýkají vám je na každém školení, určitě
se domluvíme. <img width="16" height="16" alt="" src="https://static.xx.fbcdn.net/images/emoji.php/v9/ta5/1.5/16/1f642.png" /><img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=686b1337-1376-47da-94bb-2cdd6e96eac5" /></p>
      </body>
      <title>&amp;Scaron;kolen&amp;iacute; C++, C#, .NET, OOP je opět možn&amp;eacute; objednat</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,686b1337-1376-47da-94bb-2cdd6e96eac5.aspx</guid>
      <link>http://blog.renestein.net/Scaronkoleniacute+C+C+NET+OOP+Je+Op%c4%9bt+Mo%c5%beneacute+Objednat.aspx</link>
      <pubDate>Tue, 28 Jun 2022 15:49:57 GMT</pubDate>
      <description>&lt;p&gt;
V animovaném gifu je ukázka z jednoho příkladu, který jsem ukazoval minulý týden.&lt;br&gt;
&lt;a href="http://blog.renestein.net/content/binary/Open-Live-Writer/V-animovanm-gifu-je-ukz.---Komern-vsuvka_F973/c1%5B3%5D.gif"&gt;&lt;img width="640" height="355" title="c1[3]" style="display: inline;" alt="c1[3]" src="http://blog.renestein.net/content/binary/Open-Live-Writer/V-animovanm-gifu-je-ukz.---Komern-vsuvka_F973/c1%5B3%5D_thumb.gif"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Předpokládám, že se dá snadno poznat, čeho se příklad týká.&lt;img width="16" height="16" alt="" src="https://static.xx.fbcdn.net/images/emoji.php/v9/ta5/1.5/16/1f642.png"&gt;
&lt;p&gt;
A dávám to sem, protože mám vyřízeny všechny resty, které se týkají inhouse kurzů
objednaných v době covidové a přesunutých na lepší časy. Lepší časy sice kvůli válce
na Ukrajině nepřišly, ale přesto jsem stihnul za poslední 4 měsíce dokončit více kurzů
než za celé předchozí dva roky.&lt;p&gt;
A proto i tady píšu, že jestli jste ode mě poslední rok obdrželi email "inhouse kurzy
se prozatím objednat nedají a neřeknu vám přesný termín, kdy je zase bude možné objednat",
tak už tato informace neplatí.&lt;p&gt;
Příklad dole je napsán v C++ 20. A jestli jste se zaradovali, že v C++ 20 jsou coroutines,
ale pak jste zjistili, že ve standardní knihovně si "co_awaitování" moc neužijete,
ukážu vám svou knihovnu, kde jsou všechny typy potřebné pro psaní paralelizovaného
a asynchronního kódu.&lt;p&gt;
A jestli jste ještě třeba nepřešli z C++ 98 na C++ 11 (C++ 14, C++ 17) a potřebujete
do nové spletité syntaktické džungle průvodce, který vám proseká cestu k jednoduššímu
jazyku, který se za tím starým bordelem skrývá, můžeme se také domluvit.&lt;p&gt;
Objednat se dají samozřejmě ale i kurzy, kde hlavní roli hraje C# a třeba .NET 6. 
&lt;p&gt;
A pokud nechcete řešit nějaké triviality, které si může člověk, který není líný, přečíst
a nastudovat v každém druhém tutorialu a přežvýkají vám je na každém školení, určitě
se domluvíme. &lt;img width="16" height="16" alt="" src="https://static.xx.fbcdn.net/images/emoji.php/v9/ta5/1.5/16/1f642.png"&gt;&lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=686b1337-1376-47da-94bb-2cdd6e96eac5" /&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,686b1337-1376-47da-94bb-2cdd6e96eac5.aspx</comments>
      <category>.NET Framework</category>
      <category>C#</category>
      <category>C++</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=6ff2bdba-fb72-4a6d-ab81-4c830fd61b5b</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,6ff2bdba-fb72-4a6d-ab81-4c830fd61b5b.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.renestein.net/CommentView,guid,6ff2bdba-fb72-4a6d-ab81-4c830fd61b5b.aspx</wfw:comment>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=6ff2bdba-fb72-4a6d-ab81-4c830fd61b5b</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <em>TL;DR</em>
        </p>
        <p>
Jestli někdo chcete/potřebujete pracovat s HDO rozpisem, můžete použít mou novou .NET
Standard 2.0 knihovnu pro snadné získání rozpisu HDO (hromadné dálkové ovládání -
laicky řečeno, chcete znát a ve svém programu pracovat s časy, kdy je aktivní takzvaný
nízký tarif elektřiny). 
</p>
        <p>
Nyní se data stahují z ČEZu.
</p>
        <p>
          <a href="https://github.com/renestein/RStein.HDO?fbclid=IwAR0lBpMQIILj53sGuwnuJHX0g1xWpnMdXUBHlNutJF3Np3ayBKsjvhsW1IM">https://github.com/renestein/RStein.HDO</a>
        </p>
        <p>
          <em>Konec TL;DR</em>
        </p>
        <p>
          <img src="https://camo.githubusercontent.com/fd9cda273c4651e812c6df9d18fd323513ad532776af1c3f0b350a54487ca46d/68747470733a2f2f736e6970626f6172642e696f2f4775775158592e6a7067" />
          <em>
            <em>
              <em>
                <br />
              </em>
            </em>
          </em>
        </p>
        <p>
Nedávno jsem psal na FB o chytrých zásuvkách, které bych chtěl automaticky synchronizovat
s HDO rozpisem od ČEZu.
</p>
        <p>
Přes Velikonoce jsem pokročil a nyní už mi stačí u "chytré" zásuvky (chytrého zařízení):
</p>
        <p>
1) Po zakoupení a přidání zásuvky nastavit, že se řídí podle HDO rozpisu. Pokud takový
příznak nastaven není, v zásuvce můžete mít jakákoli jiná ručně zadaná pravidla pro
vypínání a zapínání zařízení a tato pravidla nebudou nikdy přepsána pravidly z HDO
rozpisu.
</p>
        <p>
2) Můj nový agent pro Smart Home pravidelně stáhne HDO data z Čezu, porovná stávající
pravidla v zásuvkách, u kterých je nastaveno, že se řídí HDO rozpisem, s pravidly
v HDO rozpisu u ČEZu, a jestliže se pravidla liší, změní pravidla v zásuvkách tak,
aby byla shodná s aktuálním ČEZ HDO rozpisem.
</p>
        <p>
Vedlejším výsledkem je .NET Standard 2.0 knihovna RStein.HDO, kterou jsem oddělil
od hlavního a neveřejného projektu, protože jsem si říkal, že knihovnu já a možná
i někdo jiný využijeme i pro jiné účely.
</p>
        <p>
Základní funkce:
</p>
        <p>
1) Stáhne data z ČEZu a vytvoří z nich rozpis (scheduli).
</p>
        <p>
2) Schedule může být cachována (doporučuju, aby nás ČEZ neblokl, stahovat data maximálně
jednou denně - rozpis HDO se zase tak často nemění).
</p>
        <p>
3) Schedule se snadno dotážete, jestli je HDO v daném čase aktivní.
</p>
        <p>
4) Kdyby vám nestačila vystavená strukturovaná data, dostanete se jednoduše i k nezpracovaným
původním JSON datům z ČEZu a k objektovému modelu, který jim odpovídá.
</p>
        <p>
Pár poznámek na závěr.
</p>
        <p>
1) Pull requesty pro jiné distributory elektřiny jsou vítány. 
</p>
        <p>
2) Paskvily v enumeraci CezRegion - např. CezRegion.stred (čeština, neidiomatické
malé písmeno na začátku názvu) jsou moje - název přesně odpovídá vyžadované reprezentaci
hodnoty ve stringu.
</p>
        <p>
3) Česko-anglické patvary v původním modelu (SAZBA, VALID_FROM) jsou dílem vývojářů
v ČEZu.
</p>
        <p>
A jeden jeden postřeh nakonec. GitHub actions pro CI/CD jsou mnohem lépe zdokumentovány
než Azure pipelines. I když si odmyslím dokumentaci, přijdou mi GitHub actions intuitivnější
a logičtější než Azure pipelines. Popularitu YAMLu ale stejně pořád nechápu.<img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=6ff2bdba-fb72-4a6d-ab81-4c830fd61b5b" /></p>
      </body>
      <title>Nov&amp;aacute; .NET Standard 2.0 knihovna RStein.HDO (Hromadn&amp;eacute; d&amp;aacute;lkov&amp;eacute; ovl&amp;aacute;d&amp;aacute;n&amp;iacute;).</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,6ff2bdba-fb72-4a6d-ab81-4c830fd61b5b.aspx</guid>
      <link>http://blog.renestein.net/Novaacute+NET+Standard+20+Knihovna+RSteinHDO+Hromadneacute+Daacutelkoveacute+Ovlaacutedaacuteniacute.aspx</link>
      <pubDate>Thu, 08 Apr 2021 06:47:07 GMT</pubDate>
      <description>&lt;p&gt;
&lt;em&gt;TL;DR&lt;/em&gt;
&lt;p&gt;
Jestli někdo chcete/potřebujete pracovat s HDO rozpisem, můžete použít mou novou .NET
Standard 2.0 knihovnu pro snadné získání rozpisu HDO (hromadné dálkové ovládání -
laicky řečeno, chcete znát a ve svém programu pracovat s časy, kdy je aktivní takzvaný
nízký tarif elektřiny). 
&lt;p&gt;
Nyní se data stahují z ČEZu.&lt;p&gt;
&lt;a href="https://github.com/renestein/RStein.HDO?fbclid=IwAR0lBpMQIILj53sGuwnuJHX0g1xWpnMdXUBHlNutJF3Np3ayBKsjvhsW1IM"&gt;https://github.com/renestein/RStein.HDO&lt;/a&gt;
&lt;p&gt;
&lt;em&gt;Konec TL;DR&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;img src="https://camo.githubusercontent.com/fd9cda273c4651e812c6df9d18fd323513ad532776af1c3f0b350a54487ca46d/68747470733a2f2f736e6970626f6172642e696f2f4775775158592e6a7067"&gt;&lt;em&gt;&lt;em&gt;&lt;em&gt;
&lt;br&gt;
&lt;/em&gt;&lt;/em&gt;&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
Nedávno jsem psal na FB o chytrých zásuvkách, které bych chtěl automaticky synchronizovat
s HDO rozpisem od ČEZu.&lt;p&gt;
Přes Velikonoce jsem pokročil a nyní už mi stačí u "chytré" zásuvky (chytrého zařízení):&lt;p&gt;
1) Po zakoupení a přidání zásuvky nastavit, že se řídí podle HDO rozpisu. Pokud takový
příznak nastaven není, v zásuvce můžete mít jakákoli jiná ručně zadaná pravidla pro
vypínání a zapínání zařízení a tato pravidla nebudou nikdy přepsána pravidly z HDO
rozpisu.&lt;p&gt;
2) Můj nový agent pro Smart Home pravidelně stáhne HDO data z Čezu, porovná stávající
pravidla v zásuvkách, u kterých je nastaveno, že se řídí HDO rozpisem, s pravidly
v HDO rozpisu u ČEZu, a jestliže se pravidla liší, změní pravidla v zásuvkách tak,
aby byla shodná s aktuálním ČEZ HDO rozpisem.&lt;p&gt;
Vedlejším výsledkem je .NET Standard 2.0 knihovna RStein.HDO, kterou jsem oddělil
od hlavního a neveřejného projektu, protože jsem si říkal, že knihovnu já a možná
i někdo jiný využijeme i pro jiné účely.&lt;p&gt;
Základní funkce:&lt;p&gt;
1) Stáhne data z ČEZu a vytvoří z nich rozpis (scheduli).&lt;p&gt;
2) Schedule může být cachována (doporučuju, aby nás ČEZ neblokl, stahovat data maximálně
jednou denně - rozpis HDO se zase tak často nemění).&lt;p&gt;
3) Schedule se snadno dotážete, jestli je HDO v daném čase aktivní.&lt;p&gt;
4) Kdyby vám nestačila vystavená strukturovaná data, dostanete se jednoduše i k nezpracovaným
původním JSON datům z ČEZu a k objektovému modelu, který jim odpovídá.&lt;p&gt;
Pár poznámek na závěr.&lt;p&gt;
1) Pull requesty pro jiné distributory elektřiny jsou vítány. 
&lt;p&gt;
2) Paskvily v enumeraci CezRegion - např. CezRegion.stred (čeština, neidiomatické
malé písmeno na začátku názvu) jsou moje - název přesně odpovídá vyžadované reprezentaci
hodnoty ve stringu.&lt;p&gt;
3) Česko-anglické patvary v původním modelu (SAZBA, VALID_FROM) jsou dílem vývojářů
v ČEZu.&lt;p&gt;
A jeden jeden postřeh nakonec. GitHub actions pro CI/CD jsou mnohem lépe zdokumentovány
než Azure pipelines. I když si odmyslím dokumentaci, přijdou mi GitHub actions intuitivnější
a logičtější než Azure pipelines. Popularitu YAMLu ale stejně pořád nechápu.&lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=6ff2bdba-fb72-4a6d-ab81-4c830fd61b5b" /&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,6ff2bdba-fb72-4a6d-ab81-4c830fd61b5b.aspx</comments>
      <category>.NET Framework</category>
      <category>C#</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=ffc2e5e3-87f1-4f53-9a2a-331171cc0ec4</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,ffc2e5e3-87f1-4f53-9a2a-331171cc0ec4.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.renestein.net/CommentView,guid,ffc2e5e3-87f1-4f53-9a2a-331171cc0ec4.aspx</wfw:comment>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=ffc2e5e3-87f1-4f53-9a2a-331171cc0ec4</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Rád bych vás pozval na svou přednášku, kterou pořádá WUG.
</p>
        <p>
Název přednášky: TPL - konkurenční, paralelní a asynchronní kód pro náročné.
</p>
        <h6>
          <font size="3">Datum konání: 2.10.2014 od 17:30 do 21:00</font>
        </h6>
        <p>
Místo konání: pobočka: <a href="http://wug.cz/praha/prednaskove-prostory/18-BB-centrum-budova-Alfa">BB
centrum, budova Alfa (Aquarius), Vyskočilova 1461/2a, Praha 4</a></p>
        <p>
Registrace na přednášku: <a href="http://wug.cz/praha/akce/597-TPL-konkurencni-paralelni-a-asynchronni-kod-pro-narocne">http://wug.cz/praha/akce/597-TPL-konkurencni-paralelni-a-asynchronni-kod-pro-narocne</a></p>
        <p>
Anotace přednášky:
</p>
        <p>
Znáte alespoň trochu Task Parallel Library a přednášek slibujících další nenáročný
„úvod do TPL“ jste už viděli dost? Myslíte si, že klíčová slova async/await v C# jsou
magií kompilátoru, jejíž kouzlo pro vás už navěky pominulo po zhlédnutí triviálních
a donekonečna opisovaných příkladů, jak zavolat asynchronně pár nudných webových služeb?
</p>
        <p>
Na přednášce probereme, jak rozšířit knihovnu TPL o další užitečné konstrukce i jak
odstranit některá omezení v současné verzi TPL. Podíváme se na různé způsoby psaní
konkurenčního, paralelního a asynchronního kódu. U konkurenčního kódu se zaměříme
(nejen) na aktory a porovnáme různé způsoby, jak můžeme aktory psát.
</p>
        <p>
Nezapomeňte s sebou vzít i kolegy, kteří hlásají, že každou nebezpečnou hlavu konkurenčního
kódu setne jeden pořádný „lock“, a to nejlépe rekurzivní, aby vás deadlock nebo livelock
ve firmě zabavil i o dlouhých zimních večerech.
</p>
        <img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=ffc2e5e3-87f1-4f53-9a2a-331171cc0ec4" />
      </body>
      <title>Veřejn&amp;aacute; předn&amp;aacute;&amp;scaron;ka pro WUG - TPL &amp;ndash; konkurenčn&amp;iacute;, paraleln&amp;iacute; a asynchronn&amp;iacute; k&amp;oacute;d pro n&amp;aacute;ročn&amp;eacute;.</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,ffc2e5e3-87f1-4f53-9a2a-331171cc0ec4.aspx</guid>
      <link>http://blog.renestein.net/Ve%c5%99ejnaacute+P%c5%99ednaacutescaronka+Pro+WUG+TPL+Ndash+Konkuren%c4%8dniacute+Paralelniacute+A+Asynchronniacute+Koacuted+Pro+Naacutero%c4%8dneacute.aspx</link>
      <pubDate>Tue, 19 Aug 2014 10:08:00 GMT</pubDate>
      <description>&lt;p&gt;
Rád bych vás pozval na svou přednášku, kterou pořádá WUG.&lt;p&gt;
Název přednášky: TPL - konkurenční, paralelní a asynchronní kód pro náročné.&lt;h6&gt;&lt;font size="3"&gt;Datum
konání: 2.10.2014 od 17:30 do 21:00&lt;/font&gt;
&lt;/h6&gt;
&lt;p&gt;
Místo konání: pobočka: &lt;a href="http://wug.cz/praha/prednaskove-prostory/18-BB-centrum-budova-Alfa"&gt;BB
centrum, budova Alfa (Aquarius), Vyskočilova 1461/2a, Praha 4&lt;/a&gt;
&lt;p&gt;
Registrace na přednášku: &lt;a href="http://wug.cz/praha/akce/597-TPL-konkurencni-paralelni-a-asynchronni-kod-pro-narocne"&gt;http://wug.cz/praha/akce/597-TPL-konkurencni-paralelni-a-asynchronni-kod-pro-narocne&lt;/a&gt;
&lt;p&gt;
Anotace přednášky:&lt;p&gt;
Znáte alespoň trochu Task Parallel Library a přednášek slibujících další nenáročný
„úvod do TPL“ jste už viděli dost? Myslíte si, že klíčová slova async/await v C# jsou
magií kompilátoru, jejíž kouzlo pro vás už navěky pominulo po zhlédnutí triviálních
a donekonečna opisovaných příkladů, jak zavolat asynchronně pár nudných webových služeb?&lt;p&gt;
Na přednášce probereme, jak rozšířit knihovnu TPL o další užitečné konstrukce i jak
odstranit některá omezení v současné verzi TPL. Podíváme se na různé způsoby psaní
konkurenčního, paralelního a asynchronního kódu. U konkurenčního kódu se zaměříme
(nejen) na aktory a porovnáme různé způsoby, jak můžeme aktory psát.&lt;p&gt;
Nezapomeňte s sebou vzít i kolegy, kteří hlásají, že každou nebezpečnou hlavu konkurenčního
kódu setne jeden pořádný „lock“, a to nejlépe rekurzivní, aby vás deadlock nebo livelock
ve firmě zabavil i o dlouhých zimních večerech.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=ffc2e5e3-87f1-4f53-9a2a-331171cc0ec4" /&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,ffc2e5e3-87f1-4f53-9a2a-331171cc0ec4.aspx</comments>
      <category>.NET Framework</category>
      <category>C#</category>
      <category>Návrhové vzory</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=10792dd8-6b85-49f8-bd87-b3a91dfa5b6f</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,10792dd8-6b85-49f8-bd87-b3a91dfa5b6f.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.renestein.net/CommentView,guid,10792dd8-6b85-49f8-bd87-b3a91dfa5b6f.aspx</wfw:comment>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=10792dd8-6b85-49f8-bd87-b3a91dfa5b6f</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
 
</p>
        <p>
Pro ty z vás, kdo jste se mě ptali na záznam přednášky z MS Festu, mám (snad dobrou)
zprávu. Záznam přednášky je od tohoto týdne dostupný na webu WUG.  O “snad dobré”
zprávě píšu proto, že jsme sám nenašel odvahu se na sebe podívat.<img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none" alt="Smile" src="http://blog.renestein.net/content/binary/Windows-Live-Writer/Zznam-pednky-z-MS-Festu-2012_6724/wlEmoticon-smile_2.png" /></p>
        <p>
          <a title="http://www.wug.cz/zaznamy/125-MS-Fest-2012-DI-v-NET-bez-pover-iluzi-a-frikulinskeho-nadseni" href="http://www.wug.cz/zaznamy/125-MS-Fest-2012-DI-v-NET-bez-pover-iluzi-a-frikulinskeho-nadseni">http://www.wug.cz/zaznamy/125-MS-Fest-2012-DI-v-NET-bez-pover-iluzi-a-frikulinskeho-nadseni</a>
        </p>
        <p>
          <a href="http://blog.renestein.net/Prezentace+Z+P%C5%99ednaacutescaronky+Na+MS+Festu+2012+DI+V+NET+Bez+Pov%C4%9Br+Iluziacute+A+Frikuliacutenskeacuteho+Nadscaroneniacute.aspx" target="_blank">Materiály
k přednášce.</a>
        </p>
        <img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=10792dd8-6b85-49f8-bd87-b3a91dfa5b6f" />
      </body>
      <title>Z&amp;aacute;znam předn&amp;aacute;&amp;scaron;ky z MS Festu 2012 -  Dependency injection v .NET bez pověr, iluz&amp;iacute; a frikul&amp;iacute;nsk&amp;eacute;ho nad&amp;scaron;en&amp;iacute;</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,10792dd8-6b85-49f8-bd87-b3a91dfa5b6f.aspx</guid>
      <link>http://blog.renestein.net/Zaacuteznam+P%c5%99ednaacutescaronky+Z+MS+Festu+2012+Dependency+Injection+V+NET+Bez+Pov%c4%9br+Iluziacute+A+Frikuliacutenskeacuteho+Nadscaroneniacute.aspx</link>
      <pubDate>Sat, 23 Mar 2013 06:25:46 GMT</pubDate>
      <description>&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Pro ty z vás, kdo jste se mě ptali na záznam přednášky z MS Festu, mám (snad dobrou)
zprávu. Záznam přednášky je od tohoto týdne dostupný na webu WUG.&amp;nbsp; O “snad dobré”
zprávě píšu proto, že jsme sám nenašel odvahu se na sebe podívat.&lt;img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none" alt="Smile" src="http://blog.renestein.net/content/binary/Windows-Live-Writer/Zznam-pednky-z-MS-Festu-2012_6724/wlEmoticon-smile_2.png"&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a title="http://www.wug.cz/zaznamy/125-MS-Fest-2012-DI-v-NET-bez-pover-iluzi-a-frikulinskeho-nadseni" href="http://www.wug.cz/zaznamy/125-MS-Fest-2012-DI-v-NET-bez-pover-iluzi-a-frikulinskeho-nadseni"&gt;http://www.wug.cz/zaznamy/125-MS-Fest-2012-DI-v-NET-bez-pover-iluzi-a-frikulinskeho-nadseni&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.renestein.net/Prezentace+Z+P%C5%99ednaacutescaronky+Na+MS+Festu+2012+DI+V+NET+Bez+Pov%C4%9Br+Iluziacute+A+Frikuliacutenskeacuteho+Nadscaroneniacute.aspx" target="_blank"&gt;Materiály
k přednášce.&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=10792dd8-6b85-49f8-bd87-b3a91dfa5b6f" /&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,10792dd8-6b85-49f8-bd87-b3a91dfa5b6f.aspx</comments>
      <category>.NET Framework</category>
      <category>C#</category>
      <category>Návrhové vzory</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=e8badc0b-2c3d-481c-ba17-9d89535bf19b</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,e8badc0b-2c3d-481c-ba17-9d89535bf19b.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.renestein.net/CommentView,guid,e8badc0b-2c3d-481c-ba17-9d89535bf19b.aspx</wfw:comment>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=e8badc0b-2c3d-481c-ba17-9d89535bf19b</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
 
</p>
        <p>
          <a href="http://www.vbnet.cz/blog--tomas.aspx" target="_blank">Tomáše Herceg</a> &amp;
comp. opět po roce uspořádali další ročník konference <a href="http://www.ms-fest.cz/" target="_blank">MS
Fest</a>. A musím hned dodat, že z mého pohledu velmi povedený <a href="http://www.ms-fest.cz/" target="_blank">MS
Fest</a>, jehož organizace nikde neskřípala a na kterém jsme se cítil příjemně. Tímto
organizátorům ještě jednou děkuju za skvělou organizaci konference a za veškerý servis,
který poskytovali účastníkům konference i přednášejícím.
</p>
        <p>
Na MS Festu jsme měl přednášku nazvanou Dependency injection v .Net Frameworku bez
pověr, iluzí a frikulínského nadšení. 
<br />
Sice jsem se jako každý rok po domluvě s organizátory na tématu přednášky dodatečně
zděsil, že na přednášku mám jen 60 minut, a těsně před konferencí se stovkami účastníků
jsme musel nahodit svůj přídavný a životní energii rychle spalující extrovertní pohon,
ale samotná přednáška probíhala <a href="http://blog.renestein.net/Prezentace+Z+MS+Festu+2011+A+Stru%C4%8Dnyacute+Komentaacute%C5%99.aspx" target="_blank">oproti
minulému roku</a> poklidně. Nemyslete si, já  teprve po minulém ročníku MS Festu
dovedu ocenit, jaké je to blaho,  když s vámi v půlce probíhající  přednášky
nezačne zuřivě diskutovat oponent z Nokie. <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blog.renestein.net/content/binary/Windows-Live-Writer/Prezentace-z-pednky-na-MS-festu-2012_AEAD/wlEmoticon-smile_2.png" /></p>
        <p>
Nabízel jsem <a href="https://plus.google.com/u/0/100048458679392044814/posts/3ZJsehWB6ts" target="_blank">tyto
přednášky</a>.
</p>
        <p>
Tomáš Herceg mi původně v programu navrhl dvě přednášky, ale já jsme měl čas jen na
přípravu jedné přednášky <strong>a vybral jsem tu, která dostala nejvíce hlasů.</strong></p>
        <div style="width: 400px">
          <blockquote class="twitter-tweetn" width="350">
            <p>
              <a href="https://twitter.com/search/%23msfest">#msfest</a> je dobra akce, ale chtelo
by to vice narocna temata, jako bylo SQL Internals
</p>
— Michal Těhník (@MicTech) <a href="https://twitter.com/MicTech/status/275212740405112832" data-datetime="2012-12-02T12:20:05+00:00">December
2, 2012</a></blockquote>
          <blockquote class="twitter-tweetn">
            <p>
@<a href="https://twitter.com/mictech">mictech</a> Pak je třeba pro ně hlasovat. @<a href="https://twitter.com/hercegtomas">hercegtomas</a> po
mně chtěl i nabídnutou přenášku "TPL pro (cont) <a title="http://tl.gd/k7743o" href="http://t.co/OvLERrAd">tl.gd/k7743o</a></p>
— Rene Stein (@renestein) <a href="https://twitter.com/renestein/status/275218348361531392" data-datetime="2012-12-02T12:42:22+00:00">December
2, 2012</a></blockquote>
          <blockquote class="twitter-tweetn" data-in-reply-to="275218348361531392">
            <p>
@<a href="https://twitter.com/renestein">renestein</a> @<a href="https://twitter.com/hercegtomas">hercegtomas</a> Hlasoval
jsem, ale evidetne patrim k minorite. <a href="https://twitter.com/search/%23msfest">#msfest</a></p>
— Michal Těhník (@MicTech) <a href="https://twitter.com/MicTech/status/275246332359360513" data-datetime="2012-12-02T14:33:34+00:00">December
2, 2012</a></blockquote>
        </div>
        <p>
Nevím, jaká je poptávka po pokročilejších/hard core přednáškách. Jak jsem psal na
Twitteru, sám bych raději přednášel o “Task parallel library  pro pokročilé”,
ještě raději o skrytých pokladech v <a href="http://blog.renestein.net/Hraacutetky+S+Reaktivniacutem+Frameworkem+RX+Extenze.aspx" target="_blank">RX
Frameworku</a>, ale RX si již dříve zamluvil Jarda Jírava. Bavilo by mě také přednášet
o <a href="http://blog.renestein.net/C%20Kontrola%20Existence%20Vlastnosti%20U%20Typu%20Dynamic%20Bez%20Vyvolaacuteniacute%20Vyacutejimky%20RuntimeBinderException.aspx" target="_blank">specialitkách
typu dynamic</a>, mohli bychom se pobavit o klíčových slovech async/await v netradičních
kontextech, nebo bychom mohli napsat dalšího hostitele .Net Frameworku. To je alespoň
malý výběr z témat, která mi jsou blízká, protože jsem podobné  vývojářské specialitky
řešil pro různé firmy u nás i v zahraničí. Nevím, jaká by ale byla po těchto tématech
na MS Festu poptávka, protože povídat si v potemnělé posluchárně jen pro sebe nebo
prezentovat pro maximálně deset dalších  lidí má své kouzlo, ale - při vší úctě
- intimní atmosféru mám raději s jinými než vývojářskými  kulisami a aktéry. <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blog.renestein.net/content/binary/Windows-Live-Writer/Prezentace-z-pednky-na-MS-festu-2012_AEAD/wlEmoticon-smile_2.png" /></p>
        <p>
Slíbená prezentace:<br /></p>
        <iframe style="border-bottom: #ccc 0px solid; border-left: #ccc 1px solid; margin-bottom: 5px; border-top: #ccc 1px solid; border-right: #ccc 1px solid" height="356" marginheight="0" src="http://www.slideshare.net/slideshow/embed_code/15464467" frameborder="0" width="427" marginwidth="0" scrolling="no" mozallowfullscreen="mozallowfullscreen" webkitallowfullscreen="webkitallowfullscreen" allowfullscreen="allowfullscreen">
        </iframe>
        <div style="margin-bottom: 5px">
          <strong>
            <a title="Depdendency injection v .Net Frameworku" href="http://www.slideshare.net/renestein1/depdendency-injection-v-net-frameworku" target="_blank">Dependency
injection v .Net Frameworku</a>
          </strong>from <strong><a href="http://www.slideshare.net/renestein1" target="_blank">René
Stein</a></strong></div>
        <p>
          <a href="https://bitbucket.org/renestein/rstein.msfest.cookbookf" target="_blank">Doprovodný
kód je na Bitbucketu:</a>
          <br />
        </p>
        <p>
Díky za to, že jste na mou přednášku přišli. A děkuju za hodnocení přednášky, moc
jste mě potěšili. <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blog.renestein.net/content/binary/Windows-Live-Writer/Prezentace-z-pednky-na-MS-festu-2012_AEAD/wlEmoticon-smile_2.png" /></p>
        <p>
 
</p>
        <p>
P .S. Ještě málá terminologická poznámka, proč používám slovo “kontajner”, a ne kontejner,
na což se mě ptal už Tomáš Herceg po zaslání anotace.<br /></p>
        <p>
          <em>Oficiálně [myšleno  - slovo kontajner žádný speciální význam] nemá – dokonce
myslím ÚJČ slovo kontajner ani neuznává.</em>
        </p>
        <p>
          <em>Viděl jsem, že se ale v ČR slovo kontajner docela vžilo a snažím se jeho použitím
odlišit od konotací „kontejneru“ – u kterého mnoho lidí vidí spojitost s odpadky.:)</em>
        </p>
        <p>
P. P. S. A ještě děkuju <a href="http://rarous.net/weblog/" target="_blank">Alešovi
Roubíčkovi</a> za to, že si ochotně pročetl mou prezentaci a upozornil mě na místa,
která by si zasloužila nějaké upřesnění.
</p>
        <p>
P.P.P.S. Mrzí mě jediná věc. Na svých přednáškách většinou nezvětšuju písmo, na této
přednášce jsem písmo ve Visual Studiu zvětšil přesně tak, jako to měl Tomáš Herceg
na první přednášce, a při výkladu mě dost mátlo, že na obrazovce je vidět málo kódu,
i když jsem měl z domova vyzkoušeno, že by kód měl být vidět bez problémů. Místo toho, 
abych VS přepnul na celou obrazovku, tak jsem skroloval a v duchu se divil, proč je
toho vidět tak málo. Takové momentální okno přednášejícího, který zapomněl, co udělal
s fontem o přestávce. A ještě – poté, co mi spadl mikrofon a já si jej znovu nasadil,
tak prý bylo slyšet hlavně v zadních řadách praskání a jiné pazvuky. Já jsem bohužel
nic neslyšel a nikdo z posluchačů neprotestoval.
</p>
        <img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=e8badc0b-2c3d-481c-ba17-9d89535bf19b" />
      </body>
      <title>Prezentace z předn&amp;aacute;&amp;scaron;ky na MS festu 2012 - DI v .NET bez pověr, iluz&amp;iacute; a frikul&amp;iacute;nsk&amp;eacute;ho nad&amp;scaron;en&amp;iacute;</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,e8badc0b-2c3d-481c-ba17-9d89535bf19b.aspx</guid>
      <link>http://blog.renestein.net/Prezentace+Z+P%c5%99ednaacutescaronky+Na+MS+Festu+2012+DI+V+NET+Bez+Pov%c4%9br+Iluziacute+A+Frikuliacutenskeacuteho+Nadscaroneniacute.aspx</link>
      <pubDate>Mon, 03 Dec 2012 12:25:14 GMT</pubDate>
      <description>&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.vbnet.cz/blog--tomas.aspx" target="_blank"&gt;Tomáše Herceg&lt;/a&gt; &amp;amp;
comp. opět po roce uspořádali další ročník konference &lt;a href="http://www.ms-fest.cz/" target="_blank"&gt;MS
Fest&lt;/a&gt;. A musím hned dodat, že z mého pohledu velmi povedený &lt;a href="http://www.ms-fest.cz/" target="_blank"&gt;MS
Fest&lt;/a&gt;, jehož organizace nikde neskřípala a na kterém jsme se cítil příjemně. Tímto
organizátorům ještě jednou děkuju za skvělou organizaci konference a za veškerý servis,
který poskytovali účastníkům konference i přednášejícím.
&lt;/p&gt;
&lt;p&gt;
Na MS Festu jsme měl přednášku nazvanou Dependency injection v .Net Frameworku bez
pověr, iluzí a frikulínského nadšení. 
&lt;br&gt;
Sice jsem se jako každý rok po domluvě s organizátory na tématu přednášky dodatečně
zděsil, že na přednášku mám jen 60 minut, a těsně před konferencí se stovkami účastníků
jsme musel nahodit svůj přídavný a životní energii rychle spalující extrovertní pohon,
ale samotná přednáška probíhala &lt;a href="http://blog.renestein.net/Prezentace+Z+MS+Festu+2011+A+Stru%C4%8Dnyacute+Komentaacute%C5%99.aspx" target="_blank"&gt;oproti
minulému roku&lt;/a&gt; poklidně. Nemyslete si, já&amp;nbsp; teprve po minulém ročníku MS Festu
dovedu ocenit, jaké je to blaho,&amp;nbsp; když s vámi v půlce probíhající&amp;nbsp; přednášky
nezačne zuřivě diskutovat oponent z Nokie. &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blog.renestein.net/content/binary/Windows-Live-Writer/Prezentace-z-pednky-na-MS-festu-2012_AEAD/wlEmoticon-smile_2.png"&gt;
&lt;/p&gt;
&lt;p&gt;
Nabízel jsem &lt;a href="https://plus.google.com/u/0/100048458679392044814/posts/3ZJsehWB6ts" target="_blank"&gt;tyto
přednášky&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Tomáš Herceg mi původně v programu navrhl dvě přednášky, ale já jsme měl čas jen na
přípravu jedné přednášky &lt;strong&gt;a vybral jsem tu, která dostala nejvíce hlasů.&lt;/strong&gt; 
&lt;/p&gt;
&lt;div style="width: 400px"&gt;
&lt;blockquote class="twitter-tweetn" width="350"&gt; 
&lt;p&gt;
&lt;a href="https://twitter.com/search/%23msfest"&gt;#msfest&lt;/a&gt; je dobra akce, ale chtelo
by to vice narocna temata, jako bylo SQL Internals
&lt;/p&gt;
— Michal Těhník (@MicTech) &lt;a href="https://twitter.com/MicTech/status/275212740405112832" data-datetime="2012-12-02T12:20:05+00:00"&gt;December
2, 2012&lt;/a&gt;&lt;/blockquote&gt; &lt;blockquote class="twitter-tweetn"&gt; 
&lt;p&gt;
@&lt;a href="https://twitter.com/mictech"&gt;mictech&lt;/a&gt; Pak je třeba pro ně hlasovat. @&lt;a href="https://twitter.com/hercegtomas"&gt;hercegtomas&lt;/a&gt; po
mně chtěl i nabídnutou přenášku "TPL pro (cont) &lt;a title="http://tl.gd/k7743o" href="http://t.co/OvLERrAd"&gt;tl.gd/k7743o&lt;/a&gt;
&lt;/p&gt;
— Rene Stein (@renestein) &lt;a href="https://twitter.com/renestein/status/275218348361531392" data-datetime="2012-12-02T12:42:22+00:00"&gt;December
2, 2012&lt;/a&gt;&lt;/blockquote&gt; &lt;blockquote class="twitter-tweetn" data-in-reply-to="275218348361531392"&gt; 
&lt;p&gt;
@&lt;a href="https://twitter.com/renestein"&gt;renestein&lt;/a&gt; @&lt;a href="https://twitter.com/hercegtomas"&gt;hercegtomas&lt;/a&gt; Hlasoval
jsem, ale evidetne patrim k minorite. &lt;a href="https://twitter.com/search/%23msfest"&gt;#msfest&lt;/a&gt;
&lt;/p&gt;
— Michal Těhník (@MicTech) &lt;a href="https://twitter.com/MicTech/status/275246332359360513" data-datetime="2012-12-02T14:33:34+00:00"&gt;December
2, 2012&lt;/a&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;p&gt;
Nevím, jaká je poptávka po pokročilejších/hard core přednáškách. Jak jsem psal na
Twitteru, sám bych raději přednášel o “Task parallel library&amp;nbsp; pro pokročilé”,
ještě raději o skrytých pokladech v &lt;a href="http://blog.renestein.net/Hraacutetky+S+Reaktivniacutem+Frameworkem+RX+Extenze.aspx" target="_blank"&gt;RX
Frameworku&lt;/a&gt;, ale RX si již dříve zamluvil Jarda Jírava. Bavilo by mě také přednášet
o &lt;a href="http://blog.renestein.net/C%20Kontrola%20Existence%20Vlastnosti%20U%20Typu%20Dynamic%20Bez%20Vyvolaacuteniacute%20Vyacutejimky%20RuntimeBinderException.aspx" target="_blank"&gt;specialitkách
typu dynamic&lt;/a&gt;, mohli bychom se pobavit o klíčových slovech async/await v netradičních
kontextech, nebo bychom mohli napsat dalšího hostitele .Net Frameworku. To je alespoň
malý výběr z témat, která mi jsou blízká, protože jsem podobné&amp;nbsp; vývojářské specialitky
řešil pro různé firmy u nás i v zahraničí. Nevím, jaká by ale byla po těchto tématech
na MS Festu poptávka, protože povídat si v potemnělé posluchárně jen pro sebe nebo
prezentovat pro maximálně deset dalších&amp;nbsp; lidí má své kouzlo, ale - při vší úctě
- intimní atmosféru mám raději s jinými než vývojářskými&amp;nbsp; kulisami a aktéry. &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blog.renestein.net/content/binary/Windows-Live-Writer/Prezentace-z-pednky-na-MS-festu-2012_AEAD/wlEmoticon-smile_2.png"&gt;
&lt;/p&gt;
&lt;p&gt;
Slíbená prezentace:&lt;br&gt;
&lt;/p&gt;
&lt;iframe style="border-bottom: #ccc 0px solid; border-left: #ccc 1px solid; margin-bottom: 5px; border-top: #ccc 1px solid; border-right: #ccc 1px solid" height="356" marginheight="0" src="http://www.slideshare.net/slideshow/embed_code/15464467" frameborder="0" width="427" marginwidth="0" scrolling="no" mozallowfullscreen webkitallowfullscreen allowfullscreen&gt;
&lt;/iframe&gt;
&lt;div style="margin-bottom: 5px"&gt;&lt;strong&gt;&lt;a title="Depdendency injection v .Net Frameworku" href="http://www.slideshare.net/renestein1/depdendency-injection-v-net-frameworku" target="_blank"&gt;Dependency
injection v .Net Frameworku&lt;/a&gt; &lt;/strong&gt;from &lt;strong&gt;&lt;a href="http://www.slideshare.net/renestein1" target="_blank"&gt;René
Stein&lt;/a&gt;&lt;/strong&gt; 
&lt;/div&gt;
&lt;p&gt;
&lt;a href="https://bitbucket.org/renestein/rstein.msfest.cookbookf" target="_blank"&gt;Doprovodný
kód je na Bitbucketu:&lt;/a&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
Díky za to, že jste na mou přednášku přišli. A děkuju za hodnocení přednášky, moc
jste mě potěšili. &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blog.renestein.net/content/binary/Windows-Live-Writer/Prezentace-z-pednky-na-MS-festu-2012_AEAD/wlEmoticon-smile_2.png"&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
P .S. Ještě málá terminologická poznámka, proč používám slovo “kontajner”, a ne kontejner,
na což se mě ptal už Tomáš Herceg po zaslání anotace.&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Oficiálně [myšleno&amp;nbsp; - slovo kontajner žádný speciální význam] nemá – dokonce
myslím ÚJČ slovo kontajner ani neuznává.&lt;/em&gt; 
&lt;p&gt;
&lt;em&gt;Viděl jsem, že se ale v ČR slovo kontajner docela vžilo a snažím se jeho použitím
odlišit od konotací „kontejneru“ – u kterého mnoho lidí vidí spojitost s odpadky.:)&lt;/em&gt; 
&lt;p&gt;
P. P. S. A ještě děkuju &lt;a href="http://rarous.net/weblog/" target="_blank"&gt;Alešovi
Roubíčkovi&lt;/a&gt; za to, že si ochotně pročetl mou prezentaci a upozornil mě na místa,
která by si zasloužila nějaké upřesnění.
&lt;/p&gt;
&lt;p&gt;
P.P.P.S. Mrzí mě jediná věc. Na svých přednáškách většinou nezvětšuju písmo, na této
přednášce jsem písmo ve Visual Studiu zvětšil přesně tak, jako to měl Tomáš Herceg
na první přednášce, a při výkladu mě dost mátlo, že na obrazovce je vidět málo kódu,
i když jsem měl z domova vyzkoušeno, že by kód měl být vidět bez problémů. Místo toho,&amp;nbsp;
abych VS přepnul na celou obrazovku, tak jsem skroloval a v duchu se divil, proč je
toho vidět tak málo. Takové momentální okno přednášejícího, který zapomněl, co udělal
s fontem o přestávce. A ještě – poté, co mi spadl mikrofon a já si jej znovu nasadil,
tak prý bylo slyšet hlavně v zadních řadách praskání a jiné pazvuky. Já jsem bohužel
nic neslyšel a nikdo z posluchačů neprotestoval.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=e8badc0b-2c3d-481c-ba17-9d89535bf19b" /&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,e8badc0b-2c3d-481c-ba17-9d89535bf19b.aspx</comments>
      <category>.NET Framework</category>
      <category>C#</category>
      <category>Entity Framework</category>
      <category>Návrhové vzory</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=b5f8610e-3243-4c83-b55f-a5f50f883aad</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,b5f8610e-3243-4c83-b55f-a5f50f883aad.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.renestein.net/CommentView,guid,b5f8610e-3243-4c83-b55f-a5f50f883aad.aspx</wfw:comment>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=b5f8610e-3243-4c83-b55f-a5f50f883aad</wfw:commentRss>
      <slash:comments>11</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
 
</p>
        <p>
Jestliže používáte i přes <a href="http://blog.renestein.net/Entity+Framework+43+Code+First+Nechutnyacute+Probleacutem+S+TPC+Mapovaacuteniacutem.aspx">jeho
nezralost</a> Entity Framework, nebo jste si zvolili jiné ORM, které zvládá “lazy
loading”, neboli zpožděné, či chcete-li dodatečné nahrání dat do typových kolekcí,
možná jste přemýšleli, jak byste stejnou  službu napsali ve starší aplikaci,
která žádné ORM nepoužívá, nebo v hybridní aplikaci, pod kterou si představuju aplikaci,
jejíž starší moduly ORM nepoužívají, ale novější moduly již s přístupem přes ORM počítají.
I bez ORM byste ale často v aplikaci rádi využívali některé vychytávky, které s sebou
přináší ORM. Dnes chci ukázat, že zpožděné nahrávání kolekcí není žádná magie, která
by bez ORM byla v aplikaci zapovězena. Když budete mít zájem, můžeme v dalších článcích
probrat například i automatickou detekci změn vlastností na objektech a s tím související
ukládání objektů i odvolávání proběhlých změn, jestliže zákazník nechce změny uložit
a třeba na formuláři stiskne po deseti minutách zuřivé editace objektu a po několika
masivních business transakcích, které pozmění desítky objektů najednou, tlačítko Storno.
</p>
        <p>
Co si představit pod zpožděným nahráním  objektů v kolekci? Můžeme vyjít z již
zlidovělé třídy Objednávka (Order), která má kolekci svých položek (kolekce Items).
Místo nahrání všech položek objednávky z databáze ihned po vytvoření instance objednávky,
odložíme nahrání položek až na dobu, kdy budou v aplikaci poprvé potřeba. Před klienty
třídy Order ale tuto optimalizaci skrýváme tak, že kolekci Items naplníme položkami
teprve při prvním přístupu ke kolekci přes veřejné rozhraní třídy Order.
</p>
        <script src="https://gist.github.com/2020641.js">
        </script>
        <p>
Jde sice o triviální kód, kdy v get akcesoru kontrolujeme bool příznak m_itemsIsLoaded
(byly položky nahrány?) a při prvním přístupu ke kolekci zavoláme metodu loadItems,
ale představte si, že tento kód u starší aplikace zběsile doplňujete ke každé kolekci
v každé třídě, kde teď stojíte o zpožděné nahrávání. Čitelnost kódu je citelně snížena
a chrabří obhájci principu jedné odpovědnosti třídy (SRP) právě dopisují Kladivo na
heretiky <a href="http://en.wikipedia.org/wiki/SOLID_(object-oriented_design)">S.O.L.I.D</a>ní
víry pravé a připravují v zájmu lepší veřejné vývojářské morálky autodafé účtu dotyčného
vývojáře na všech významných sociálních sítích.
</p>
        <p>
Můžeme se rozhodnout, že nebudeme zatěžovat zpožděným nahráváním kolekcí přímo třídu
Objednávka, ale že vytvoříme proxy třídu, do které odpovědnost za tuto “infrastrukturní
službu” vložíme. Proxy objekt je, jak známo, objekt, který má z hlediska klienta stejné
rozhraní jako původní objekt a klient si není vědom, že pracuje s instancí zástupce
(surogátem) třídy Order, a ne s originální třídou Order. 
</p>
        <p>
Samotná třída Objednávka není nijak zatěžována znalostí, že její kolekce Items je
nahrána až při prvním přístupu ke kolekci. Zpožděné nahrávání zvládne ale potomek
třídy Order, třída OrderProxy, ve které je podobný kód, který se původně nacházel
v objednávce. A protože platí, že potomek nějaké třídy může být v aplikaci používán
na všech místech, kde je očekáván předek, můžeme například z repozitáře/identitní
mapy objektů začít ihned vydávat klientům instance OrderProxy místo originální třídy
Order.
</p>
        <script src="https://gist.github.com/2020775.js">
        </script>
        <p>
Odpovědnosti už jsme rozdělili lépe, protože třída Order není zatěžována zpožděným
nahráváním kolekce a jediným důvodem existence třídy OrderProxy je právě zpožděné
nahrávání. Přesto stále platí, že budeme do úmoru psát další a další třídy Proxy,
u nichž  jediná kreativní vývojářská činnost spočívá v pojmenování bool proměnné,
která nám sděluje, jestli kolekce byla, nebo nebyla nahrána. Je možné si práci zjednodušit
tím, že například vytvoříme T4 šablonu, která proxy třídy vygeneruje, ale my se dnes
zaměříme na to, jak vytvořit proxy třídu, aniž bychom museli psát proxy ručně nebo
spoléhat na T4 šablony.<br /><br />
Použijeme takzvanou dynamickou proxy, kterou si lze představit jako nástroj, kterému
řekneme, co má proxy dělat, a on pro každou třídu bez ohledu na unikátní rozhraní
každé třídy sám vygeneruje proxy, která pro tuto třídu implementuje námi vyžadované
chování. Slovo “dynamická” u proxy vyjadřuje hlavně to, že jde o proxy generovanou
automaticky za běhu aplikace! V našem konkrétním scénáři se zpožděným nahráváním objektů
vytvoříme i pro aplikaci, která má v business vrstvě stovky i  tisíce tříd jen
jednu další třídu, která představuje “deskriptor” pro každou proxy zajišťující 
zpožděné nahrávání kolekcí, přičemž platí, že tento “deskriptor“  bude schopen
obsloužit všechny kolekce ve všech třídách. Sice se pro každou třídu vytvoří unikátní
proxy (potomek originální třídy), ale tato proxy se bude odkazovat na obecný scénář
zpožděného nahrávání v našem “deskriptoru”. Při čtení dalších částí článku mějte na
paměti, že kód dělá stále to samé, jako námi vytvořená třída OrderProxy výše, jen
jsme kód zobecnili tak, abychom si dokázali vynutit zpožděné nahrávání kolekcí ve
všech třídách. Vedlejším a nepříjemným důsledkem tohoto zobecnění, jak je tomu asi
u každé abstrakce,  je samozřejmě snížená schopnost jen po letmém prolétnutí
infrastrukturního kódu očima poznat, oč přesně usilujeme. Výhodou však bude to, že
náš deskriptor oddálí zmiňované autodafé vývojáře už jen tím, že dodržuje princip <a href="http://en.wikipedia.org/wiki/Don't_repeat_yourself">DRY-Don't
repeat yourself</a> – místo psaní jen mírně obměněného kódu v každé konkrétní proxy
jednorázově vyjádříme náš záměr zpožděně nahrávat kolekce v “deskriptoru” pro generování
dynamické proxy.
</p>
        <p>
Mějme třídy Customer, Order a OrderItem. Zajímá nás hlavně to, že třída Customer má
kolekci objednávek a třída Order kolekci položek objednávky. Pro všechny kolekce chceme
doplnit zpožděné nahrání kolekcí.<br />
Všimněte si také toho, že vlastnosti s kolekcemi jsou virtuální. Stále platí, že dynamická
proxy je potomkem naší třídy a musí být schopna přepsat implementaci a doplnit kód
pro zpožděné nahrání kolekce stejně, jako jsme přepisovali get akcesor u “manuální”
proxy výše.
</p>
        <script src="https://gist.github.com/2020853.js">
        </script>
        <p>
I když je mnohem zábavnější napsat si podporu pro dynamicky generované proxy sám,
ne vždy bychom měli vynalézat na projektu kolo, zvláště když jsme v časovém presu 
a navíc pod drábovou knutou nudných projektových manažerů surově lámajících naše vývojářská
křídla <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blog.renestein.net/content/binary/Windows-Live-Writer/1b979a3deb47_7BE6/wlEmoticon-smile_2.png" /> ,
a alespoň v tomto článku použijeme výborný a ověřený nástroj pro generování dynamických
proxy z <a href="http://www.castleproject.org/">projektu Castle</a>. Nejjednodušší
způsob přidání knihovny pro generování dynamických proxy spočívá v instalaci přes <a href="http://nuget.codeplex.com/">NuGet</a>.
V Powershell konzoli ve Visual studiu zadejte příkaz.
</p>
        <script src="https://gist.github.com/2020893.js">
        </script>
        <p>
Vytvoření dynamické proxy v Castlu je kupodivu otázkou napsání  jednoho řádku
kódu. My služby Castlu zapouzdříme do naší vlastní třídy ProxyEngine. 
</p>
        <script src="https://gist.github.com/2020959.js">
        </script>
        <p>
Do konstruktoru třídy ProxyEngine dostáváme instanci třídy SimpleObjectFactory, kterou
si můžete prozatím zjednodušeně představit jako velmi jednoduchou generickou továrnu
na výrobu business objektů, která zároveň funguje jako identitní mapa. Její kompletní
výpis naleznete níže v tomto článku.
</p>
        <p>
Hlavní je pro nás metoda AddDefaultProxy, která dostává jako první argument typ, pro
který má být vytvořena proxy. Tedy předáte-li typový deskriptor objednávky, metoda
by měla vyrobit OrderProxy. Druhým argumentem jsou argumenty, které mají být předány
konstruktoru naší třídy. Jestliže objednávka vyžaduje v konstruktoru odkaz na své
id, vygenerovaná proxy třída garantuje, že jí id bude do konstruktoru předáno.
</p>
        <p>
Teď přichází zajímavá část – vytvoření proxy: 
</p>
        <script src="https://gist.github.com/2020977.js">
        </script>
        <p>
Proměnná <em>m_proxyGenerator </em>je instancí třídy <em>ProxyEngine </em>z Castlu,
která představuje výkonné jádro pro generování proxy. Prvním argumentem metody proxyGenerator.CreateClassProxy
je typ, pro který chceme proxy vytvořit. Druhý argument typu ProxyGenerationOptions
jsou různé volby, které dovolují jemně řídit, jak se bude vytvořená proxy chovat.
My zatím potřebujeme jen sdělit, které metody originální (ne proxy) třídy chceme v
proxy “přepsat”. Proto jsou ProxyGenerationOptions inicializovány hned v konstruktoru
třídy ProxyEngine a je jim předána instance třídy ProxyGenerationHook, která, jak
ihned ve výpise uvidíme, vybírá kolekce, u kterých má být podporováno zpožděné nahrání
objektů.
</p>
        <script src="https://gist.github.com/2021032.js">
        </script>
        <p>
Rozhraní IProxyGenerationHook je rozhraní Castlu. Metoda ShouldInterceptMethod z tohoto
rozhraní je metoda, kterou Castle používá k rozhodnutí, jaké metody a vlastnosti mají
být “přepsány” v dynamické proxy. Třída ProxyGenerationHook v metodě ShouldInterceptMethod
říká  - tedy vrací true - , že chceme zachytit všechny get akcesory <em>( methodInfo.IsSpecialName&amp;&amp;
methodInfo.Name.StartsWith(GET_METHOD_NAME_PREFIX</em>), jejichž návratovou hodnotou
je kolekce. Přesněji řečeno každá kolekce podporující generické rozhraní ICollection&lt;T&gt;
(methodInfo.ReturnType.GetInterface(COLLECTION_NAME) != null). Jiných metod ani vlastností
si v tomto článku u tříd  nevšímáme, a proto pro ně z metody ShouldInterceptMethod
vrátíme false. Zajímavou metodou v rozhraní IProxyGenerationHook je i metoda NonVirtualMemberNotification,
pomocí níž nás Castle informuje, že v originální třídě je nevirtuální metoda – my
metodu NonVirtualMemberNotification nevyužíváme, ale mohli bychom do ní snadno doplnit
kód, který vyhodí výjimku, jestliže jste Castlem notifikováni, že existuje nevirtuální
vlastnost vracející ICollection&lt;T&gt;, protože vaše firemní konvence vyžadují,
aby všechny kolekce podporovaly zpožděné nahrávání kolekce.<br /><br />
Nyní jsme již Castlu sdělili, že máme zájem “přepsat” get akcesory kolekcí, ale stále
Castle neví,  jakou logiku má do těchto get akcesorů doplnit. Vraťme se k metodě
CreateClassProxy. Třetí argument je zřejmý, předáváme argumenty, se kterými má být
zavolán konstruktor naší originální třídy. Posledním argumentem metody CreateClassProxy
je objekt, který nás zajímá nejvíce – jedná se o tzv. interceptora, který bude použit
vždy, když je na proxy použita  metoda/vlastnost, kterou chceme “přepsat”. Stále
píšeme obecné řešení zpožděného nahrávání kolekcí, a proto metodě CreateClassProxy
předáme interceptora s výmluvným názvem LazyLoadInterceptor. LazyLoadInterceptor je
ten “zázračný” typ, který jsem výše popisoval jako obecný deskriptor funkcí, které
musí podporovat dynamická proxy pro instanci z každé třídy v business vrstvě.
</p>
        <p>
Náš <em>LazyLoadInterceptor</em>, stejně jako každý jiný interceptor, musí podporovat
rozhraní  <em>IInterceptor</em> z Castlu. Rozhraní <em>IInterceptor </em>má jedinou
metodu Intercept, kterou Castle zavolá vždy, když je volána metoda/vlastnost, kterou
chceme “přepsat”.
</p>
        <script src="https://gist.github.com/2021104.js">
        </script>
        <p>
Metodě Intercept je předán objekt Invocation, který nese základní informace o volané
metodě.Kromě dalších vlastností je vhodné si zapamatovat, že v invocation.Method naleznete
objekt MethodInfo  (deskriptor metody) a  v InvocationTarget zase konkrétní
instanci, na které je metoda volána<em>. <strong>Zdůrazním, že touto konkrétní instancí
je v našem případě (dynamický) proxy objekt, ne instance originální třídy.</strong></em></p>
        <p>
          <strong>Zkusme si scénář v metodě Intercept projít. Mějme na paměti, že i když ten
kód může vypadat na první pohled děsivě, neřeší nic jiného než ručně napsaná proxy
výše. Zkusme se v našem popisu pro názornost zaměřit na konkrétní proxy objektu reprezentujícího
zákazníka Josefa Nováka v momentě, kdy je poprvé přistoupeno k jeho kolekci Orders
(seznam objednávek), i když kód v <em>LazyLoadInterceptoru </em>funguje analogicky
ve všech dalších proxy business tříd v systému.</strong>
        </p>
        <ul>
          <li>
Metoda <em>Intercept </em>nejprve na předaném objektu <em>invocation </em>volá metodu <em>Proceed</em>. 
Metoda Proceed vyvolá get akcesor originálního objektu a návratovou hodnotu (při prvním
volání prázdnou typovou kolekci objednávek) nalezneme ve vlastnosti invocation.ReturnValue.
Proč voláme nejprve invocation.Proceed? Protože potřebujeme v interceptoru kolekci,
do které u zákazníka můžeme nahrát objednávky, a tuto kolekci stále spravuje instance
originální třídy, jak si můžete ověřit ve výpisu třídy Customer.<br /></li>
          <li>
Jestliže se nejedná o první volání metody, nic neděláme, protože kolekce už musí být
naplněna. V proměnné m_inspectedMethods máme názvy vlastností, které jsme již u daného
objektu zpracovali.<br /></li>
          <li>
Jestliže invocation.ReturnValue je null, opět nic dalšího neděláme. Nemáme žádnou
kolekci, do které bychom mohli nahrát objednávky. 
<br /></li>
          <li>
Do kolekce m_inspectedMethods přidáme název aktuální vlastnosti (Orders), protože
jsme ji již začali zpracovávat.<br /><em>m_inspectedMethods.Add(invocation.Method.Name);<br /><br /></em></li>
          <li>
Nejprve potřebujeme zjistit, z jaké třídy pocházejí objekty,  které budeme do
kolekce, jejíž data nahráváme, přidávat. U objektu zákazník a kolekce Orders půjde
samozřejmě o objekty z třídy Objednávka.<br /><em>Type collectionItemType = invocation.Method.ReturnType.GetInterface(COLLECTION_INTERFACE_NAME).GetGenericArguments()[0];<br /></em></li>
          <li>
Dohledáme třídu z databázové vrstvy, která nám bude schopna vrátit seznam objednávek
pro daného zákazníka.<br /><em>Object dbComponent = findDbComponent(collectionItemType);<br /></em>Pro účely článku je zvolena jednoduchá jmenná konvence -  rozhraní pro přístup
k databázi se jmenují vždy I&lt;Název třídy&gt;DbComponent. Pro objednávku tedy hledáme
typ IOrderDbComponent. Pokud db komponentu nenalezneme, nic dalšího nemůžeme dělat.<br /></li>
          <li>
V nalezené db komponentě musíme najít metodu, která nám vrátí záznamy pro všechny
objednávky zákazníka Josefa Nováka.  
<br /><em>MethodInfo methodInfo = getDbCollectionMethodInfo(dbComponent, invocation.TargetType,
collectionItemType);<br /></em>Opět je zvolená jmenná konvence, kdy metoda má tvar Get{TypeInCollection}RecordsBy{ParentType}Id"
a přijímá jeden argument typu int . V našem scénáři hledáme tedy na db komponentě
metodu GetOrderRecordsByCustomerId, která přijímá id “rodičovského” zákazníka. <em>V
dalších článcích bych rád ukázal, jak se bez této i dalších dále zmíněných jmenných
konvence obejdeme a budeme moci nakonfigurovat zpožděné nahrávání kolekcí přes jakkoli
nazvané třídy a metody.<br /></em>Stejně jako v předchozím bodě platí, že nenalezneme-li vyhovující metodu, nic
dalšího nemůžeme dělat.<br /></li>
          <li>
            <em>
            </em>Dále u objektu zákazník získáme hodnotu vlastnosti Id, kterou potřebujeme
pro vyvolání metody na db komponentě nalezené v předchozím odstavci<br /><em>  int? objectId = getTargetObjectId(invocation.InvocationTarget);<br /></em></li>
          <li>
Zavoláme metodu GetOrderRecordsByCustomerId. Návratovou hodnotou je objekt DataTable,
který v našem scénáři obsahuje záznamy všech objednávek patřících Josefu Novákovi.<br /><em>DataTable retValues = methodInfo.Invoke(dbComponent, new object[] {objectId})
as DataTable;<br /></em></li>
          <li>
Přes pomocnou třídu SimpleObjectFactory, kterou LazyLoadInterceptor vyžaduje v konstruktoru,
vytvoříme <strong>proxy </strong>objekty Objednávek a přidáme je do kolekce Orders
zákazníka.<br /><em>var targetCollection = invocation.ReturnValue;<br />
addItemsToCollection(targetCollection, collectionItemType, retValues, invocation);<br /></em>Navíc se u každé vytvořené objednávky pokusíme nastavit odkaz na  “rodičovského
zákazníka”, přesněji řečeno na <strong>proxy </strong>zákazníka. Opět je zvolena jmenná
konvence, kdy objekt Order musí obsahovat vlastnost nazvanou Customer, jinak k nastavení
“rodiče” nejde. Jak jsem již psal výše, v dalších článcích bychom si měli ukázat,
jak tyto výchozí jmenné konvence rozšíříme a dovolíme i jejich úplné nahrazení.<br /></li>
          <li>
Hotovo, kolekce Orders u zákazníka Josefa Nováka je naplněna proxy objekty třídy Order
a stejný scénář proběhne i při přístupu ke kolekci Items (položky objednávky) u každé
objednávky.</li>
        </ul>
        <p>
Nyní můžeme vyzkoušet, jestli jsou proxy třídy generovány a hlavně jestli naše úsilí
nebylo marné a proxy třídy podporují zpožděné nahrávání kolekce.
</p>
        <script src="https://gist.github.com/2021321.js">
        </script>
        <p>
 
</p>
        <p>
          <a href="http://blog.renestein.net/content/binary/Windows-Live-Writer/1b979a3deb47_7BE6/consoleProxy_4.png">
            <img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="consoleProxy" border="0" alt="consoleProxy" src="http://blog.renestein.net/content/binary/Windows-Live-Writer/1b979a3deb47_7BE6/consoleProxy_thumb_1.png" width="644" height="322" />
          </a>
        </p>
        <p>
Výsledkem by měl být tento výpis, ze kterého je patrné :<br /></p>
        <ul>
          <li>
Místo originální třídy jsou používány proxy třídy. 
</li>
          <li>
Kolekce jsou naplněny, i když ve třídách Customer ani Order žádný kód pro nahrání
kolekce nemáme. 
</li>
          <li>
Je naplněna kolekce Orders u zákazníka i kolekce Items u každé objednávky.</li>
        </ul>
        <p>
Následuje slibovaný výpis generické třídy SimpleObjectFactory.  
</p>
        <p>
Třída SimpleObjectFactory podporuje rozhraní SimpleObjectFactory a při vydání objektu:
</p>
        <ol>
          <li>
Funguje jako identitní mapa, takže každý objekt je nahrán jen jednou (nyní per process,
což se dá snadno změnit).<br /></li>
          <li>
Používá záměrně služby “zastaralé” db vrstvy pro nahrání dat každého objektu – vytváření
objektů ale deleguje na ProxyEngine.<br /></li>
          <li>
Pokusí se nastavit hodnoty jednoduchých vlastností u vytvořených proxy objektů – jestliže
se název vlastnosti shoduje s názvem sloupce v datovém zdroji, je vlastnost objektu
nastavena na hodnotu sloupečku, která je uložena v řádku  vytaženém z databáze.</li>
        </ol>
        <script src="https://gist.github.com/2021356.js">
        </script>
        <p>
Co můžeme udělat dále v dalších článcích, jestliže budete mít zájem:
</p>
        <ol>
          <li>
Nebudeme spoléhat na jmenné konvence při plnění kolekci a “rodičovských” vlastností,
ale dovolíme nakonfigurovat interceptora tak, abychom mohli spravovat asociace mezi
třídami podle konvencí unikátních pro každý projekt, a přitom abychom nemuseli do
těchto nízkoúrovňových proxy služeb moc zasahovat. Konfiguraci provedeme nejlépe pomocí
fluentního API.<br /></li>
          <li>
LazyLoadInterceptor nebude používat stále dokola reflexi pro dohledání typů a metod,
ale bude nalezené hodnoty cachovat.<br /></li>
          <li>
            <em>Budeme schopni podpořit i zpožděné nahrávání “rodičovských” vlastností. Prozatím
je “rodičovská” vlastnost nastavena jen při nahrání kolekce – když vytáhnete z databáze
jako první objednávku a sáhnete na její vlastnost Customer, vlastnost vám nyní vrátí
null!<br /></em>
          </li>
          <li>
Mohli bychom rozšířit proxy třídy o sledování změn vlastností a umožnit u každého
objektu uložení změn nebo vrácení změn (undo).<br /></li>
          <li>
Zavedeme repozitáře (Repository), které i v hybridní aplikaci sjednotí ve vyšších
vrstvách aplikace přístup k objektům, které jsou nahrány přes ORM i k objektům vytaženým
z našich stávajících “old school” db/business služeb.<br /></li>
          <li>
Místo toho, abychom generovali dynamické proxy vždy po startu aplikace, umoříme jednorázově
(pro většinu aplikací stejně zanedbatelnou) režii spojenou s tímto postupem vygenerováním
a uložením assembly s dynamickými proxy při prvním spuštění nové verze aplikace. Při
dalším spuštění aplikace se již použijí proxy ve vygenerované assembly.</li>
        </ol>
        <p>
Pro dnešek toho bylo ale myslím dost. Snad jen dodám, že jsem se v tomto článku chtěl
vyhnout různým buzzwordům, ale fajnšmekrům potvrdím, co asi sami tuší, že jsme v tomto
článku zavítali do hájemství <a href="http://en.wikipedia.org/wiki/Aspect-oriented_programming">AOP
- aspektově orientovaného programování</a>.
</p>
        <p>
Celý projekt si <a href="https://bitbucket.org/renestein/rstein.misc/src">můžete stáhnout</a>,
nejlépe přes Mercurial (hg). Součástí zdrojových kódů je i jednoduchá třída napodobující
rozhraní tradičních “db komponent” pro přístup do databáze a zpřístupňující data v
Datasetu. 
</p>
        <script src="https://gist.github.com/2021422.js">
        </script>
        <img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=b5f8610e-3243-4c83-b55f-a5f50f883aad" />
      </body>
      <title>Lazy loading (zpožděn&amp;eacute; nahr&amp;aacute;v&amp;aacute;n&amp;iacute;) objektů do kolekce i ve star&amp;scaron;&amp;iacute; aplikaci s využit&amp;iacute;m dynamick&amp;eacute; proxy</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,b5f8610e-3243-4c83-b55f-a5f50f883aad.aspx</guid>
      <link>http://blog.renestein.net/Lazy+Loading+Zpo%c5%bed%c4%9bneacute+Nahraacutevaacuteniacute+Objekt%c5%af+Do+Kolekce+I+Ve+Starscaroniacute+Aplikaci+S+Vyu%c5%beitiacutem+Dynamickeacute+Proxy.aspx</link>
      <pubDate>Mon, 12 Mar 2012 13:06:49 GMT</pubDate>
      <description>&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Jestliže používáte i přes &lt;a href="http://blog.renestein.net/Entity+Framework+43+Code+First+Nechutnyacute+Probleacutem+S+TPC+Mapovaacuteniacutem.aspx"&gt;jeho
nezralost&lt;/a&gt; Entity Framework, nebo jste si zvolili jiné ORM, které zvládá “lazy
loading”, neboli zpožděné, či chcete-li dodatečné nahrání dat do typových kolekcí,
možná jste přemýšleli, jak byste stejnou&amp;nbsp; službu napsali ve starší aplikaci,
která žádné ORM nepoužívá, nebo v hybridní aplikaci, pod kterou si představuju aplikaci,
jejíž starší moduly ORM nepoužívají, ale novější moduly již s přístupem přes ORM počítají.
I bez ORM byste ale často v aplikaci rádi využívali některé vychytávky, které s sebou
přináší ORM. Dnes chci ukázat, že zpožděné nahrávání kolekcí není žádná magie, která
by bez ORM byla v aplikaci zapovězena. Když budete mít zájem, můžeme v dalších článcích
probrat například i automatickou detekci změn vlastností na objektech a s tím související
ukládání objektů i odvolávání proběhlých změn, jestliže zákazník nechce změny uložit
a třeba na formuláři stiskne po deseti minutách zuřivé editace objektu a po několika
masivních business transakcích, které pozmění desítky objektů najednou, tlačítko Storno.
&lt;/p&gt;
&lt;p&gt;
Co si představit pod zpožděným nahráním&amp;nbsp; objektů v kolekci? Můžeme vyjít z již
zlidovělé třídy Objednávka (Order), která má kolekci svých položek (kolekce Items).
Místo nahrání všech položek objednávky z databáze ihned po vytvoření instance objednávky,
odložíme nahrání položek až na dobu, kdy budou v aplikaci poprvé potřeba. Před klienty
třídy Order ale tuto optimalizaci skrýváme tak, že kolekci Items naplníme položkami
teprve při prvním přístupu ke kolekci přes veřejné rozhraní třídy Order.
&lt;/p&gt;
&lt;script src="https://gist.github.com/2020641.js"&gt; &lt;/script&gt;
&lt;p&gt;
Jde sice o triviální kód, kdy v get akcesoru kontrolujeme bool příznak m_itemsIsLoaded
(byly položky nahrány?) a při prvním přístupu ke kolekci zavoláme metodu loadItems,
ale představte si, že tento kód u starší aplikace zběsile doplňujete ke každé kolekci
v každé třídě, kde teď stojíte o zpožděné nahrávání. Čitelnost kódu je citelně snížena
a chrabří obhájci principu jedné odpovědnosti třídy (SRP) právě dopisují Kladivo na
heretiky &lt;a href="http://en.wikipedia.org/wiki/SOLID_(object-oriented_design)"&gt;S.O.L.I.D&lt;/a&gt;ní
víry pravé a připravují v zájmu lepší veřejné vývojářské morálky autodafé účtu dotyčného
vývojáře na všech významných sociálních sítích.
&lt;/p&gt;
&lt;p&gt;
Můžeme se rozhodnout, že nebudeme zatěžovat zpožděným nahráváním kolekcí přímo třídu
Objednávka, ale že vytvoříme proxy třídu, do které odpovědnost za tuto “infrastrukturní
službu” vložíme. Proxy objekt je, jak známo, objekt, který má z hlediska klienta stejné
rozhraní jako původní objekt a klient si není vědom, že pracuje s instancí zástupce
(surogátem) třídy Order, a ne s originální třídou Order. 
&lt;/p&gt;
&lt;p&gt;
Samotná třída Objednávka není nijak zatěžována znalostí, že její kolekce Items je
nahrána až při prvním přístupu ke kolekci. Zpožděné nahrávání zvládne ale potomek
třídy Order, třída OrderProxy, ve které je podobný kód, který se původně nacházel
v objednávce. A protože platí, že potomek nějaké třídy může být v aplikaci používán
na všech místech, kde je očekáván předek, můžeme například z repozitáře/identitní
mapy objektů začít ihned vydávat klientům instance OrderProxy místo originální třídy
Order.
&lt;/p&gt;
&lt;script src="https://gist.github.com/2020775.js"&gt; &lt;/script&gt;
&lt;p&gt;
Odpovědnosti už jsme rozdělili lépe, protože třída Order není zatěžována zpožděným
nahráváním kolekce a jediným důvodem existence třídy OrderProxy je právě zpožděné
nahrávání. Přesto stále platí, že budeme do úmoru psát další a další třídy Proxy,
u nichž&amp;nbsp; jediná kreativní vývojářská činnost spočívá v pojmenování bool proměnné,
která nám sděluje, jestli kolekce byla, nebo nebyla nahrána. Je možné si práci zjednodušit
tím, že například vytvoříme T4 šablonu, která proxy třídy vygeneruje, ale my se dnes
zaměříme na to, jak vytvořit proxy třídu, aniž bychom museli psát proxy ručně nebo
spoléhat na T4 šablony.&lt;br&gt;
&lt;br&gt;
Použijeme takzvanou dynamickou proxy, kterou si lze představit jako nástroj, kterému
řekneme, co má proxy dělat, a on pro každou třídu bez ohledu na unikátní rozhraní
každé třídy sám vygeneruje proxy, která pro tuto třídu implementuje námi vyžadované
chování. Slovo “dynamická” u proxy vyjadřuje hlavně to, že jde o proxy generovanou
automaticky za běhu aplikace! V našem konkrétním scénáři se zpožděným nahráváním objektů
vytvoříme i pro aplikaci, která má v business vrstvě stovky i&amp;nbsp; tisíce tříd jen
jednu další třídu, která představuje “deskriptor” pro každou proxy zajišťující&amp;nbsp;
zpožděné nahrávání kolekcí, přičemž platí, že tento “deskriptor“&amp;nbsp; bude schopen
obsloužit všechny kolekce ve všech třídách. Sice se pro každou třídu vytvoří unikátní
proxy (potomek originální třídy), ale tato proxy se bude odkazovat na obecný scénář
zpožděného nahrávání v našem “deskriptoru”. Při čtení dalších částí článku mějte na
paměti, že kód dělá stále to samé, jako námi vytvořená třída OrderProxy výše, jen
jsme kód zobecnili tak, abychom si dokázali vynutit zpožděné nahrávání kolekcí ve
všech třídách. Vedlejším a nepříjemným důsledkem tohoto zobecnění, jak je tomu asi
u každé abstrakce,&amp;nbsp; je samozřejmě snížená schopnost jen po letmém prolétnutí
infrastrukturního kódu očima poznat, oč přesně usilujeme. Výhodou však bude to, že
náš deskriptor oddálí zmiňované autodafé vývojáře už jen tím, že dodržuje princip &lt;a href="http://en.wikipedia.org/wiki/Don't_repeat_yourself"&gt;DRY-Don't
repeat yourself&lt;/a&gt; – místo psaní jen mírně obměněného kódu v každé konkrétní proxy
jednorázově vyjádříme náš záměr zpožděně nahrávat kolekce v “deskriptoru” pro generování
dynamické proxy.
&lt;/p&gt;
&lt;p&gt;
Mějme třídy Customer, Order a OrderItem. Zajímá nás hlavně to, že třída Customer má
kolekci objednávek a třída Order kolekci položek objednávky. Pro všechny kolekce chceme
doplnit zpožděné nahrání kolekcí.&lt;br&gt;
Všimněte si také toho, že vlastnosti s kolekcemi jsou virtuální. Stále platí, že dynamická
proxy je potomkem naší třídy a musí být schopna přepsat implementaci a doplnit kód
pro zpožděné nahrání kolekce stejně, jako jsme přepisovali get akcesor u “manuální”
proxy výše.
&lt;/p&gt;
&lt;script src="https://gist.github.com/2020853.js"&gt; &lt;/script&gt;
&lt;p&gt;
I když je mnohem zábavnější napsat si podporu pro dynamicky generované proxy sám,
ne vždy bychom měli vynalézat na projektu kolo, zvláště když jsme v časovém presu&amp;nbsp;
a navíc pod drábovou knutou nudných projektových manažerů surově lámajících naše vývojářská
křídla &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blog.renestein.net/content/binary/Windows-Live-Writer/1b979a3deb47_7BE6/wlEmoticon-smile_2.png"&gt; ,
a alespoň v tomto článku použijeme výborný a ověřený nástroj pro generování dynamických
proxy z &lt;a href="http://www.castleproject.org/"&gt;projektu Castle&lt;/a&gt;. Nejjednodušší
způsob přidání knihovny pro generování dynamických proxy spočívá v instalaci přes &lt;a href="http://nuget.codeplex.com/"&gt;NuGet&lt;/a&gt;.
V Powershell konzoli ve Visual studiu zadejte příkaz.
&lt;/p&gt;
&lt;script src="https://gist.github.com/2020893.js"&gt; &lt;/script&gt;
&lt;p&gt;
Vytvoření dynamické proxy v Castlu je kupodivu otázkou napsání&amp;nbsp; jednoho řádku
kódu. My služby Castlu zapouzdříme do naší vlastní třídy ProxyEngine. 
&lt;/p&gt;
&lt;script src="https://gist.github.com/2020959.js"&gt; &lt;/script&gt;
&lt;p&gt;
Do konstruktoru třídy ProxyEngine dostáváme instanci třídy SimpleObjectFactory, kterou
si můžete prozatím zjednodušeně představit jako velmi jednoduchou generickou továrnu
na výrobu business objektů, která zároveň funguje jako identitní mapa. Její kompletní
výpis naleznete níže v tomto článku.
&lt;/p&gt;
&lt;p&gt;
Hlavní je pro nás metoda AddDefaultProxy, která dostává jako první argument typ, pro
který má být vytvořena proxy. Tedy předáte-li typový deskriptor objednávky, metoda
by měla vyrobit OrderProxy. Druhým argumentem jsou argumenty, které mají být předány
konstruktoru naší třídy. Jestliže objednávka vyžaduje v konstruktoru odkaz na své
id, vygenerovaná proxy třída garantuje, že jí id bude do konstruktoru předáno.
&lt;/p&gt;
&lt;p&gt;
Teď přichází zajímavá část – vytvoření proxy: 
&lt;/p&gt;
&lt;script src="https://gist.github.com/2020977.js"&gt; &lt;/script&gt;
&lt;p&gt;
Proměnná &lt;em&gt;m_proxyGenerator &lt;/em&gt;je instancí třídy &lt;em&gt;ProxyEngine &lt;/em&gt;z Castlu,
která představuje výkonné jádro pro generování proxy. Prvním argumentem metody proxyGenerator.CreateClassProxy
je typ, pro který chceme proxy vytvořit. Druhý argument typu ProxyGenerationOptions
jsou různé volby, které dovolují jemně řídit, jak se bude vytvořená proxy chovat.
My zatím potřebujeme jen sdělit, které metody originální (ne proxy) třídy chceme v
proxy “přepsat”. Proto jsou ProxyGenerationOptions inicializovány hned v konstruktoru
třídy ProxyEngine a je jim předána instance třídy ProxyGenerationHook, která, jak
ihned ve výpise uvidíme, vybírá kolekce, u kterých má být podporováno zpožděné nahrání
objektů.
&lt;/p&gt;
&lt;script src="https://gist.github.com/2021032.js"&gt; &lt;/script&gt;
&lt;p&gt;
Rozhraní IProxyGenerationHook je rozhraní Castlu. Metoda ShouldInterceptMethod z tohoto
rozhraní je metoda, kterou Castle používá k rozhodnutí, jaké metody a vlastnosti mají
být “přepsány” v dynamické proxy. Třída ProxyGenerationHook v metodě ShouldInterceptMethod
říká&amp;nbsp; - tedy vrací true - , že chceme zachytit všechny get akcesory &lt;em&gt;( methodInfo.IsSpecialName&amp;amp;&amp;amp;
methodInfo.Name.StartsWith(GET_METHOD_NAME_PREFIX&lt;/em&gt;), jejichž návratovou hodnotou
je kolekce. Přesněji řečeno každá kolekce podporující generické rozhraní ICollection&amp;lt;T&amp;gt;
(methodInfo.ReturnType.GetInterface(COLLECTION_NAME) != null). Jiných metod ani vlastností
si v tomto článku u tříd&amp;nbsp; nevšímáme, a proto pro ně z metody ShouldInterceptMethod
vrátíme false. Zajímavou metodou v rozhraní IProxyGenerationHook je i metoda NonVirtualMemberNotification,
pomocí níž nás Castle informuje, že v originální třídě je nevirtuální metoda – my
metodu NonVirtualMemberNotification nevyužíváme, ale mohli bychom do ní snadno doplnit
kód, který vyhodí výjimku, jestliže jste Castlem notifikováni, že existuje nevirtuální
vlastnost vracející ICollection&amp;lt;T&amp;gt;, protože vaše firemní konvence vyžadují,
aby všechny kolekce podporovaly zpožděné nahrávání kolekce.&lt;br&gt;
&lt;br&gt;
Nyní jsme již Castlu sdělili, že máme zájem “přepsat” get akcesory kolekcí, ale stále
Castle neví,&amp;nbsp; jakou logiku má do těchto get akcesorů doplnit. Vraťme se k metodě
CreateClassProxy. Třetí argument je zřejmý, předáváme argumenty, se kterými má být
zavolán konstruktor naší originální třídy. Posledním argumentem metody CreateClassProxy
je objekt, který nás zajímá nejvíce – jedná se o tzv. interceptora, který bude použit
vždy, když je na proxy použita&amp;nbsp; metoda/vlastnost, kterou chceme “přepsat”. Stále
píšeme obecné řešení zpožděného nahrávání kolekcí, a proto metodě CreateClassProxy
předáme interceptora s výmluvným názvem LazyLoadInterceptor. LazyLoadInterceptor je
ten “zázračný” typ, který jsem výše popisoval jako obecný deskriptor funkcí, které
musí podporovat dynamická proxy pro instanci z každé třídy v business vrstvě.
&lt;/p&gt;
&lt;p&gt;
Náš &lt;em&gt;LazyLoadInterceptor&lt;/em&gt;, stejně jako každý jiný interceptor, musí podporovat
rozhraní&amp;nbsp; &lt;em&gt;IInterceptor&lt;/em&gt; z Castlu. Rozhraní &lt;em&gt;IInterceptor &lt;/em&gt;má jedinou
metodu Intercept, kterou Castle zavolá vždy, když je volána metoda/vlastnost, kterou
chceme “přepsat”.
&lt;/p&gt;
&lt;script src="https://gist.github.com/2021104.js"&gt; &lt;/script&gt;
&lt;p&gt;
Metodě Intercept je předán objekt Invocation, který nese základní informace o volané
metodě.Kromě dalších vlastností je vhodné si zapamatovat, že v invocation.Method naleznete
objekt MethodInfo&amp;nbsp; (deskriptor metody) a&amp;nbsp; v InvocationTarget zase konkrétní
instanci, na které je metoda volána&lt;em&gt;. &lt;strong&gt;Zdůrazním, že touto konkrétní instancí
je v našem případě (dynamický) proxy objekt, ne instance originální třídy.&lt;/strong&gt;&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Zkusme si scénář v metodě Intercept projít. Mějme na paměti, že i když ten
kód může vypadat na první pohled děsivě, neřeší nic jiného než ručně napsaná proxy
výše. Zkusme se v našem popisu pro názornost zaměřit na konkrétní proxy objektu reprezentujícího
zákazníka Josefa Nováka v momentě, kdy je poprvé přistoupeno k jeho kolekci Orders
(seznam objednávek), i když kód v &lt;em&gt;LazyLoadInterceptoru &lt;/em&gt;funguje analogicky
ve všech dalších proxy business tříd v systému.&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Metoda &lt;em&gt;Intercept &lt;/em&gt;nejprve na předaném objektu &lt;em&gt;invocation &lt;/em&gt;volá metodu &lt;em&gt;Proceed&lt;/em&gt;.&amp;nbsp;
Metoda Proceed vyvolá get akcesor originálního objektu a návratovou hodnotu (při prvním
volání prázdnou typovou kolekci objednávek) nalezneme ve vlastnosti invocation.ReturnValue.
Proč voláme nejprve invocation.Proceed? Protože potřebujeme v interceptoru kolekci,
do které u zákazníka můžeme nahrát objednávky, a tuto kolekci stále spravuje instance
originální třídy, jak si můžete ověřit ve výpisu třídy Customer.&lt;br&gt;
&lt;li&gt;
Jestliže se nejedná o první volání metody, nic neděláme, protože kolekce už musí být
naplněna. V proměnné m_inspectedMethods máme názvy vlastností, které jsme již u daného
objektu zpracovali.&lt;br&gt;
&lt;li&gt;
Jestliže invocation.ReturnValue je null, opět nic dalšího neděláme. Nemáme žádnou
kolekci, do které bychom mohli nahrát objednávky. 
&lt;br&gt;
&lt;li&gt;
Do kolekce m_inspectedMethods přidáme název aktuální vlastnosti (Orders), protože
jsme ji již začali zpracovávat.&lt;br&gt;
&lt;em&gt;m_inspectedMethods.Add(invocation.Method.Name);&lt;br&gt;
&lt;br&gt;
&lt;/em&gt; 
&lt;li&gt;
Nejprve potřebujeme zjistit, z jaké třídy pocházejí objekty,&amp;nbsp; které budeme do
kolekce, jejíž data nahráváme, přidávat. U objektu zákazník a kolekce Orders půjde
samozřejmě o objekty z třídy Objednávka.&lt;br&gt;
&lt;em&gt;Type collectionItemType = invocation.Method.ReturnType.GetInterface(COLLECTION_INTERFACE_NAME).GetGenericArguments()[0];&lt;br&gt;
&lt;/em&gt; 
&lt;li&gt;
Dohledáme třídu z databázové vrstvy, která nám bude schopna vrátit seznam objednávek
pro daného zákazníka.&lt;br&gt;
&lt;em&gt;Object dbComponent = findDbComponent(collectionItemType);&lt;br&gt;
&lt;/em&gt;Pro účely článku je zvolena jednoduchá jmenná konvence -&amp;nbsp; rozhraní pro přístup
k databázi se jmenují vždy I&amp;lt;Název třídy&amp;gt;DbComponent. Pro objednávku tedy hledáme
typ IOrderDbComponent. Pokud db komponentu nenalezneme, nic dalšího nemůžeme dělat.&lt;br&gt;
&lt;li&gt;
V nalezené db komponentě musíme najít metodu, která nám vrátí záznamy pro všechny
objednávky zákazníka Josefa Nováka.&amp;nbsp; 
&lt;br&gt;
&lt;em&gt;MethodInfo methodInfo = getDbCollectionMethodInfo(dbComponent, invocation.TargetType,
collectionItemType);&lt;br&gt;
&lt;/em&gt;Opět je zvolená jmenná konvence, kdy metoda má tvar Get{TypeInCollection}RecordsBy{ParentType}Id"
a přijímá jeden argument typu int . V našem scénáři hledáme tedy na db komponentě
metodu GetOrderRecordsByCustomerId, která přijímá id “rodičovského” zákazníka. &lt;em&gt;V
dalších článcích bych rád ukázal, jak se bez této i dalších dále zmíněných jmenných
konvence obejdeme a budeme moci nakonfigurovat zpožděné nahrávání kolekcí přes jakkoli
nazvané třídy a metody.&lt;br&gt;
&lt;/em&gt;Stejně jako v předchozím bodě platí, že nenalezneme-li vyhovující metodu, nic
dalšího nemůžeme dělat.&lt;br&gt;
&lt;li&gt;
&lt;em&gt;&lt;/em&gt;Dále u objektu zákazník získáme hodnotu vlastnosti Id, kterou potřebujeme
pro vyvolání metody na db komponentě nalezené v předchozím odstavci&lt;br&gt;
&lt;em&gt;&amp;nbsp; int? objectId = getTargetObjectId(invocation.InvocationTarget);&lt;br&gt;
&lt;/em&gt; 
&lt;li&gt;
Zavoláme metodu GetOrderRecordsByCustomerId. Návratovou hodnotou je objekt DataTable,
který v našem scénáři obsahuje záznamy všech objednávek patřících Josefu Novákovi.&lt;br&gt;
&lt;em&gt;DataTable retValues = methodInfo.Invoke(dbComponent, new object[] {objectId})
as DataTable;&lt;br&gt;
&lt;/em&gt; 
&lt;li&gt;
Přes pomocnou třídu SimpleObjectFactory, kterou LazyLoadInterceptor vyžaduje v konstruktoru,
vytvoříme &lt;strong&gt;proxy &lt;/strong&gt;objekty Objednávek a přidáme je do kolekce Orders
zákazníka.&lt;br&gt;
&lt;em&gt;var targetCollection = invocation.ReturnValue;&lt;br&gt;
addItemsToCollection(targetCollection, collectionItemType, retValues, invocation);&lt;br&gt;
&lt;/em&gt;Navíc se u každé vytvořené objednávky pokusíme nastavit odkaz na&amp;nbsp; “rodičovského
zákazníka”, přesněji řečeno na &lt;strong&gt;proxy &lt;/strong&gt;zákazníka. Opět je zvolena jmenná
konvence, kdy objekt Order musí obsahovat vlastnost nazvanou Customer, jinak k nastavení
“rodiče” nejde. Jak jsem již psal výše, v dalších článcích bychom si měli ukázat,
jak tyto výchozí jmenné konvence rozšíříme a dovolíme i jejich úplné nahrazení.&lt;br&gt;
&lt;li&gt;
Hotovo, kolekce Orders u zákazníka Josefa Nováka je naplněna proxy objekty třídy Order
a stejný scénář proběhne i při přístupu ke kolekci Items (položky objednávky) u každé
objednávky.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Nyní můžeme vyzkoušet, jestli jsou proxy třídy generovány a hlavně jestli naše úsilí
nebylo marné a proxy třídy podporují zpožděné nahrávání kolekce.
&lt;/p&gt;
&lt;script src="https://gist.github.com/2021321.js"&gt; &lt;/script&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.renestein.net/content/binary/Windows-Live-Writer/1b979a3deb47_7BE6/consoleProxy_4.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="consoleProxy" border="0" alt="consoleProxy" src="http://blog.renestein.net/content/binary/Windows-Live-Writer/1b979a3deb47_7BE6/consoleProxy_thumb_1.png" width="644" height="322"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Výsledkem by měl být tento výpis, ze kterého je patrné :&lt;br&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Místo originální třídy jsou používány proxy třídy. 
&lt;li&gt;
Kolekce jsou naplněny, i když ve třídách Customer ani Order žádný kód pro nahrání
kolekce nemáme. 
&lt;li&gt;
Je naplněna kolekce Orders u zákazníka i kolekce Items u každé objednávky.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Následuje slibovaný výpis generické třídy SimpleObjectFactory.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Třída SimpleObjectFactory podporuje rozhraní SimpleObjectFactory a při vydání objektu:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Funguje jako identitní mapa, takže každý objekt je nahrán jen jednou (nyní per process,
což se dá snadno změnit).&lt;br&gt;
&lt;li&gt;
Používá záměrně služby “zastaralé” db vrstvy pro nahrání dat každého objektu – vytváření
objektů ale deleguje na ProxyEngine.&lt;br&gt;
&lt;li&gt;
Pokusí se nastavit hodnoty jednoduchých vlastností u vytvořených proxy objektů – jestliže
se název vlastnosti shoduje s názvem sloupce v datovém zdroji, je vlastnost objektu
nastavena na hodnotu sloupečku, která je uložena v řádku&amp;nbsp; vytaženém z databáze.&lt;/li&gt;
&lt;/ol&gt;
&lt;script src="https://gist.github.com/2021356.js"&gt; &lt;/script&gt;
&lt;p&gt;
Co můžeme udělat dále v dalších článcích, jestliže budete mít zájem:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Nebudeme spoléhat na jmenné konvence při plnění kolekci a “rodičovských” vlastností,
ale dovolíme nakonfigurovat interceptora tak, abychom mohli spravovat asociace mezi
třídami podle konvencí unikátních pro každý projekt, a přitom abychom nemuseli do
těchto nízkoúrovňových proxy služeb moc zasahovat. Konfiguraci provedeme nejlépe pomocí
fluentního API.&lt;br&gt;
&lt;li&gt;
LazyLoadInterceptor nebude používat stále dokola reflexi pro dohledání typů a metod,
ale bude nalezené hodnoty cachovat.&lt;br&gt;
&lt;li&gt;
&lt;em&gt;Budeme schopni podpořit i zpožděné nahrávání “rodičovských” vlastností. Prozatím
je “rodičovská” vlastnost nastavena jen při nahrání kolekce – když vytáhnete z databáze
jako první objednávku a sáhnete na její vlastnost Customer, vlastnost vám nyní vrátí
null!&lt;br&gt;
&lt;/em&gt; 
&lt;li&gt;
Mohli bychom rozšířit proxy třídy o sledování změn vlastností a umožnit u každého
objektu uložení změn nebo vrácení změn (undo).&lt;br&gt;
&lt;li&gt;
Zavedeme repozitáře (Repository), které i v hybridní aplikaci sjednotí ve vyšších
vrstvách aplikace přístup k objektům, které jsou nahrány přes ORM i k objektům vytaženým
z našich stávajících “old school” db/business služeb.&lt;br&gt;
&lt;li&gt;
Místo toho, abychom generovali dynamické proxy vždy po startu aplikace, umoříme jednorázově
(pro většinu aplikací stejně zanedbatelnou) režii spojenou s tímto postupem vygenerováním
a uložením assembly s dynamickými proxy při prvním spuštění nové verze aplikace. Při
dalším spuštění aplikace se již použijí proxy ve vygenerované assembly.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Pro dnešek toho bylo ale myslím dost. Snad jen dodám, že jsem se v tomto článku chtěl
vyhnout různým buzzwordům, ale fajnšmekrům potvrdím, co asi sami tuší, že jsme v tomto
článku zavítali do hájemství &lt;a href="http://en.wikipedia.org/wiki/Aspect-oriented_programming"&gt;AOP
- aspektově orientovaného programování&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Celý projekt si &lt;a href="https://bitbucket.org/renestein/rstein.misc/src"&gt;můžete stáhnout&lt;/a&gt;,
nejlépe přes Mercurial (hg). Součástí zdrojových kódů je i jednoduchá třída napodobující
rozhraní tradičních “db komponent” pro přístup do databáze a zpřístupňující data v
Datasetu. 
&lt;/p&gt;
&lt;script src="https://gist.github.com/2021422.js"&gt; &lt;/script&gt;
&lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=b5f8610e-3243-4c83-b55f-a5f50f883aad" /&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,b5f8610e-3243-4c83-b55f-a5f50f883aad.aspx</comments>
      <category>.NET Framework</category>
      <category>Entity Framework</category>
      <category>Návrhové vzory</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=14e232fb-6780-4183-b273-d877381d1305</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,14e232fb-6780-4183-b273-d877381d1305.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.renestein.net/CommentView,guid,14e232fb-6780-4183-b273-d877381d1305.aspx</wfw:comment>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=14e232fb-6780-4183-b273-d877381d1305</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <title>Entity Framework 4.3. Code First - (nechutn&amp;yacute;) probl&amp;eacute;m s TPC mapov&amp;aacute;n&amp;iacute;m?</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,14e232fb-6780-4183-b273-d877381d1305.aspx</guid>
      <link>http://blog.renestein.net/Entity+Framework+43+Code+First+Nechutnyacute+Probleacutem+S+TPC+Mapovaacuteniacutem.aspx</link>
      <pubDate>Fri, 24 Feb 2012 21:06:21 GMT</pubDate>
      <description>&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Update 25. 2.2011: Tak chyba potvrzena EF týmem. Jedná se skutečně o chybu, která
je částečně popsána v known issues.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Diego B Vega : @Rene Stein: Thanks for reporting this and for the repro. What
you describe seems to be a bug in TPC mapping that we are already aware of and that
we are planning to fix in the upcoming EF 4.3.1. Please take a look at the list of
known issues above for more information. &lt;/em&gt; 
&lt;p&gt;
&lt;em&gt;Jedná se tedy o chybu, kterou někdo zmínil i&amp;nbsp; v komentářích. Zarážející ale
je, že k chybě “chybí sloupec v databázi” se dostanete teprve tehdy, kdy vygenerujete
databázi s jiným než požadovaným schématem, odchytnete výjimku při dotazování a podíváte
se na popisek vnořené výjimky. V “known issues” EF by spíš podle mě mělo být&amp;nbsp;
- ve verzi 4.3 se vám ani nepodaří vygenerovat databázi s TPC mapováním dědičnosti
a volání metody MapInheritedProperties&amp;nbsp; při konfiguraci entit je jen zbytečná
dekorace v kódu a cvičení v marnosti.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
Mohl by prosím někdo ověřit, že jsem buď udělal nějakou triviální chybu při mapování,
anebo potvrdit mé podezření, že je EF Code First v poslední verzi 4.3 natolik prolezlý
chybami,&amp;nbsp; že v něm nefunguje ani tento triviální scénář.&lt;br&gt;
&lt;br&gt;
Problém se snažím reprodukovat na tomto kódu.
&lt;/p&gt;
&lt;p&gt;
Mám třídy Base a Derived. Jejich role asi vysvětlovat nikomu nemusím.&lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blog.renestein.net/content/binary/Windows-Live-Writer/Entity-Framework-4.3.-Code-First---_12BC6/wlEmoticon-smile_2.png"&gt;
&lt;/p&gt;
&lt;script src="https://gist.github.com/1903468.js?file=Base.cs"&gt;&lt;/script&gt;&lt;script src="https://gist.github.com/1903468.js?file=Derived.cs"&gt;&lt;/script&gt;
&lt;p&gt;
Snažím se pro mapování třídy Derived do databáze použít v db kontextu strategii TPC
– table per (concrete) class (metoda MapInheritedProperties).&amp;nbsp; 
&lt;/p&gt;
&lt;script src="https://gist.github.com/1903468.js?file=MyContextDel.cs"&gt;&lt;/script&gt;
&lt;p&gt;
Po spuštění se aplikace vytvoří databáze se dvěma tabulkami. Struktura databáze ale
odpovídá TPT strategii pro mapování dědičnosti: 
&lt;p&gt;
Tabulka Base má sloupce Id a BaseProperty, tabulka Derived Id 
&lt;pk   , fk&gt;
a Note. Volání MapInheritedProperties je tedy zcela ignorováno.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.renestein.net/content/binary/Windows-Live-Writer/Entity-Framework-4.3.-Code-First---_12BC6/EFTables.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="EFTables" border="0" alt="EFTables" src="http://blog.renestein.net/content/binary/Windows-Live-Writer/Entity-Framework-4.3.-Code-First---_12BC6/EFTables_thumb.png" width="358" height="331"&gt;&lt;/a&gt;
&lt;/p&gt;
Jak popisuju i v kódu, matoucí je to, že Entity Framework sice mapuje třídy do databáze
podle TPT strategie, ale dotazy klade, jako kdyby v databázi byly třída Derived namapována
TPC strategií. 
&lt;br&gt;
Vygenerovaný SQL dotaz do tabulky Derived vypadá takto:&lt;br&gt;
&lt;br&gt;
&lt;em&gt;SELECT '0X0X' AS [C1], [Extent1].[id] AS [id], &lt;strong&gt;[Extent1].[BaseProperty]
AS [BaseProperty],&lt;/strong&gt; [Extent1].[Note] AS [Note] FROM &lt;strong&gt;[dbo].[Derived] &lt;/strong&gt;AS
[Extent1] &lt;/em&gt;&lt;script src="https://gist.github.com/1903468.js?file=Program.cs"&gt;&lt;/script&gt;
&lt;p&gt;
Schizofrenní Entity Framework se beze všech skrupulí snaží dohledat v tabulce Derived
sloupec BaseProperty (TPC mapování), což pochopitelně skončí výjimkou při vykonávání
dotazu, protože se jiná část jeho vícečetné osobnosti složené z nespolupracujících
spoluautorů EF rozhodla při generování databáze, že TPT je pro každého aplikačního
vývojáře vždycky jasná volba. 
&lt;/p&gt;
&lt;p&gt;
A protože perverzních projevů EF se při pátečním večeru nelze nabažit, tak tady je
skript pro založení databáze, který jsem vytáhl z podkladového ObjectContextu a&lt;strong&gt; který
by měl mapovat podle TPC, což se ale nestane, protože je proti databázi spuštěn skript
zcela jiný&lt;/strong&gt;.
&lt;/p&gt;
Výsledek Trace.WriteLine(((IObjectContextAdapter) context).ObjectContext.CreateDatabaseScript()); &lt;script src="https://gist.github.com/1903468.js?file=create.sql"&gt;&lt;/script&gt;
&lt;p&gt;
&lt;a href="http://blog.renestein.net/__DOWNLOAD/EF_TPC_TPH.rar"&gt;Projekt s reprodukcí
problému ke stažení.&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=14e232fb-6780-4183-b273-d877381d1305" /&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,14e232fb-6780-4183-b273-d877381d1305.aspx</comments>
      <category>.NET Framework</category>
      <category>C#</category>
      <category>Entity Framework</category>
      <category>LINQ</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=7aff293a-4afa-4efa-8bfa-78500f267cfa</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,7aff293a-4afa-4efa-8bfa-78500f267cfa.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.renestein.net/CommentView,guid,7aff293a-4afa-4efa-8bfa-78500f267cfa.aspx</wfw:comment>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=7aff293a-4afa-4efa-8bfa-78500f267cfa</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Přibližně před rokem jsem u dvou firem začínal sérii technologických kurzů subjektivním
shrnutím změn (nejen) v aplikacích psaných v .Net Frameworku. Nedávno jsme ji s kolegou
náhodou otevřeli a pobavili jsme se nad tím, jak je rok v IT stále dlouhá doba a že
zde dvojnásobně platí “tempus fugit”. Napadlo mě, že se nad prezentací možná se pobaví
i někdo další, hlavně v pasážích, kde jemně naznačuju zálibu Microsoftu v zařezávání
technologií.<img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blog.renestein.net/content/binary/Windows-Live-Writer/de5bdc4acd85_ADFB/wlEmoticon-smile_2.png" /></p>
        <p>
U prezentace je třeba mít na paměti:
</p>
        <ol>
          <li>
Jedná se jen o osnovu “přehledové“ a cca dvouhodinové přednášky.<br /><br /></li>
          <li>
Témata, typy projektů a technologie jsou v přednášce voleny podle zájmu zákazníka.<br /><br /></li>
          <li>
Snažil jsem se nebýt hned  v této úvodní přednášce příliš ostrý a konfliktní.<img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blog.renestein.net/content/binary/Windows-Live-Writer/de5bdc4acd85_ADFB/wlEmoticon-smile_2.png" /><br /><br /></li>
          <li>
Zvolená témata se týkala oblastí, které jsme v dalších dnech probíraly detailněji
na konkrétních projektech vytvořených na návazných kurzech. Po pár zkušenostech si
myslím, že jediný smyslupný kurz zabývající se technologií či programovacím jazykem
je ten, na kterém píšete před účastníky kód. Tato přednáška byla koncipována jako
motivační úvod k dalším tématům.</li>
        </ol>
        <div style="width: 425px" id="__ss_7332936">
          <strong style="margin: 12px 0px 4px; display: block">
            <a title="Moderni trendy ve_vyvoji_aplikaci" href="http://www.slideshare.net/RENESTEIN/moderni-trendy-vevyvojiaplikaci">Moderni
trendy ve_vyvoji_aplikaci</a>
          </strong>
          <object id="__sse7332936" width="425" height="355">
            <param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=modernitrendyvevyvojiaplikaci-110321070156-phpapp01&amp;stripped_title=moderni-trendy-vevyvojiaplikaci&amp;userName=RENESTEIN" />
            <param name="allowFullScreen" value="true" />
            <param name="allowScriptAccess" value="always" />
            <embed name="__sse7332936" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=modernitrendyvevyvojiaplikaci-110321070156-phpapp01&amp;stripped_title=moderni-trendy-vevyvojiaplikaci&amp;userName=RENESTEIN" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355">
            </embed>
          </object>
          <div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px">View
more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/RENESTEIN">RENESTEIN</a>.
</div>
        </div>
        <img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=7aff293a-4afa-4efa-8bfa-78500f267cfa" />
      </body>
      <title>Prezentace Modern&amp;iacute; trendy ve v&amp;yacute;voji aplikac&amp;iacute;</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,7aff293a-4afa-4efa-8bfa-78500f267cfa.aspx</guid>
      <link>http://blog.renestein.net/Prezentace+Moderniacute+Trendy+Ve+Vyacutevoji+Aplikaciacute.aspx</link>
      <pubDate>Mon, 21 Mar 2011 12:11:41 GMT</pubDate>
      <description>&lt;p&gt;
Přibližně před rokem jsem u dvou firem začínal sérii technologických kurzů subjektivním
shrnutím změn (nejen) v aplikacích psaných v .Net Frameworku. Nedávno jsme ji s kolegou
náhodou otevřeli a pobavili jsme se nad tím, jak je rok v IT stále dlouhá doba a že
zde dvojnásobně platí “tempus fugit”. Napadlo mě, že se nad prezentací možná se pobaví
i někdo další, hlavně v pasážích, kde jemně naznačuju zálibu Microsoftu v zařezávání
technologií.&lt;img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blog.renestein.net/content/binary/Windows-Live-Writer/de5bdc4acd85_ADFB/wlEmoticon-smile_2.png"&gt;
&lt;/p&gt;
&lt;p&gt;
U prezentace je třeba mít na paměti:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Jedná se jen o osnovu “přehledové“ a cca dvouhodinové přednášky.&lt;br&gt;
&lt;br&gt;
&lt;li&gt;
Témata, typy projektů a technologie jsou v přednášce voleny podle zájmu zákazníka.&lt;br&gt;
&lt;br&gt;
&lt;li&gt;
Snažil jsem se nebýt hned&amp;nbsp; v této úvodní přednášce příliš ostrý a konfliktní.&lt;img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blog.renestein.net/content/binary/Windows-Live-Writer/de5bdc4acd85_ADFB/wlEmoticon-smile_2.png"&gt;
&lt;br&gt;
&lt;br&gt;
&lt;li&gt;
Zvolená témata se týkala oblastí, které jsme v dalších dnech probíraly detailněji
na konkrétních projektech vytvořených na návazných kurzech. Po pár zkušenostech si
myslím, že jediný smyslupný kurz zabývající se technologií či programovacím jazykem
je ten, na kterém píšete před účastníky kód. Tato přednáška byla koncipována jako
motivační úvod k dalším tématům.&lt;/li&gt;
&lt;/ol&gt;
&lt;div style="width: 425px" id="__ss_7332936"&gt;&lt;strong style="margin: 12px 0px 4px; display: block"&gt;&lt;a title="Moderni trendy ve_vyvoji_aplikaci" href="http://www.slideshare.net/RENESTEIN/moderni-trendy-vevyvojiaplikaci"&gt;Moderni
trendy ve_vyvoji_aplikaci&lt;/a&gt;&lt;/strong&gt;
&lt;object id="__sse7332936" width="425" height="355"&gt;
&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=modernitrendyvevyvojiaplikaci-110321070156-phpapp01&amp;amp;stripped_title=moderni-trendy-vevyvojiaplikaci&amp;amp;userName=RENESTEIN" /&gt;
&lt;param name="allowFullScreen" value="true" /&gt;
&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed name="__sse7332936" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=modernitrendyvevyvojiaplikaci-110321070156-phpapp01&amp;amp;stripped_title=moderni-trendy-vevyvojiaplikaci&amp;amp;userName=RENESTEIN" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;
&lt;/object&gt;
&lt;div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px"&gt;View
more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/RENESTEIN"&gt;RENESTEIN&lt;/a&gt;.
&lt;/div&gt;
&lt;/div&gt;
&lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=7aff293a-4afa-4efa-8bfa-78500f267cfa" /&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,7aff293a-4afa-4efa-8bfa-78500f267cfa.aspx</comments>
      <category>.NET Framework</category>
      <category>ASP.NET</category>
      <category>C#</category>
      <category>Compact .Net Framework</category>
      <category>LINQ</category>
      <category>RX Extensions</category>
      <category>Silverlight</category>
      <category>Web Services</category>
      <category>Windows Forms</category>
      <category>WP7</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=0257bcba-1a86-4ec0-a779-e858ab369d9f</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,0257bcba-1a86-4ec0-a779-e858ab369d9f.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.renestein.net/CommentView,guid,0257bcba-1a86-4ec0-a779-e858ab369d9f.aspx</wfw:comment>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=0257bcba-1a86-4ec0-a779-e858ab369d9f</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
 
</p>
        <p>
Dnešní článek je jen “intermezzem”, protože doplňuje <a href="http://blog.renestein.net/Tipy+Pro+Windows+Phone+7+Aplikace+IIIndashpropojeniacute+View+Modelu+S+View+Straacutenkou.aspx">předchozí
článek</a> o slíbenou informaci, jak můžeme automaticky registrovat serializovatelné
třídy, jejichž instance  nesou tranzientní stav, který je uložen  v KnownTypesDictionary. <a href="http://blog.renestein.net/Tipy+Pro+Windows+Phone+7+Aplikace+IIIndashpropojeniacute+View+Modelu+S+View+Straacutenkou.aspx">Přechozí
článek</a> končil <a href="https://gist.github.com/763469#file_known_types_dictionary.cs">ukázkou</a>,
jak můžeme vrátit staticky definovaný seznam typů, dnes se poohlédneme po trochu dynamičtějším
řešení. I když postup není omezen jen na WP7 aplikace, ale můžete ho použít v kterékoli
aplikaci, která využívá (WCF) <a href="http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractserializer.aspx">DataContractSerializer</a>,
my se zaměříme v článku opět hlavně na řešení WP7 specialitek. 
</p>
        <p>
Přečetli jste si první odstavec a nevíte, co je tranzientní stav? Hledáte marně v
MSDN typ KnownTypesDictionary? Nedivte se, milostný akt sice můžete rozjet bez předehry,
ale abyste rozuměli  tomuto intermezzu, pečlivě a pomalu si přečtěte jako předehru
k intermezzu <a href="http://blog.renestein.net/Tipy+Pro+Windows+Phone+7+Aplikace+II+Ndash+Podpora+%c5%bdivotniacuteho+Cyklu+Aplikace+V%c4%8detn%c4%9b+Tombstoningu+Ve+Quotview+Modelechrdquo.aspx">tipy
pro Windows Phone 7 aplikace II – podpora životního cyklu aplikace (včetně tombstoningu)
ve "view modelech”</a>, i díl <a href="http://blog.renestein.net/Tipy+Pro+Windows+Phone+7+Aplikace+IIIndashpropojeniacute+View+Modelu+S+View+Straacutenkou.aspx">třetí,
kde se bavíme o KnownTypesDctionary</a>.
</p>
        <p>
Předehru máte za sebou, takže víte, že KnownTypesDictionary je specializovaný objekt
Dictionary, ve kterém je klíčem řetězec a hodnotou libovolný objekt a že v objektech
KnownTypesDictionary ukládáme tranzientní stav view modelů při každém “tombstoningu”.
I když KnownTypesDictionary může jako hodnotu nést libovolný objekt, my musíme instruovat
DataContractSerializer, které objekty a hlavně z kterých odvozených tříd má v objektu
Dictionary očekávat.
</p>
        <p>
Když do KnownTypesDictionary ukládáme v jedné aplikaci instance z tříd OrderVO a InvoiceVO
a v jiné aplikaci instance TwitterPost a ObservableCollection&lt;TwitterPost &gt;,
musíme vždy znovu zmíněné třídy registrovat pomocí atributu <a href="http://msdn.microsoft.com/en-gb/library/system.runtime.serialization.knowntypeattribute.aspx">KnownType</a>.
</p>
        <p>
Pro připomenutí následuje výpis kódu, kterým jsme končili a který registruje serializovatelné
třídy v aplikaci “natvrdo” pomocí statické metody <em>GetKnownTypes</em>, jejíž název
je předán do konstruktoru atributu KnownType.
</p>
        <p>
 
</p>
        <p>
          <script src="https://gist.github.com/763469.js">
          </script>
Napevno zadrátované typy v <em>KnownTypesDctionary</em> nám nemusí vadit v jedné aplikaci,
ale když chceme používat KnownTypesDctionary v mnoha různých aplikacích, musím řešení
upravit.
</p>
        <p>
Místo abychom třídy v metodě <em>GetKnownTypes </em>registrovali přímo, delegujeme
odpovědnost za vrácení serializovatelných typů na specializovaného poskytovatele.<br /><em></em></p>
        <p>
          <em>BTW: To víte, že první a okouzlující zákon vztahu mezi třídami zní:  “Když
je třída vyčerpána množstvím odpovědností, vždy si může přičarovat otroka, který špinavou
práci udělá za ni”?. Občas se tomuto zákonu  také říká SRP – princip jedné odpovědnosti
třídy”.<img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blog.renestein.net/content/binary/Windows-Live-Writer/Tipy-pro-Windows_9A1E/wlEmoticon-smile_2.png" /></em>
        </p>
        <p>
Poskytovatel je objekt podporující rozhraní IKnownTypeProvider s jednou samopopisnou
metodou.
</p>
        <p>
          <script src="http://gist.github.com/772649.js">
          </script>
        </p>
        <p>
Refaktorizujeme třídu KnownTypesDictionary, aby při vracení serializovatelných typů
využívala objekt IKnownTypeProvider. 
</p>
        <p>
          <script src="http://gist.github.com/772654.js">
          </script>
        </p>
        <p>
Do nové statické vlastnosti KnownTypeProvider je ve statickém konstruktoru přiřazen
DefaultKnownTypesProvider, o kterém budeme mluvit za chvíli, ale do vlastnosti KnownTypeProvider
můžete klidně vložit pro účely vaší aplikace lépe přizpůsobený IKnownTypeProvider. 
</p>
        <p>
Metoda GetKnownTypes vrátí všechny staticky registrované typy v poli KNOWN_TYPES společně
s  typy, které dodá  IKnownTypeProvider. Typy jsou získány jen při prvním
volání metody GetKnownTypes a jsou cachovány v proměnné _cachedKnownTypes, abychom
opakovaným získáním typů z  IKnownTypeProvider zbytečně neplýtvali výkonem WP7
telefonů ani trpělivostí uživatele. Předpokladem tohoto přístupu samozřejmě je, že
v aplikaci je fixní množina serializovatelných typů, která se za běhu aplikace již
nemění. Jestli vám to nevyhovuje, odstraníte cache z KnownTypesDictionary za 10 sekund. 
</p>
        <p>
Jaké odpovědnosti bude mít DefaultKnownTypesProvider? 
</p>
        <ol>
          <li>
DefaultKnownTypesProvider nám vrátí všechny deskriptory třídy (Type) označené atributem
[DataContract] v hlavní assembly aplikace.<br /><br /></li>
          <li>
DefaultKnownTypesProvider nám vrátí všechny deskriptory třídy (Type) označené atributem
[DataContract] v dalších assembly, ze kterých je složena aplikace.<br /><br /></li>
          <li>
DefaultKnownTypesProvider nalezne další a pro aktuální aplikaci specifické objekty
podporující rozhraní IKnownTypeProvider a vrátí seznam všech typů z těchto providerů.<br /><br /></li>
          <li>
Pro všechny nalezené typy T zaregistruje i kolekci Observable&lt;T&gt;. To znamená,
že pro třídu OrderVO označenou atributem DataContract je automaticky vrácen z poskytovatele
nejen její Type (typof(OrderVO), ale i deskriptor kolekce typeof(ObservableCollection&lt;OrderVO&gt;).<br /></li>
        </ol>
        <p>
Kód třídy DefaultKnownTypesProvider: 
</p>
        <p>
          <script src="http://gist.github.com/772673.js">
          </script>V metodě GetKnownTypes vyzvedneme
všechny typy z “hlavní”  (vstupní) assembly. Hlavní assembly získáme v metodě
getExecutingAssembly přes vlastnosti třídy Deployment. 
</p>
        <p>
          <script src="http://gist.github.com/772674.js">
          </script>Typy z hlavní  assembly
sloučíme s typy v dalších assembly voláním metody getRefencedAssembliesTypes(). Ve
WP7 jsem bohužel nenašel způsob, jak seznam dalších assembly získat, a proto další
assembly poskytují objekty <em>IAssemblyTypesProvider </em>nalezené v hlavní assembly.
</p>
        <p>
Chcete-li tedy automaticky vyhledat typy označené atributem <em>DataContract </em>v
další assembly, vložte do hlavní assembly třídu podporující rozhraní <em>IAssemblyTypesProvider<strong>.</strong></em></p>
        <script src="http://gist.github.com/772676.js">
        </script>
        <p>
Do proměnné <em>collectionTypes</em> v metodě <em>GetKnownTypes</em> vygenerujeme
pro všechny nalezené typy jejich kolekce. Možná trochu složitě vypadající kód jen
zabraňuje tomu, abyste nalezené deskriptory tříd typu ObservableCollection&lt;T&gt;
v proměnné <em>types</em> balili znovu do kolekce ObservableCollection. Jinými slovy,
když v proměnné <em>types</em> bude kolekce <em>ObservableCollection&lt;OrderVO&gt;</em>,
do proměnné collectionTypes <strong>nebude </strong>generována kolekce <em>ObservableCollection&lt;ObservableCollection&lt;OrderVO&gt;&gt;</em>.
</p>
        <p>
          <script src="http://gist.github.com/772696.js">
          </script>
        </p>
        <p>
Na konci vracíme nalezené typy sloučené s vygenerovanými typy kolekcí ObservableCollection&lt;T&gt;
a dalšími a pro aplikaci specifickými typy z ostatnich poskytovatelů . Za poskytovatele
považujeme další objekty IKnownTypeProvider nalezené v hlavní assembly. <script src="http://gist.github.com/772704.js"></script></p>
        <p>
A tím máme hotovo. 
</p>
        <p>
Připomínám, že DefaultKnownTypesProvider můžete využít nejen ve WP7 aplikacích, ale
ve všech aplikacích v .Net Frameworku, kde je používán DataContractSerializer a vy
chcete automaticky registrovat odvozené serializovatelné typy. 
</p>
        <p>
Příště již začneme stavět aplikaci založenou na našem "mini frameworku”, abyste viděli,
k čemu tyto počáteční díly seriálu včetně intermezza, které právě čtete, vůbec byly.<img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blog.renestein.net/content/binary/Windows-Live-Writer/Tipy-pro-Windows_9A1E/wlEmoticon-smile_2.png" /></p>
        <p>
Předcházející články: 
</p>
        <p>
          <a href="http://blog.renestein.net/Tipy+Pro+Windows+Phone+7+Aplikace+I.aspx">Tipy
pro Windows Phone 7 aplikace I</a>
        </p>
        <p>
          <a href="http://blog.renestein.net/Tipy+Pro+Windows+Phone+7+Aplikace+II+Ndash+Podpora+%c5%bdivotniacuteho+Cyklu+Aplikace+V%c4%8detn%c4%9b+Tombstoningu+Ve+Quotview+Modelechrdquo.aspx">Tipy
pro Windows Phone 7 aplikace II – podpora životního cyklu aplikace (včetně tombstoningu)
ve "view modelech”</a>
        </p>
        <p>
          <a href="http://blog.renestein.net/Tipy+Pro+Windows+Phone+7+Aplikace+IIIndashpropojeniacute+View+Modelu+S+View+Straacutenkou.aspx">Tipy
pro Windows Phone 7 aplikace III–propojení view modelu s view (stránkou)</a>
        </p>
        <img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=0257bcba-1a86-4ec0-a779-e858ab369d9f" />
      </body>
      <title>Tipy pro Windows Phone 7 aplikace IV - intermezzo I - zjednodu&amp;scaron;en&amp;aacute; registrace serializovateln&amp;yacute;ch tř&amp;iacute;d nesouc&amp;iacute;ch tranzientn&amp;iacute; stav v KnownTypesDictionary</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,0257bcba-1a86-4ec0-a779-e858ab369d9f.aspx</guid>
      <link>http://blog.renestein.net/Tipy+Pro+Windows+Phone+7+Aplikace+IV+Intermezzo+I+Zjednoduscaronenaacute+Registrace+Serializovatelnyacutech+T%c5%99iacuted+Nesouciacutech+Tranzientniacute+Stav+V+KnownTypesDictionary.aspx</link>
      <pubDate>Mon, 10 Jan 2011 12:37:12 GMT</pubDate>
      <description>&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Dnešní článek je jen “intermezzem”, protože doplňuje &lt;a href="http://blog.renestein.net/Tipy+Pro+Windows+Phone+7+Aplikace+IIIndashpropojeniacute+View+Modelu+S+View+Straacutenkou.aspx"&gt;předchozí
článek&lt;/a&gt; o slíbenou informaci, jak můžeme automaticky registrovat serializovatelné
třídy, jejichž instance&amp;nbsp; nesou tranzientní stav, který je uložen&amp;nbsp; v KnownTypesDictionary. &lt;a href="http://blog.renestein.net/Tipy+Pro+Windows+Phone+7+Aplikace+IIIndashpropojeniacute+View+Modelu+S+View+Straacutenkou.aspx"&gt;Přechozí
článek&lt;/a&gt; končil &lt;a href="https://gist.github.com/763469#file_known_types_dictionary.cs"&gt;ukázkou&lt;/a&gt;,
jak můžeme vrátit staticky definovaný seznam typů, dnes se poohlédneme po trochu dynamičtějším
řešení. I když postup není omezen jen na WP7 aplikace, ale můžete ho použít v kterékoli
aplikaci, která využívá (WCF) &lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractserializer.aspx"&gt;DataContractSerializer&lt;/a&gt;,
my se zaměříme v článku opět hlavně na řešení WP7 specialitek. 
&lt;/p&gt;
&lt;p&gt;
Přečetli jste si první odstavec a nevíte, co je tranzientní stav? Hledáte marně v
MSDN typ KnownTypesDictionary? Nedivte se, milostný akt sice můžete rozjet bez předehry,
ale abyste rozuměli&amp;nbsp; tomuto intermezzu, pečlivě a pomalu si přečtěte jako předehru
k intermezzu &lt;a href="http://blog.renestein.net/Tipy+Pro+Windows+Phone+7+Aplikace+II+Ndash+Podpora+%c5%bdivotniacuteho+Cyklu+Aplikace+V%c4%8detn%c4%9b+Tombstoningu+Ve+Quotview+Modelechrdquo.aspx"&gt;tipy
pro Windows Phone 7 aplikace II – podpora životního cyklu aplikace (včetně tombstoningu)
ve "view modelech”&lt;/a&gt;, i díl &lt;a href="http://blog.renestein.net/Tipy+Pro+Windows+Phone+7+Aplikace+IIIndashpropojeniacute+View+Modelu+S+View+Straacutenkou.aspx"&gt;třetí,
kde se bavíme o KnownTypesDctionary&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Předehru máte za sebou, takže víte, že KnownTypesDictionary je specializovaný objekt
Dictionary, ve kterém je klíčem řetězec a hodnotou libovolný objekt a že v objektech
KnownTypesDictionary ukládáme tranzientní stav view modelů při každém “tombstoningu”.
I když KnownTypesDictionary může jako hodnotu nést libovolný objekt, my musíme instruovat
DataContractSerializer, které objekty a hlavně z kterých odvozených tříd má v objektu
Dictionary očekávat.
&lt;/p&gt;
&lt;p&gt;
Když do KnownTypesDictionary ukládáme v jedné aplikaci instance z tříd OrderVO a InvoiceVO
a v jiné aplikaci instance TwitterPost a ObservableCollection&amp;lt;TwitterPost &amp;gt;,
musíme vždy znovu zmíněné třídy registrovat pomocí atributu &lt;a href="http://msdn.microsoft.com/en-gb/library/system.runtime.serialization.knowntypeattribute.aspx"&gt;KnownType&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Pro připomenutí následuje výpis kódu, kterým jsme končili a který registruje serializovatelné
třídy v aplikaci “natvrdo” pomocí statické metody &lt;em&gt;GetKnownTypes&lt;/em&gt;, jejíž název
je předán do konstruktoru atributu KnownType.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;script src="https://gist.github.com/763469.js"&gt; &lt;/script&gt;
Napevno zadrátované typy v &lt;em&gt;KnownTypesDctionary&lt;/em&gt; nám nemusí vadit v jedné aplikaci,
ale když chceme používat KnownTypesDctionary v mnoha různých aplikacích, musím řešení
upravit.
&lt;/p&gt;
&lt;p&gt;
Místo abychom třídy v metodě &lt;em&gt;GetKnownTypes &lt;/em&gt;registrovali přímo, delegujeme
odpovědnost za vrácení serializovatelných typů na specializovaného poskytovatele.&lt;br&gt;
&lt;em&gt;&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;BTW: To víte, že první a okouzlující zákon vztahu mezi třídami zní:&amp;nbsp; “Když
je třída vyčerpána množstvím odpovědností, vždy si může přičarovat otroka, který špinavou
práci udělá za ni”?. Občas se tomuto zákonu&amp;nbsp; také říká SRP – princip jedné odpovědnosti
třídy”.&lt;img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blog.renestein.net/content/binary/Windows-Live-Writer/Tipy-pro-Windows_9A1E/wlEmoticon-smile_2.png"&gt;&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
Poskytovatel je objekt podporující rozhraní IKnownTypeProvider s jednou samopopisnou
metodou.
&lt;/p&gt;
&lt;p&gt;
&lt;script src="http://gist.github.com/772649.js"&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;
Refaktorizujeme třídu KnownTypesDictionary, aby při vracení serializovatelných typů
využívala objekt IKnownTypeProvider. 
&lt;p&gt;
&lt;script src="http://gist.github.com/772654.js"&gt;&lt;/script&gt;
&lt;p&gt;
Do nové statické vlastnosti KnownTypeProvider je ve statickém konstruktoru přiřazen
DefaultKnownTypesProvider, o kterém budeme mluvit za chvíli, ale do vlastnosti KnownTypeProvider
můžete klidně vložit pro účely vaší aplikace lépe přizpůsobený IKnownTypeProvider. 
&lt;p&gt;
Metoda GetKnownTypes vrátí všechny staticky registrované typy v poli KNOWN_TYPES společně
s&amp;nbsp; typy, které dodá&amp;nbsp; IKnownTypeProvider. Typy jsou získány jen při prvním
volání metody GetKnownTypes a jsou cachovány v proměnné _cachedKnownTypes, abychom
opakovaným získáním typů z&amp;nbsp; IKnownTypeProvider zbytečně neplýtvali výkonem WP7
telefonů ani trpělivostí uživatele. Předpokladem tohoto přístupu samozřejmě je, že
v aplikaci je fixní množina serializovatelných typů, která se za běhu aplikace již
nemění. Jestli vám to nevyhovuje, odstraníte cache z KnownTypesDictionary za 10 sekund. 
&lt;p&gt;
Jaké odpovědnosti bude mít DefaultKnownTypesProvider? 
&lt;ol&gt;
&lt;li&gt;
DefaultKnownTypesProvider nám vrátí všechny deskriptory třídy (Type) označené atributem
[DataContract] v hlavní assembly aplikace.&lt;br&gt;
&lt;br&gt;
&lt;li&gt;
DefaultKnownTypesProvider nám vrátí všechny deskriptory třídy (Type) označené atributem
[DataContract] v dalších assembly, ze kterých je složena aplikace.&lt;br&gt;
&lt;br&gt;
&lt;li&gt;
DefaultKnownTypesProvider nalezne další a pro aktuální aplikaci specifické objekty
podporující rozhraní IKnownTypeProvider a vrátí seznam všech typů z těchto providerů.&lt;br&gt;
&lt;br&gt;
&lt;li&gt;
Pro všechny nalezené typy T zaregistruje i kolekci Observable&amp;lt;T&amp;gt;. To znamená,
že pro třídu OrderVO označenou atributem DataContract je automaticky vrácen z poskytovatele
nejen její Type (typof(OrderVO), ale i deskriptor kolekce typeof(ObservableCollection&amp;lt;OrderVO&amp;gt;).&lt;br&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Kód třídy DefaultKnownTypesProvider: 
&lt;p&gt;
&lt;script src="http://gist.github.com/772673.js"&gt;&lt;/script&gt;V metodě GetKnownTypes vyzvedneme
všechny typy z “hlavní”&amp;nbsp; (vstupní) assembly. Hlavní assembly získáme v metodě
getExecutingAssembly přes vlastnosti třídy Deployment. 
&lt;p&gt;
&lt;script src="http://gist.github.com/772674.js"&gt;&lt;/script&gt;Typy z hlavní&amp;nbsp; assembly
sloučíme s typy v dalších assembly voláním metody getRefencedAssembliesTypes(). Ve
WP7 jsem bohužel nenašel způsob, jak seznam dalších assembly získat, a proto další
assembly poskytují objekty &lt;em&gt;IAssemblyTypesProvider &lt;/em&gt;nalezené v hlavní assembly.
&lt;/p&gt;
&lt;p&gt;
Chcete-li tedy automaticky vyhledat typy označené atributem &lt;em&gt;DataContract &lt;/em&gt;v
další assembly, vložte do hlavní assembly třídu podporující rozhraní &lt;em&gt;IAssemblyTypesProvider&lt;strong&gt;.&lt;/strong&gt;&lt;/em&gt;
&lt;/p&gt;
&lt;script src="http://gist.github.com/772676.js"&gt;&lt;/script&gt;
&lt;p&gt;
Do proměnné &lt;em&gt;collectionTypes&lt;/em&gt; v metodě &lt;em&gt;GetKnownTypes&lt;/em&gt; vygenerujeme
pro všechny nalezené typy jejich kolekce. Možná trochu složitě vypadající kód jen
zabraňuje tomu, abyste nalezené deskriptory tříd typu ObservableCollection&amp;lt;T&amp;gt;
v proměnné &lt;em&gt;types&lt;/em&gt; balili znovu do kolekce ObservableCollection. Jinými slovy,
když v proměnné &lt;em&gt;types&lt;/em&gt; bude kolekce &lt;em&gt;ObservableCollection&amp;lt;OrderVO&amp;gt;&lt;/em&gt;,
do proměnné collectionTypes &lt;strong&gt;nebude &lt;/strong&gt;generována kolekce &lt;em&gt;ObservableCollection&amp;lt;ObservableCollection&amp;lt;OrderVO&amp;gt;&amp;gt;&lt;/em&gt;.
&lt;/p&gt;
&lt;p&gt;
&lt;script src="http://gist.github.com/772696.js"&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;
Na konci vracíme nalezené typy sloučené s vygenerovanými typy kolekcí ObservableCollection&amp;lt;T&amp;gt;
a dalšími a pro aplikaci specifickými typy z ostatnich poskytovatelů . Za poskytovatele
považujeme další objekty IKnownTypeProvider nalezené v hlavní assembly. &lt;script src="http://gist.github.com/772704.js"&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;
A tím máme hotovo. 
&lt;p&gt;
Připomínám, že DefaultKnownTypesProvider můžete využít nejen ve WP7 aplikacích, ale
ve všech aplikacích v .Net Frameworku, kde je používán DataContractSerializer a vy
chcete automaticky registrovat odvozené serializovatelné typy. 
&lt;p&gt;
Příště již začneme stavět aplikaci založenou na našem "mini frameworku”, abyste viděli,
k čemu tyto počáteční díly seriálu včetně intermezza, které právě čtete, vůbec byly.&lt;img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blog.renestein.net/content/binary/Windows-Live-Writer/Tipy-pro-Windows_9A1E/wlEmoticon-smile_2.png"&gt; 
&lt;p&gt;
Předcházející články: 
&lt;p&gt;
&lt;a href="http://blog.renestein.net/Tipy+Pro+Windows+Phone+7+Aplikace+I.aspx"&gt;Tipy
pro Windows Phone 7 aplikace I&lt;/a&gt; 
&lt;p&gt;
&lt;a href="http://blog.renestein.net/Tipy+Pro+Windows+Phone+7+Aplikace+II+Ndash+Podpora+%c5%bdivotniacuteho+Cyklu+Aplikace+V%c4%8detn%c4%9b+Tombstoningu+Ve+Quotview+Modelechrdquo.aspx"&gt;Tipy
pro Windows Phone 7 aplikace II – podpora životního cyklu aplikace (včetně tombstoningu)
ve "view modelech”&lt;/a&gt; 
&lt;p&gt;
&lt;a href="http://blog.renestein.net/Tipy+Pro+Windows+Phone+7+Aplikace+IIIndashpropojeniacute+View+Modelu+S+View+Straacutenkou.aspx"&gt;Tipy
pro Windows Phone 7 aplikace III–propojení view modelu s view (stránkou)&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=0257bcba-1a86-4ec0-a779-e858ab369d9f" /&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,0257bcba-1a86-4ec0-a779-e858ab369d9f.aspx</comments>
      <category>.NET Framework</category>
      <category>C#</category>
      <category>Návrhové vzory</category>
      <category>Silverlight</category>
      <category>WP7</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=90c71b5b-7324-4a73-a7a4-5ee017c8b136</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,90c71b5b-7324-4a73-a7a4-5ee017c8b136.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.renestein.net/CommentView,guid,90c71b5b-7324-4a73-a7a4-5ee017c8b136.aspx</wfw:comment>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=90c71b5b-7324-4a73-a7a4-5ee017c8b136</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <title>C# Posterous API Wrapper verze 0.0.3 &amp;ndash; pro .NF 3.5+, Silverlight 4 a nově i s podporou pro Windows Phone 7</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,90c71b5b-7324-4a73-a7a4-5ee017c8b136.aspx</guid>
      <link>http://blog.renestein.net/C+Posterous+API+Wrapper+Verze+003+Ndash+Pro+NF+35+Silverlight+4+A+Nov%c4%9b+I+S+Podporou+Pro+Windows+Phone+7.aspx</link>
      <pubDate>Mon, 15 Nov 2010 15:25:38 GMT</pubDate>
      <description>Ke stažení jsem uvolnil další verzi API wrapperu služby Posterous. Pracuji nyní na komerčním a delší dobu plánovaném projektu pro WP7, a proto jsem v rámci vývojářského ducha povznášejícího testování různých nedomyšleností a špeků tohoto nového nadělení od mobilní divize MS cvičně  přidal už v Beta/RC verzi WP7 do Posterous API zkušební verzi pro WP7, kterou jsem nyní otestoval a doladil na “ostré”(sic! skutečně?) verzi WP7.

Další sarkasmy na adresu WP7 si dnes odpustím, těch už bylo dost na Twitteru...
&lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=90c71b5b-7324-4a73-a7a4-5ee017c8b136"/&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,90c71b5b-7324-4a73-a7a4-5ee017c8b136.aspx</comments>
      <category>.NET Framework</category>
      <category>C# Posterous API</category>
      <category>Silverlight</category>
      <category>WP7</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=9dc8102d-ebe5-4958-bbf1-247c1ce0b47c</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,9dc8102d-ebe5-4958-bbf1-247c1ce0b47c.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.renestein.net/CommentView,guid,9dc8102d-ebe5-4958-bbf1-247c1ce0b47c.aspx</wfw:comment>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=9dc8102d-ebe5-4958-bbf1-247c1ce0b47c</wfw:commentRss>
      <title>C# - kontrola existence vlastnosti u typu dynamic bez vyvol&amp;aacute;n&amp;iacute; v&amp;yacute;jimky RuntimeBinderException.</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,9dc8102d-ebe5-4958-bbf1-247c1ce0b47c.aspx</guid>
      <link>http://blog.renestein.net/C+Kontrola+Existence+Vlastnosti+U+Typu+Dynamic+Bez+Vyvolaacuteniacute+Vyacutejimky+RuntimeBinderException.aspx</link>
      <pubDate>Mon, 23 Aug 2010 13:33:03 GMT</pubDate>
      <description>Dan Steigerwald mě na Facebooku upozornil na článek “Challenge: Dynamically dynamic” na blogu Ayende Rahiena. Jak se můžete sami podívat, celá výzva se týká toho, jak zjistit, jestli u dané instance typu dynamic existuje vlastnost se zadaným jménem, aniž byste museli odchytávat  výjimku RuntimeBinderException, která vás na chybějící vlastnost sice drsně upozorní, ale zároveň vás nutí používat kód řízený výjimkami..Jak vypadá kód detekující existenci vlastnosti s vy/zneužitím RuntimeBinderException?
&lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=9dc8102d-ebe5-4958-bbf1-247c1ce0b47c"/&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,9dc8102d-ebe5-4958-bbf1-247c1ce0b47c.aspx</comments>
      <category>.NET Framework</category>
      <category>C#</category>
      <category>LINQ</category>
      <category>Programátorské hádanky</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=d28b9cd9-bf78-4e1f-8407-3a213baad863</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,d28b9cd9-bf78-4e1f-8407-3a213baad863.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.renestein.net/CommentView,guid,d28b9cd9-bf78-4e1f-8407-3a213baad863.aspx</wfw:comment>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=d28b9cd9-bf78-4e1f-8407-3a213baad863</wfw:commentRss>
      <slash:comments>6</slash:comments>
      <title>V&amp;yacute;hody a nev&amp;yacute;hody softwarov&amp;yacute;ch tov&amp;aacute;ren</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,d28b9cd9-bf78-4e1f-8407-3a213baad863.aspx</guid>
      <link>http://blog.renestein.net/Vyacutehody+A+Nevyacutehody+Softwarovyacutech+Tovaacuteren.aspx</link>
      <pubDate>Sun, 21 Mar 2010 10:57:10 GMT</pubDate>
      <description>Emailem jsem dostal zajímavou otázku, jaký je můj názor na softwarové továrny a kde vidím výhody a nevýhody softwarových továren. Odpověď nakonec publikuji i zde – už jen proto, že jsem si při jejím psaní uvědomil, že na továrnu kladu stejné nároky jako na kteroukoli další knihovnu v systému a že výběr softwarové továrny se u mě moc neliší od výběru třeba ORM Frameworku. Nejde o taxativní výčet výhod a nevýhod, ale spíš o volně nahozená témata, která mě za 20 minut psaní příspěvku napadla. &lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=d28b9cd9-bf78-4e1f-8407-3a213baad863"/&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,d28b9cd9-bf78-4e1f-8407-3a213baad863.aspx</comments>
      <category>.NET Framework</category>
      <category>Analytické drobky</category>
      <category>Návrhové vzory</category>
      <category>UML</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=8a82577f-48da-4b94-ad58-bbbafdc19f3f</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,8a82577f-48da-4b94-ad58-bbbafdc19f3f.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.renestein.net/CommentView,guid,8a82577f-48da-4b94-ad58-bbbafdc19f3f.aspx</wfw:comment>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=8a82577f-48da-4b94-ad58-bbbafdc19f3f</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <title>Podivn&amp;eacute;? chov&amp;aacute;n&amp;iacute; při explicitn&amp;iacute;m přetypov&amp;aacute;n&amp;iacute; typu dynamic ve Visual Studiu 2010 RC</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,8a82577f-48da-4b94-ad58-bbbafdc19f3f.aspx</guid>
      <link>http://blog.renestein.net/Podivneacute+Chovaacuteniacute+P%c5%99i+Explicitniacutem+P%c5%99etypovaacuteniacute+Typu+Dynamic+Ve+Visual+Studiu+2010+RC.aspx</link>
      <pubDate>Wed, 24 Feb 2010 18:19:03 GMT</pubDate>
      <description>Na twitteru jsem psal, že si pohraju s implementací rozhraní ve třídě přes automatickou delegaci na privátní  proměnnou s využitím nového typu dynamic v C# 4.0. Jestliže se dobře pamatuji, většinou se po nějakém takovém řešení pídí Delphisté. Z příkladu níže bude asi jasné i pro ostatni, co mám předchozími hutnými větami na mysli . 

Při hraní si s typem dynamic jsem ale narazil na zvláštní chování při explicitním přetypování a chtěl bych poprosit, zda by toto chování někdo zkusil nasimulovat ve vsvém Visual Studiu 2010 (nejlépe nejen na RC, ale i na starší Betě 2, kterou jsem už smazal). Příklad níže je jen jednoduchý “jednosměrný” prototyp, na kterém vynikne problém s explicitním přetypováním.
&lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=8a82577f-48da-4b94-ad58-bbbafdc19f3f"/&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,8a82577f-48da-4b94-ad58-bbbafdc19f3f.aspx</comments>
      <category>.NET Framework</category>
      <category>C#</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=24bbfc33-2595-43c9-a9a2-1df1de6a9b30</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,24bbfc33-2595-43c9-a9a2-1df1de6a9b30.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.renestein.net/CommentView,guid,24bbfc33-2595-43c9-a9a2-1df1de6a9b30.aspx</wfw:comment>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=24bbfc33-2595-43c9-a9a2-1df1de6a9b30</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <title>Hr&amp;aacute;tky s Reaktivn&amp;iacute;m frameworkem (RX extenze)</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,24bbfc33-2595-43c9-a9a2-1df1de6a9b30.aspx</guid>
      <link>http://blog.renestein.net/Hraacutetky+S+Reaktivniacutem+Frameworkem+RX+Extenze.aspx</link>
      <pubDate>Tue, 02 Feb 2010 06:43:00 GMT</pubDate>
      <description>Zkusme se nyní podívat, jak by nám s “převrácením starších asynchronních metod z hlavy zpět na synchronní nohy” mohl pomoci RX Framework. Úplné základy v tomto článku nezazní a začátečníky odkazuji na sérii přednášek na Channel 9, kde dozvíte i zajímavé podrobnosti o genezi celého RX Frameworku  a matematické dualitě rozhraní IEnumerable a IObservable (jinými slovy o společných rysech dobře známých GoF návrhových vzorů Iterátor a Observer). &lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=24bbfc33-2595-43c9-a9a2-1df1de6a9b30"/&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,24bbfc33-2595-43c9-a9a2-1df1de6a9b30.aspx</comments>
      <category>.NET Framework</category>
      <category>C# Posterous API</category>
      <category>LINQ</category>
      <category>Návrhové vzory</category>
      <category>RX Extensions</category>
      <category>Windows Forms</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=947b6fc1-477c-48b8-a514-2f7ee893ed3b</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,947b6fc1-477c-48b8-a514-2f7ee893ed3b.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.renestein.net/CommentView,guid,947b6fc1-477c-48b8-a514-2f7ee893ed3b.aspx</wfw:comment>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=947b6fc1-477c-48b8-a514-2f7ee893ed3b</wfw:commentRss>
      <title>C# Posterous API pro Silverlight 4 (a .Net Framework 3.5) &amp;ndash; verze 0.0.0.2</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,947b6fc1-477c-48b8-a514-2f7ee893ed3b.aspx</guid>
      <link>http://blog.renestein.net/C+Posterous+API+Pro+Silverlight+4+A+Net+Framework+35+Ndash+Verze+0002.aspx</link>
      <pubDate>Thu, 28 Jan 2010 15:33:08 GMT</pubDate>
      <description>Poznámky ke změnám v této verzi:
Kvůli verzi pro Silverlight přidány další asynchronní metody tak, aby bylo možné získat data z webu asynchronně, jak to Silverlight vyžaduje a jak je toto chování v aplikacích vynuceno třídami WebRequest a WebResponse. Pokud se pokusíte zavolat synchronní verzi metody v SL z UI vlákna, měli byste z knihovny dostat výjimku – to je lepší varianta, než skončit v paralyzovaném stavu, kdy aplikace na nic nereaguje...
&lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=947b6fc1-477c-48b8-a514-2f7ee893ed3b"/&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,947b6fc1-477c-48b8-a514-2f7ee893ed3b.aspx</comments>
      <category>.NET Framework</category>
      <category>C# Posterous API</category>
      <category>Silverlight</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=c00e3a67-5b1e-47a4-be6a-bfcedf7b462c</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,c00e3a67-5b1e-47a4-be6a-bfcedf7b462c.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.renestein.net/CommentView,guid,c00e3a67-5b1e-47a4-be6a-bfcedf7b462c.aspx</wfw:comment>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=c00e3a67-5b1e-47a4-be6a-bfcedf7b462c</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <title>Uk&amp;aacute;zka pr&amp;aacute;ce s Posterous API &amp;ndash; z&amp;aacute;lohov&amp;aacute;n&amp;iacute; blogu</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,c00e3a67-5b1e-47a4-be6a-bfcedf7b462c.aspx</guid>
      <link>http://blog.renestein.net/Ukaacutezka+Praacutece+S+Posterous+API+Ndash+Zaacutelohovaacuteniacute+Blogu.aspx</link>
      <pubDate>Wed, 20 Jan 2010 16:54:21 GMT</pubDate>
      <description>Po jednoduchém přehledu možností mého C# Posterous API wrapperu se nyní podíváme, jak se dá API použít k zálohování vašeho blogu. Pro účely tohoto článku předpokládám, že jste úvodní článek o API wrapperu četli.

Zálohovač blogu (RSPosterousBackup.exe) je jednoduchá konzolová aplikace, které stačí předat uživatelské jméno (parametr –u)  a heslo (parametr –p)  vašeho účtu na Posterous a také adresář vašem počítači (parametr bd), do kterého chcete blog zazálohovat.

Jednoduchá ukázka:
...&lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=c00e3a67-5b1e-47a4-be6a-bfcedf7b462c"/&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,c00e3a67-5b1e-47a4-be6a-bfcedf7b462c.aspx</comments>
      <category>.NET Framework</category>
      <category>C# Posterous API</category>
      <category>LINQ</category>
      <category>RX Extensions</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=6919d89d-efc3-44fc-9ed8-01530d0e51a9</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,6919d89d-efc3-44fc-9ed8-01530d0e51a9.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.renestein.net/CommentView,guid,6919d89d-efc3-44fc-9ed8-01530d0e51a9.aspx</wfw:comment>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=6919d89d-efc3-44fc-9ed8-01530d0e51a9</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <title>Projekt C# Posterous API &amp;ndash; verze 0.0.0.1 Alfa</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,6919d89d-efc3-44fc-9ed8-01530d0e51a9.aspx</guid>
      <link>http://blog.renestein.net/Projekt+C+Posterous+API+Ndash+Verze+0001+Alfa.aspx</link>
      <pubDate>Fri, 15 Jan 2010 16:49:51 GMT</pubDate>
      <description>Jak jsem avizoval minulý týden na twitteru, píšu C# wrapper webového API zajímavé služby Posterous.
Pár odkazů na začátek:
Jestliže nevíte, co je Posterous...
&lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=6919d89d-efc3-44fc-9ed8-01530d0e51a9"/&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,6919d89d-efc3-44fc-9ed8-01530d0e51a9.aspx</comments>
      <category>.NET Framework</category>
      <category>C# Posterous API</category>
      <category>Compact .Net Framework</category>
      <category>Silverlight</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=5fb56cb3-9933-49c9-bca5-f97661795666</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,5fb56cb3-9933-49c9-bca5-f97661795666.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.renestein.net/CommentView,guid,5fb56cb3-9933-49c9-bca5-f97661795666.aspx</wfw:comment>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=5fb56cb3-9933-49c9-bca5-f97661795666</wfw:commentRss>
      <slash:comments>6</slash:comments>
      <title>Drobn&amp;aacute; pozn&amp;aacute;mka ke kontravarianc&amp;iacute; deleg&amp;aacute;tů v C#</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,5fb56cb3-9933-49c9-bca5-f97661795666.aspx</guid>
      <link>http://blog.renestein.net/Drobnaacute+Poznaacutemka+Ke+Kontravarianciacute+Delegaacutet%c5%af+V+C.aspx</link>
      <pubDate>Fri, 24 Apr 2009 10:57:02 GMT</pubDate>
      <description>Předpokládám, že se stejně jako já těšíte na lepší podporu kovariance a kontravariance u rozhraní a delegátů v připravované verzi  C# 4.0. Už dnes se ale dá s existující podporou kovariance a kontravariance u delegátů pěkně kouzlit – pro ty s exaktnějším přístupem ke kódu a vytříbenou terminologií se slovo “kouzlit” v knihách zásadně překládá jako “psát elegantnější kód”. Opakovat základy kovariance a kontravariance u delegátů zde nebudu a &lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=5fb56cb3-9933-49c9-bca5-f97661795666"/&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,5fb56cb3-9933-49c9-bca5-f97661795666.aspx</comments>
      <category>.NET Framework</category>
      <category>Compact .Net Framework</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=dc4df303-bc27-4d9c-b817-0ca84fea8825</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,dc4df303-bc27-4d9c-b817-0ca84fea8825.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.renestein.net/CommentView,guid,dc4df303-bc27-4d9c-b817-0ca84fea8825.aspx</wfw:comment>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=dc4df303-bc27-4d9c-b817-0ca84fea8825</wfw:commentRss>
      <title>LINQ a logov&amp;aacute;n&amp;iacute; na př&amp;iacute;kladu logov&amp;aacute;n&amp;iacute; kroků Dijsktrova algoritmu</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,dc4df303-bc27-4d9c-b817-0ca84fea8825.aspx</guid>
      <link>http://blog.renestein.net/LINQ+A+Logovaacuteniacute+Na+P%c5%99iacutekladu+Logovaacuteniacute+Krok%c5%af+Dijsktrova+Algoritmu.aspx</link>
      <pubDate>Tue, 03 Mar 2009 15:34:35 GMT</pubDate>
      <description>Na LINQu je pěkné, jak jednoduše můžeme LINQ výraz upravit nebo jej bezbolestně rozšířit o další části. Nedávno jsem publikoval článek Dijsktrův alogritmus pomocí LINQu, extenzních metod a lambda výrazů a nyní si ukážeme drobnou úpravu v kódu, která způsobí, že se před každým rekurzivním voláním vždy vypíšou i prozatímní výsledky hledání nejkratší cesty.



Abychom mohli zalogovat výsledek, vytvoříme si vlastní extenzní metody pro výpis informací z předaného libovolného generického IEnumerable&lt;T&gt; do ...&lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=dc4df303-bc27-4d9c-b817-0ca84fea8825"/&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,dc4df303-bc27-4d9c-b817-0ca84fea8825.aspx</comments>
      <category>.NET Framework</category>
      <category>Compact .Net Framework</category>
      <category>LINQ</category>
    </item>
    <item>
      <trackback:ping>http://blog.renestein.net/Trackback.aspx?guid=19e20d35-6660-4911-b640-d666aed87aba</trackback:ping>
      <pingback:server>http://blog.renestein.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.renestein.net/PermaLink,guid,19e20d35-6660-4911-b640-d666aed87aba.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://blog.renestein.net/CommentView,guid,19e20d35-6660-4911-b640-d666aed87aba.aspx</wfw:comment>
      <wfw:commentRss>http://blog.renestein.net/SyndicationService.asmx/GetEntryCommentsRss?guid=19e20d35-6660-4911-b640-d666aed87aba</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <title>Dijsktrův alogritmus pomoc&amp;iacute; LINQu, extenzn&amp;iacute;ch metod a lambda v&amp;yacute;razů</title>
      <guid isPermaLink="false">http://blog.renestein.net/PermaLink,guid,19e20d35-6660-4911-b640-d666aed87aba.aspx</guid>
      <link>http://blog.renestein.net/Dijsktr%c5%afv+Alogritmus+Pomociacute+LINQu+Extenzniacutech+Metod+A+Lambda+Vyacuteraz%c5%af.aspx</link>
      <pubDate>Wed, 11 Feb 2009 18:13:14 GMT</pubDate>
      <description>Pokusil jsem se napsat Dijsktrův algoritmus pomocí LINQ konstrukcí. Pokud někdo z vás tápe, k čemu je Dijsktrův algoritmus dobrý a k čemu slouží, odkážu jej na podrobný článek na Wikipedii. Zde jen připomenu, že Dijsktrův algoritmus slouží k nalezení nejkratších cest v grafu z jednoho zdrojového uzlu ke všem ostatním uzlům. Je tak možné najít například nejkratší cestu z jednoho města do druhého. Na internetu jsem našel jeden graf, který budeme mít stále před očima a na který budeme Dijkstrův algoritmus napsaný v LINQu aplikovat.&lt;img width="0" height="0" src="http://blog.renestein.net/aggbug.ashx?id=19e20d35-6660-4911-b640-d666aed87aba"/&gt;</description>
      <comments>http://blog.renestein.net/CommentView,guid,19e20d35-6660-4911-b640-d666aed87aba.aspx</comments>
      <category>.NET Framework</category>
      <category>Compact .Net Framework</category>
      <category>LINQ</category>
    </item>
  </channel>
</rss>