<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Jürgen Gutsch</title><link>http://www.aspnetzone.de/blogs/juergengutsch/default.aspx</link><description>ASP.NET und mehr...</description><language></language><lastBuildDate>Tue, 23 Jun 2009 02:50:23 PDT</lastBuildDate><generator>Community Server http://communityserver.org</generator><creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/</creativeCommons:license><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><title>www.asp-net-mvc.com</title><link>http://feedproxy.google.com/~r/jgutsch/~3/RPVkdyE8gdU/www-asp-net-mvc-com.aspx</link><category>Wissenswertes</category><category>ASP.NET</category><category>Interessante Ressourcen</category><category>ASP.NET MVC</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Jürgen Gutsch</dc:creator><pubDate>Tue, 03 Nov 2009 23:33:29 PST</pubDate><guid isPermaLink="false">http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/11/04/www-asp-net-mvc-com.aspx</guid><description>&lt;p&gt;Soeben bin ich auf &lt;a href="http://weblogs.asp.net/seanmcalinden/default.aspx"&gt;Sean McAlinden's Blog&lt;/a&gt; gestoßen und zwar auf eine Beitrag, in dem Sean eine kleine Helferklasse beschreibt, mit der man relativ einfach an eingebettete Ressourcen kommen kann: &lt;a title="ASP.Net MVC Embedded Resource Helper Class" href="http://weblogs.asp.net/seanmcalinden/archive/2009/11/03/asp-net-mvc-embedded-resource-helper-class.aspx"&gt;ASP.Net MVC Embedded Resource Helper Class&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ganz unten unter Beitrag fand ich einen Link auf &lt;a href="http://www.asp-net-mvc.com"&gt;www.asp-net-mvc.com&lt;/a&gt;. Und da ich generell auf alles drauf klicke was irgendwie für ich interessant sein könnte. Fand ich eine Seite vor die sowohl von &lt;a href="http://weblogs.asp.net/seanmcalinden"&gt;Sean McAlinden&lt;/a&gt; als auch von Paul Thorrington. Was zuerst aussieht wie eine kommerzielle Website entpuppte sich als Präsentation kleiner und feiner &lt;a title="ASP.NET MVC Framework" href="http://www.asp.net/mvc/"&gt;ASP.NET MVC&lt;/a&gt; Helfer. Insgesamt gibt es sieben kleine Helfer zum anschauen, herunterladen und nutzen.&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.asp-net-mvc.com/MvcHelpers" href="http://www.asp-net-mvc.com/MvcHelpers"&gt;http://www.asp-net-mvc.com/MvcHelpers&lt;/a&gt;&lt;/p&gt;&lt;div class="wlWriterHeaderFooter" style="text-align:left;margin:0px;padding:4px 4px 4px 4px;"&gt;&lt;a href="http://dotnet-kicks.de/kick/?url=http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/11/04/www-asp-net-mvc-com.aspx"&gt;&lt;img src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/11/04/www-asp-net-mvc-com.aspx&amp;amp;bgcolor=3169AD&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000" alt="DotNetKicks-DE Image" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.aspnetzone.de/aggbug.aspx?PostID=214370" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=RPVkdyE8gdU:hxYGTJefl14:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=RPVkdyE8gdU:hxYGTJefl14:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?i=RPVkdyE8gdU:hxYGTJefl14:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=RPVkdyE8gdU:hxYGTJefl14:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?i=RPVkdyE8gdU:hxYGTJefl14:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=RPVkdyE8gdU:hxYGTJefl14:mNpC_eAfmKU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?d=mNpC_eAfmKU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jgutsch/~4/RPVkdyE8gdU" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/11/04/www-asp-net-mvc-com.aspx</feedburner:origLink></item><item><title>Stirnrunzeln über “Wie viel Sinn machen Unittests?”</title><link>http://feedproxy.google.com/~r/jgutsch/~3/TFHAFlZSKag/stirnrunzeln-ber-wie-viel-sinn-machen-unittests.aspx</link><category>Wissenswertes</category><category>Unit-Tests</category><category>Clean Code Developer</category><category>Clean Code</category><category>Entwicklung</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Jürgen Gutsch</dc:creator><pubDate>Mon, 02 Nov 2009 00:44:12 PST</pubDate><guid isPermaLink="false">http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/11/02/stirnrunzeln-ber-wie-viel-sinn-machen-unittests.aspx</guid><description>&lt;p&gt;Seit Oktober 2009 verfolge ich mit Begeisterung das Streitgespräch zwischen &lt;a href="http://www.des-eisbaeren-blog.de/?tag=/streitgespr%c3%a4ch"&gt;Golo Roden&lt;/a&gt; und &lt;a href="http://www.aspnetzone.de/blogs/peterbucher/archive/tags/Streitgespr_26002300_228_3B00_ch/default.aspx"&gt;Peter Bucher&lt;/a&gt;. Beide Autoren stellen sich jeden Monat von neuem diversen Fragen und Problemen aus dem Bereich der Softwareentwicklung.&lt;/p&gt;  &lt;p&gt;Auch dieses mal kann man wieder über ein Spannendes Thema lesen: &lt;a href="http://www.des-eisbaeren-blog.de/post/2009/11/01/Wie-viel-Sinn-machen-Unittests.aspx"&gt;Wie viel Sinn machen Unittests?&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Diesmal allerdings fühle ich mich gezwungen selber ein Kommentar über den neuesten Beitrag zu schreiben. Denn das erste mal seit dieser Serie bin ich sehr erstaunt, bzw. sogar leicht erschreckt, über Golos Beitrag.&lt;/p&gt;  &lt;p&gt;So schreibt Golo, dass Unit Tests zwar wünschenswert sind und und durchaus Sinn machen, allerdings nur an explizit ausgewällten Stellen:&lt;/p&gt;  &lt;blockquote&gt;&lt;strong&gt;Golo schrieb:     &lt;br /&gt;&lt;/strong&gt;Wie viel Sinn machen Unittests also nun? Zusammengefasst kann man sagen, dass Unittests – an der richtigen Stelle eingesetzt – durchaus Sinn ergeben, dass diese Stellen aber explizit ausgewählt werden sollten.&lt;/blockquote&gt;  &lt;p&gt;Des weiteren schreibt er, dass eine 100%ige Testabdeckung zwar wünschenswert ist, aber in der Praxis kaum möglich ist und sogar auf kosten der OOP geht.&lt;/p&gt;  &lt;p&gt;Als Begründung nennt er drei Aspekte, auf die ich hier etwas eingehen möchte:&lt;/p&gt;  &lt;blockquote&gt;&lt;strong&gt;Golo schrieb:     &lt;br /&gt;&lt;/strong&gt;&lt;em&gt;Der bestehende objektorientierte Aufbau ist unter OOP- und stilistischen Aspekten sauber umgesetzt, läuft einer guten Testbarkeit allerdings zuwider.&lt;/em&gt; &lt;/blockquote&gt;  &lt;p&gt;Diesen ersten Aspekt kann ich leider nicht nachvollziehen, bzw. halte ihn aus meiner Erfahrung heraus sogar für paradox. Im Gegenteil bin ich der Meinung, dass eine saubere, allen Regeln des OOP entsprechende Architektur testbarer ist. Ich gehe sogar noch weiter und behaupte, dass eine mir TDD umgesetzte Anwendung OOP besser umsetzen kann als eine, nicht mit Unit Tests abgedeckte Anwendung. &lt;/p&gt;  &lt;p&gt;Denkt man darüber nach was Unit Tests eigentlich sind, nämlich Tests der kleinsten vorhandenen Units, beeinträchtig das keineswegs negativ den aufbau der Anwendung nach allen regeln der OOP. Ein Unit Test testet die kleineste ansprechbare Einheit einer Klasse, das ist eine Methode oder eine Eigenschaft, aber weder deren Abhängigkeiten, noch komplexe Routinen und Szenarien.&lt;/p&gt;  &lt;p&gt;Unit Tests unterbinden Abhängigkeiten:&lt;/p&gt;  &lt;blockquote&gt;&lt;strong&gt;Golo schrieb:     &lt;br /&gt;&lt;/strong&gt;&lt;em&gt;Es bestehen zahlreiche Abhängigkeiten zu externen Komponenten, die sich nicht oder nur mit sehr viel Aufwand simulieren lassen. &lt;/em&gt;&lt;/blockquote&gt;  &lt;p&gt;Eine saubere Architektur besteht ohne Abhängigkeiten. Mit Hilfe von IoC Containern und Dependency Injection werden Abhängigkeiten gelöst. Dadurch lassen sich die einzelnen Units noch einfacher Testen. Dadurch lassen sich z. B. ohne Aufwand andere spezielle für diese Tests benötigte Bibliotheken laden. Das wiederspricht also schon dem zweiten Aspekt. Beispielswiese lässt sich für den Unit Test eine Library laden, die den Zugriff auf eine Im-Memory-Datenbank ermöglicht, statt auf einen SQL Server Datenbank.&lt;/p&gt;  &lt;p&gt;Eine weitere Möglichkeit sich in in Unit Tests von Abhängigkeiten zu lösen sind Mocking Frameworks wie z. B: RhinoMocks:&lt;/p&gt;  &lt;blockquote&gt;&lt;strong&gt;Golo schrieb:     &lt;br /&gt;&lt;/strong&gt;&lt;em&gt;Es bestehen Abhängigkeiten zur konkreten Laufzeitumgebung, die sich nicht oder nur mit sehr viel Aufwand nachbilden lassen.&lt;/em&gt;&lt;/blockquote&gt;  &lt;p&gt;Mocking Frameworks werden genutzt um z. B. abhängige Klassen zu simulieren. Anhand eines Interfaces werden “gefälschte” Objekte erzeigt, die lediglich die benötigten Funktionen bereitstellen und die gewünschten werte liefern. &lt;/p&gt;  &lt;p&gt;Datenzugriffsklassen, Dateienzugriffsklassen, eigentlich alle Abhängigkeiten lassen sich in einer sauberen Umgebung simulieren und der Unit Test konzentriert sich einzig und allein auf das Unit, statt Abhängigkeiten berücksichtigen zu müssen.&lt;/p&gt;  &lt;blockquote&gt;&lt;strong&gt;Golo schrieb:     &lt;br /&gt;&lt;/strong&gt;&lt;em&gt;Um Webbrowser-spezifisches Verhalten zu simulieren, müssten die Eigenheiten des jeweiligen Webbrowsers im Unittest nachgebildet werden. Alternativ könnten der entsprechenden gewünschte Webbrowser automatisiert werden – was seinerseits allerdings einen ziemlichen Aufwand nach sich zieht.&lt;/em&gt;&lt;/blockquote&gt;  &lt;p&gt;Das ist meiner Meinung nach die Aufgabe eines integrationstests, nicht die eines Unit Tests. Da hier ein komplettverhalten getestet wird und nicht das Verhalten einer einzelnen Unit. Um diese Unit zu testen muss der HttpRequest der von der Unit benötigt wird, simuliert werden.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;Golo schrieb:       &lt;br /&gt;&lt;/strong&gt;&lt;em&gt;Ebenfalls problematisch ist multithreaded Code, sofern bestimmte Konstellationen in den einzelnen Threads getestet werden sollen – da das Umschalten zwischen den Threads vom aktuellen Kontext des Prozessors beziehungsweise des Betriebssystems abhängt, kann sich das Verhalten von Ausführung zu Ausführung unterscheiden.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Auch hier sollte der Unit Test nicht den Thread testen , sondern die Units die innerhalb der Threads arbeiten, alles andere wäre kein Unit Test.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mein Fazit:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Die Benutzung von Unit Tests von möglichen Abhängigkeiten “abhängig zu machen” ist in Zeiten mit IOC Containern und Mocking Frameworks nicht mehr haltbar. Mit Hilfe von diesen Hilfsmitteln ist garantiert eine Testabdeckung von annähernd 100% machbar.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Hier noch ein &lt;a href="http://blog.thomasbandt.de/39/2291/de/blog/unit-tests-sind-gut.html"&gt;Statement zum Thema&lt;/a&gt; von &lt;a title="Thomas goes .NET" href="http://blog.thomasbandt.de/"&gt;Thomas Bandt&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Lesenswert sind auch die Kommentare zu Golos Beitrag unter anderem auch von &lt;a title="Ralf Westphal" href="http://www.ralfw.de"&gt;Ralf Westphal&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mein Fazit (das zweite):&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Wie &lt;a title="Thomas goes .NET" href="http://blog.thomasbandt.de/"&gt;Thomas&lt;/a&gt; kann ich bestätigen dass TDD am Anfang sehr, sehr schwierig ist. Wenn man Jahrelang einfach drauf los entwickelt hat, ist es ein wahrer Kraftakt und es erfordert eine menge Konzentration uns Selbstdisziplin Testgetrieben zu entwickeln.&lt;/p&gt;&lt;div class="wlWriterHeaderFooter" style="text-align:left;margin:0px;padding:4px 4px 4px 4px;"&gt;&lt;a href="http://dotnet-kicks.de/kick/?url=http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/11/02/stirnrunzeln-ber-wie-viel-sinn-machen-unittests.aspx"&gt;&lt;img src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/11/02/stirnrunzeln-ber-wie-viel-sinn-machen-unittests.aspx&amp;amp;bgcolor=3169AD&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000" alt="DotNetKicks-DE Image" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.aspnetzone.de/aggbug.aspx?PostID=214319" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=TFHAFlZSKag:O4jwAAlB3Jc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=TFHAFlZSKag:O4jwAAlB3Jc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?i=TFHAFlZSKag:O4jwAAlB3Jc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=TFHAFlZSKag:O4jwAAlB3Jc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?i=TFHAFlZSKag:O4jwAAlB3Jc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=TFHAFlZSKag:O4jwAAlB3Jc:mNpC_eAfmKU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?d=mNpC_eAfmKU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jgutsch/~4/TFHAFlZSKag" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/11/02/stirnrunzeln-ber-wie-viel-sinn-machen-unittests.aspx</feedburner:origLink></item><item><title>Zweiter Start mit NHibernate</title><link>http://feedproxy.google.com/~r/jgutsch/~3/Fpbf3tn-F8s/zweiter-start-mit-nhibernate.aspx</link><category>Datenbank</category><category>LINQ</category><category>NHibernate</category><category>Fluent NHibernate</category><category>LINQ2NHibernate</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Jürgen Gutsch</dc:creator><pubDate>Mon, 28 Sep 2009 13:05:00 PDT</pubDate><guid isPermaLink="false">http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/09/28/zweiter-start-mit-nhibernate.aspx</guid><description>&lt;P&gt;Es ist eine ganze Weile her seit ich mir das letzte Mal NHibernate angeschaut habe. Damals hielt ich NHibernate für zu unflexibel und zu kompliziert, bzw. aufwändig in der Konfiguration. Zumindest damals musste das Mapping der Datenbank auf die einzelnen Objekte in XML-Dateien geschrieben werden. Anschließend wurde per externes Programm, aus den Mapping Klassen generiert, die dann für den Zugriff auf die Datenbank genutzt werden konnten. Gerade die Nutzung eines externen Tools zur Generierung der nötigen Klassen erschien mir sehr umständlich.&lt;/P&gt;
&lt;P&gt;Vor ein paar Wochen war es wieder so weit, dass ich mir NHibernate angeschaut habe. &lt;/P&gt;
&lt;P&gt;Der Grund waren ein paar positive Äußerungen in der .NET Community. Dort war immer wieder zu lesen, wie gut NHibernate im Zusammenhang mit Fluent NHibernate und LINQ to NHibernate sei. Alleine schon die Aussicht auf LINQ und de Konfiguration über Fluent Interfaces machten mich wieder neugierig auf den am häufigsten erwähnten OR-Mapper. &lt;/P&gt;
&lt;P&gt;Enttäuscht wurde ich nicht, ganz im Gegenteil. Mit dem Fluent NHibernate und LINQ to NHibernate ist es eine Freude mit NHibernate zu arbeiten. Nicht nur dass man ganz ohne XML-Konfigurationen auskommt, mit Hilfe des Fluent NHibernate lässt sich das Mapping und die Konfiguration per .NET Code schreiben. Also ob das nicht genug wäre, lässt sich mit Fluent NHibernate sogar die Datenbank dann aus dem erstellten Mapping und der Konfiguration generieren.&lt;/P&gt;
&lt;P&gt;Hier mal das Ergebnis meiner ersten Spielerei.&lt;/P&gt;
&lt;P&gt;Benötigt werden Fluent NHibernate (welches unter folgender URL heruntergeladen werden kann: &lt;A href="http://fluentnhibernate.org/"&gt;http://fluentnhibernate.org/&lt;/A&gt;, die NHibernate.dll ist dort bereits enthalten) und LINQ to NHibernate (&lt;A href="http://sourceforge.net/projects/nhibernate/files/"&gt;http://sourceforge.net/projects/nhibernate/files/&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Vorbereitung&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Angefangen hab ich mit der Erstellung meiner Daten-Objekte &lt;/P&gt;
&lt;P&gt;Person.cs&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;class&lt;/span&gt; Person: Entity&amp;lt;Person&amp;gt; &lt;br /&gt;{ &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;protected&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;override&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;void&lt;/span&gt; Initialize() &lt;br /&gt;  { &lt;br /&gt;    Projects &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;new&lt;/span&gt; List&amp;lt;Project&amp;gt;(); &lt;br /&gt;    Tasks &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;new&lt;/span&gt; List&amp;lt;Task&amp;gt;(); &lt;br /&gt;  }  &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;virtual&lt;/span&gt; List&amp;lt;Project&amp;gt; Projects { get; set; } &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;virtual&lt;/span&gt; List&amp;lt;Task&amp;gt; Tasks { get; set; } &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;virtual&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt; FirstName { get; set; } &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;virtual&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt; LastName { get; set; } &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;virtual&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt; Email { get; set; } &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;virtual&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt; Telefone { get; set; } &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Projekt.cs&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;class&lt;/span&gt; Project: Entity&amp;lt;Project&amp;gt; &lt;br /&gt;{ &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;protected&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;override&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;void&lt;/span&gt; Initialize() &lt;br /&gt;  { &lt;br /&gt;    Persons &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;new&lt;/span&gt; List&amp;lt;Person&amp;gt;(); &lt;br /&gt;    Tasks &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;new&lt;/span&gt; List&amp;lt;Task&amp;gt;(); &lt;br /&gt;  }  &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;virtual&lt;/span&gt; List&amp;lt;Person&amp;gt; Persons { get; set; } &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;virtual&lt;/span&gt; List&amp;lt;Task&amp;gt; Tasks { get; set; } &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;virtual&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt; Name { get; set; } &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;virtual&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt; Description { get; set; } &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;virtual&lt;/span&gt; DateTime StartDate { get; set; } &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;virtual&lt;/span&gt; DateTime EndDate { get; set; } &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Task.cs&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;class&lt;/span&gt; Task: Entity&amp;lt;Task&amp;gt; &lt;br /&gt;{ &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;virtual&lt;/span&gt; Person Person { get; set; } &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;virtual&lt;/span&gt; Project Project { get; set; } &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;virtual&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt; Name { get; set; } &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;virtual&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt; Description { get; set; } &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;virtual&lt;/span&gt; DateTime StartDate { get; set; } &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;virtual&lt;/span&gt; DateTime EndDate { get; set; } &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Wie man jetzt evtl. erkennen kann ist eine kleine, einfache Aufgabenverwaltung geplant. Alle drei Objekte erben von einer generischen Basisklasse die weitere Funktionen und die Eigenschaft Id, vom Typ Guid – die in jeder Klasse enthalten ist – bereitstellt.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Mapping&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Jetzt wird es dann eigentlich erst interessant: per Fluent NHibernate müssen die Mappings erzeugt werden. Als erste für die Person-Klasse:&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;class&lt;/span&gt; PersonClassMap: ClassMap&amp;lt;Person&amp;gt; &lt;br /&gt;{ &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; PersonClassMap() &lt;br /&gt;  { &lt;br /&gt;    Table(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"Persons"&lt;/span&gt;); &lt;br /&gt;    Id(d =&amp;gt; d.Id).GeneratedBy.Guid(); &lt;br /&gt;    Map(d =&amp;gt; d.FirstName).Not.Nullable().Length(50); &lt;br /&gt;    Map(d =&amp;gt; d.LastName).Not.Nullable().Length(50); &lt;br /&gt;    Map(d =&amp;gt; d.Email).Not.Nullable().Length(50); &lt;br /&gt;    Map(d =&amp;gt; d.Telefone).Not.Nullable().Length(50); &lt;br /&gt;    HasMany(d =&amp;gt; d.Tasks) &lt;br /&gt;      .Cascade.All() &lt;br /&gt;      .KeyColumn(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"PersonId"&lt;/span&gt;) &lt;br /&gt;      .Inverse(); &lt;br /&gt;    HasManyToMany(d =&amp;gt; d.Projects) &lt;br /&gt;      .Cascade.All() &lt;br /&gt;      .Table(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"Person2Project"&lt;/span&gt;) &lt;br /&gt;      .ParentKeyColumn(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"PersonId"&lt;/span&gt;) &lt;br /&gt;      .ChildKeyColumn(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"ProjectId"&lt;/span&gt;); &lt;br /&gt;  } &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Als erste wird hier der Name der Datenbank-Tabelle definiert. Anschließend mit der Methode Id() der Primärschlüssel. GeneratedBy.Guid() gibt an dass es sich um einen Autogenerierten Guid-Wert handeln soll.&lt;/P&gt;
&lt;P&gt;Die Methode Map ist die einfachste, sie mappt lediglich die Eigenschaften auf die Felder in der Datenbank. Not.Nullable()und Length(50) sind sprechend.&lt;/P&gt;
&lt;P&gt;Interessant wird es mit HasMany(), hier wird definiert, dass einer Person mehrere Aufgaben zugewiesen sein können. KeyColumn("PersonId") zeigt auf den Fremdschlüssel in der Tabelle „Tasks“. Inverse zeig an dass es das Gegenstück zur Referenzierung in der Klasse Task ist. Dort sieht die Referenz wie folgt aus:&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;References(r =&amp;gt; r.Person, &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"PersonId"&lt;/span&gt;);&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Die Angabe des Spaltennamens (2. Parameter) ist notwendig wenn man diesen nicht autogeneriert haben möchte, einem bestimmten Namensschema in der Datenbank folgen möchte oder bereits einen Namen in der Datenbank vergeben hat Kniffliger als HasMany() ist HasManyToMany() hier wird eine n:m Beziehung dargestellt und definiert, dass mehrere Personen mehreren Projekten zugeordnet werden können. Wenn der Tabellenname nicht autogeneriert werden soll muss dieser angegeben werden, genauso wie die Spalten. Erscheint zunächst einfach, allerdings muss man beachten, dass das Gegenstück (im Mapping für die Projekte) rückwärts verweist: &lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;HasManyToMany(d =&amp;gt; d.Persons) &lt;br /&gt;  .Cascade.All() &lt;br /&gt;  .Table(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"Person2Project"&lt;/span&gt;) &lt;br /&gt;  .ParentKeyColumn(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"ProjectId"&lt;/span&gt;) &lt;br /&gt;  .ChildKeyColumn(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"PersonId"&lt;/span&gt;) &lt;br /&gt;  .Inverse();&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Man sieht, die Spaltennamen für ParentKeyColumn sind vertauscht und es muss wieder ein Inverse() angehängt sein.&lt;/P&gt;
&lt;P&gt;Die anderen beiden Mappings sehen wie folgt aus:&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;class&lt;/span&gt; ProjectClassMap: ClassMap&amp;lt;Project&amp;gt; &lt;br /&gt;{ &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; ProjectClassMap() &lt;br /&gt;  { &lt;br /&gt;    Table(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"Projects"&lt;/span&gt;); &lt;br /&gt;    Id(d =&amp;gt; d.Id).GeneratedBy.Guid(); &lt;br /&gt;    Map(d =&amp;gt; d.Name).Not.Nullable().Length(50); &lt;br /&gt;    Map(d =&amp;gt; d.Description).Not.Nullable().Length(4000); &lt;br /&gt;    Map(d =&amp;gt; d.EndDate).Not.Nullable(); &lt;br /&gt;    Map(d =&amp;gt; d.StartDate).Not.Nullable(); &lt;br /&gt;    HasManyToMany(d =&amp;gt; d.Persons) &lt;br /&gt;      .Cascade.All() &lt;br /&gt;      .Table(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"Person2Project"&lt;/span&gt;) &lt;br /&gt;      .ParentKeyColumn(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"ProjectId"&lt;/span&gt;) &lt;br /&gt;      .ChildKeyColumn(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"PersonId"&lt;/span&gt;) &lt;br /&gt;      .Inverse(); &lt;br /&gt;    HasMany(d =&amp;gt; d.Tasks).Cascade.All().KeyColumn(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"ProjectId"&lt;/span&gt;).Inverse(); &lt;br /&gt;  } &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;class&lt;/span&gt; TaskClassMap: ClassMap&amp;lt;Task&amp;gt; &lt;br /&gt;{ &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; TaskClassMap() &lt;br /&gt;  { &lt;br /&gt;    Table(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"Tasks"&lt;/span&gt;); &lt;br /&gt;    Id(d =&amp;gt; d.Id).GeneratedBy.Guid(); &lt;br /&gt;    Map(d =&amp;gt; d.Name).Not.Nullable().Length(50); &lt;br /&gt;    Map(d =&amp;gt; d.Description).Not.Nullable().Length(4000); &lt;br /&gt;    Map(d =&amp;gt; d.EndDate).Not.Nullable(); &lt;br /&gt;    Map(d =&amp;gt; d.StartDate).Not.Nullable(); &lt;br /&gt;    References(r =&amp;gt; r.Project, &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"ProjectId"&lt;/span&gt;); &lt;br /&gt;    References(r =&amp;gt; r.Person, &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"PersonId"&lt;/span&gt;); &lt;br /&gt;  } &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Konfiguration&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Im nächsten Schritt muss die Verbindung zur Datenbank konfiguriert werden und bei Bedarf eine SessionFactory erzeugt werden. Dazu habe ich mit eine statische Klasse angelegt die wiederum zwei Methode enthält: Die erste Methode erstellt die Konfiguration und die Zweite Methode erstellt die SessionFactory anhand dieser Konfiguration.&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;static&lt;/span&gt; FluentConfiguration CreateConfiguration() &lt;br /&gt;{ &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;return&lt;/span&gt; Fluently.Configure() &lt;br /&gt;    .Database(MsSqlConfiguration.MsSql2005 &lt;br /&gt;      .ConnectionString(c =&amp;gt; c.FromAppSetting(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"DbConnection"&lt;/span&gt;)) &lt;br /&gt;      .ShowSql()) &lt;br /&gt;    .Mappings(m =&amp;gt; m.FluentMappings &lt;br /&gt;      .AddFromAssemblyOf&amp;lt;IEntity&amp;gt;()); &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Im ersten Teil der Fluently Configuration wird die Verbindung zur Datenbank definiert. Hierfür gibt es verschiedenste Möglichkeiten. (Mehr Möglichkeiten lassen sich aus der Dokumentation entnehmen: &lt;A href="http://wiki.fluentnhibernate.org/Main_Page)"&gt;http://wiki.fluentnhibernate.org/Main_Page)&lt;/A&gt; Ich habe MS SQL 2005 als Datenbankserver gewählt und lese den ConnectionString aus den App.Settings, bzw. der Web.Config aus. Außerdem möchte ich bei Fehlern den SQL-String sehen: ShowSql()&lt;/P&gt;
&lt;P&gt;Anschließend wird das Mapping zugewiesen. Das geschieht ganz einfach indem man dem Fluent NHibernate sagt, wo die Assembly mit den Mappings liegen. Es werden automatisch alle Klassen als Mapping erkannt die von ClassMap&amp;lt;T&amp;gt; erben.&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;static&lt;/span&gt; ISessionFactory CreateSessionFactory() &lt;br /&gt;{ &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;return&lt;/span&gt; CreateConfiguration().BuildSessionFactory(); &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Die zweite Methode ruft die erste auf und erstellt eine neue SessionFactory. Ich habe die Configuration von der Erstellung der Session getrennt um für die Generierung der Datenbank einen Konfigurationspunkt – für die Generierung der Datenbank – dazwischen zuhängen, die ich für die einfache Erzeugung der SessionFactory nicht benötige.&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;void&lt;/span&gt; SetupDatabase() &lt;br /&gt;{ &lt;br /&gt;  FluentConfiguration conf &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; NHConfiguration.CreateConfiguration(); &lt;br /&gt;  conf.ExposeConfiguration(BuildSchema).BuildSessionFactory(); &lt;br /&gt;} &lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;private&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;static&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;void&lt;/span&gt; BuildSchema(Configuration conf) &lt;br /&gt;{ &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;new&lt;/span&gt; SchemaExport(conf).Drop(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;false&lt;/span&gt;, &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;true&lt;/span&gt;); &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;new&lt;/span&gt; SchemaExport(conf).Create(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;false&lt;/span&gt;, &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;true&lt;/span&gt;); &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Mit der Methode ExposeConfiguration() werden Anweisungen zum Exportieren des Datenbankschemas eingebunden. Das Schema wird in dem Fall in die Datenbank selber exportiert. Es wird also die Datenbank erstellt.&lt;/P&gt;
&lt;P&gt;Es empfiehlt sich die SessionFactory global, anwendungsweit bereit&amp;nbsp; zu halten, da die Erzeugung der Factory sonst recht unperformant ist. Schließlich muss das Schema erst anhand des erstellten Mappings generiert werden&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;private&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;static&lt;/span&gt; ISessionFactory sessionFactory; &lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;static&lt;/span&gt; ISessionFactory SessionFactory &lt;br /&gt;{ &lt;br /&gt;  get &lt;br /&gt;  { &lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;if&lt;/span&gt; (sessionFactory == &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;null&lt;/span&gt;) &lt;br /&gt;      sessionFactory &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; NHConfiguration.CreateSessionFactory(); &lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;return&lt;/span&gt; sessionFactory; &lt;br /&gt;  } &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;LINQ to NHibernate&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Eine Session kann dann innerhalb eines Using-Blocks geöffnet werden:&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;using&lt;/span&gt;(var session &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; sessionFactory.OpenSession()) &lt;br /&gt;{ &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Innerhalb des Blocks kann dann endlich auch LINQ to NHibernate zum Einsatz kommen:&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;var q &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; from a &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;in&lt;/span&gt; session.Linq&amp;lt;Person&amp;gt;() &lt;br /&gt;        where a.FirstName !&lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;""&lt;/span&gt; &lt;br /&gt;        select a;&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Die generische Methode Linq&amp;lt;T&amp;gt;() liefert ein Ergebnis vom Typ INHibernateQueryable&amp;lt;T&amp;gt; das wiederum von IQueryable&amp;lt;T&amp;gt; und IEnumerable&amp;lt;T&amp;gt; und somit wiederum bequem per LINQ abgefragt werden kann.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Fazit&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;NHibernate ist dadurch natürlich recht schnell einsetzbar, bequemer und auch etwas flexibler, denn das Mapping und auch die Konfiguration lassen sich theoretisch so natürlich auch dynamisch erzeugen. Die Benutzung von LINQ erleichtert die Abfragen ungemein. Fluent NHibernate macht die Konfiguration und das Mapping lesbarer. &lt;/P&gt;
&lt;P&gt;Ich denke mit den beiden oben vorgestellten Erweiterungen ist NHibernate wirklich eines der genialsten OR-Mapper.&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#ff0000&gt;&lt;STRONG&gt;Update:&lt;/STRONG&gt;&lt;BR&gt;&lt;/FONT&gt;Das Beispielprojekt gibt es hier zum herunterladen: &lt;A href="http://www.aspnetzone.de/files/folders/213409/download.aspx"&gt;NHibernateTestApplication.zip&lt;/A&gt; (2.4MB)&lt;/P&gt;
&lt;DIV style="TEXT-ALIGN:left;PADDING-BOTTOM:4px;MARGIN:0px;PADDING-LEFT:4px;PADDING-RIGHT:4px;PADDING-TOP:4px;" class=wlWriterHeaderFooter&gt;&lt;A href="http://dotnet-kicks.de/kick/?url=http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/09/28/zweiter-start-mit-nhibernate.aspx"&gt;&lt;IMG border=0 alt="DotNetKicks-DE Image" src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/09/28/zweiter-start-mit-nhibernate.aspx&amp;amp;bgcolor=3169AD&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000"&gt;&lt;/A&gt;&lt;/DIV&gt;&lt;img src="http://www.aspnetzone.de/aggbug.aspx?PostID=213402" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=Fpbf3tn-F8s:ZKZGqomAY08:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=Fpbf3tn-F8s:ZKZGqomAY08:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?i=Fpbf3tn-F8s:ZKZGqomAY08:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=Fpbf3tn-F8s:ZKZGqomAY08:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?i=Fpbf3tn-F8s:ZKZGqomAY08:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=Fpbf3tn-F8s:ZKZGqomAY08:mNpC_eAfmKU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?d=mNpC_eAfmKU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jgutsch/~4/Fpbf3tn-F8s" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/09/28/zweiter-start-mit-nhibernate.aspx</feedburner:origLink></item><item><title>jQuery Visual Cheat Sheet</title><link>http://feedproxy.google.com/~r/jgutsch/~3/MOj_YLcporU/jquery-visual-cheat-sheet.aspx</link><category>Interessante Ressourcen</category><category>Neuigkeiten</category><category>jQuery</category><category>Cheat Sheet</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Jürgen Gutsch</dc:creator><pubDate>Thu, 24 Sep 2009 23:33:31 PDT</pubDate><guid isPermaLink="false">http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/09/25/jquery-visual-cheat-sheet.aspx</guid><description>&lt;p&gt;Von &lt;a href="http://woork.blogspot.com/" target="_blank"&gt;Antonio Lupetti&lt;/a&gt; gibt es ein recht ausführliches &lt;a title="jQuery" href="http://jquery.com/" target="_blank"&gt;jQuery&lt;/a&gt; Cheat Sheet zum kostenlosen Download. Das Cheaat Sheet enthält eine Übersicht über die wichtigsten jQuery Funktionen, sowie jQuery Selektoren und einige Beispiele zur Anwendung der Funktionen:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://woork.blogspot.com/2009/09/jquery-visual-cheat-sheet.html" href="http://woork.blogspot.com/2009/09/jquery-visual-cheat-sheet.html"&gt;http://woork.blogspot.com/2009/09/jquery-visual-cheat-sheet.html&lt;/a&gt;&lt;/p&gt;&lt;div class="wlWriterHeaderFooter" style="text-align:left;margin:0px;padding:4px 4px 4px 4px;"&gt;&lt;a href="http://dotnet-kicks.de/kick/?url=http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/09/25/jquery-visual-cheat-sheet.aspx"&gt;&lt;img src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/09/25/jquery-visual-cheat-sheet.aspx&amp;amp;bgcolor=3169AD&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000" alt="DotNetKicks-DE Image" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.aspnetzone.de/aggbug.aspx?PostID=213330" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=MOj_YLcporU:UFYv6dXWVn8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=MOj_YLcporU:UFYv6dXWVn8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?i=MOj_YLcporU:UFYv6dXWVn8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=MOj_YLcporU:UFYv6dXWVn8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?i=MOj_YLcporU:UFYv6dXWVn8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=MOj_YLcporU:UFYv6dXWVn8:mNpC_eAfmKU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?d=mNpC_eAfmKU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jgutsch/~4/MOj_YLcporU" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/09/25/jquery-visual-cheat-sheet.aspx</feedburner:origLink></item><item><title>VSTS beim .NET-Stammtisch Konstanz-Kreuzlingen</title><link>http://feedproxy.google.com/~r/jgutsch/~3/pEfZK_lM4fI/vsts-beim-net-stammtisch-konstanz-kreuzlingen.aspx</link><category>Community</category><category>TFS</category><category>Stammtisch</category><category>VSTS</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Jürgen Gutsch</dc:creator><pubDate>Wed, 26 Aug 2009 00:55:57 PDT</pubDate><guid isPermaLink="false">http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/08/26/vsts-beim-net-stammtisch-konstanz-kreuzlingen.aspx</guid><description>&lt;p&gt;&lt;a href="http://www.dotnetkk.de/"&gt;&lt;img style="border-bottom-style:none;border-right-style:none;border-top-style:none;margin-bottom:5px;border-left-style:none;margin-right:5px;" align="left" src="http://www.aspnetzone.de/photos/juergengutsch/images/206171/original.aspx" /&gt;&lt;/a&gt;Etwas verspätet liefere ich hier noch einen kurzer Rückblick auf das &lt;a href="http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/07/29/sechstes-treffen-des-net-stammtisch-konstanz-kreuzlingen.aspx"&gt;sechste Treffen&lt;/a&gt; des &lt;a title=".NET-Stammtisch Konstanz-Kreuzlingen" href="http://www.dotnetkk.de/"&gt;.NET-Stammtisch Konstanz-Kreuzlingen&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Wie immer bin ich um 18:30Uhr im Raum F023 in der FH-Konstanz angekommen um die Session vorzubereiten. Strom und Beamer zu prüfen und die Videokamera aufzustellen. Diesmal war ich nicht der erste, denn &lt;a href="http://www.artiso.com/problog/"&gt;Thomas&lt;/a&gt; stand schon drin und richtete den Laptop für seine Präsentation.&lt;/p&gt;  &lt;p&gt;Thomas zeigte viele Neuerungen in den VSTS 2010 auch anhand einiger live Demos.&lt;/p&gt;  &lt;p&gt;Als beeindrucktesten Neuerungen empfand ich die hierarchischen Workitems, sowie die viel Bessere Unterstützung der Tester unter anderem auch mit dem neuen Workitem-Typ “Testcase”, den Testaufzeichnungen und dem Videomitschnitt während des Testens. Der Entwickler kann so fehlgeschlagenen Tests nachvollziehen und muss unter Umständen nicht lange nach dem Fehler suchen. Auch für die Architekten wurden einige Neuerungen hinzugefügt.&lt;/p&gt;  &lt;p&gt;Insgesamt werde ich wohl jedem empfehlen VSTS 2010 einzusetzen, bzw. auf die neue Version updaten, sobald sie Verfügbar ist.&lt;/p&gt;  &lt;p&gt;Das Video und die Bilder zum Vortrag werde ich in den nächsten Wochen auf der Website des &lt;a title=".NET-Stammtisch Konstanz-Kreuzlingen" href="http://www.dotnetkk.de/"&gt;.NET-Stammtisch &lt;/a&gt;veröffentlichen.&lt;/p&gt;  &lt;p&gt;Anschließend gingen wir alle in das &lt;a href="http://www.brauhaus-joh-albrecht.de/data/kon.php"&gt;Brauhaus&lt;/a&gt; wo wir in gemütlicher Atmosphäre, bei Frischgebrautem, weiter zum Thema Diskutieren konnten.&lt;/p&gt;  &lt;p&gt;Danke nochmal an Thomas, dass er extra wegen uns aus Erlangen, zu uns nach Konstanz runter geheizt ist. :-)&lt;/p&gt;&lt;div class="wlWriterHeaderFooter" style="text-align:left;margin:0px;padding:4px 4px 4px 4px;"&gt;&lt;a href="http://dotnet-kicks.de/kick/?url=http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/08/26/vsts-beim-net-stammtisch-konstanz-kreuzlingen.aspx"&gt;&lt;img src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/08/26/vsts-beim-net-stammtisch-konstanz-kreuzlingen.aspx&amp;amp;bgcolor=3169AD&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000" alt="DotNetKicks-DE Image" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.aspnetzone.de/aggbug.aspx?PostID=212453" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=pEfZK_lM4fI:zSYba86aUkQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=pEfZK_lM4fI:zSYba86aUkQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?i=pEfZK_lM4fI:zSYba86aUkQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=pEfZK_lM4fI:zSYba86aUkQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?i=pEfZK_lM4fI:zSYba86aUkQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=pEfZK_lM4fI:zSYba86aUkQ:mNpC_eAfmKU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?d=mNpC_eAfmKU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jgutsch/~4/pEfZK_lM4fI" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/08/26/vsts-beim-net-stammtisch-konstanz-kreuzlingen.aspx</feedburner:origLink></item><item><title>Grenzfälle – Wann ist Code Clean?</title><link>http://feedproxy.google.com/~r/jgutsch/~3/ppkQFhuJVT8/grenzf-lle-wann-ist-code-clean.aspx</link><category>C#</category><category>Clean Code Developer</category><category>Clean Code</category><category>ExtensionMethods</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Jürgen Gutsch</dc:creator><pubDate>Thu, 20 Aug 2009 02:20:00 PDT</pubDate><guid isPermaLink="false">http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/08/20/grenzf-lle-wann-ist-code-clean.aspx</guid><description>&lt;P&gt;Aus meinem &lt;A title="LINQ to XML: Queries auf XML mit Namespaces" href="http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/08/13/linq-to-xml-querys-auf-xml-mit-namespaces.aspx"&gt;letzten Blogpost&lt;/A&gt; entwickelte sich eine interessante Diskussion zum Thema &lt;A title="Clean Code" href="http://astore.amazon.de/gutschonline-21/detail/0132350882"&gt;Clean Code&lt;/A&gt;. &lt;/P&gt;
&lt;P&gt;Im Grunde ging es in dem Blogpost darum, dass ich mich beschwerte, dass es in LINQ to XML keine “saubere” Möglichkeit gibt XElements mit Namespaces abzufragen. Außer&amp;nbsp; mit einer vom &lt;A title="Peter Bucher: Auf den Spuren von .NET" href="http://www.aspnetzone.de/blogs/peterbucher/default.aspx"&gt;Peter&lt;/A&gt; zur Verfügung gestellten Extension Method. &lt;/P&gt;
&lt;P&gt;&lt;A title="René 's Weblog" href="http://weblog.drescher-hackel.de/"&gt;René&lt;/A&gt; wies mich per Kommentar darauf hin, dass man auch die statische Methode XName.Get() verwenden könne um Namen für &lt;A title=XElement href="http://msdn.microsoft.com/en-us/library/system.xml.linq.xelement.aspx" target=_blank&gt;XElement&lt;/A&gt;e mit Namespaces zu generieren.&lt;/P&gt;
&lt;P&gt;Ich übernahm Renés Idee wie folgt: &lt;BR&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;XDocument xdoc &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; XDocument.Load(xmlResponseReader);  &lt;br /&gt;XName xname &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; XName.Get(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"multistatus"&lt;/span&gt;, &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"DAV:"&lt;/span&gt;); &lt;br /&gt;XElement xelement &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; xdoc.Element(xname);&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Damit ging die ganze Diskussion los :-)&lt;/P&gt;
&lt;P&gt;René war nun der Ansicht, dass diese drei Zeilen nicht Clean Code seien, da die Erzeugung einer separaten Variablen, die den Wert aus der statischen Methode zugewiesen bekommt, unnötig sei. &lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;René schrieb:&lt;/STRONG&gt; &lt;BR&gt;&lt;EM&gt;In Bezug auf statische Methode bleibe ich aber bei der Aussage, dass wenn ich den Wert nur 1 mal benötige, dann rufe ich die Methode direkt auf, andernfalls nutze ich einen zusätzlichen Parameter.&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;René hat absolut recht, was die gezeigten Codes angeht. Die sind klein genug :-)&lt;/P&gt;
&lt;P&gt;René und ich haben allerdings nun die unterschiedlichen Anforderungen nicht Berücksichtigt. Der im Blogpost dargestellte Code war natürlich vereinfacht, um das Prinzip zu veranschaulichen. In Wirklichkeit habe ich ein relativ großes XML mit verschiedensten Elementen deren Werte ich abfragen möchte.&lt;/P&gt;
&lt;P&gt;Um jetzt mehrere &lt;A title=XElement href="http://msdn.microsoft.com/en-us/library/system.xml.linq.xelement.aspx" target=_blank&gt;XElement&lt;/A&gt;e abzufragen, sähe der Code nach Renés variante so aus: &lt;BR&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt; nsDAV &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; “DAV:”; &lt;br /&gt;Folder inboxFolder &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;new&lt;/span&gt; Folder(); &lt;br /&gt;inboxFolder.HRef &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; xfolder.Element(XName.Get(“href”, nsDAV)).Value; &lt;br /&gt;inboxFolder.DisplayName= xfolder.Element(XName.Get(“displayname”, nsDAV)).Value; &lt;br /&gt;inboxFolder.FolderSize= xfolder.Element(XName.Get(“foldersize”, nsDAV)).Value; &lt;br /&gt;inboxFolder.HasChildren= xfolder.Element(XName.Get(“haschildren”, nsDAV)).Value; &lt;br /&gt;inboxFolder.HasSubs= xfolder.Element(XName.Get(“hassubs”, nsDAV)).Value; &lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// …&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Eine Variable vom Typ &lt;A title="XName Class" href="http://msdn.microsoft.com/en-us/library/system.xml.linq.xname.aspx"&gt;XName&lt;/A&gt; zu erstellen macht hier natürlich keinen Sinn&lt;/P&gt;
&lt;P&gt;Aus meiner Sicht bläht diese statische Methode den Code allerdings mehr auf, als die gezeigten Extension Methods: &lt;BR&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;XNamespace nsDAV &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"DAV:"&lt;/span&gt;; &lt;br /&gt;Folder inboxFolder &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;new&lt;/span&gt; Folder(); &lt;br /&gt;inboxFolder.HRef &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; xfolder.Element(nsDAV, “href”).Value; &lt;br /&gt;inboxFolder.DisplayName= xfolder.Element(nsDAV, “displayname”).Value; &lt;br /&gt;inboxFolder.FolderSize= xfolder.Element(nsDAV, “foldersize”).Value; &lt;br /&gt;inboxFolder.HasChildren= xfolder.Element(nsDAV, “haschildren”).Value; &lt;br /&gt;inboxFolder.HasSubs= xfolder.Element(nsDAV, “hassubs”).Value; &lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// …&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Zurück zum Clean Code: René war der Meinung das es kein Clean Code sei, wenn ich eine separate Variablenzuweisung schreibe. Ich dagegen bin der Meinung, dass man lieber zwei Zeilen schreiben sollte, als zu viele Anweisungen in eine Zeile zu setzen. Ich bin der Meinung das Der Code für &lt;STRONG&gt;jeden&lt;/STRONG&gt; vor allem &lt;STRONG&gt;einfach&lt;/STRONG&gt; lesbar sein sollte. Je mehr Anweisungen in einer Zeile zu finden sind, desto länger verharrt der “Leser” in der Zeile und desto schwieriger ist es die Zeile schnell zu verstehen. (Und mir ist es dabei egal, ob der Leser ein Einsteiger oder ein erfahrener Entwickler ist)&lt;/P&gt;
&lt;P&gt;Natürlich kann es auch hier Ausnahmen geben. In dem letzten Code (oben) habe ich die Ermittlung des XElements und das Auslesen dessen Wertes in eine Zeile gesetzt. Hier wird allerdings auch der Lesefluss nicht beeinträchtigt: &lt;BR&gt;&lt;A title=XElement href="http://msdn.microsoft.com/en-us/library/system.xml.linq.xelement.aspx" target=_blank&gt;XElement&lt;/A&gt; ermitteln =&amp;gt; seinen Wert auslesen&lt;/P&gt;
&lt;P&gt;An der Stelle habe ich natürlich die extremen Ansicht von &lt;A title="Robert C. Martin" href="http://www.objectmentor.com/omTeam/martin_r.html"&gt;Robert C. Martin&lt;/A&gt; übernommen, der in seinem Buch &lt;A title="Clean Code" href="http://astore.amazon.de/gutschonline-21/detail/0132350882"&gt;Clean Code&lt;/A&gt; schreibt, man solle den Code wie einen Zeitungsartikel lesen können. Das setzt nicht nur Lesbarkeit voraus, sondern auch die Einhaltung eines Lesefluss.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;Nebenbei:&lt;/STRONG&gt; ReSharper beeinflusst: Habe gerade versucht im Live Writer einen Schreibfehler mit [Alt][Enter] zu korrigieren *fg*&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;René schrieb:&lt;/STRONG&gt; &lt;BR&gt;&lt;EM&gt;Mein Verständnis von "Clean Code" fängt da an, wo der Code optimiert ist, funktionell korrekt und verständlich. Wenn ich nur den Schwerpunkt auf Verständlichkeit lege, dann hat das wenig mit "Clean Code" im eigentlichen Sinne zu tun.&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Clean Code entsteht nur aus einem längeren Prozess heraus und kann nicht einfach so erzeugt, bzw. geschrieben werden. Clean Code entsteht unter anderem durch die Einhaltung der Prinzipien und Regeln des &lt;A title="Clean Code Developer" href="http://clean-code-developer.de/"&gt;CCD&lt;/A&gt;. Clean Code entsteht dabei vor allem aus Wiederholungen von Reviews und &lt;A title="Wikipedia: Refactoring" href="http://de.wikipedia.org/wiki/Refactoring"&gt;Refactoring&lt;/A&gt;. Natürlich muss die Funktionalität des Codes immer im Vordergrund stehen, aber beim nachträglichen Bearbeiten seines Codes sollte nach und nach auch an der Lesbarkeit des Codes gearbeitet werden.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;Pfadfinderregel:&lt;/STRONG&gt; &lt;BR&gt;&lt;EM&gt;Verlasse einen Ort sauberer, als du ihn vorgefunden hast.&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;Zu Ralfs Uommentar:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Jetzt ich gehe mal schnell auf den Kommentar von &lt;A title="Ralf Westphal" href="http://www.ralfw.de"&gt;Ralf Westphal&lt;/A&gt; ein:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;Ralf schrieb:&lt;/STRONG&gt; &lt;BR&gt;&lt;EM&gt;Ob&lt;/EM&gt; &lt;BR&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;XDocument xdoc &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; XDocument.Load(xmlResponseReader); &lt;br /&gt;XElement xelement &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; xdoc.Element(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"{DAV:}multistatus"&lt;/span&gt;);&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;wirklich viel umständlicher ist &lt;BR&gt;&lt;/EM&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;XDocument xdoc &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; XDocument.Load(xmlResponseReader); &lt;br /&gt;XNamespace ns &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"DAV:"&lt;/span&gt;; &lt;br /&gt;XElement xelement &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; xdoc.Element(ns, &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"multistatus"&lt;/span&gt;);&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;wage ich eigentlich nicht zu beurteilen.&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Stichwort: Redundanzen ;-) &lt;BR&gt;Der Namespace “DAV:” kann öfter vorkommen. Ihn jedes Mal angeben zu müssen ist mühsam. Zudem lenkt der Namespace vom eigentlichen Elementnamen ab. Zumindest ist das die Erfahrung beim schreiben des Codes. Wenn man allerdings nur diese kleinen Codesnippets für sich betrachtet ist es wirklich egal.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;Ralf schrieb: &lt;BR&gt;&lt;/STRONG&gt;&lt;EM&gt;Mir schiene jedoch eine Ext Meth, der ich keinen Namespace übergeben muss, noch geeigneter:&lt;/EM&gt; &lt;BR&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;XDocument xdoc &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; XDocument.Load(xmlResponseReader); &lt;br /&gt;XElement xelement &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; xdoc.Element(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"DAV:"&lt;/span&gt;, &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"multistatus"&lt;/span&gt;);&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Bei so einer Extension Methode sehe ich keine Probleme. Allerdings arbeite ich in der Regel ungerne mit Strings, wenn es sich vermeiden lässt. Wenn es ein Objekt gibt versuche ich dieses zu nutzen.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;Ralf schrieb:&lt;/STRONG&gt; &lt;BR&gt;&lt;EM&gt;An CCD wurde die Frage gestellt, ob 1 Statement pro Zeile angezeigt sei.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Meine Meinung dazu: da ist unter dem Radar von CCD&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Logisch, das ist ja auch nicht Aufgabe des CCD das zu definieren. Wie oben bereits geschrieben gibt an dieser Stelle Robert C. Martin eine Empfehlung wie der Code seiner Ansicht nach am besten auszusehen hat. CCD verweist ja lediglich auf sein Buch.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;Ralf schrieb:&lt;/STRONG&gt; &lt;BR&gt;&lt;EM&gt;Was der eine oder andere für lesbar hält, fällt in die Nähe eines Geschmacksurteils…&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Im Detail, ja.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;STRONG&gt;Ralf schrieb:&lt;/STRONG&gt; &lt;BR&gt;&lt;EM&gt;Das Gesamtbild muss stimmen. Und das kann im Detail dann auch mal unterschiedlich aussehen&lt;/EM&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Logisch.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;STRONG&gt;Ralf schrieb:&lt;/STRONG&gt; &lt;BR&gt;&lt;EM&gt;Ich wäre zwar nicht allzu traurig, wenn C# nicht mehr als eine Anweisung pro Zeile zuließe, doch ich nehme gern auch die Möglichkeit mit, dass es mehrere sein dürfen.&lt;/EM&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Dem kann ich nur zustimmen…&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;Ralf schrieb:&lt;/STRONG&gt; &lt;BR&gt;&lt;EM&gt;Noch ein Wort zu statischen Methoden, die in der Diskussion auftauchten. Wenn die im API drinstecken, dann kann man nix machen. Sollten wir selbst aber statische Methoden schreiben? Eher nicht. (Auch wenn R# immer mal wieder vorschlägt, eine Methode statisch zu machen.) Der Grund: static methods don´t compose.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Da statische Methoden keine Interfacemethoden implementieren können, kann man ihre Funktionalität nicht gut injizieren. (Von Funktionszeigern darauf sehe ich mal ab.)&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Dito…&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Zeilenlänte und Schachtelungstiefe&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Und damit damit folgende Aussage – die nicht ganz zum Ursprünglichen Thema passt - nicht in den Untiefen der Kommentarfunktion verloren geht, nehme ich sie ebenfalls hier mit rein.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;Ralf schrieb:&lt;/STRONG&gt; &lt;BR&gt;&lt;EM&gt;Wichtiger finde ich zwei andere Dimensionen:&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;-Zeilenlänge&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;-Schachtelungstiefe&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Eine Zeile mit wievielen Anweisungen auch immer sollte nicht über eine normale Editorfensterbreite hinausgehen. Wenn man scrollen muss, dann sinkt die Verständlichkeit bzw. die Aufnahmegeschwindigkeit rapide.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Und ich finde Schachtelungen beobachtenswert. Es ist ein Unterschied, ob ich&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;A(B(C()));&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;oder&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;var c=C();&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;var b=B(c);&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;A(b);&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;schreibe. Letzteres macht mehr Aufwand, ist aber flüssiger zu lesen, weil man von oben nach unten lesen kann.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Bei der Schachtelung kehrt sich die Leserichtung quasi um: man muss von innen nach außen, d.h. eher von rechts nach links lesen. Das hakt schnell mal. Da hilft auch eine andere Schreibweise nicht viel wie&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;A(&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;B(&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp; C()&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&amp;nbsp; )&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;);&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Deshalb bin ich ja ein Freund von Flow-APIs oder allgm Fluent Interfaces. Die machen nicht nur bei async Verarbeitung das Verständnis und die Notation einfacher.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Wer die Variablen b und c scheut, der könnte doch vielleicht so lesbarer schreiben:&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;C | B | A&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Das ist in C# natürlich nicht so recht möglich. Wie wäre es jedoch mit:&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Flow&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;.From(C)&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;.To(B)&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;.To(A)&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;.Execute();&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Sieht für so ein kleines Beispiel etwas überkandidelt aus. Aber wenn die Szenarien größer werden, halte ich das für ein unterschätztes Programmiermodell.&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;Ich bedanke mich bei allen beteiligten für die anregende Diskussion.&lt;/STRONG&gt; Ich finde es immer wieder schön, wenn ein einfacher Blogpsot so eine Diskussion losreißen kann.&lt;/P&gt;
&lt;DIV style="TEXT-ALIGN:left;PADDING-BOTTOM:4px;MARGIN:0px;PADDING-LEFT:4px;PADDING-RIGHT:4px;PADDING-TOP:4px;" class=wlWriterHeaderFooter&gt;&lt;A href="http://dotnet-kicks.de/kick/?url=http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/08/20/grenzf-lle-wann-ist-code-clean.aspx"&gt;&lt;IMG border=0 alt="DotNetKicks-DE Image" src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/08/20/grenzf-lle-wann-ist-code-clean.aspx&amp;amp;bgcolor=3169AD&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000"&gt;&lt;/A&gt;&lt;/DIV&gt;&lt;img src="http://www.aspnetzone.de/aggbug.aspx?PostID=212335" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=ppkQFhuJVT8:saHwrow-wEA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=ppkQFhuJVT8:saHwrow-wEA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?i=ppkQFhuJVT8:saHwrow-wEA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=ppkQFhuJVT8:saHwrow-wEA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?i=ppkQFhuJVT8:saHwrow-wEA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=ppkQFhuJVT8:saHwrow-wEA:mNpC_eAfmKU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?d=mNpC_eAfmKU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jgutsch/~4/ppkQFhuJVT8" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/08/20/grenzf-lle-wann-ist-code-clean.aspx</feedburner:origLink></item><item><title>LINQ to XML: Queries auf XML mit Namespaces</title><link>http://feedproxy.google.com/~r/jgutsch/~3/ET-m2XxDJJA/linq-to-xml-querys-auf-xml-mit-namespaces.aspx</link><category>Wissenswertes</category><category>ASP.NET</category><category>XML</category><category>C#</category><category>Tutorials</category><category>LINQ</category><category>.NET 3.5</category><category>Tipps und Tricks</category><category>LINQtoXML</category><category>ExtensionMethods</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Jürgen Gutsch</dc:creator><pubDate>Thu, 13 Aug 2009 02:30:00 PDT</pubDate><guid isPermaLink="false">http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/08/13/linq-to-xml-querys-auf-xml-mit-namespaces.aspx</guid><description>&lt;P&gt;Beim Zugriff auf XML mit bestimmten XML-Namespaces kommt es beim herkömmlichen Queries zu einem Fehler. Wie auch beim XMLDoxument muss beim den Abfragen auf bestimmte Knoten ein Namespace angegeben werden.&lt;/P&gt;
&lt;P&gt;Ausgangspunkt bei mir ist eine Abfrage per WebDAV auf einen Exchange Server, bei der ich ungefähr folgende Antwort erhalte: &lt;BR&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;xml&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;version&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="1.0"&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;?&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;a:multistatus&lt;/span&gt; &lt;br /&gt;    &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;xmlns:b&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/"&lt;/span&gt; &lt;br /&gt;    &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;xmlns:d&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="urn:schemas:httpmail:"&lt;/span&gt; &lt;br /&gt;    &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;xmlns:c&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="xml:"&lt;/span&gt; &lt;br /&gt;    &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;xmlns:a&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="DAV:"&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;a:response&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;a:href&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt;http://mdomain/exchange/Account/&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;a:href&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt;  &lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;a:propstat&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt;  &lt;br /&gt;      &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;a:status&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt;HTTP/1.1 200 OK&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;a:status&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt;  &lt;br /&gt;      &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;a:prop&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;      &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;a:prop&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;a:propstat&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;a:response&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;a:multistatus&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Folgende Abfrage liefert einen Fehler: &lt;BR&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;XDocument xdoc &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; XDocument.Load(xmlResponseReader); &lt;br /&gt;XElement xelement &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; xdoc.Element(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"a:multistatus"&lt;/span&gt;);&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;BLOCKQUOTE style="MARGIN-RIGHT:0px;" dir=ltr&gt;
&lt;P&gt;&lt;EM&gt;XmlException: The ':' character, hexadecimal value 0x3A, cannot be included in a name.&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Um das Element nun fehlerfrei zu erhalten muss es wie folgt abgefragt werden: &lt;BR&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;XDocument xdoc &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; XDocument.Load(xmlResponseReader); &lt;br /&gt;XElement xelement &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; xdoc.Element(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"{DAV:}multistatus"&lt;/span&gt;);&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Damit haben wir den – aus meiner Sicht - ersten und einzigen, aber recht großen Nachteil von LINQ to XML gefunden: Die Namespaces müssen direkt in den Namen des Elements eingegeben werden.&lt;/P&gt;
&lt;P&gt;Die &lt;A title="How to: Write Queries on XML in Namespaces" href="http://msdn.microsoft.com/en-us/library/bb669152.aspx"&gt;Lösung die in der MSDN angeboten wird&lt;/A&gt;, ist auch nicht besser: &lt;BR&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;XDocument xdoc &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; XDocument.Load(xmlResponseReader); &lt;br /&gt;XNamespace a &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"DAV:"&lt;/span&gt;; &lt;br /&gt;XElement xelement &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; xdoc.Element(a &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;+&lt;/span&gt; &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"multistatus"&lt;/span&gt;);&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Mir stellt sich hier die Frage: Wieso erstelle ich ein XNamespace-Object wenn ich es dann doch per String-Gebastel in den Elementnamen einbauen muss. Der &lt;A title="You Have *GOT* To Be Kidding Me!" href="http://msdn.microsoft.com/en-us/library/bb669152.aspx#CommunityContent"&gt;Kommentator in der MSDN Dokumentation&lt;/A&gt; ist ganz offensichtlich der selben Meinung.&lt;/P&gt;
&lt;P&gt;&lt;A title="Peter Bucher: Auf den Spuren von .NET" href="http://www.aspnetzone.de/blogs/peterbucher/default.aspx"&gt;Peter&lt;/A&gt; hat für dieses Problem eine kleine elegante Lösung, indem er für die Methoden &lt;A title="XContainer.Element Method" href="http://msdn.microsoft.com/en-us/library/system.xml.linq.xcontainer.element.aspx"&gt;Element&lt;/A&gt; und &lt;A title="XContainer.Elements Method" href="http://msdn.microsoft.com/en-us/library/system.xml.linq.xcontainer.elements.aspx"&gt;Elements&lt;/A&gt; jeweils eine &lt;A title="Neues .NET 3.5 Feature: Extension Methods" href="http://www.aspnetzone.de/blogs/juergengutsch/archive/2007/11/14/neues-net-3-5-feature-extension-methods.aspx"&gt;Extension Methode&lt;/A&gt; geschrieben hat: &lt;BR&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;static&lt;/span&gt; IEnumerable&amp;lt;XElement&amp;gt; Elements( &lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;this&lt;/span&gt; XContainer source, &lt;br /&gt;    XNamespace ns, &lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt; name) &lt;br /&gt;{ &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;return&lt;/span&gt; source.Elements(ns &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;+&lt;/span&gt; name); &lt;br /&gt;} &lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;static&lt;/span&gt; XElement Element( &lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;this&lt;/span&gt; XContainer source, &lt;br /&gt;    XNamespace ns, &lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt; name) &lt;br /&gt;{ &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;return&lt;/span&gt; source.Element(ns &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;+&lt;/span&gt; name); &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;So kann ich wenigstens außerhalb der Extension Methoden ohne String-Gebastel auskommen: &lt;BR&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;XDocument xdoc &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; XDocument.Load(xmlResponseReader); &lt;br /&gt;XNamespace a &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"DAV:"&lt;/span&gt;; &lt;br /&gt;XElement xelement &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; xdoc.Element(a, &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"multistatus"&lt;/span&gt;);&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://weblog.drescher-hackel.de/"&gt;René&lt;/A&gt; hat mich per Kommentar darauf hingewiesen, dass man die Elemente natürlich auch per &lt;A href="http://msdn.microsoft.com/de-de/library/bb299741.aspx"&gt;XName&lt;/A&gt; abfragen kann. Das ganze sieht dann so aus:&lt;BR&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;XDocument xdoc &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; XDocument.Load(xmlResponseReader); &lt;br /&gt;XName xname &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; XName.Get(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"multistatus"&lt;/span&gt;, &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"DAV:"&lt;/span&gt;); &lt;br /&gt;XElement xelement &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; xdoc.Element(xname);&lt;/span&gt;&lt;/code&gt;&lt;BR&gt;&lt;/P&gt;
&lt;DIV style="TEXT-ALIGN:left;PADDING-BOTTOM:4px;MARGIN:0px;PADDING-LEFT:4px;PADDING-RIGHT:4px;PADDING-TOP:4px;" class=wlWriterHeaderFooter&gt;&lt;A href="http://dotnet-kicks.de/kick/?url=http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/08/13/linq-to-xml-querys-auf-xml-mit-namespaces.aspx"&gt;&lt;IMG border=0 alt="DotNetKicks-DE Image" src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/08/13/linq-to-xml-querys-auf-xml-mit-namespaces.aspx&amp;amp;bgcolor=3169AD&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000"&gt;&lt;/A&gt;&lt;/DIV&gt;&lt;img src="http://www.aspnetzone.de/aggbug.aspx?PostID=212145" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=ET-m2XxDJJA:qFvq18-bpHE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=ET-m2XxDJJA:qFvq18-bpHE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?i=ET-m2XxDJJA:qFvq18-bpHE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=ET-m2XxDJJA:qFvq18-bpHE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?i=ET-m2XxDJJA:qFvq18-bpHE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=ET-m2XxDJJA:qFvq18-bpHE:mNpC_eAfmKU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?d=mNpC_eAfmKU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jgutsch/~4/ET-m2XxDJJA" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/08/13/linq-to-xml-querys-auf-xml-mit-namespaces.aspx</feedburner:origLink></item><item><title>Sechstes Treffen des .NET-Stammtisch Konstanz-Kreuzlingen</title><link>http://feedproxy.google.com/~r/jgutsch/~3/y37gcHq5SC8/sechstes-treffen-des-net-stammtisch-konstanz-kreuzlingen.aspx</link><category>Community</category><category>Neuigkeiten</category><category>TFS</category><category>Stammtisch</category><category>VSTS</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Jürgen Gutsch</dc:creator><pubDate>Wed, 29 Jul 2009 00:34:51 PDT</pubDate><guid isPermaLink="false">http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/07/29/sechstes-treffen-des-net-stammtisch-konstanz-kreuzlingen.aspx</guid><description>&lt;p&gt;&lt;a href="http://www.dotnetkk.de/"&gt;&lt;img style="border-bottom-style:none;border-right-style:none;border-top-style:none;margin-bottom:5px;border-left-style:none;margin-right:5px;" align="left" src="http://www.aspnetzone.de/photos/juergengutsch/images/206171/original.aspx" /&gt;&lt;/a&gt;Das &lt;a href="http://dotnetkk.de/Appointments/Details/sechstes-treffen-des-net-stammtisch-konstanz-kreuzlingen"&gt;sechste .NET-Stammtisch Treffen&lt;/a&gt; findet mit &lt;a href="http://www.artiso.com/problog/"&gt;Thomas Schissler&lt;/a&gt; und folgendem Thema statt:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Überblick über VSTS 2010.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Mit Visual Studio Team System 2010 bring Microsoft eine neue Generation seiner Entwicklungsplattform auf den Markt.&lt;/p&gt;  &lt;p&gt;Neben einer großen Anzahl von Verbesserungen bring VSTS 2010 und das Backendsystem TFS 2010 auch völlig neue Funktionen und Möglichkeiten mit. Der Vortrag beleuchtet die verschiedenen Bereiche und stellt jeweils die wichtigsten Neuerungen vor. Diese werden mit verschiedenen Praxisbeispielen plastisch erläutert. &lt;/p&gt;  &lt;p&gt;Thomas ist Leiter die Software-Entwicklung bei der Artiso AG in Ulm, Gründungsmitglied und Team-Leader der .NET Developer-Group Ulm und MVP für den Bereich Team System. Desweiteren ist Thomas viel als Sprecher auf großen Konferenzen und in User Group unterwegs. Das Weblog von Thomas, mit vielen Beiträgen zum Thema VSTS, ist unter folgender URL zu finden: &lt;a href="http://www.artiso.com/problog/"&gt;http://www.artiso.com/problog/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;a href="http://dotnetkk.de/News/Details/aenderungen-im-ablauf-der-veranstaltungen"&gt;Änderung im Ablauf der Veranstaltungen&lt;/a&gt;       &lt;br /&gt;&lt;/strong&gt;Wir halten es in Zukunft so, dass es bei jedem Treffen nur einen Vortrag gibt, anschließend jedoch genügend Zeit bleibt um bei einem Bierchen darüber zu diskutieren, damit die Teilnehmer auch aktiv werden und die Sprechern Feedback empfangen und zusätzliche Fragen beantworten können.&lt;/p&gt;&lt;div class="wlWriterHeaderFooter" style="text-align:left;margin:0px;padding:4px 4px 4px 4px;"&gt;&lt;a href="http://dotnet-kicks.de/kick/?url=http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/07/29/sechstes-treffen-des-net-stammtisch-konstanz-kreuzlingen.aspx"&gt;&lt;img src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/07/29/sechstes-treffen-des-net-stammtisch-konstanz-kreuzlingen.aspx&amp;amp;bgcolor=3169AD&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000" alt="DotNetKicks-DE Image" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.aspnetzone.de/aggbug.aspx?PostID=211779" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=y37gcHq5SC8:6J_umrIow0k:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=y37gcHq5SC8:6J_umrIow0k:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?i=y37gcHq5SC8:6J_umrIow0k:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=y37gcHq5SC8:6J_umrIow0k:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?i=y37gcHq5SC8:6J_umrIow0k:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=y37gcHq5SC8:6J_umrIow0k:mNpC_eAfmKU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?d=mNpC_eAfmKU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jgutsch/~4/y37gcHq5SC8" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/07/29/sechstes-treffen-des-net-stammtisch-konstanz-kreuzlingen.aspx</feedburner:origLink></item><item><title>Jan Welker über dotnet-kicks.de</title><link>http://feedproxy.google.com/~r/jgutsch/~3/Vc06S1uxZ8I/jan-welker-ber-dotnet-kicks-de.aspx</link><category>Wissenswertes</category><category>Community</category><category>Interessante Ressourcen</category><category>dotnet-kicks.de</category><category>Open Space</category><category>Video</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Jürgen Gutsch</dc:creator><pubDate>Tue, 28 Jul 2009 05:53:58 PDT</pubDate><guid isPermaLink="false">http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/07/28/jan-welker-ber-dotnet-kicks-de.aspx</guid><description>&lt;a href="http://dotnet-kicks.de"&gt;&lt;img style="border-bottom-style:none;border-right-style:none;border-top-style:none;border-left-style:none;" alt="dotnet-kicks.de" src="http://dotnet-kicks.de/dnk_logo.gif" /&gt;&amp;#160;&lt;/a&gt;   &lt;p&gt;So, so… Da hat &lt;a title="Dariusz quatscht" href="http://blogs.msdn.com/dparys/"&gt;Dariusz Paris&lt;/a&gt; also auch den &lt;a title="Jan Welker" href="http://blog.jan-welker.de"&gt;Jan Welker&lt;/a&gt; beim &lt;a title=".NET Open Space Süd" href="http://ulm.netopenspace.de/2009/MainPage.ashx"&gt;.NET Open Space Süd&lt;/a&gt; erwischt und interviewt ihn hier zu &lt;a title="dotnet-kicks.de" href="http://dotnet-kicks.de/"&gt;dotnet-kicks.de&lt;/a&gt;. (Übrigens war der Raum in dem das Interview gemacht wurde, während dem .NET Open Space Süd, der beliebtesten Raum der &lt;a title="artiso AG" href="http://www.artiso.com/"&gt;artiso AG&lt;/a&gt;. Wegen der roten Sessel natürlich.)&lt;/p&gt;  &lt;p&gt;Das Ergebnis ist nun hier auf dem Blog von Dariusz zu sehen:    &lt;br /&gt;&lt;a href="http://blogs.msdn.com/dparys/archive/2009/07/28/community-jan-welker-ber-donet-kicks-de.aspx"&gt;Community: Jan Welker über donet-kicks.de&lt;/a&gt;&lt;/p&gt; &lt;a href="http://ulm.netopenspace.de/"&gt;&lt;img style="border-bottom-style:none;border-right-style:none;border-top-style:none;border-left-style:none;" alt=".NET Open Space vom 11.07. bis 12.07.2009 in Ulm" src="http://ulm.netopenspace.de/2009/GetFile.aspx?File=Logos/nos-logo-1-2009.png" /&gt; &lt;/a&gt;&lt;div class="wlWriterHeaderFooter" style="text-align:left;margin:0px;padding:4px 4px 4px 4px;"&gt;&lt;a href="http://dotnet-kicks.de/kick/?url=http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/07/28/jan-welker-ber-dotnet-kicks-de.aspx"&gt;&lt;img src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/07/28/jan-welker-ber-dotnet-kicks-de.aspx&amp;amp;bgcolor=3169AD&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000" alt="DotNetKicks-DE Image" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.aspnetzone.de/aggbug.aspx?PostID=211759" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=Vc06S1uxZ8I:Isi6bqPcKGk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=Vc06S1uxZ8I:Isi6bqPcKGk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?i=Vc06S1uxZ8I:Isi6bqPcKGk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=Vc06S1uxZ8I:Isi6bqPcKGk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?i=Vc06S1uxZ8I:Isi6bqPcKGk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=Vc06S1uxZ8I:Isi6bqPcKGk:mNpC_eAfmKU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?d=mNpC_eAfmKU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jgutsch/~4/Vc06S1uxZ8I" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/07/28/jan-welker-ber-dotnet-kicks-de.aspx</feedburner:origLink></item><item><title>Stefan Lieser über Clean Code Developer</title><link>http://feedproxy.google.com/~r/jgutsch/~3/5Otz2iwh_sU/stefan-lieser-ber-clean-code-developer.aspx</link><category>Wissenswertes</category><category>Community</category><category>Interessante Ressourcen</category><category>Open Space</category><category>Clean Code Developer</category><category>Clean Code</category><category>Video</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Jürgen Gutsch</dc:creator><pubDate>Tue, 28 Jul 2009 00:42:00 PDT</pubDate><guid isPermaLink="false">http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/07/28/stefan-lieser-ber-clean-code-developer.aspx</guid><description>&lt;P&gt;&amp;nbsp;&lt;A href="http://www.clean-code-developer.de"&gt;&lt;IMG style="BORDER-BOTTOM-STYLE:none;BORDER-RIGHT-STYLE:none;BORDER-TOP-STYLE:none;BORDER-LEFT-STYLE:none;" src="http://www.clean-code-developer.de/attachment/wiki/CcdStempel/dotnetpro%20ccd%20stempel%20full%20size%20banner.gif?format=raw"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Beim &lt;A title=".NET Open Space Süd" href="http://ulm.netopenspace.de/2009/MainPage.ashx"&gt;.NET Open Space Süd&lt;/A&gt; waren unter anderem auch &lt;A title="Stefan Liesers Blog" href="http://www.lieser-online.de/blog/"&gt;Stefan Lieser&lt;/A&gt; und von Microsoft &lt;A href="http://blogs.msdn.com/dparys/"&gt;Dariusz Paris&lt;/A&gt; anwesend. Interessant war zu sehen wie sich Dariusz sowohl eine Kamera als auch den Stefan krallte, um vor der Türe der &lt;A title="artiso AG" href="http://www.artiso.com/"&gt;artiso AG&lt;/A&gt; ein interview zu führen.&lt;/P&gt;
&lt;P&gt;Das Ergebnis ist nun hier auf dem Blog von Dariusz zu sehen: &lt;BR&gt;&lt;A title=http://blogs.msdn.com/dparys/archive/2009/07/28/community-stefan-lieser-ber-clean-code-developer.aspx href="http://blogs.msdn.com/dparys/archive/2009/07/28/community-stefan-lieser-ber-clean-code-developer.aspx"&gt;Community: Stefan Lieser über Clean Code Developer&lt;/A&gt;&lt;/P&gt;&lt;A href="http://ulm.netopenspace.de/"&gt;&lt;IMG style="BORDER-BOTTOM-STYLE:none;BORDER-RIGHT-STYLE:none;BORDER-TOP-STYLE:none;BORDER-LEFT-STYLE:none;" alt=".NET Open Space vom 11.07. bis 12.07.2009 in Ulm" src="http://ulm.netopenspace.de/2009/GetFile.aspx?File=Logos/nos-logo-1-2009.png"&gt; &lt;/A&gt;
&lt;DIV style="TEXT-ALIGN:left;PADDING-BOTTOM:4px;MARGIN:0px;PADDING-LEFT:4px;PADDING-RIGHT:4px;PADDING-TOP:4px;" class=wlWriterHeaderFooter&gt;&lt;A href="http://dotnet-kicks.de/kick/?url=http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/07/28/stefan-lieser-ber-clean-code-developer.aspx"&gt;&lt;IMG border=0 alt="DotNetKicks-DE Image" src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/07/28/stefan-lieser-ber-clean-code-developer.aspx&amp;amp;bgcolor=3169AD&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000"&gt;&lt;/A&gt;&lt;/DIV&gt;&lt;img src="http://www.aspnetzone.de/aggbug.aspx?PostID=211743" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=5Otz2iwh_sU:459ztD3decw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=5Otz2iwh_sU:459ztD3decw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?i=5Otz2iwh_sU:459ztD3decw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=5Otz2iwh_sU:459ztD3decw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?i=5Otz2iwh_sU:459ztD3decw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=5Otz2iwh_sU:459ztD3decw:mNpC_eAfmKU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?d=mNpC_eAfmKU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jgutsch/~4/5Otz2iwh_sU" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/07/28/stefan-lieser-ber-clean-code-developer.aspx</feedburner:origLink></item><item><title>Die Clean Code Developer Initiative</title><link>http://feedproxy.google.com/~r/jgutsch/~3/2ydaalVcQKQ/die-clean-code-developer-initiative.aspx</link><category>Wissenswertes</category><category>Tipps und Tricks</category><category>Entwickler</category><category>Open Space</category><category>Clean Code Developer</category><category>Clean Code</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Jürgen Gutsch</dc:creator><pubDate>Thu, 16 Jul 2009 00:09:00 PDT</pubDate><guid isPermaLink="false">http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/07/16/die-clean-code-developer-initiative.aspx</guid><description>&lt;P&gt;&lt;A href="http://www.clean-code-developer.de"&gt;&lt;IMG style="BORDER-BOTTOM:medium none;BORDER-LEFT:medium none;BORDER-TOP:medium none;BORDER-RIGHT:medium none;" src="http://www.clean-code-developer.de/attachment/wiki/CcdStempel/dotnetpro%20ccd%20stempel%20full%20size%20banner.gif?format=raw"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A title="Stefan Liesers Blog" href="http://www.lieser-online.de/blog/"&gt;Stefan Lieser&lt;/A&gt; und &lt;A title="Ralf Westphal" href="http://www.ralfw.de"&gt;Ralf Westphal&lt;/A&gt; haben vor einiger Zeit die &lt;A title="Clean Code Developer" href="http://clean-code-developer.de"&gt;Clean Code Developer&lt;/A&gt; Initiative gestartet, die “Prinzipien, Regeln und Praktiken für bessere Software” aufstellt und vermittelt. Das ziel der Beiden ist es die Softwarequalität zu steigern und die Professionalität von Softwareentwicklern zu fördern. Die Regeln und Praktiken basieren auf dem Buch &lt;A title="Clean Code" href="http://astore.amazon.de/gutschonline-21/detail/0132350882"&gt;Clean Code&lt;/A&gt; von &lt;A title="Robert C. Martin" href="http://www.objectmentor.com/omTeam/martin_r.html"&gt;Robert C. Martin&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Clean Code nach Robert C. Martin kann jeder machen. Es erfordert allerdings ein radikales Umdenken, was aber aufgrund der provokanten Art von “Uncle Bob” relativ einfach fällt. Uncle Bob stößt einen praktisch mit der Nase in den eigenen Mist. Beim Lesen des Buches (liest sich übrigens fast wie ein Roman und sorgt - auf englisch gelesen – für einige Lacher) gibt es einen Aha-Effekt nach dem anderen.&lt;/P&gt;
&lt;P&gt;Mir ist allerdings erst beim &lt;A title=".NET Open Space Süd" href="http://ulm.netopenspace.de/2009/MainPage.ashx"&gt;.NET Open Space Süd&lt;/A&gt; klar geworden, dass das Buch alleine nur dann was bringt, wenn man ganz alleine im stillen Kämmerlein vor sich hin entwickelt. Es ist unwahrscheinlich das es in einem größeren Team von jedem gelesen wird. Es ist genauso unwahrscheinlich, dass es von jedem im Team gleichermaßen interpretiert und eingehalten wird. &lt;/P&gt;
&lt;P&gt;Um Clean Code nun einem größeren Team zu vermitteln, muss zuerst Interesse dafür geweckt werden. Es muss darüber geredet werden, es muss diskutiert werden. Clean Code im Team durchzusetzen ist ein längerer Prozess. Nicht jeder ist auf Anhieb bereit so stark umzudenken und so anders zu arbeiten. Wenn man Jahre lang schlechten Code entwickelt hat ist es schwierig die Regeln und Praktiken sofort anzuwenden oder sich überhaupt mit den Regeln und Praktiken anzufreunden.&lt;/P&gt;
&lt;P&gt;Dabei hilft nun die Clean Code Developer Initiative. Mit Hilfe &lt;A href="http://clean-code-developer.de/wiki/CcdArmband"&gt;der Armbänder&lt;/A&gt; wird auch der das Interesse und somit ein Dialog angeregt. Entwickler kommen so mit der Initiative in Berührung, lesen die Prinzipien, Regeln und Praktiken, freunden sich damit an und fangen ans selber die Regeln zu berücksichtigen.&lt;/P&gt;
&lt;P&gt;Was einen Clean Code Developer ausmacht kann hier nachgelesen werden: &lt;A title="Wer ist ein Clean Code Developer (CCD)?" href="http://clean-code-developer.de/wiki/CleanCodeDeveloper"&gt;Wer ist ein Clean Code Developer (CCD)?&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Das Wiki der Clean Code Developer Initiative: &lt;A title=http://clean-code-developer.de/ href="http://clean-code-developer.de/"&gt;http://clean-code-developer.de/&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Und hier nochmal das Buch &lt;A title="Clean Code" href="http://astore.amazon.de/gutschonline-21/detail/0132350882"&gt;Clean Code&lt;/A&gt; von &lt;A title="Robert C. Martin" href="http://www.objectmentor.com/omTeam/martin_r.html"&gt;Robert C. Martin&lt;/A&gt;&lt;/P&gt;
&lt;DIV style="TEXT-ALIGN:left;PADDING-BOTTOM:4px;MARGIN:0px;PADDING-LEFT:4px;PADDING-RIGHT:4px;PADDING-TOP:4px;" class=wlWriterHeaderFooter&gt;&lt;A href="http://dotnet-kicks.de/kick/?url=http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/07/16/die-clean-code-developer-initiative.aspx"&gt;&lt;IMG border=0 alt="DotNetKicks-DE Image" src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/07/16/die-clean-code-developer-initiative.aspx&amp;amp;bgcolor=3169AD&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000"&gt;&lt;/A&gt;&lt;/DIV&gt;&lt;img src="http://www.aspnetzone.de/aggbug.aspx?PostID=211485" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=2ydaalVcQKQ:CGapzDKbvQA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=2ydaalVcQKQ:CGapzDKbvQA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?i=2ydaalVcQKQ:CGapzDKbvQA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=2ydaalVcQKQ:CGapzDKbvQA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?i=2ydaalVcQKQ:CGapzDKbvQA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=2ydaalVcQKQ:CGapzDKbvQA:mNpC_eAfmKU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?d=mNpC_eAfmKU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jgutsch/~4/2ydaalVcQKQ" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/07/16/die-clean-code-developer-initiative.aspx</feedburner:origLink></item><item><title>Das .NET Open Space Süd 2009 ist vorbei :-(</title><link>http://feedproxy.google.com/~r/jgutsch/~3/-e9QfiFe5e8/das-net-open-space-s-d-2009-ist-vorbei.aspx</link><category>Community</category><category>.NET</category><category>Open Space</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Jürgen Gutsch</dc:creator><pubDate>Tue, 14 Jul 2009 01:03:00 PDT</pubDate><guid isPermaLink="false">http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/07/14/das-net-open-space-s-d-2009-ist-vorbei.aspx</guid><description>&lt;P&gt;&lt;A title=".NET Open Space Süd vom 11.07. bis 12.07.2009 in Ulm" href="http://ulm.netopenspace.de/"&gt;&lt;IMG style="BORDER-BOTTOM-STYLE:none;BORDER-RIGHT-STYLE:none;BORDER-TOP-STYLE:none;BORDER-LEFT-STYLE:none;" alt=".NET Open Space vom 11.07. bis 12.07.2009 in Ulm" src="http://ulm.netopenspace.de/2009/GetFile.aspx?File=Logos/nos-logo-1-2009.png"&gt; &lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Am Wochenende (11.07. und 12.07.) fand in der Nähe von Blaustein, bei Ulm, das erste .NET Open Space Süd statt. Die beiden Organisatoren &lt;A href="http://blog.alexonasp.net/"&gt;Alexander Zeitler&lt;/A&gt; und &lt;A href="http://www.artiso.com/problog/"&gt;Thomas Schissler&lt;/A&gt; hatten sich mächtig ins Zeug gelegt um uns die perfekte Umgebung für das Open Space zu liefern. &lt;/P&gt;
&lt;P&gt;Ein besonderer Dank geht auch an den &lt;A href="http://www.sv-arnegg.de"&gt;SV Arnegg&lt;/A&gt;, der für die komplette Bewirtung und die abendliche Unterhaltung bei der Party gesorgt hat und uns das Clubheim für das Mittagessen und die Party zur Verfügung gestellt hat. Es ist einfach auch eine geniale Idee den lokalen Sportverein in so eine Veranstaltung einzubinden.&lt;/P&gt;
&lt;P&gt;Anders als auf herkömmlichen Konferenzen, waren in den zwei Tagen alle Anwesenden selber für das Programm und die Themen verantwortlich. Auf diese Art kann ein .NET Open Space nur ein voller Erfolg sein. Jeder bringt Themen ein, die ihn interessieren oder zu denen er was beitragen kann. So kam ein bunt gemischtes Programm zu fast allen wichtigen .NET-Themen und .NET-Technologien, aber auch zur allgemeinen Architektur zusammen.&lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://goudmg.bay.livefilestore.com/y1pJNajd3MTDQ35urFOcU7bRP4jkqSiGmbb0ThjRkxths1WzFf4386i_nuVoFzG9vjrc61Uk2YQWCHcs--ohTgkRA/CIMG3243.jpg"&gt; &lt;/P&gt;
&lt;P&gt;Zusätzlich zu dem Programm war es sehr spannend, die Prominenz der .NET Community mal selber persönlich kennen zu lernen. Aber auch mit allen anderen ergaben sich anregende Diskussionen. Wer da war kann man in der &lt;A title=Teilnehmerliste href="http://ulm.netopenspace.de/2009/Teilnehmer.ashx"&gt;Teilnehmerliste&lt;/A&gt; sehen.&lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://goudmg.bay.livefilestore.com/y1pvy0gHgqKsLE0ofToBXGkefZudVDHScRpKnLvL8AdgX2Rx1WDO2mXAxnZ3TzkieLpeB6RtF5z0jjXw7wy5eMRXg/CIMG3239.jpg"&gt; &lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;Insgesamt hat es sehr viel Spaß gemacht und sollte 2010 auf jeden Fall wiederholt werden. Ich selber habe viele neue Ideen, Ansichten und Anregungen mit nach Hause genommen und bin sicher, dass es beim nächsten Mal wieder so wird :-)&lt;/P&gt;
&lt;P&gt;Ach so: Die Bilder oben sind übrigens von &lt;A title="Peter Bucher: Auf den Spuren von .NET" href="http://www.aspnetzone.de/blogs/peterbucher/default.aspx"&gt;Peter&lt;/A&gt; geklaut der natürlich auch &lt;A title=".NET Open Space Süd 2009 in Ulm: Ich war da und es war gut!" href="http://www.aspnetzone.de/blogs/peterbucher/archive/2009/07/12/net-open-space-s-d-2009-in-ulm-ich-war-da-und-es-war-gut.aspx"&gt;mit von der Partie&lt;/A&gt; war. Mehr Bilder gibt es hier:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://cid-58b8038555f39d35.skydrive.live.com/redir.aspx?page=browse&amp;amp;resid=58B8038555F39D35!198&amp;amp;ct=photos"&gt;&lt;IMG style="BORDER-BOTTOM-STYLE:none;BORDER-RIGHT-STYLE:none;BORDER-TOP-STYLE:none;BORDER-LEFT-STYLE:none;" alt="View NetOS_Süd" src="http://www.aspnetzone.de/blogs/peterbucher/InlineRepresentation4182f91f4ce9410aae975be5f0fa841c_63DE0200.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Auch dabei waren übrigens: &lt;A href="http://blog.alexonasp.net/"&gt;Alex&lt;/A&gt;, &lt;A href="http://der-albert.com/"&gt;Albert&lt;/A&gt;, &lt;A href="http://blog.jan-welker.de/default.aspx"&gt;Jan&lt;/A&gt;, &lt;A title="Thomas goes .NET" href="http://blog.thomasbandt.de/"&gt;Thomas&lt;/A&gt;, &lt;A title="C ant it's sharp" href="http://berndhengelein.de/"&gt;Bernd&lt;/A&gt; und &lt;A title="Schwarzes Brett" href="http://ulm.netopenspace.de/2009/Schwarzes%20Brett.ashx"&gt;viele mehr&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;PS: Habe mich dann doch zu einem “&lt;A title="Clean Code Developer (CCD)" href="http://clean-code-developer.de/"&gt;Clean Code Developer (CCD)&lt;/A&gt;”, á la &lt;A title="Stefan Liesers Blog" href="http://www.lieser-online.de/blog/"&gt;Stefan Lieser&lt;/A&gt; und &lt;A title="One Man Think Tank Gedanken" href="http://ralfw.blogspot.com/"&gt;Ralf Westphal&lt;/A&gt;, “bekehren” lassen ;-) Einfach weil es auf diese Art einfacher ist, “Clean Code” auch an Anderen weiter zu vermitteln. Reden alleine Hilft nicht immer, man muss es auch “vorleben”. Werd mir dann mal so schnell wie möglich die Armbänder und das T-Shirt besorgen müssen :-)&lt;/P&gt;
&lt;DIV style="TEXT-ALIGN:left;PADDING-BOTTOM:4px;MARGIN:0px;PADDING-LEFT:4px;PADDING-RIGHT:4px;PADDING-TOP:4px;" class=wlWriterHeaderFooter&gt;&lt;A href="http://dotnet-kicks.de/kick/?url=http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/07/14/das-net-open-space-s-d-2009-ist-vorbei.aspx"&gt;&lt;IMG border=0 alt="DotNetKicks-DE Image" src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/07/14/das-net-open-space-s-d-2009-ist-vorbei.aspx&amp;amp;bgcolor=3169AD&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000"&gt;&lt;/A&gt;&lt;/DIV&gt;&lt;img src="http://www.aspnetzone.de/aggbug.aspx?PostID=211408" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=-e9QfiFe5e8:pt5NiwwmedA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=-e9QfiFe5e8:pt5NiwwmedA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?i=-e9QfiFe5e8:pt5NiwwmedA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=-e9QfiFe5e8:pt5NiwwmedA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?i=-e9QfiFe5e8:pt5NiwwmedA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=-e9QfiFe5e8:pt5NiwwmedA:mNpC_eAfmKU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?d=mNpC_eAfmKU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jgutsch/~4/-e9QfiFe5e8" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/07/14/das-net-open-space-s-d-2009-ist-vorbei.aspx</feedburner:origLink></item><item><title>Ressourcen aus externen Libraries im Markup ausgeben</title><link>http://feedproxy.google.com/~r/jgutsch/~3/Tj0K50w5QGw/ressourcen-aus-externen-libraries-im-markup-ausgeben.aspx</link><category>ASP.NET</category><category>C#</category><category>Tutorials</category><category>.NET 3.5</category><category>Tipps und Tricks</category><category>Resources</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Jürgen Gutsch</dc:creator><pubDate>Mon, 29 Jun 2009 01:43:00 PDT</pubDate><guid isPermaLink="false">http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/06/29/ressourcen-aus-externen-libraries-im-markup-ausgeben.aspx</guid><description>&lt;P&gt;Bei großen Projekten kann es unter Umständen Sinn machen, alle String-Ressourcen in eine separate Library auszulagern. Das Problem ist dann nur, dass diese Ressourcen nicht mehr so einfach über die ASP.NET Markup angesprochen werden können. &lt;/P&gt;
&lt;P&gt;Die Lösung gibt es mit einem eigenen &lt;A title=ExpressionBuilder href="http://msdn.microsoft.com/de-de/library/system.web.compilation.expressionbuilder.aspx"&gt;ExpressionBuilder&lt;/A&gt;, mit dem es möglich ist einen eigenen ASP.NET Ausdruck zu schreiben um auf die externen Ressourcen zu zu greifen.&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;%$ ExternalResources: General, LoginPageTitle %&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Um den Ausdruck von eventuellen internen Ressourcen auseinander zu halten habe ich den ExpressionPrefix “ExternalResources” genannt.&lt;/P&gt;
&lt;P&gt;Die Struktur des xpressionBuilder sieht bei mir wie folgt aus:&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;[ExpressionPrefix(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"ExternalResources"&lt;/span&gt;)] &lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;class&lt;/span&gt; ExternalResourcesExpressionBuilder: &lt;br /&gt;  ExpressionBuilder &lt;br /&gt;{ &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;override&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;object&lt;/span&gt; ParseExpression( &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt; expression, &lt;br /&gt;  Type propertyType, &lt;br /&gt;  ExpressionBuilderContext context) &lt;br /&gt;  { &lt;br /&gt;  }  &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;override&lt;/span&gt; CodeExpression GetCodeExpression( &lt;br /&gt;  BoundPropertyEntry entry, &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;object&lt;/span&gt; parsedData, &lt;br /&gt;  ExpressionBuilderContext context) &lt;br /&gt;  { &lt;br /&gt;  } &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;die Methode ParseExpression nimmt den Ausdruck auseinander und gibt diesen in einem gewünschten Format als Object zurück. In meinem Fall habe ich mir eine kleine Hilfsklasse namens “ResourceExpression” gebaut:&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;classKey &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;null&lt;/span&gt;; &lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt; resourceKey &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;null&lt;/span&gt;; &lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;if&lt;/span&gt;(expression.Length !&lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; 0) &lt;br /&gt;{ &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt;[] strArray &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; expression.Split(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;new&lt;/span&gt;[] { ',' }); &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;int&lt;/span&gt; length &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; strArray.Length; &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;if&lt;/span&gt;(length &amp;gt; 2) &lt;br /&gt;  { &lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;return&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;null&lt;/span&gt;; &lt;br /&gt;  } &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;if&lt;/span&gt;(length == 1) &lt;br /&gt;  { &lt;br /&gt;    resourceKey &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; strArray[0].Trim(); &lt;br /&gt;  } &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;else&lt;/span&gt; &lt;br /&gt;  { &lt;br /&gt;    classKey &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; strArray[0].Trim(); &lt;br /&gt;    resourceKey &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; strArray[1].Trim(); &lt;br /&gt;  } &lt;br /&gt;} &lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;return&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;new&lt;/span&gt; ResourceExpression &lt;br /&gt;{ &lt;br /&gt;  ClassKey &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; classKey, &lt;br /&gt;  ResourceKey &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; resourceKey &lt;br /&gt;};&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Die Hilfsklasse:&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;class&lt;/span&gt; ResourceExpression &lt;br /&gt;{ &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt; ClassKey { get; set; } &lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt; ResourceKey { get; set; } &lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;In der Methode “GetCodeExpression” findet die eigentliche Arbeit statt. Hier wird der Ressource-String ermittelt und zurückgegeben. Theoretisch kann hier auch per WebService auf einen Übersetzungsdienst zu gegriffen werden.&lt;/P&gt;
&lt;P&gt;Ich hole mir allerdings nur per Reflection den entsprechenden ResoourceManager über den ich den zurück zu gebenden Ressource-String ermittle:&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;ResourceExpression expression &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; (ResourceExpression)parsedData; &lt;br /&gt;ResourceManager resourceManager &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;new&lt;/span&gt; ResourceManager(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"Cobra.Web.Resources."&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;+&lt;/span&gt; expression.ClassKey, Assembly.GetAssembly(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;typeof&lt;/span&gt;(Resources.General))) &lt;br /&gt;{ &lt;br /&gt;  IgnoreCase &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;true&lt;/span&gt; &lt;br /&gt;}; &lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt; outString &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; String.Empty; &lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;if&lt;/span&gt;(!&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt;.IsNullOrEmpty(expression.ResourceKey)) &lt;br /&gt;{ &lt;br /&gt;  outString &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; resourceManager.GetString(expression.ResourceKey); &lt;br /&gt;} &lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;return&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;new&lt;/span&gt; CodePrimitiveExpression(outString);&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Zu guter Letzt, muss der ExpressionBuilder noch in Web.Config registriert werden:&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;configuration&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;    &amp;lt;system.web&amp;gt; &lt;br /&gt;        &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;compilation&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;            &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;expressionBuilders&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;                &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;add&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;expressionPrefix&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="ExternalResources"&lt;/span&gt; &lt;br /&gt;                 &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;type&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="GO.Web.Library.ExternalResourcesExpressionBuilder"&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;/&amp;gt;&lt;/span&gt; &lt;br /&gt;            &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;expressionBuilders&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;        &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;compilation&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;    &amp;lt;/system.web&amp;gt; &lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;configuration&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;DIV style="TEXT-ALIGN:left;PADDING-BOTTOM:4px;MARGIN:0px;PADDING-LEFT:4px;PADDING-RIGHT:4px;PADDING-TOP:4px;" class=wlWriterHeaderFooter&gt;&lt;A href="http://dotnet-kicks.de/kick/?url=http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/06/29/ressourcen-aus-externen-libraries-im-markup-ausgeben.aspx"&gt;&lt;IMG border=0 alt="DotNetKicks-DE Image" src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/06/29/ressourcen-aus-externen-libraries-im-markup-ausgeben.aspx&amp;amp;bgcolor=3169AD&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000"&gt;&lt;/A&gt;&lt;/DIV&gt;&lt;img src="http://www.aspnetzone.de/aggbug.aspx?PostID=210974" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=Tj0K50w5QGw:Nm4yVHWJTL4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=Tj0K50w5QGw:Nm4yVHWJTL4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?i=Tj0K50w5QGw:Nm4yVHWJTL4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=Tj0K50w5QGw:Nm4yVHWJTL4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?i=Tj0K50w5QGw:Nm4yVHWJTL4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=Tj0K50w5QGw:Nm4yVHWJTL4:mNpC_eAfmKU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?d=mNpC_eAfmKU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jgutsch/~4/Tj0K50w5QGw" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/06/29/ressourcen-aus-externen-libraries-im-markup-ausgeben.aspx</feedburner:origLink></item><item><title>Web Slices für den IE8 ganz einfach selber machen</title><link>http://feedproxy.google.com/~r/jgutsch/~3/l8BxSAygNtI/web-slices-f-r-den-ie8-ganz-einfach-selber-machen.aspx</link><category>Tipps und Tricks</category><category>Browser</category><category>IE8</category><category>Web Slices</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Jürgen Gutsch</dc:creator><pubDate>Mon, 29 Jun 2009 00:02:00 PDT</pubDate><guid isPermaLink="false">http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/06/29/web-slices-f-r-den-ie8-ganz-einfach-selber-machen.aspx</guid><description>&lt;P&gt;Am Wochenende hatte ich tatsächlich etwas Zeit, um mir mal die Web Slices für den IE8 genauer anzuschauen.&lt;/P&gt;
&lt;P&gt;Interessant ist, wie einfach es ist ein Web Slice zu erstellen. Allerdings gibt es eine Stolperfalle über die man nicht unbedingt stolpern muss. &lt;/P&gt;
&lt;P&gt;Ein Web Slice wird als HTML im HTML der Website definiert und erstellt. Definiert wird ein Web Slice über speziell vorgegebene CSS-Klassen. Diese Klassen können zur Formatierung genutzt werden, müssen aber nicht. Ich habe es einfach gemacht und gleich diese Klassen für die Formatierung genutzt. &lt;/P&gt;
&lt;P&gt;Definiert wird ein Slice mit einem &amp;lt;div&amp;gt; mit der Klasse “hslice” und einer eindeutigen ID (die ID hält mehrere Slices auseinander)&lt;/P&gt;
&lt;P&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;div&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;class&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="hslice"&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;id&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="baseslice"&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;h2&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;class&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="entry-title"&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt;Mehr von Jürgen Gutsch&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;h2&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;div&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;class&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="entry-content"&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;        &lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;div&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;div&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/P&gt;
&lt;P&gt;Innerhalb des Slices wird ein Titel definiert. Üblicherweise ein &amp;lt;h2&amp;gt; Element. Der Titel wird über die Klasse “entry-titel” definiert. Dieser Titel erscheint dann in der Favoritenleiste des IE8.&lt;/P&gt;
&lt;P&gt;Der eigentliche Inhalt des Slices wird in einem &amp;lt;div&amp;gt; mit der Klasse “entry-content” erstellt und kann im Prinzip alles beinhalten, sogar dynamischen Inhalt von einer anderen Seite. Dazu wird im &amp;lt;div&amp;gt;-Element für den Inhalt einfach ein “href” mit dem Link zur Externen Ressource eingefügt.&lt;/P&gt;
&lt;P&gt;Die eine Stolperfalle gibt es bei der Formatierung: Das CSS greift nur, wenn es auf die Klasse “entry-content” angewendet wird, also auf das &amp;lt;div&amp;gt; für den Inhalt. Nicht aber auf das übergeordnete Element. Zudem werden die Formatierungen vom Dokument übernommen. Diese müssen also ggf. überschrieben werden.&lt;/P&gt;
&lt;P&gt;Ein Web Slice könnte dann z. B. so aussehen:&lt;/P&gt;
&lt;DIV style="PADDING-BOTTOM:0px;MARGIN:0px;PADDING-LEFT:0px;PADDING-RIGHT:0px;DISPLAY:inline;FLOAT:none;PADDING-TOP:0px;" id=scid:6960CE03-38FC-44df-87D4-FA4540212B06:1731136a-f88b-425c-a611-edad09c925ff class=wlWriterSmartContent&gt;&lt;IMG style="WIDTH:519px;HEIGHT:408px;" alt="" src="http://www.aspnetzone.de/photos/juergengutsch/images/210970/original.aspx"&gt;&lt;/DIV&gt;
&lt;P&gt;ein sehr guter Artikel zum Thema ist im MSDN-Magazine zu finden: &lt;A title=http://msdn.microsoft.com/de-de/magazine/dd458804.aspx href="http://msdn.microsoft.com/de-de/magazine/dd458804.aspx"&gt;http://msdn.microsoft.com/de-de/magazine/dd458804.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Und auch im Blog von Klaus Bock: &lt;BR&gt;&lt;A title=http://blog.klaus-b.net/ href="http://blog.klaus-b.net/"&gt;http://blog.klaus-b.net/&lt;/A&gt;&lt;/P&gt;
&lt;DIV style="TEXT-ALIGN:left;PADDING-BOTTOM:4px;MARGIN:0px;PADDING-LEFT:4px;PADDING-RIGHT:4px;PADDING-TOP:4px;" class=wlWriterHeaderFooter&gt;&lt;A href="http://dotnet-kicks.de/kick/?url=http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/06/29/web-slices-f-r-den-ie8-ganz-einfach-selber-machen.aspx"&gt;&lt;IMG border=0 alt="DotNetKicks-DE Image" src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/06/29/web-slices-f-r-den-ie8-ganz-einfach-selber-machen.aspx&amp;amp;bgcolor=3169AD&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000"&gt;&lt;/A&gt;&lt;/DIV&gt;&lt;img src="http://www.aspnetzone.de/aggbug.aspx?PostID=210971" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=l8BxSAygNtI:L7TmlRS6dYU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=l8BxSAygNtI:L7TmlRS6dYU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?i=l8BxSAygNtI:L7TmlRS6dYU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=l8BxSAygNtI:L7TmlRS6dYU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?i=l8BxSAygNtI:L7TmlRS6dYU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=l8BxSAygNtI:L7TmlRS6dYU:mNpC_eAfmKU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?d=mNpC_eAfmKU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jgutsch/~4/l8BxSAygNtI" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/06/29/web-slices-f-r-den-ie8-ganz-einfach-selber-machen.aspx</feedburner:origLink></item><item><title>OT: (Meine) Zukunft der Politik in Deutschland?</title><link>http://feedproxy.google.com/~r/jgutsch/~3/lDO5kTPeEos/ot-meine-zukunft-der-politik-in-deutschland.aspx</link><category>Pers&amp;#246;nliches</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Jürgen Gutsch</dc:creator><pubDate>Tue, 23 Jun 2009 00:50:23 PDT</pubDate><guid isPermaLink="false">http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/06/23/ot-meine-zukunft-der-politik-in-deutschland.aspx</guid><description>&lt;p&gt;Aus aktuellem Anlass wird es leider mal wieder Zeit etwas vom Thema abzuweichen. Ich denke aber dass auch ich mal ein paar Worte schreiben sollte, die hoffentlich nicht allen gefallen werden. Aus Rücksicht auf die Volltextsuche von ASP.NET Zone habe ich den Senf mal hier veröffentlicht: &lt;a title="juergen.gutsch-online.de" href="http://juergen.gutsch-online.de/post/2009/06/23/(Meine)-Zukunft-der-Politik-in-Deutschland.aspx"&gt;juergen.gutsch-online.de&lt;/a&gt;&lt;/p&gt;&lt;div class="wlWriterHeaderFooter" style="text-align:left;margin:0px;padding:4px 4px 4px 4px;"&gt;&lt;a href="http://dotnet-kicks.de/kick/?url=http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/06/23/ot-meine-zukunft-der-politik-in-deutschland.aspx"&gt;&lt;img src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/06/23/ot-meine-zukunft-der-politik-in-deutschland.aspx&amp;amp;bgcolor=3169AD&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000" alt="DotNetKicks-DE Image" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.aspnetzone.de/aggbug.aspx?PostID=210847" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=lDO5kTPeEos:ngHcd9nIr4g:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=lDO5kTPeEos:ngHcd9nIr4g:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?i=lDO5kTPeEos:ngHcd9nIr4g:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=lDO5kTPeEos:ngHcd9nIr4g:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?i=lDO5kTPeEos:ngHcd9nIr4g:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/jgutsch?a=lDO5kTPeEos:ngHcd9nIr4g:mNpC_eAfmKU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jgutsch?d=mNpC_eAfmKU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jgutsch/~4/lDO5kTPeEos" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/06/23/ot-meine-zukunft-der-politik-in-deutschland.aspx</feedburner:origLink></item></channel></rss>
