<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>build broken</title>
	<atom:link href="http://blog.aztec-project.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.aztec-project.org</link>
	<description>but we can fix it! Sometimes :)</description>
	<lastBuildDate>Fri, 11 Jun 2010 12:52:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>Webcamps München</title>
		<link>http://blog.aztec-project.org/2010/06/11/webcamps-muenchen/</link>
		<comments>http://blog.aztec-project.org/2010/06/11/webcamps-muenchen/#comments</comments>
		<pubDate>Fri, 11 Jun 2010 08:02:34 +0000</pubDate>
		<dc:creator>Andreas Seebauer</dc:creator>
				<category><![CDATA[Veranstaltung]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[webcamp]]></category>

		<guid isPermaLink="false">http://blog.aztec-project.org/?p=1065</guid>
		<description><![CDATA[Um unsere ASP.NET-MVC2-Kenntnisse mal wieder etwas aufzufrischen, haben ein paar von uns das zweitägige Webcamp von Microsoft in München/Unterschleißheim besucht, an dem man unter den Teilnehmern auch ein paar bekannte Gesichter wie Pete Sacchet, Christian Deger und Golo Roden angetroffen hat. Am ersten Tag wurden die Grundlagen von MVC2, Entity Framework, JQuery und IIS vermittelt. Dabei wurde [...]]]></description>
			<content:encoded><![CDATA[<div>
<p><a href="http://www.webcamps.ms/#munich_panel" target="_blank"><img class="size-full wp-image-1067 alignleft" style="margin-left: 4px; margin-right: 8px;" title="camps" src="http://blog.aztec-project.org/wp-content/uploads/2010/06/camps.png" alt="" width="122" height="120" /></a></p>
<p><img class="alignright size-medium wp-image-1068" title="IMG_0165" src="http://blog.aztec-project.org/wp-content/uploads/2010/06/IMG_0165-225x300.jpg" alt="" width="135" height="180" />Um unsere ASP.NET-MVC2-Kenntnisse mal wieder etwas aufzufrischen, haben ein paar von uns das zweitägige <a href="http://www.webcamps.ms/#munich_panel" target="_blank">Webcamp</a> von Microsoft in München/Unterschleißheim besucht, an dem man unter den Teilnehmern auch ein paar bekannte Gesichter wie <a href="http://blog.sacchet.de/" target="_blank">Pete Sacchet</a>, <a href="http://www.deger-it.de/" target="_blank">Christian Deger</a> und <a href="http://www.goloroden.de/" target="_blank">Golo Roden</a> angetroffen hat.</p>
<p>Am ersten Tag wurden die Grundlagen von MVC2, Entity Framework, JQuery und IIS vermittelt. Dabei wurde anhand einer Rich Web Application gezeigt, wie MVC2, das Entity Framework und JQuery zusammenspielen können. Am zweiten Tag mussten die am Vortag zusammengestellte Teams ein Projekt auf diesen Themengebieten basteln und vorstellen.</p>
<p>Moderiert wurde das Ganze von <a href="http://www.webcamps.ms/Speaker/jongalloway" target="_blank">Jon Galloway</a> und <a href="http://www.webcamps.ms/Speaker/christianwenz" target="_blank">Christian Wenz</a>, die am zweiten Tag bei Problemen mit Rat und Tat zur Seite standen.</p>
</div>
<div>Erhofft hatten wir uns von den zwei Tagen, einiges über MVC2 und JQuery zu erfahren. Enttäuscht wurden wir nicht, da uns noch unbekannte HtmlHelper, Validierungsmethoden sowie ein paar Tricks im Umgang mit Visual Studio gezeigt wurden. Das Entity Framework einmal im Einsatz zu sehen, war ganz nett, aber für uns nicht allzu interessant, da wir im Moment mit NHibernate arbeiten und damit ganz gut fahren.</div>
<div>
<p><img class="size-medium wp-image-1074 alignnone" title="IMG_0157" src="http://blog.aztec-project.org/wp-content/uploads/2010/06/IMG_0157-225x300.jpg" alt="" width="203" height="270" /><img class="size-medium wp-image-1071 alignnone" title="IMG_0158" src="http://blog.aztec-project.org/wp-content/uploads/2010/06/IMG_0158-225x300.jpg" alt="" width="203" height="270" /><img class="size-medium wp-image-1072 alignnone" title="IMG_0159" src="http://blog.aztec-project.org/wp-content/uploads/2010/06/IMG_0159-225x300.jpg" alt="" width="203" height="270" /></p>
<p>Ja, zu essen gab es auch was. War lecker, wie man sieht. <img src='http://blog.aztec-project.org/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
</div>
<div>Als Projekt am zweiten Tag haben wir uns für ein Buchungssystem von Ferienwohnungen entschieden. Wir waren leider nicht offiziell dabei, da uns diese Idee erst nach den Pitches eingefallen ist.<br />
Das einzig Negative an der ganzen Veranstaltung war das Netz im Hotel Dolce Munich. 100 Leute, die gleichzeitig versuchen, über eine gefühlte DSL-Leitung zu saugen, saugt einfach. Der Proxy des Hotels setzte noch einen drauf und leitete Aufrufe auf localhost um, was den Start der Applikation in der Entwicklungsumgebung sehr schwer machte :&gt;.</div>
<div>
<p>Nachdem man dann das WLAN deaktiviert hatte, konnte es dann auch losgehen.</p>
</div>
<div><img class="size-medium wp-image-1076" title="IMG_0161" src="http://blog.aztec-project.org/wp-content/uploads/2010/06/IMG_0161-300x225.jpg" alt="" width="300" height="225" /><img class="size-medium wp-image-1077" title="IMG_0162" src="http://blog.aztec-project.org/wp-content/uploads/2010/06/IMG_0162-300x225.jpg" alt="" width="300" height="225" /><img class="size-medium wp-image-1078" title="IMG_0163" src="http://blog.aztec-project.org/wp-content/uploads/2010/06/IMG_0163-300x225.jpg" alt="" width="300" height="225" /><img class="size-medium wp-image-1079" title="IMG_0164" src="http://blog.aztec-project.org/wp-content/uploads/2010/06/IMG_0164-300x225.jpg" alt="" width="300" height="225" /></div>
<div>
<p>Um uns möglichst nah an den Projekten in der Arbeit zu orientieren, haben wir erstmal Folgendes gemacht: SVN angelegt, Features, die wir aufnehmen wollten, erörtert, Architektur gezeichnet, Komponenten herausgearbeitet, Contracts erstellt, Komponenten angelegt, Komponenten implementiert. Und schwupps war die Zeit um. :&gt; Wir sind leider nicht mit unserem Projekt fertig geworden, haben aber trotzdem in den zwei Tagen einiges gelernt.</p>
</div>
<p>Glückwunsch nochmal an die Gewinner des Wettbewerbs (Schiffe versenken).</p>
<p><a href="http://dotnet-kicks.de/kick/?url=http://blog.aztec-project.org/2010/06/11/webcamps-muenchen/"><img src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http://blog.aztec-project.org/2010/06/11/webcamps-muenchen/" alt="kick it on dotnet-kicks.de" border="0"></a></p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.aztec-project.org%2F2010%2F06%2F11%2Fwebcamps-muenchen%2F&amp;title=Webcamps%20M%C3%BCnchen"><img src="http://blog.aztec-project.org/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p><fb:like 
		href="http://blog.aztec-project.org/2010/06/11/webcamps-muenchen/" 
		layout="standard" 
		show_faces="true" 
		width="450" 
		
		action="like" 
		colorscheme="light" 
		style="margin-top:5px;"
		class="fb_edge_widget_with_comment fb_iframe_widget"></fb:like>]]></content:encoded>
			<wfw:commentRss>http://blog.aztec-project.org/2010/06/11/webcamps-muenchen/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>BarCamp Bodensee 2010</title>
		<link>http://blog.aztec-project.org/2010/06/06/barcamp-bodensee-2010/</link>
		<comments>http://blog.aztec-project.org/2010/06/06/barcamp-bodensee-2010/#comments</comments>
		<pubDate>Sun, 06 Jun 2010 18:32:41 +0000</pubDate>
		<dc:creator>Stefan Kölle</dc:creator>
				<category><![CDATA[BarCamp]]></category>
		<category><![CDATA[datenschutz]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[socialweb]]></category>
		<category><![CDATA[sonne]]></category>

		<guid isPermaLink="false">http://blog.aztec-project.org/?p=1055</guid>
		<description><![CDATA[Dieses Wochenende findet das BarCamp Bodensee 2010 statt. Ich war gestern dort und habe interessante Sessions besucht. Sehr gut fand ich die Session &#8220;Decentralized Social Web&#8221;, nachdem ich schon lange selbst über das Thema nachgedacht habe. In der Session wurde gut herausgearbeitet, Grundgedanke ist ein Protokoll wie IP zu schaffen, also ein Konzept zu entwickeln [...]]]></description>
			<content:encoded><![CDATA[<p>Dieses Wochenende findet das <a href="http://barcampbodensee.mixxt.eu/">BarCamp Bodensee 2010</a> statt. Ich war gestern dort und habe interessante Sessions besucht.</p>
<p>Sehr gut fand ich die Session &#8220;Decentralized Social Web&#8221;, nachdem ich schon lange selbst über das Thema nachgedacht habe. In der Session wurde gut herausgearbeitet, Grundgedanke ist ein Protokoll wie IP zu schaffen, also ein Konzept zu entwickeln um die Daten seiner Friends und sozialen Kontakte selbst zu besitzen und diese bei sozialen Netzwerken dann zu verwenden. Der Betreiber eines sozialen Netzwerks selbst soll die Daten nicht besitzen bzw. nur in verschlüsselter Form auf sie zugreifen können. Ändert man selbst die Zugriffsrechte, besitzt die Plattform zwar noch die Daten, kann auf diese jedoch nicht mehr zugreifen.</p>
<p>Noch verstehen Nutzer den Mehrwert nicht und die Lösungen sind zu komplex, um dem Normaluser hier den Einstieg zu erleichtern. Ein Nutzer von sozialen Netzwerken möchte einen Service und den bekommt er derzeit bei Facebook. Diese Entwicklung ist gefährlich, da sich Facebook zur allgemeinen Datensammelstelle entwickelt, die alles kontrolliert. &#8220;My data belongs to me&#8221;. Nur sind wir technisch affinen Menschen hier zu paranoid? Der Normaluser bekommt im Moment genau das, was er möchte: eine gesicherte, schnelle Dienstleistung. Auf die Frage, wer für Facebook zu zahlen bereit wäre, kamen erstaunlich viele Meldungen, man sieht Facebook also als einen Dienstleister.</p>
<p>Gut jedoch zu sehen, dass sich bereits Projekte aufgetan haben das decentralized social web zu erkunden: </p>
<p><strong>Movim</strong><br />
Ziel des MOVIM-Projekts (für My Open Virtual Identity Manager), ist eine vollständige und total dezentrale soziale Platform zu entwickeln, die ihre User einfach respektiert.<br />
<a href="http://www.movim.eu/" target="_blank">http://www.movim.eu/</a></p>
<p><strong>Diaspora</strong><br />
The privacy aware, personally controlled, do-it-all, open source social network.<br />
<a href="http://joindiaspora.com/">http://joindiaspora.com/</a></p>
<p><strong>Web Finger</strong><br />
Personal Web Discovery, making email addresses readable again<br />
<a href="http://code.google.com/p/webfinger/" target="_blank">http://code.google.com/p/webfinger/</a></p>
<p>Es gab noch viele weitere gute Sessions, das Wetter hat gestern gut mitgespielt und viele Teilnehmer haben sich gerne in der Sonne aufgehalten und dort genetzwerkt. </p>
<p>Die <a href="http://www.be2.de/blog/" target="_blank">love coaches von be2</a> waren auch wieder dabei und <a href="http://www.be2.de/blog/barcamp/" target="_blank">verlosen heute eine faltbare Sitzcouch</a>, die Flexible Love Bank von myfab.</p>
<p><a href="http://blog.aztec-project.org/wp-content/uploads/2010/06/IMG_0247.jpg"><img src="http://blog.aztec-project.org/wp-content/uploads/2010/06/IMG_0247-300x225.jpg" alt="" title="be2 Verlosung" width="300" height="225" class="alignnone size-medium wp-image-1056" /></a></p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.aztec-project.org%2F2010%2F06%2F06%2Fbarcamp-bodensee-2010%2F&amp;title=BarCamp%20Bodensee%202010"><img src="http://blog.aztec-project.org/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p><fb:like 
		href="http://blog.aztec-project.org/2010/06/06/barcamp-bodensee-2010/" 
		layout="standard" 
		show_faces="true" 
		width="450" 
		
		action="like" 
		colorscheme="light" 
		style="margin-top:5px;"
		class="fb_edge_widget_with_comment fb_iframe_widget"></fb:like>]]></content:encoded>
			<wfw:commentRss>http://blog.aztec-project.org/2010/06/06/barcamp-bodensee-2010/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Asynchrone Kommunikation mit dem Async-Pattern (Refactored)</title>
		<link>http://blog.aztec-project.org/2010/05/06/asynchrone-kommunikation-mit-dem-async-pattern-refactored/</link>
		<comments>http://blog.aztec-project.org/2010/05/06/asynchrone-kommunikation-mit-dem-async-pattern-refactored/#comments</comments>
		<pubDate>Thu, 06 May 2010 12:37:46 +0000</pubDate>
		<dc:creator>Thomas Christian</dc:creator>
				<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Pattern]]></category>
		<category><![CDATA[Tipps]]></category>

		<guid isPermaLink="false">http://blog.aztec-project.org/?p=1027</guid>
		<description><![CDATA[Nach dem ich meinen vorherigen Artikel zum Thema &#8220;Asynchrone Kommunikation mit dem Async-Pattern&#8221; vorgestellt hatte, hat Ralf Westphal auf seinem Blog &#8220;One Man Think Tank Gedanken&#8221; das Vorgehen zur Implementierung einer asynchronen Kommunikation mit Hilfe von Event-Based-Components vorgestellt, welches eine sehr gute Alternative zum Async-Pattern ist. Seinen Eintrag nehme ich zum Anlass, um meine Beispiel-Implementierung [...]]]></description>
			<content:encoded><![CDATA[<p>Nach dem ich meinen vorherigen Artikel zum Thema <a href="http://blog.aztec-project.org/2010/05/05/asynchrone-kommunikation-mit-dem-async-pattern/">&#8220;Asynchrone Kommunikation mit dem Async-Pattern&#8221;</a> vorgestellt hatte, hat Ralf Westphal auf seinem Blog <a href="http://ralfw.blogspot.com/2010/05/asynchrone-kommunikation-mit-ebcs-statt.html">&#8220;One Man Think Tank Gedanken&#8221;</a> das Vorgehen zur Implementierung einer asynchronen Kommunikation mit Hilfe von Event-Based-Components vorgestellt, welches eine sehr gute Alternative zum Async-Pattern ist. Seinen Eintrag nehme ich zum Anlass, um meine Beispiel-Implementierung des Async-Pattern zu refaktorisieren, um eine bessere Trennung der Verantwortlichkeiten und somit eine bessere Lesbarkeit zu erreichen.</p>
<p>In das Form wird die Abhängigkeit &#8220;CalcProxy&#8221; injected.</p>
<style type="text/css">
.cf { font-family: Courier New; font-size: 10pt; color: black; background: white; }
.cl { margin: 0px; }
.cb1 { color: blue; }
.cb2 { color: #2b91af; }
</style>
<div class="cf">
<p class="cl"><span class="cb1">static</span> <span class="cb1">void</span> Main()</p>
<p class="cl">{</p>
<p class="cl">&nbsp;&nbsp;&nbsp; <span class="cb2">CalcProxy</span> calcProxy = <span class="cb1">new</span> <span class="cb2">CalcProxy</span>(<span class="cb1">new</span> <span class="cb2">Calculator</span>());</p>
<p class="cl">&nbsp;&nbsp;&nbsp; <span class="cb2">Application</span>.EnableVisualStyles();</p>
<p class="cl">&nbsp;&nbsp;&nbsp; <span class="cb2">Application</span>.SetCompatibleTextRenderingDefault(<span class="cb1">false</span>);</p>
<p class="cl">&nbsp;&nbsp;&nbsp; <span class="cb2">Application</span>.Run(<span class="cb1">new</span> <span class="cb2">Form1</span>(calcProxy));</p>
<p class="cl">}</p>
</div>
<p>&nbsp;</p>
<p>Im Gegensatz zur vorherigen Version wird in der Form nun nicht mehr der Calculator direkt erzeugt und verwendet, sondern auf den injekteten CalcProxy zugegriffen.</p>
<style type="text/css">
.cf { font-family: Courier New; font-size: 10pt; color: black; background: white; }
.cl { margin: 0px; }
.cb1 { color: blue; }
.cb2 { color: #2b91af; }
</style>
<div class="cf">
<p class="cl"><span class="cb1">public</span> <span class="cb1">partial</span> <span class="cb1">class</span> <span class="cb2">Form1</span> : <span class="cb2">Form</span> {</p>
<p class="cl">&nbsp;&nbsp;&nbsp; <span class="cb1">private</span> <span class="cb1">readonly</span> <span class="cb2">ICalcProxy</span> m_calcProxy;</p>
<p class="cl">&nbsp;&nbsp;&nbsp; <span class="cb1">public</span> Form1(<span class="cb2">ICalcProxy</span> calcProxy) {</p>
<p class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; InitializeComponent();</p>
<p class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; m_calcProxy = calcProxy;</p>
<p class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; m_calcProxy.CalcCompleted += CalculatorCalcCompleted;</p>
<p class="cl">&nbsp;&nbsp;&nbsp; }</p>
<p class="cl">&nbsp;</p>
<p class="cl">&nbsp;&nbsp;&nbsp; <span class="cb1">private</span> <span class="cb1">void</span> Run_Click(<span class="cb1">object</span> sender, <span class="cb2">EventArgs</span> e) {</p>
<p class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="cb1">int</span> number;</p>
<p class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="cb1">if</span> (<span class="cb2">Int32</span>.TryParse(txbEingabe.Text, <span class="cb1">out</span> number)) {</p>
<p class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; m_calcProxy.CalcAsync(number, number);</p>
<p class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p class="cl">&nbsp;&nbsp;&nbsp; }</p>
<p class="cl">&nbsp;</p>
<p class="cl">&nbsp;&nbsp;&nbsp; <span class="cb1">void</span> CalculatorCalcCompleted(<span class="cb1">object</span> sender, <span class="cb2">CalcEventArgs</span> eventArgs) {</p>
<p class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; lblCounter.Text = eventArgs.UserState.ToString();</p>
<p class="cl">&nbsp;&nbsp;&nbsp; }</p>
<p class="cl">}</p>
</div>
<p>&nbsp;</p>
<p>Der CalcProxy wiederum bekommt die Abhängigkeit zum Calculator injected und stellt für die Calculator.Calc-Methode sowohl eine synchrone als auch eine asynchrone Methode zur Verfügung.</p>
<style type="text/css">
.cf { font-family: Courier New; font-size: 10pt; color: black; background: white; }
.cl { margin: 0px; }
.cb1 { color: blue; }
.cb2 { color: #2b91af; }
.cb3 { color: #a31515; }
</style>
<div class="cf">
<p class="cl"><span class="cb1">public</span> <span class="cb1">class</span> <span class="cb2">CalcProxy</span> : <span class="cb2">ICalcProxy</span> {</p>
<p class="cl">&nbsp;&nbsp;&nbsp; <span class="cb1">private</span> <span class="cb1">readonly</span> <span class="cb2">ICalculator</span> m_calculator;</p>
<p class="cl">&nbsp;&nbsp;&nbsp; <span class="cb1">public</span> <span class="cb1">event</span> <span class="cb2">CalcCompletedEventHandler</span> CalcCompleted;</p>
<p class="cl">&nbsp;&nbsp;&nbsp; <span class="cb1">private</span> <span class="cb2">AsyncOperation</span> m_asyncOperation;</p>
<p class="cl">&nbsp;&nbsp;&nbsp; <span class="cb1">private</span> <span class="cb1">bool</span> m_isRunning;</p>
<p class="cl">&nbsp;</p>
<p class="cl">&nbsp;&nbsp;&nbsp; <span class="cb1">public</span> CalcProxy(<span class="cb2">ICalculator</span> calculator) {</p>
<p class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; m_calculator = calculator;</p>
<p class="cl">&nbsp;&nbsp;&nbsp; }</p>
<p class="cl">&nbsp;</p>
<p class="cl">&nbsp;&nbsp;&nbsp; <span class="cb1">public</span> <span class="cb1">int</span> Calc(<span class="cb1">int</span> number) {</p>
<p class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="cb1">return</span> m_calculator.Calc(number);</p>
<p class="cl">&nbsp;&nbsp;&nbsp; }</p>
<p class="cl">&nbsp;</p>
<p class="cl">&nbsp;&nbsp;&nbsp; <span class="cb1">public</span> <span class="cb1">void</span> CalcAsync(<span class="cb1">int</span> number, <span class="cb1">object</span> userState) {</p>
<p class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="cb1">lock</span> (<span class="cb1">this</span>) {</p>
<p class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="cb1">if</span> (m_isRunning) {</p>
<p class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="cb1">throw</span> <span class="cb1">new</span> <span class="cb2">InvalidOperationException</span>(<span class="cb3">&quot;Diese Operation wird bereits ausgef&#252;hrt&quot;</span>);</p>
<p class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; m_isRunning = <span class="cb1">true</span>;</p>
<p class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; m_asyncOperation = <span class="cb2">AsyncOperationManager</span>.CreateOperation(userState);</p>
<p class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="cb2">ThreadPool</span>.QueueUserWorkItem(ExecuteCalc, number);</p>
<p class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p class="cl">&nbsp;&nbsp;&nbsp; }</p>
<p class="cl">&nbsp;</p>
<p class="cl">&nbsp;&nbsp;&nbsp; <span class="cb1">private</span> <span class="cb1">void</span> ExecuteCalc(<span class="cb1">object</span> state) {</p>
<p class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="cb1">var</span> result = Calc((<span class="cb1">int</span>)state);</p>
<p class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; m_asyncOperation.PostOperationCompleted(CalcCompletedSuccessful, result);</p>
<p class="cl">&nbsp;&nbsp;&nbsp; }</p>
<p class="cl">&nbsp;</p>
<p class="cl">&nbsp;&nbsp;&nbsp; <span class="cb1">private</span> <span class="cb1">void</span> CalcCompletedSuccessful(<span class="cb1">object</span> result) {</p>
<p class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="cb1">if</span> (CalcCompleted != <span class="cb1">null</span>) {</p>
<p class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; CalcCompleted(<span class="cb1">this</span>, <span class="cb1">new</span> <span class="cb2">CalcEventArgs</span>(<span class="cb1">null</span>, <span class="cb1">false</span>, (<span class="cb1">int</span>)result, result));</p>
<p class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p class="cl">&nbsp;&nbsp;&nbsp; }</p>
<p class="cl">}</p>
</div>
<p>&nbsp;</p>
<p>Nun enthält der Calculator nur noch die Methode die für den Calculator notwendig ist, nämlich die Calc-Methode.</p>
<style type="text/css">
.cf { font-family: Courier New; font-size: 10pt; color: black; background: white; }
.cl { margin: 0px; }
.cb1 { color: blue; }
.cb2 { color: #2b91af; }
</style>
<div class="cf">
<p class="cl"><span class="cb1">public</span> <span class="cb1">class</span> <span class="cb2">Calculator</span> : <span class="cb2">ICalculator</span> {</p>
<p class="cl">&nbsp;&nbsp;&nbsp; <span class="cb1">public</span> <span class="cb1">int</span> Calc(<span class="cb1">int</span> number) {</p>
<p class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="cb2">Thread</span>.Sleep(10000);</p>
<p class="cl">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span class="cb1">return</span> number * number;</p>
<p class="cl">&nbsp;&nbsp;&nbsp; }</p>
<p class="cl">}</p>
</div>
<p><a href="http://dotnet-kicks.de/kick/?url=http%3a%2f%2fblog.aztec-project.org%2f2010%2f05%2f06%2fasynchrone-kommunikation-mit-dem-async-pattern-refactored%2f"><img src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblog.aztec-project.org%2f2010%2f05%2f06%2fasynchrone-kommunikation-mit-dem-async-pattern-refactored%2f" alt="kick it on dotnet-kicks.de" border="0"></a></p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.aztec-project.org%2F2010%2F05%2F06%2Fasynchrone-kommunikation-mit-dem-async-pattern-refactored%2F&amp;title=Asynchrone%20Kommunikation%20mit%20dem%20Async-Pattern%20%28Refactored%29"><img src="http://blog.aztec-project.org/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p><fb:like 
		href="http://blog.aztec-project.org/2010/05/06/asynchrone-kommunikation-mit-dem-async-pattern-refactored/" 
		layout="standard" 
		show_faces="true" 
		width="450" 
		
		action="like" 
		colorscheme="light" 
		style="margin-top:5px;"
		class="fb_edge_widget_with_comment fb_iframe_widget"></fb:like>]]></content:encoded>
			<wfw:commentRss>http://blog.aztec-project.org/2010/05/06/asynchrone-kommunikation-mit-dem-async-pattern-refactored/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Asynchrone Kommunikation mit dem Async-Pattern</title>
		<link>http://blog.aztec-project.org/2010/05/05/asynchrone-kommunikation-mit-dem-async-pattern/</link>
		<comments>http://blog.aztec-project.org/2010/05/05/asynchrone-kommunikation-mit-dem-async-pattern/#comments</comments>
		<pubDate>Wed, 05 May 2010 14:52:17 +0000</pubDate>
		<dc:creator>Thomas Christian</dc:creator>
				<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Pattern]]></category>
		<category><![CDATA[Tipps]]></category>

		<guid isPermaLink="false">http://blog.aztec-project.org/?p=961</guid>
		<description><![CDATA[Bevor ich anhand eines Beispiels zeige, wie man mit Hilfe des Async-Pattern ein asynchrone Kommunikation implementieren kann, möchte ich kurz beschreiben, wo der Unterschied zwischen der synchronen und der asynchronen Kommunikation liegt und wofür die asynchrone Kommunikation nützlich ist. Synchrone Kommunikation Bei der synchronen Kommunikation handelt es sich um eine Echtzeit-Kommunikation. Das bedeutet, dass Anfragen [...]]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal" style="text-align: justify;">Bevor ich anhand eines Beispiels zeige, wie man mit Hilfe des Async-Pattern ein asynchrone Kommunikation implementieren kann, möchte ich kurz beschreiben, wo der Unterschied zwischen der synchronen und der asynchronen Kommunikation liegt und wofür die asynchrone Kommunikation nützlich ist.</p>
<p class="MsoListParagraphCxSpFirst" style="margin-left: 35.45pt; text-align: justify;">
<p class="MsoListParagraphCxSpMiddle" style="margin-left: 0cm; text-align: justify;"><strong><span style="font-size: 12pt; line-height: 115%;">Synchrone Kommunikation</span></strong></p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left: 0cm; text-align: justify;">Bei der synchronen Kommunikation handelt es sich um eine Echtzeit-Kommunikation. Das bedeutet, dass Anfragen und Antworten jeweils vollständig nacheinander abgearbeitet werden. Kommuniziert ein Prozess mit einem Webserver synchron, so ist der Prozess solange blockiert, bis er die vollständige Antwort vom Webserver erhalten hat.</p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left: 0cm; text-align: justify;">
<p class="MsoListParagraphCxSpMiddle" style="margin-left: 0cm; text-align: justify;"><strong><span style="font-size: 12pt; line-height: 115%;">Asynchrone Kommunikation</span></strong></p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left: 0cm; text-align: justify;">Im Gegensatz zur synchronen Kommunikation handelt es sich bei der asynchronen Kommunikation nicht um eine Echtzeit-Kommunikation. Das bedeutet, dass bei der Kommunikation eines Prozesses mit einem Webserver der Prozess nicht blockiert. Der Prozess verschickt lediglich die Anfrage an den Webserver und kehrt danach sofort zur weiteren Prozessausführung zurück. Der Prozess geht dabei davon aus, dass die Anfrage an den Webservice korrekt gestellt wurde. Die Antwort wird dann zu einem unbestimmten Zeitpunkt vom Webservice geliefert, und zwar dann, wenn dieser mit der Abarbeitung der Anfrage fertig ist.</p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left: 0cm; text-align: justify;">
<p class="MsoListParagraphCxSpMiddle" style="margin-left: 0cm; text-align: justify;"><strong><span style="font-size: 12pt; line-height: 115%;">Warum Asynchrone Kommunikation</span></strong></p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left: 0cm; text-align: justify;">Asynchrone Kommunikation bietet sich in unterschiedlichsten Situationen an. So ist es z.B. sinnvoll, dass eine WinForms-Anwendung asynchron mit einem Webservice kommuniziert, da der Haupt-Thread der WinForm-Anwendung sonst so lange blockiert wäre, bis der Webservice die Antwort auf die Anfrage liefert. Die Folge wäre, dass im Titel der Anwendung stehen würde, dass die Anwendung nicht antwortet (s. Abbildung 1). Viele Benutzer denken dass es sich bei dieser Meldung um einen Fehler im Programm handelt und beenden das Programm fix über den Task-Manager. Dabei lag es nur an der etwas länger dauernden Kommunikation zwischen der WinForm-Anwendung und dem Webservice.</p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left: 0cm; text-align: justify;">
<p class="MsoListParagraphCxSpMiddle" style="margin-left: 35.45pt; text-align: center; page-break-after: avoid;"><span></span></p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left: 35.45pt; text-align: center; page-break-after: avoid;"><a href="http://blog.aztec-project.org/wp-content/uploads/2010/05/keineRueckmeldung.png"><img class="aligncenter size-full wp-image-973" title="keineRueckmeldung" src="http://blog.aztec-project.org/wp-content/uploads/2010/05/keineRueckmeldung.png" alt="" width="308" height="53" /></a> Abbildung 1</p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left: 35.45pt; text-align: justify;">
<p class="MsoListParagraphCxSpMiddle" style="margin-left: 0cm; text-align: justify;">Ein weiterer Grund für eine asynchrone Kommunikation wäre, wenn eine Anwendung nur Nachrichten verschicken möchte und es im Grunde keine Rolle spielt, ob diese Nachricht korrekt verarbeitet wurde. Vorstellbar wäre hier Loggen von Aktionen. Mir wäre es jetzt egal, ob die Nachricht korrekt gespeichert wurde oder nicht. Ich will nur nicht, dass meine Anwendung, nur weil Daten geloggt werden müssen,<span> </span>langsamer wird. Es handelt sich ja bei den Log-Daten nicht um Informationen die für die Abarbeitung notwendig sind.</p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left: 0cm; text-align: justify;">
<p class="MsoListParagraphCxSpMiddle" style="margin-left: 0cm; text-align: justify;">Ein weiterer Fall wäre z. B. das Skalieren von Datenbankabfragen. So könnten mehrere Threads gleichzeitig Daten von gleichen oder unterschiedlichen Datenbeständen abfragen um schnellere Antwortzeiten zu erhalten.</p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left: 0cm; text-align: justify;"><strong><span style="font-size: 12pt; line-height: 115%;">Beispiel</span></strong></p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left: 0cm; text-align: justify;">
Um die asynchrone Kommunikation zu realisieren gibt es unterschiedliche Möglichkeiten. Ich habe mich allerdings für eine Event-Based-Variante entschieden. Der große Vorteil von einem Event-Based Async-Pattern liegt in meinen Augen darin, dass der Nutzer von asynchrone Methoden sich nicht wirklich mit Multithread-Umgebungen auskennen muss. Für den Nutzer ist es völlig transparent wie die Threads im Hintergrund erzeugt werden und wie die Synchronisation der einzelnen Thread funktioniert. Für den Nutzer ist es nur wichtig zu wissen, dass er eine Methode aufrufen kann die asynchron abläuft und somit nicht den erwarteten Rückgabewert besitzt wie die synchrone Methode und dass ein Event ausgelöst wird, wenn die Methode komplett abgearbeitet wurde und der erwartete Rückgabewert zur Verfügung steht.</p>
<p>Nun aber genug geredet, jetzt wird programmiert. Für das Beispiel habe ich mich für eine WinForm-Anwendung entschieden, die nichts anderes tut, als die eingegebene Zahl zu quadrieren. Diese Berechnung dauert aufgrund eines Thread.Sleep() zehn Sekunden, um eine verzögerte Ausführung zu simulieren. Die Berechnung habe ich dabei in eine extra Komponente ausgelagert, die eine Schnittstelle zur asynchronen Kommunikation bereitstellt. Dabei gilt es eine gewisse Namenskonvention einzuhalten. Neben der synchronen Methode „Calc“, wird die asynchrone Methode mit dem Zusatz „Async“ bezeichnet („CalcAsync“). Da das Async-Pattern Event-Based ist, muss ein Event bereitgestellt werden, welches ausgelöst wird, wenn die asynchrone Verarbeitung beendet wurde. Laut Namenskonvention muss solch ein Event „&lt;Methodenname&gt;Completed“ heißen. Mein Event heißt somit „CalcCompleted“.</p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left: 0cm; text-align: justify;">
<p class="MsoListParagraphCxSpMiddle" style="margin-left: 0cm; text-align: justify;">Die Abbildung 2 zeigt die UI der Anwendung. Bei dem Drücken des „Run“-Buttons, soll die eingegebene Zahl asynchron quadriert werden und im Anschluss in das Feld „Ergebnis“ ausgegeben werden.</p>
<p class="MsoListParagraphCxSpMiddle" style="margin-left: 0cm; text-align: justify;">
<p class="MsoListParagraphCxSpLast" style="margin-left: 0cm; text-align: center; page-break-after: avoid;"><span></span></p>
<p class="MsoNormal" style="text-align: center;"><a href="http://blog.aztec-project.org/wp-content/uploads/2010/05/Form1.png"><img class="aligncenter size-full wp-image-980" title="Form1" src="http://blog.aztec-project.org/wp-content/uploads/2010/05/Form1.png" alt="" width="300" height="200" /></a>Abbildung 2</p>
<p class="MsoNormal">Der Code hinter der UI sieht folgendermaßen aus. Beim instanziieren des Forms, wird eine Instanz des Calculators erstellt und ein Delegate auf das „CalcCompleted“-Event registriert. Dieses Event wird aufgerufen sobald der Calculator mit der Berechnung fertig ist.</p>
<p class="MsoNormal">Bei dem Drücken des „Run“-Buttons, wird die Methode Calculator.CalcAsync(…) aufgerufen.</p>
<p class="MsoNormal">
<div style="font-family: Courier New; font-size: 10pt; color: black; background: white;">
<div style="font-family: Courier New; font-size: 10pt; color: black; background: white;">
<p style="margin: 0px;"><span style="color: blue;">public</span> <span style="color: blue;">partial</span> <span style="color: blue;">class</span> <span style="color: #2b91af;">Form1</span> : <span style="color: #2b91af;">Form</span> {</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> <span style="color: #2b91af;">ICalculator</span> m_calculator;</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> Form1() {</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; InitializeComponent();</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; m_calculator = <span style="color: blue;">new</span> <span style="color: #2b91af;">Calculator</span>();</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; m_calculator.CalcCompleted += Calculator_CalcCompleted;</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px;">&nbsp;</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> <span style="color: blue;">void</span> Run_Click(<span style="color: blue;">object</span> sender, <span style="color: #2b91af;">EventArgs</span> e) {</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">int</span> number;</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">if</span> (<span style="color: #2b91af;">Int32</span>.TryParse(txbEingabe.Text, <span style="color: blue;">out</span> number)) {</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; m_calculator.CalcAsync(number, number);</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px;">&nbsp;</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">void</span> Calculator_CalcCompleted(<span style="color: blue;">object</span> sender, <span style="color: #2b91af;">CalcEventArgs</span> eventArgs) {</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; lblCounter.Text = eventArgs.Result.ToString();</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; }</p>
</div>
</div>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;">Sobald die Berechnung fertig ist, wird das CalcCompleted-Event ausgelöst und somit die Calculator_CalcComplete-Methode aufgerufen und das Ergebnis der Berechnung in ein Label geschrieben. Der große Vorteil ist, dass man sich an dieser Stelle nicht mehr um die Synchronisierung der Threads kümmern muss, sodass man direkt auf das Label schreiben darf und es nicht zu einem threadübergreifenden Zugriff kommt.</p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;">Der Calculator sieht wie folgt aus:</p>
<div style="font-family: Courier New; font-size: 10pt; color: black; background: white;">
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;</p>
<p style="margin: 0px;"><span style="color: blue;">public</span> <span style="color: blue;">interface</span> <span style="color: #2b91af;">ICalculator</span> {</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">event</span> <span style="color: #2b91af;">Calculator</span>.<span style="color: #2b91af;">CalcCompletedEventHandler</span> CalcCompleted;</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">int</span> Calc(<span style="color: blue;">int</span> number);</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">void</span> CalcAsync(<span style="color: blue;">int</span> number, <span style="color: blue;">object</span> userState);</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px;">&nbsp;</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> <span style="color: blue;">class</span> <span style="color: #2b91af;">Calculator</span> : <span style="color: #2b91af;">ICalculator</span> {</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> <span style="color: blue;">delegate</span> <span style="color: blue;">void</span> <span style="color: #2b91af;">CalcCompletedEventHandler</span>(<span style="color: blue;">object</span> sender, <span style="color: #2b91af;">CalcEventArgs</span> eventArgs);</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> <span style="color: blue;">event</span> <span style="color: #2b91af;">CalcCompletedEventHandler</span> CalcCompleted;</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> <span style="color: #2b91af;">AsyncOperation</span> m_asyncOperation;</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> <span style="color: blue;">bool</span> m_isRunning;</p>
<p style="margin: 0px;">&nbsp;</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> <span style="color: blue;">int</span> Calc(<span style="color: blue;">int</span> number) {</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #2b91af;">Thread</span>.Sleep(10000);</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">return</span> number * number;</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px;">&nbsp;</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> <span style="color: blue;">void</span> CalcAsync(<span style="color: blue;">int</span> number, <span style="color: blue;">object</span> userState) {</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">lock</span> (<span style="color: blue;">this</span>) {</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">if</span> (m_isRunning) {</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">throw</span> <span style="color: blue;">new</span> <span style="color: #2b91af;">InvalidOperationException</span>(<span style="color: #a31515;">&quot;Diese Operation wird bereits ausgef&#252;hrt&quot;</span>);</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; m_isRunning = <span style="color: blue;">true</span>;</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; m_asyncOperation = <span style="color: #2b91af;">AsyncOperationManager</span>.CreateOperation(userState);</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #2b91af;">ThreadPool</span>.QueueUserWorkItem(ExecuteCalc, number);</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; .</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; .</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; .</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; }</p>
</div>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;">
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;">Wie man im Interface des Calculator sieht, gibt es eine synchrone und eine asynchrone Methode für die Berechnung.<span> </span>Uns interessiert allerdings nur die asynchrone Methode. Das lock und die Prüfung auf m_isRunning verhindern lediglich, dass die asynchrone Methode während ihrer Ausführung öfter aufgerufen wird. Das Wesentliche an dieser Methode ist der Aufruf von AsyncOperationManager.CreateOperation, denn dieser Aufruf stellt einen Synchronisationskontext bereit, der die Threads miteinander synchronisiert. <span> </span>Für die eigentliche Berechnung wird sich über den ThreadPool ein neuer Thread besorgt, der sich dann um die Abarbeitung der ExecuteCalc in einem eigenen Thread kümmert.</p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;">
<div style="font-family: Courier New; font-size: 10pt; color: black; background: none repeat scroll 0% 0% white;">
<div style="font-family: Courier New; font-size: 10pt; color: black; background: white;">
<p style="margin: 0px;"><span style="color: blue;">public</span> <span style="color: blue;">class</span> <span style="color: #2b91af;">Calculator</span> : <span style="color: #2b91af;">ICalculator</span> {</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; .</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; .</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; .</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> <span style="color: blue;">void</span> ExecuteCalc(<span style="color: blue;">object</span> state) {</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">int</span> result = Calc((<span style="color: blue;">int</span>)state);</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; m_asyncOperation.PostOperationCompleted(CalcCompletedSuccessful, result);</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px;">&nbsp;</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> <span style="color: blue;">void</span> CalcCompletedSuccessful(<span style="color: blue;">object</span> result) {</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">if</span> (CalcCompleted != <span style="color: blue;">null</span>) {</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; CalcCompleted(<span style="color: blue;">this</span>, <span style="color: blue;">new</span> <span style="color: #2b91af;">CalcEventArgs</span>(<span style="color: blue;">null</span>, <span style="color: blue;">false</span>, (<span style="color: blue;">int</span>)result, result));</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> <span style="color: blue;">class</span> <span style="color: #2b91af;">CalcEventArgs</span> : <span style="color: #2b91af;">AsyncCompletedEventArgs</span> {</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> CalcEventArgs(<span style="color: #2b91af;">Exception</span> error, <span style="color: blue;">bool</span> cancelled, <span style="color: blue;">int</span> result, <span style="color: blue;">object</span> userState)</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; : <span style="color: blue;">base</span>(error, cancelled, userState) {</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Result = result;</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> <span style="color: blue;">int</span> Result { <span style="color: blue;">get</span>; <span style="color: blue;">private</span> <span style="color: blue;">set</span>; }</p>
<p style="margin: 0px;">&nbsp;&nbsp;&nbsp; }</p>
</div>
</div>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 10pt; font-family: &amp;amp;amp;"> </span></p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;">Sobald die Berechnung abgeschlossen ist, wird der Thread mit dem MainThread über den Aufruf von PostOperationCompleted synchronisiert und das CalcCompleted-Event ausgelöst und das Ergebnis in das Label geschrieben (s. o.).</p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 1799px; width: 1px; height: 1px; overflow: hidden;">
<p style="margin: 0cm 0cm 0.0001pt; background: none repeat scroll 0% 0% white;"><span style="font-size: 10pt; font-family: &amp;amp;amp; color: #2b91af;" lang="EN-US">6</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US"> </span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: blue;" lang="EN-US">public</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US"> </span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: blue;" lang="EN-US">partial</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US"> </span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: blue;" lang="EN-US">class</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US"> </span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: #2b91af;" lang="EN-US">Form1</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US"> : </span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: #2b91af;" lang="EN-US">Form</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US"> {</span></p>
<p style="margin: 0cm 0cm 0.0001pt; background: none repeat scroll 0% 0% white;"><span style="font-size: 10pt; font-family: &amp;amp;amp; color: #2b91af;" lang="EN-US"> 7</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US"> </span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: blue;" lang="EN-US">private</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US"> </span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: #2b91af;" lang="EN-US">ICalculator</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US"> m_calculator;</span></p>
<p style="margin: 0cm 0cm 0.0001pt; background: none repeat scroll 0% 0% white;"><span style="font-size: 10pt; font-family: &amp;amp;amp; color: #2b91af;" lang="EN-US"> 8</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US"> </span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: blue;" lang="EN-US">public</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US"> Form1() {</span></p>
<p style="margin: 0cm 0cm 0.0001pt; background: none repeat scroll 0% 0% white;"><span style="font-size: 10pt; font-family: &amp;amp;amp; color: #2b91af;" lang="EN-US"> 9</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US"> InitializeComponent();</span></p>
<p style="margin: 0cm 0cm 0.0001pt; background: none repeat scroll 0% 0% white;"><span style="font-size: 10pt; font-family: &amp;amp;amp; color: #2b91af;" lang="EN-US"> 10</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US"> m_calculator = </span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: blue;" lang="EN-US">new</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US"> </span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: #2b91af;" lang="EN-US">Calculator</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US">();</span></p>
<p style="margin: 0cm 0cm 0.0001pt; background: none repeat scroll 0% 0% white;"><span style="font-size: 10pt; font-family: &amp;amp;amp; color: #2b91af;" lang="EN-US"> 11</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US"> m_calculator.CalcCompleted += Calculator_CalcCompleted;</span></p>
<p style="margin: 0cm 0cm 0.0001pt; background: none repeat scroll 0% 0% white;"><span style="font-size: 10pt; font-family: &amp;amp;amp; color: #2b91af;" lang="EN-US"> 12</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US"> }</span></p>
<p style="margin: 0cm 0cm 0.0001pt; background: none repeat scroll 0% 0% white;"><span style="font-size: 10pt; font-family: &amp;amp;amp; color: #2b91af;" lang="EN-US"> 13</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US"> </span></p>
<p style="margin: 0cm 0cm 0.0001pt; background: none repeat scroll 0% 0% white;"><span style="font-size: 10pt; font-family: &amp;amp;amp; color: #2b91af;" lang="EN-US"> 14</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US"> </span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: blue;" lang="EN-US">private</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US"> </span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: blue;" lang="EN-US">void</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US"> Run_Click(</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: blue;" lang="EN-US">object</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US"> sender, </span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: #2b91af;" lang="EN-US">EventArgs</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US"> e) {</span></p>
<p style="margin: 0cm 0cm 0.0001pt; background: none repeat scroll 0% 0% white;"><span style="font-size: 10pt; font-family: &amp;amp;amp; color: #2b91af;" lang="EN-US"> 15</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US"> </span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: blue;" lang="EN-US">int</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US"> number;</span></p>
<p style="margin: 0cm 0cm 0.0001pt; background: none repeat scroll 0% 0% white;"><span style="font-size: 10pt; font-family: &amp;amp;amp; color: #2b91af;" lang="EN-US"> 16</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US"> </span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: blue;" lang="EN-US">if</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US"> (</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: #2b91af;" lang="EN-US">Int32</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US">.TryParse(txbEingabe.Text, </span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: blue;" lang="EN-US">out</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US"> number)) {</span></p>
<p style="margin: 0cm 0cm 0.0001pt; background: none repeat scroll 0% 0% white;"><span style="font-size: 10pt; font-family: &amp;amp;amp; color: #2b91af;" lang="EN-US"> 17</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US"> m_calculator.CalcAsync(number, number);</span></p>
<p style="margin: 0cm 0cm 0.0001pt; background: none repeat scroll 0% 0% white;"><span style="font-size: 10pt; font-family: &amp;amp;amp; color: #2b91af;" lang="EN-US"> 18</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US"> }</span></p>
<p style="margin: 0cm 0cm 0.0001pt; background: none repeat scroll 0% 0% white;"><span style="font-size: 10pt; font-family: &amp;amp;amp; color: #2b91af;" lang="EN-US"> 19</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US"> }</span></p>
<p style="margin: 0cm 0cm 0.0001pt; background: none repeat scroll 0% 0% white;"><span style="font-size: 10pt; font-family: &amp;amp;amp; color: #2b91af;" lang="EN-US"> 20</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US"> </span></p>
<p style="margin: 0cm 0cm 0.0001pt; background: none repeat scroll 0% 0% white;"><span style="font-size: 10pt; font-family: &amp;amp;amp; color: #2b91af;" lang="EN-US"> 21</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US"> </span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: blue;" lang="EN-US">void</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US"> Calculator_CalcCompleted(</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: blue;" lang="EN-US">object</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US"> sender, </span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: #2b91af;" lang="EN-US">CalcEventArgs</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US"> eventArgs) {</span></p>
<p style="margin: 0cm 0cm 0.0001pt; background: none repeat scroll 0% 0% white;"><span style="font-size: 10pt; font-family: &amp;amp;amp; color: #2b91af;" lang="EN-US"> 22</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;" lang="EN-US"> lblCounter.Text = eventArgs.UserState.ToString();</span></p>
<p style="margin: 0cm 0cm 0.0001pt; background: none repeat scroll 0% 0% white;"><span style="font-size: 10pt; font-family: &amp;amp;amp; color: #2b91af;" lang="EN-US"> </span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: #2b91af;">23</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;"> }</span></p>
<p style="margin: 0cm 0cm 0.0001pt; background: none repeat scroll 0% 0% white;"><span style="font-size: 10pt; font-family: &amp;amp;amp; color: #2b91af;"> 24</span><span style="font-size: 10pt; font-family: &amp;amp;amp; color: black;"> }</span></p>
</div>
<p><a href="http://dotnet-kicks.de/kick/?url=http%3a%2f%2fblog.aztec-project.org%2f2010%2f05%2f05%2fasynchrone-kommunikation-mit-dem-async-pattern%2f"><img src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblog.aztec-project.org%2f2010%2f05%2f05%2fasynchrone-kommunikation-mit-dem-async-pattern%2f" alt="kick it on dotnet-kicks.de" border="0"></p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.aztec-project.org%2F2010%2F05%2F05%2Fasynchrone-kommunikation-mit-dem-async-pattern%2F&amp;title=Asynchrone%20Kommunikation%20mit%20dem%20Async-Pattern"><img src="http://blog.aztec-project.org/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p><fb:like 
		href="http://blog.aztec-project.org/2010/05/05/asynchrone-kommunikation-mit-dem-async-pattern/" 
		layout="standard" 
		show_faces="true" 
		width="450" 
		
		action="like" 
		colorscheme="light" 
		style="margin-top:5px;"
		class="fb_edge_widget_with_comment fb_iframe_widget"></fb:like>]]></content:encoded>
			<wfw:commentRss>http://blog.aztec-project.org/2010/05/05/asynchrone-kommunikation-mit-dem-async-pattern/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>(Spreu + Weizen).Select(Programmierer)</title>
		<link>http://blog.aztec-project.org/2010/03/14/spreu-weizen-selectprogrammierer/</link>
		<comments>http://blog.aztec-project.org/2010/03/14/spreu-weizen-selectprogrammierer/#comments</comments>
		<pubDate>Sun, 14 Mar 2010 10:41:36 +0000</pubDate>
		<dc:creator>Christina Hirth</dc:creator>
				<category><![CDATA[Clean Code Developing]]></category>
		<category><![CDATA[Clean Code]]></category>

		<guid isPermaLink="false">http://blog.aztec-project.org/?p=935</guid>
		<description><![CDATA[Obwohl wir Jeff Atwood schon vor Monaten von unseren Bloggerliste gestrichen haben, ich habe ihn noch nicht aus meinem Googlereader entfernt. Er ist ein Typ, der liebt viel Wirbel zu verursachen (Scott Hanselmann nennt ihn aus den Wörtern friend und enemy &#8220;my friendemy&#8221; ) aber manchmal trifft er den Nagel auf den Kopf. So auch [...]]]></description>
			<content:encoded><![CDATA[<p>Obwohl wir <a href="http://www.codinghorror.com/blog/" target="_blank">Jeff Atwood</a> schon vor Monaten von unseren Bloggerliste gestrichen haben, ich habe ihn noch nicht aus meinem Googlereader entfernt. Er ist ein Typ, der liebt viel Wirbel zu verursachen (<a href="http://www.hanselman.com/blog/" target="_blank">Scott Hanselmann</a> nennt ihn aus den Wörtern <em>friend</em> und <em>enemy</em> &#8220;my friendemy&#8221; <img src='http://blog.aztec-project.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ) aber manchmal trifft er den Nagel auf den Kopf. So auch in seinem letzten Artikel <a href="http://www.codinghorror.com/blog/2010/02/the-nonprogramming-programmer.html" target="_blank">&#8220;The Non-Programming Programmer&#8221;</a>.</p>
<blockquote><p>&#8230;<br />
I wrote that article in 2007, and I am stunned, but not entirely surprised, to hear that three years later &#8220;the vast majority&#8221; of so-called programmers who apply for a programming job interview are unable to write the smallest of programs. To be clear, hard is a relative term &#8212; we&#8217;re not talking about complicated, Google-style graduate computer science interview problems. This is extremely simple stuff we&#8217;re asking candidates to do. And they can&#8217;t. <strong>It&#8217;s the equivalent of attempting to hire a truck driver and finding out that 90 percent of the job applicants can&#8217;t find the gas pedal or the gear shift.</strong></p></blockquote>
<p>Aus den Unmengen von Kommentaren zu urteilen, ist das ein Problem, mit dem sehr viele zu kämpfen haben. Sein Artikel beschäftigt sich mit der Arbeit von Personen, die Einstellungsgespräche führen, und er versucht ein paar Tipps zu geben, wie man dieses Verfahren führen soll.</p>
<p>Ich musste allerdings beim Lesen ständig auf die Situation &#8220;danach&#8221; denken, wenn diese NPPs (sprich Non- Programming Programmers) bereits aus irgendeinem Grund eingestellt wurden. Aus Erfahrung weiß ich genau, was mir viel über jemanden verraten würde: weiß er/sie etwas über Clean Code, kennt er die Folgen vom Creepy Code und wie ist die persönliche Einstellung dazu? Also zusammengefasst: geht es um einen <strong>professionellen Softwareentwickler</strong>? Dafür würden auch ein Code-Review oder ein paar Fragen reichen.</p>
<p>Was haltet ihr von Coding bei der Einstellung? Ist das auch in Europa üblich? Würde das die unpassenden Personen ausfiltern? Oder soll man sich die Zeit nehmen und dem Kandidaten &#8220;ungesehen&#8221; die Probezeit anbieten? Würde das vielleicht zu viele Personen ausfiltern? Kann man sich das überhaupt erlauben in der heutigen Zeit der Fachkräftemangel? (Gut, man fragt sich natürlich, ob wir hier über &#8220;Fachkraft&#8221; sprechen dürfen&#8230;)</p>
<p><a href="http://dotnet-kicks.de/kick/?url=http%3a%2f%2fblog.aztec-project.org%2f2010%2f03%2f14%2fspreu-weizen-selectprogrammierer%2f"><img src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblog.aztec-project.org%2f2010%2f03%2f14%2fspreu-weizen-selectprogrammierer%2f" border="0" alt="kick it on dotnet-kicks.de" /></a></p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.aztec-project.org%2F2010%2F03%2F14%2Fspreu-weizen-selectprogrammierer%2F&amp;title=%28Spreu%20%2B%20Weizen%29.Select%28Programmierer%29"><img src="http://blog.aztec-project.org/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p><fb:like 
		href="http://blog.aztec-project.org/2010/03/14/spreu-weizen-selectprogrammierer/" 
		layout="standard" 
		show_faces="true" 
		width="450" 
		
		action="like" 
		colorscheme="light" 
		style="margin-top:5px;"
		class="fb_edge_widget_with_comment fb_iframe_widget"></fb:like>]]></content:encoded>
			<wfw:commentRss>http://blog.aztec-project.org/2010/03/14/spreu-weizen-selectprogrammierer/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>NoSQL mit StupidDB</title>
		<link>http://blog.aztec-project.org/2010/02/22/nosql-mit-stupiddb/</link>
		<comments>http://blog.aztec-project.org/2010/02/22/nosql-mit-stupiddb/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 08:31:19 +0000</pubDate>
		<dc:creator>Stefan Kölle</dc:creator>
				<category><![CDATA[StupidDB]]></category>
		<category><![CDATA[Datenbank]]></category>
		<category><![CDATA[NoSQL]]></category>
		<category><![CDATA[Schemalos]]></category>

		<guid isPermaLink="false">http://blog.aztec-project.org/?p=916</guid>
		<description><![CDATA[Seit ein paar Monaten wird der Begriff NoSQL (Not only SQL) immer häufiger verwendet. Wir sind mit unserer schemalosen Datenbank StupidDB vor eineinhalb Jahren bereits auf diesen Zug aufgesprungen und jetzt hat sie einen Überbegriff bekommen: auch StupidDB ist NoSQL! Auf dem BarCamp in Nürnberg war NoSQL auch ein Thema und Jonathan Weiss hat in [...]]]></description>
			<content:encoded><![CDATA[<p>Seit ein paar Monaten wird der Begriff <a href="http://www.computerworld.com/s/article/9135086/No_to_SQL_Anti_database_movement_gains_steam" target="_blank">NoSQL (Not only SQL)</a> immer häufiger verwendet. Wir sind mit unserer schemalosen Datenbank <a href="http://sourceforge.net/projects/stupiddb/" target="_blank">StupidDB</a> vor eineinhalb Jahren bereits auf diesen Zug aufgesprungen und jetzt hat sie einen Überbegriff bekommen: auch StupidDB ist NoSQL!</p>
<p>Auf dem <a href="http://www.bcnue2.de/" target="_blank">BarCamp in Nürnberg</a> war NoSQL auch ein Thema und <a href="http://twitter.com/jweiss" target="_blank">Jonathan Weiss</a> hat in seiner Session gut dargestellt, dass relationale Datenbanken nicht immer die Lösung für alle Probleme sind. NoSQL Datenbanken speichern meist dokumentenorientiert und sind dadurch nicht an ein festes Schema gebunden. Relationale Datenbanken haben ein fixes Schema und erlauben dynamische Abfragen der Daten, bei NoSQL ist dies umgekehrt. Weitere Informationen zu <a href="http://en.wikipedia.org/wiki/NoSQL" target="_blank">NoSQL bei Wikipedia</a>.</p>
<p>Im <a href="http://www.dotnetpro.de/articles/onlinearticle3220.aspx" target="_blank">März Heft der dotnetpro</a> stelle ich ausführlich den Einsatz von StupidDB vor. Das Heft ist am 18.2.2010 erschienen und sollte jetzt in jedem gut sortierten Kiosk erhältlich sein.</p>
<p>Für alle, die sich Heft nicht griffbereit haben, ich habe bereits Mitte letzten Jahres in einem Blogpost den <a href="/2009/07/13/stupiddb-object-persistence-framework/" target="_blank">Einsatz von StupidDB</a>  beschrieben. Hier sieht man zumindest die Grundzüge der StupidDB. Das aktuelle dotnetpro Heft lohnt sich jedoch trotzdem, da hier noch weitere Artikel zum Thema NoSQL zu finden sind. Unter anderem das <a href="http://loungerepo.codeplex.com/" target="_blank">Lounge Repository</a> von <a href="http://www.ralfw.de/default.html" target="_blank">Ralf Westphal</a> und auch CouchDB.</p>
<p>Als neuester Vertreter in der NoSQL Bewegung gilt MongoDB. Eine Opensource Implementierung die nun auch Sourceforge einsetzt. Auch dafür gibt es schon <a href="http://odetocode.com/Blogs/scott/archive/2009/10/13/experimenting-with-mongodb-from-c.aspx" target="_blank">Blogposts</a> und Tests mit .NET.</p>
<p>Zudem hat <a href="http://ayende.com/Blog/Default.aspx" target="_blank">Ayende Rahien</a> im Herbst letzten Jahres auch seine <a href="http://odetocode.com/Blogs/scott/archive/2009/10/13/experimenting-with-mongodb-from-c.aspx" target="_blank">Rhino Divan DB</a> vorgestellt. Interessant klingt auch <a href="http://blog.technewlogic.de/StaticContent/Pages/ObjectLounge_Main.aspx" target="_blank">Object Lounge</a>.</p>
<p>Es scheint also ein Bedarf an alternativer Datenpersistenz zu bestehen, wird sich zeigen wohin dieses Jahr die Reise bei NoSQL geht.</p>
<p>Wer sich den aktuellen Code einmal ansehen möchte, kann dies gerne unter folgendem Link ansehen:<br />
<a href="https://stupiddb.svn.sourceforge.net/svnroot/stupiddb/trunk" target="_blank">https://stupiddb.svn.sourceforge.net/svnroot/stupiddb/trunk</a></p>
<p>Als DLL haben wir StupidDB auf <a href="http://www.aztec-project.org" target="_blank">www.aztec-project.org</a> bereitgestellt.</p>
<p>Verwendet ihr schon NoSQL?</p>
<p><a href="http://dotnet-kicks.de/kick/?url=http%3a%2f%2fblog.aztec-project.org%2f2010%2f02%2f22%2fnosql-mit-stupiddb%2f"><img src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblog.aztec-project.org%2f2010%2f02%2f22%2fnosql-mit-stupiddb%2f" border="0" alt="kick it on dotnet-kicks.de" /></a></p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.aztec-project.org%2F2010%2F02%2F22%2Fnosql-mit-stupiddb%2F&amp;title=NoSQL%20mit%20StupidDB"><img src="http://blog.aztec-project.org/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p><fb:like 
		href="http://blog.aztec-project.org/2010/02/22/nosql-mit-stupiddb/" 
		layout="standard" 
		show_faces="true" 
		width="450" 
		
		action="like" 
		colorscheme="light" 
		style="margin-top:5px;"
		class="fb_edge_widget_with_comment fb_iframe_widget"></fb:like>]]></content:encoded>
			<wfw:commentRss>http://blog.aztec-project.org/2010/02/22/nosql-mit-stupiddb/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Beispiel Model-View-Presenter mit WinForms</title>
		<link>http://blog.aztec-project.org/2010/02/16/beispiel-model-view-presenter-winforms/</link>
		<comments>http://blog.aztec-project.org/2010/02/16/beispiel-model-view-presenter-winforms/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 07:48:46 +0000</pubDate>
		<dc:creator>Stefan Kölle</dc:creator>
				<category><![CDATA[How-To]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Contract-First]]></category>
		<category><![CDATA[MVP]]></category>
		<category><![CDATA[WinForms]]></category>

		<guid isPermaLink="false">http://blog.aztec-project.org/?p=888</guid>
		<description><![CDATA[Im Teil 1 (MVP mit WinForms) habe ich die Grundgedanken zur Implementierung von MVP in WinForms vorgestellt, mit der man WinForm-Anwendungen mit UnitTests abdecken kann. In einer komplexeren WinForm-Anwendung gibt es neben dem Startform auch mehrere Unterforms, die durch das Hauptform aufgerufen werden müssen. Das Beispielprojekt Zur Demonstration habe ich ein Beispielprogramm mit MVP entwickelt, [...]]]></description>
			<content:encoded><![CDATA[<p>Im Teil 1 (<a href="/2009/12/02/mvp-mit-WinForms-model-view-presenter/">MVP mit WinForms</a>) habe ich die Grundgedanken zur Implementierung von MVP in WinForms vorgestellt, mit der man WinForm-Anwendungen mit UnitTests abdecken kann. In einer komplexeren WinForm-Anwendung gibt es neben dem Startform auch mehrere Unterforms, die durch das Hauptform aufgerufen werden müssen.</p>
<p><strong>Das Beispielprojekt<br />
</strong><br />
Zur Demonstration habe ich ein Beispielprogramm mit MVP entwickelt, welches einen sehr einfachen Twitterclient darstellt. Das Beispiel wurde nach Contract-First komponentenorientiert gebaut und besteht neben der MVP-Komponente aus weiteren Komponenten.</p>
<p><a href="http://blog.aztec-project.org/wp-content/uploads/2010/02/Foto1.jpg"><img class="alignnone size-full wp-image-900" title="TwitterClient Architektur" src="http://blog.aztec-project.org/wp-content/uploads/2010/02/Foto1.jpg" alt="" width="200" height="159" /></a></p>
<p>Die weiteren Komponenten haben nichts mit MVP zu tun, sondern sollen nur zeigen, wie man MVP in diesem Umfeld integriert. -&gt; <a href="http://blog.aztec-project.org/wp-content/uploads/2010/02/TwitterClient.zip">Den kompletten Sourcecode downloaden</a></p>
<p>Die Funktionen des Twitter-Clients sollen sein:<br />
1. Anzeige der 20 neuesten Meldungen aus der Timeline im Hauptfenster<br />
2. Der Benutzer soll Status-Updates bei Twitter posten können<br />
3. Die Zugangsdaten des Twitter-Accounts sollen gespeichert werden können</p>
<p><strong>Die WinForm-Komponente<br />
</strong></p>
<p>Um die Funktionen abzubilden, sind 3 Screens notwendig:<br />
1. Hauptbildschirm mit der Timeline des Twitter-Accounts<br />
2. Form für das Absenden eines Twitter-Status-Updates<br />
3. Konfigurationsbildschirm für den Twitter-Account</p>
<p><a href="http://blog.aztec-project.org/wp-content/uploads/2010/02/Foto2.jpg"><img class="alignnone size-medium wp-image-901" title="TwitterClient UI" src="http://blog.aztec-project.org/wp-content/uploads/2010/02/Foto2-300x143.jpg" alt="" width="300" height="143" /></a></p>
<p>Jedes WinForm besteht aus einer View-Klasse (dem WinForm), einem Model, welches als Singleton im IoC-Container konfiguriert wird und einem Presenter. Die einzelnen Funktionen in den Views sind im Beispielprojekt durch Tests abgedeckt und zeigen die notwendigen Tests für diese Art der Implementierung. Gerade durch geringen Funktionsumfang kann man das Muster der Verwendung gut erkennen.</p>
<p>In der MVP-Komponente befindet sich auch der &#8220;Inversion of Control&#8221;-Container, der die einzelnen Komponenten zusammenfügt. Dies könnte auch in einer extra Runner-Komponente ausgelagert sein.</p>
<p><strong>Aufrufen eines weiteren WinForms<br />
</strong><br />
Alle Abhängigkeiten werden per Dependency-Injection-Container an den Presenter übergeben. Da das Hauptform alle weiteren Views und Presenter instanziert, müssten diese alle bereits beim Programmstart instanziert werden. Um dies zu verhindern, habe ich eine IPresenterFactory eingeführt, die zur Laufzeit weitere Presenter nachinstanzieren kann. Die Factory selbst hält eine Referenz auf den Container und wird bei Programmstart im Container hinzugefügt. Um sicherzustellen, dass weiterhin alle anderen Abhängigkeiten über den Konstruktor definiert werden, können aus dieser Factory nur Klassen instanziert werden, die IPresenter implementieren.</p>
<p><strong>Fazit</strong><br />
Mit dieser Beispielanwendung kann man eine mögliche Implementierung von Model View Presenter in der Variante Supervising Controller sehen. Es ist also auch mit WinForms eine voll getestete MVP-Implementierung zu erstellen.</p>
<p>Anhang:<br />
<a href="http://blog.aztec-project.org/wp-content/uploads/2010/02/TwitterClient.zip">Kompletter Sourcecode der Beispielanwendung als ZIP</a></p>
<p><a href="http://dotnet-kicks.de/kick/?url=http%3a%2f%2fblog.aztec-project.org%2f2010%2f02%2f16%2fbeispiel-model-view-presenter-winforms%2f"><img src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblog.aztec-project.org%2f2010%2f02%2f16%2fbeispiel-model-view-presenter-winforms%2f" border="0" alt="kick it on dotnet-kicks.de" /></a></p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.aztec-project.org%2F2010%2F02%2F16%2Fbeispiel-model-view-presenter-winforms%2F&amp;title=Beispiel%20Model-View-Presenter%20mit%20WinForms"><img src="http://blog.aztec-project.org/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p><fb:like 
		href="http://blog.aztec-project.org/2010/02/16/beispiel-model-view-presenter-winforms/" 
		layout="standard" 
		show_faces="true" 
		width="450" 
		
		action="like" 
		colorscheme="light" 
		style="margin-top:5px;"
		class="fb_edge_widget_with_comment fb_iframe_widget"></fb:like>]]></content:encoded>
			<wfw:commentRss>http://blog.aztec-project.org/2010/02/16/beispiel-model-view-presenter-winforms/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Softwarezellen &#8211; eine Lösung um die Komplexität zu beherrschen</title>
		<link>http://blog.aztec-project.org/2010/01/27/softwarezellen-eine-losung-um-die-komplexitat-zu-beherrschen/</link>
		<comments>http://blog.aztec-project.org/2010/01/27/softwarezellen-eine-losung-um-die-komplexitat-zu-beherrschen/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 10:01:52 +0000</pubDate>
		<dc:creator>Christina Hirth</dc:creator>
				<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Clean Code Developing]]></category>

		<guid isPermaLink="false">http://blog.aztec-project.org/?p=866</guid>
		<description><![CDATA[Wir haben wie viele von uns in der Webentwicklung vor vielen Jahren mit Scriptsprachen und mit prozeduralen &#8211; Spaghetti-Code &#8211; angefangen. Mit der Zeit wuchs unsere Webpräsenz zu einer unüberschaubaren Anwendung mit manchen Seiten, die keiner von uns mehr anfassen wollte &#8211; aus Angst vor den Konsequenzen. Um etwas Ordnung in die Webanwendungen zu bringen, [...]]]></description>
			<content:encoded><![CDATA[<p>Wir haben wie viele von uns in der Webentwicklung vor vielen Jahren mit Scriptsprachen und mit prozeduralen &#8211; Spaghetti-Code <img src='http://blog.aztec-project.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  &#8211; angefangen. Mit der Zeit wuchs unsere Webpräsenz zu einer unüberschaubaren Anwendung mit manchen Seiten, die keiner von uns mehr anfassen wollte &#8211; aus Angst vor den Konsequenzen.</p>
<p>Um etwas Ordnung in die Webanwendungen zu bringen, haben wir also vor 4 Jahren angefangen, nach einem 3-Schichten-Modell zu entwickeln. Wir haben neue Funktionalitäten und neue Anwendungen nur noch so gebaut und wir waren für eine kurze Zeit zufrieden. Alles lief gut. Als wir den Umstieg auf .NET begonnen haben, haben wir weiterhin nach einem Mehr-Schichten-Modell gearbeitet, wir haben nur die Anzahl der Schichten erhöht.</p>
<p>Die Anwendungen wuchsen weiter, wir haben immer mehr Bereiche ausgelagert und diese hauptsächlich mit Webservices angesprochen. Währenddessen waren wir daran, unser Hauptprodukt, ein Portal für unseren Kunden mit der neuen Technologie entsprechend der alten Anforderung neu zu bauen. Und dann ist es passiert: ehe wir uns versahen, hatten wir ein riesiges Projekt, das alle mögliche Anwendungen eingebunden bzw. durch Webservices angesprochen hat. Die Grenzen waren fließend, eventuelle Änderungen an anderen Anwendungen konnten das Projekt unbuildbar machen, also ein ähnlicher Zustand wie vor paar Jahren zuvor.</p>
<p>Die Weiterentwicklung hat nicht nur in unserer Art zu Programmieren stattgefunden, wir selbst haben uns auch weiterentwickelt, wir haben die Community kennen gelernt. Bei den Open Space-Veranstaltungen haben wir <a href="http://lieser-online.de/" target="_blank">Stefan</a> und <a href="http://ralfw.de/default.html" target="_blank">Ralf</a> kennengelernt und durch sie eine andere Sichtweise der Dinge: die <a href="http://weblogs.asp.net/ralfw/archive/tags/Software+Cells/default.aspx" target="_blank">Modellierung einer Lösung durch Softwarezellen</a>.</p>
<p>Wir haben sie zu uns eingeladen und uns die Idee erklären lassen. Das Stichwort heißt <a href="http://de.wikipedia.org/wiki/Holon" target="_blank">Holon</a>. Wikipedia definiert ein Holon folgendermaßen:</p>
<blockquote><p>Der Begriff Holon (von griech. ὅλος, hólos und ὀν, on „ganzes Seiendes“) wurde von Arthur Koestler geprägt und bedeutet ein Ganzes, das Teil eines anderen Ganzen ist. Es wird auch als &#8220;Ganzes/Teil&#8221; umschrieben.</p></blockquote>
<p>Jede Anwendung ist ein Ganzes, die aus Teilen besteht, die ihrerseits auch als Ganze zu betrachten sind.</p>
<p>Seit dem Besuch von Ralf und Stefan haben wir uns die Artikelserie von Ralf von <a href="http://dotnetpro.de/" target="_blank">dotnetpro</a> durchgelesen, die Webcasts (<a href="https://www.microsoft.com/germany/msdn/webcasts/library.aspx?id=1032298692" target="_blank">Teil 1</a>, <a href="https://www.microsoft.com/germany/msdn/webcasts/library.aspx?id=1032298700" target="_blank">Teil 2</a>) angeschaut und wir haben angefangen, diese Modellierung auszuprobieren. </p>
<p>Wir haben noch einen langen und interessanten Weg vor uns, aber eins ist jetzt schon sicher: wir werden versuchen unsere nächste Projekte durch Softzellen modellieren.</p>
<p>Solange die Komplexität nicht wieder die Überhand gewinnt <img src='http://blog.aztec-project.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><a href="http://dotnet-kicks.de/kick/?url=http%3a%2f%2fblog.aztec-project.org%2f2010%2f01%2f27%2fsoftwarezellen-eine-losung-um-die-komplexitat-zu-beherrschen%2f" target="_blank"><img src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblog.aztec-project.org%2f2010%2f01%2f27%2fsoftwarezellen-eine-losung-um-die-komplexitat-zu-beherrschen%2f" alt="kick it on dotnet-kicks.de" border="0"></a></p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.aztec-project.org%2F2010%2F01%2F27%2Fsoftwarezellen-eine-losung-um-die-komplexitat-zu-beherrschen%2F&amp;title=Softwarezellen%20%26%238211%3B%20eine%20L%C3%B6sung%20um%20die%20Komplexit%C3%A4t%20zu%20beherrschen"><img src="http://blog.aztec-project.org/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p><fb:like 
		href="http://blog.aztec-project.org/2010/01/27/softwarezellen-eine-losung-um-die-komplexitat-zu-beherrschen/" 
		layout="standard" 
		show_faces="true" 
		width="450" 
		
		action="like" 
		colorscheme="light" 
		style="margin-top:5px;"
		class="fb_edge_widget_with_comment fb_iframe_widget"></fb:like>]]></content:encoded>
			<wfw:commentRss>http://blog.aztec-project.org/2010/01/27/softwarezellen-eine-losung-um-die-komplexitat-zu-beherrschen/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Refaktorisierung &#8211; mal anders erklärt</title>
		<link>http://blog.aztec-project.org/2010/01/18/refaktorizierung-mal-anders-erklaert/</link>
		<comments>http://blog.aztec-project.org/2010/01/18/refaktorizierung-mal-anders-erklaert/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 21:09:06 +0000</pubDate>
		<dc:creator>Christina Hirth</dc:creator>
				<category><![CDATA[Clean Code Developing]]></category>
		<category><![CDATA[Buchempfehlung]]></category>
		<category><![CDATA[Clean Code]]></category>
		<category><![CDATA[Refaktorisierung]]></category>

		<guid isPermaLink="false">http://blog.aztec-project.org/?p=844</guid>
		<description><![CDATA[Ich lese gerade das Buch Agile Principles, Patterns and Practices in C# from Robert C. Martin und Micah Martin. Dabei bin ich auf eine so tolle Metapher gestoßen, dass ich sie hier unbedingt niederschreiben wollte (die Übersetzung ist frei von mir): Refaktorisierung ist, wie die Küche nach dem Abendessen aufzuräumen. Das erste Mal, wenn du [...]]]></description>
			<content:encoded><![CDATA[<p>Ich lese gerade das Buch <a href="http://www.amazon.de/Agile-Principles-Patterns-Practices-C/dp/0131857258" target="_blank">Agile Principles, Patterns and Practices in C#</a> from Robert C. Martin und Micah Martin. Dabei bin ich auf eine so tolle Metapher gestoßen, dass ich sie hier unbedingt niederschreiben wollte (die Übersetzung ist frei von mir):</p>
<blockquote><p>Refaktorisierung ist, wie die Küche nach dem Abendessen aufzuräumen. Das erste Mal, wenn du das überspringst, bist mit der Kochen schneller fertig. Aber das Fehlen von sauberem Geschirr und sauberem Arbeitsplatz führt dazu, dass die Vorbereitung diesmal länger dauert. Am liebsten würdest du das Aufräumen wieder überspringen. Tatsache ist, dass du <b>heute</b> ohne das lästige Geschirrspülen wieder schneller fertig wärst. Aber der Schmutz wächst und wächst. Jedes Mal dauert es länger, das richtige Küchengerät zu finden, die vertrockneten Schmutzschichten vom Geschirr ab zu kratzen, und so weiter und so fort. Das Vorbereiten des Abendessens dauert ewig&#8230;<br />
Das Überspringen der Abwasch macht das Kochen eigentlich nicht wirklich schneller.</p>
<p>Das Ziel von Refaktorisierung ist die Bereinigung des Codes, jeden Tag, jede Stunde, jede Minute. Wir wollen nicht den Code versauen. Wir wollen nicht ständig gezwungen zu sein, schmutzigen Bits und Bytes sauber zu schrubben. Wir wollen jeder Zeit in der Lage zu sein, unser System mühelos zu erweitern und zu verändern. Der wichtigste Faktor, der uns das möglich macht, ist die Sauberkeit des Codes. </p></blockquote>
<p>Das Buch habe zwar noch nicht ganz durch, aber was ich bis jetzt gelesen habe, kann ich nur unterschreiben. Es beinhaltet die Prinzipien, wie man in einem agilen Team sauberen Code plant und Mustern und Beispiele, wie man ihn schreibt. Und wie ihr ja sieht, ist es in eine ganz tolle Art geschrieben <img src='http://blog.aztec-project.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a href="http://dotnet-kicks.de/kick/?url=http%3a%2f%2fblog.aztec-project.org%2f2010%2f01%2f18%2frefaktorizierung-mal-anders-erklaert%2f" target="_blank"><img src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblog.aztec-project.org%2f2010%2f01%2f18%2frefaktorizierung-mal-anders-erklaert%2f" alt="kick it on dotnet-kicks.de" border="0"></a></p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.aztec-project.org%2F2010%2F01%2F18%2Frefaktorizierung-mal-anders-erklaert%2F&amp;title=Refaktorisierung%20%26%238211%3B%20mal%20anders%20erkl%C3%A4rt"><img src="http://blog.aztec-project.org/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p><fb:like 
		href="http://blog.aztec-project.org/2010/01/18/refaktorizierung-mal-anders-erklaert/" 
		layout="standard" 
		show_faces="true" 
		width="450" 
		
		action="like" 
		colorscheme="light" 
		style="margin-top:5px;"
		class="fb_edge_widget_with_comment fb_iframe_widget"></fb:like>]]></content:encoded>
			<wfw:commentRss>http://blog.aztec-project.org/2010/01/18/refaktorizierung-mal-anders-erklaert/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MVP mit WinForms (Model-View-Presenter)</title>
		<link>http://blog.aztec-project.org/2009/12/02/mvp-mit-winforms-model-view-presenter/</link>
		<comments>http://blog.aztec-project.org/2009/12/02/mvp-mit-winforms-model-view-presenter/#comments</comments>
		<pubDate>Wed, 02 Dec 2009 12:30:32 +0000</pubDate>
		<dc:creator>Stefan Kölle</dc:creator>
				<category><![CDATA[How-To]]></category>
		<category><![CDATA[MVC]]></category>

		<guid isPermaLink="false">http://blog.aztec-project.org/?p=728</guid>
		<description><![CDATA[Wir setzen seit langer Zeit interne Tools mit WinForms um und hatten seit Anfang an Probleme bei der Testbarkeit dieser Anwendungen. Auch wenn man bei WinForms versucht, jeglichen Code aus der Codebehind-Datei zu entfernen, tut man sich mit dem Unit-Testing weiterhin schwer. Auf der Suche nach einer Lösung zur besseren Testbarkeit stößt man immer wieder [...]]]></description>
			<content:encoded><![CDATA[<p>Wir setzen seit langer Zeit interne Tools mit WinForms um und hatten seit Anfang an Probleme bei der Testbarkeit dieser Anwendungen. Auch wenn man bei WinForms versucht, jeglichen Code  aus der Codebehind-Datei zu entfernen, tut man sich mit dem Unit-Testing weiterhin schwer.</p>
<p>Auf der Suche nach einer Lösung zur besseren Testbarkeit stößt man immer wieder auf ein MVC- oder MVP-Modell, aber nirgends gibt es echte Beispiele in Verbindung mit WinForms. Ich möchte nun in einer Demo-Anwendung einen möglichen Ansatz zur Umsetzung des MVP-Patterns bei WinForms beschreiben.</p>
<p><strong>Die einzelnen Bestandteile von MVP</strong></p>
<p>Das Model repräsentiert den gesamten Zustand und die Logik der Ansicht. Das Model wird über den Presenter gefüllt. Die View enthält keinerlei Anwendungslogik, während der Presenter den Programmablauf steuert.</p>
<p>MVP gibt es in zwei Varianten &#8211; &#8220;Passive View&#8221; und &#8220;Supervising Controller&#8221;. Ich habe mich bei der Implementierung für &#8220;Supervising Controller&#8221; entschieden, da es auf den ersten Blick weniger Code erfordert. Der Unterschied von beiden Varianten besteht darin, dass bei &#8220;Passive View&#8221; die View weder Presenter noch Model kennt und als dumme View nur über den Presenter befüllt wird. Mir gefällt dabei jedoch nicht, dass der Presenter dabei die View genau kennen muss.</p>
<p>Bei &#8220;Supervising Controller&#8221; kennt nun jeweils die View als auch der Presenter das Model, darüber findet der Datenaustausch statt.</p>
<p><strong>Die konkrete Implementierung</strong></p>
<p>Der Presenter wird mit der View und dem Model instanziert.</p>
<div style="font-family: Courier New; font-size: 10pt; color: black; background: white;">
<p style="margin: 0px;"><span style="color: #2b91af;"> 10</span> <span style="color: blue;">public</span> <span style="color: blue;">class</span> <span style="color: #2b91af;">MainPresenter</span> : <span style="color: #2b91af;">IMainPresenter</span></p>
<p style="margin: 0px;"><span style="color: #2b91af;"> 11</span> {</p>
<p style="margin: 0px;"><span style="color: #2b91af;"> 12</span> <span style="color: blue;">private</span> <span style="color: blue;">readonly</span> <span style="color: #2b91af;">IMainView</span> m_view;</p>
<p style="margin: 0px;"><span style="color: #2b91af;"> 13</span> <span style="color: blue;">private</span> <span style="color: blue;">readonly</span> <span style="color: #2b91af;">IMainModel</span> m_model;</p>
<p style="margin: 0px;"><span style="color: #2b91af;"> 14</span></p>
<p style="margin: 0px;"><span style="color: #2b91af;"> 15</span> <span style="color: blue;">public</span> MainPresenter(<span style="color: #2b91af;">IMainView</span> view, <span style="color: #2b91af;">IMainModel</span> model)</p>
<p style="margin: 0px;"><span style="color: #2b91af;"> 16</span> {</p>
<p style="margin: 0px;"><span style="color: #2b91af;"> 17</span> m_view = view;</p>
<p style="margin: 0px;"><span style="color: #2b91af;"> 18</span> m_model = model;</p>
<p style="margin: 0px;"><span style="color: #2b91af;"> 19</span></p>
<p style="margin: 0px;"><span style="color: #2b91af;"> 20</span> InitializeModelAndRefreshView();</p>
<p style="margin: 0px;"><span style="color: #2b91af;"> 21</span> InitializeAndShowView();</p>
</div>
<p>Die View ist das WinForm und wird auch mit dem Model instanziert. Das Model selbst ist ein über den IoC-Container realisiertes Singleton.</p>
<div style="font-family: Courier New; font-size: 10pt; color: black; background: white;">
<p style="margin: 0px;"><span style="color: #2b91af;"> 10</span> <span style="color: blue;">public</span> <span style="color: blue;">partial</span> <span style="color: blue;">class</span> <span style="color: #2b91af;">MainView</span> : <span style="color: #2b91af;">Form</span>, <span style="color: #2b91af;">IMainView</span></p>
<p style="margin: 0px;"><span style="color: #2b91af;"> 11</span> {</p>
<p style="margin: 0px;"><span style="color: #2b91af;"> 12</span> <span style="color: blue;">private</span> <span style="color: blue;">readonly</span> <span style="color: #2b91af;">IMainModel</span> m_model;</p>
<p style="margin: 0px;"><span style="color: #2b91af;"> 13</span></p>
<p style="margin: 0px;"><span style="color: #2b91af;"> 14</span> <span style="color: blue;">public</span> MainView(<span style="color: #2b91af;">IMainModel</span> model)</p>
<p style="margin: 0px;"><span style="color: #2b91af;"> 15</span> {</p>
<p style="margin: 0px;"><span style="color: #2b91af;"> 16</span> m_model = model;</p>
<p style="margin: 0px;"><span style="color: #2b91af;"> 17</span></p>
<p style="margin: 0px;"><span style="color: #2b91af;"> 18</span> InitializeComponent();</p>
<p style="margin: 0px;"><span style="color: #2b91af;"> 19</span> <span style="color: blue;">this</span>.Closed += <span style="color: blue;">delegate</span> { ViewClosed(<span style="color: blue;">this</span>, <span style="color: blue;">new</span> <span style="color: #2b91af;">EventArgs</span>()); };</p>
</div>
<p>Das Model beinhaltet nur Properties mit allen Daten, die zur Anzeige der View notwendig sind.</p>
<p>Wenn der Presenter Daten im Model ändert, ruft dieser explizit eine UpdateMethode in der View  auf. Die View selbst stellt EventHandler zur Verfügung, auf die sich der Presenter hängt, um Aktionen auf der View weiter zu bearbeiten.</p>
<div style="font-family: Courier New; font-size: 10pt; color: black; background: white;">
<p style="margin: 0px;"><span style="color: #2b91af;"> 60</span> <span style="color: blue;">public</span> <span style="color: blue;">event</span> <span style="color: #2b91af;">EventHandler</span>&lt;<span style="color: #2b91af;">EventArgs</span>&gt; ViewClosed;</p>
</div>
<p>Im Presenter sieht dies folgendermaßen aus:</p>
<div style="font-family: Courier New; font-size: 10pt; color: black; background: white;">
<p style="margin: 0px;"><span style="color: #2b91af;"> 31</span> <span style="color: blue;">private</span> <span style="color: blue;">void</span> InitializeAndShowView()</p>
<p style="margin: 0px;"><span style="color: #2b91af;"> 32</span> {</p>
<p style="margin: 0px;"><span style="color: #2b91af;"> 33</span> m_view.Title = <span style="color: #a31515;">&#8220;ResourcerClient V1.0&#8243;</span>;</p>
<p style="margin: 0px;"><span style="color: #2b91af;"> 34</span> m_view.ViewClosed += <span style="color: blue;">new</span> <span style="color: #2b91af;">EventHandler</span>&lt;<span style="color: #2b91af;">EventArgs</span>&gt;(mainView_ViewClosed);</p>
</div>
<div style="font-family: Courier New; font-size: 10pt; color: black; background: white;">
<p style="margin: 0px;"><span style="color: #2b91af;"> 42</span> <span style="color: blue;">void</span> mainView_ViewClosed(<span style="color: blue;">object</span> sender, <span style="color: #2b91af;">EventArgs</span> e)</p>
<p style="margin: 0px;"><span style="color: #2b91af;"> 43</span> {</p>
<p style="margin: 0px;"><span style="color: #2b91af;"> 44</span> <span style="color: #2b91af;">Application</span>.Exit();</p>
<p style="margin: 0px;"><span style="color: #2b91af;"> 45</span> }</p>
</div>
<p>Damit ist die Grundlage des MVP Patterns bei WinForms angelegt. Der Presenter ist damit schon voll testbar, da er komplett von der View abgekoppelt ist. Bis jetzt sieht alles sehr einfach aus. Auch einige andere Beispiele aus dem Netz gehen soweit. Doch wie instanziert man jetzt eine weitere View bzw. einen weiteren Presenter?</p>
<p><a href="/2010/02/16/beispiel-model-view-presenter-winforms/"><br />
Mehr dazu im zweiten Teil</a></p>
<p><a href="http://dotnet-kicks.de/kick/?url=http%3a%2f%2fblog.aztec-project.org%2f2009%2f12%2f02%2fmvp-mit-winforms-model-view-presenter%2f"><img src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblog.aztec-project.org%2f2009%2f12%2f02%2fmvp-mit-winforms-model-view-presenter%2f" border="0" alt="kick it on dotnet-kicks.de" /></a></p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.aztec-project.org%2F2009%2F12%2F02%2Fmvp-mit-winforms-model-view-presenter%2F&amp;title=MVP%20mit%20WinForms%20%28Model-View-Presenter%29"><img src="http://blog.aztec-project.org/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p><fb:like 
		href="http://blog.aztec-project.org/2009/12/02/mvp-mit-winforms-model-view-presenter/" 
		layout="standard" 
		show_faces="true" 
		width="450" 
		
		action="like" 
		colorscheme="light" 
		style="margin-top:5px;"
		class="fb_edge_widget_with_comment fb_iframe_widget"></fb:like>]]></content:encoded>
			<wfw:commentRss>http://blog.aztec-project.org/2009/12/02/mvp-mit-winforms-model-view-presenter/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

