<?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 &#187; MVC</title>
	<atom:link href="http://blog.aztec-project.org/category/mvc/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>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>]]></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>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>]]></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>
		<item>
		<title>ASP.MVC 2 &#8211; Vortrag von Albert bei münchener UserGroup</title>
		<link>http://blog.aztec-project.org/2009/10/30/asp-mvc-2-bei-munchener-usergroup/</link>
		<comments>http://blog.aztec-project.org/2009/10/30/asp-mvc-2-bei-munchener-usergroup/#comments</comments>
		<pubDate>Fri, 30 Oct 2009 08:50:46 +0000</pubDate>
		<dc:creator>Christina Hirth</dc:creator>
				<category><![CDATA[MVC]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Veranstaltung]]></category>

		<guid isPermaLink="false">http://blog.aztec-project.org/?p=692</guid>
		<description><![CDATA[Gestern Abend waren wir alle bei einem super Vortrag von Albert über ASP.MVC v2. Die neue Version soll am 22. März zusammen mit .NET 4.0 rauskommen. Ich will jetzt nicht über all die Neuigkeiten sprechen, die wir gestern erfahren haben und worüber wir uns jetzt schon freuen müssen, nur über einen speziellen Teil: die Validierung [...]]]></description>
			<content:encoded><![CDATA[<p>Gestern Abend waren wir alle bei einem super Vortrag von <a href="http://der-albert.com/" target="_blank">Albert</a> über ASP.MVC v2. Die neue Version soll am 22. März zusammen mit .NET 4.0 rauskommen.<br />
Ich will jetzt nicht über all die Neuigkeiten sprechen, die wir gestern erfahren haben und worüber wir uns jetzt schon freuen müssen, nur über einen speziellen Teil: die Validierung der Daten durch Attribute.</p>
<p>Der Grund ist folgender: wir haben uns vor ca. 1 Jahr ein eigenes Attribut namens <code>ObligatoryFieldAttribut</code> gebaut. Dieses wird über die Properties gesetzt, die wir für die Speicherung als unerheblich markieren möchten. Die Überprüfung erfolgt dann durch Reflection.</p>
<p>Und was haben wir gestern erfahren? In der neue MVC-Version gibt es ein neues Attribut namens <code>Required</code>, das genau das tut!</p>
<p>Ihr könnt euch sicher vorstellen, was wir uns gestern gedacht haben: wir lagen genau richtig und wir waren unserer Zeit voraus! Oder haben unsere Büro-Nachbarn &#8211; die eine <em>Microsoft Subsidiary</em> sind &#8211; Kameras bei uns installiert <img src='http://blog.aztec-project.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ?</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%2F10%2F30%2Fasp-mvc-2-bei-munchener-usergroup%2F&amp;title=ASP.MVC%202%20%26%238211%3B%20Vortrag%20von%20Albert%20bei%20m%C3%BCnchener%20UserGroup"><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>]]></content:encoded>
			<wfw:commentRss>http://blog.aztec-project.org/2009/10/30/asp-mvc-2-bei-munchener-usergroup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

