<?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:rssdatehelper="urn:rssdatehelper"><channel><title>Jongens van Wazzup</title><link>http://www.dejongensvanwazzup.nl</link><pubDate></pubDate><generator>umbraco</generator><description>ontwikkelen = vooruitgang</description><language>nl</language><item><title>Waarom ik haast geen enums meer gebruik</title><link>http://www.dejongensvanwazzup.nl/2010/7/18/waarom-ik-haast-geen-enums-meer-gebruik.aspx</link><pubDate>Sun, 18 Jul 2010 22:07:36 GMT</pubDate><guid>http://www.dejongensvanwazzup.nl/2010/7/18/waarom-ik-haast-geen-enums-meer-gebruik.aspx</guid><description><![CDATA[ 
<p><strong><img src="/media/184/WindowsLiveWriter_Hijdieopvoedtniethijdieverwektisdevader_14917_image_thumb_2.png" width="54" height="64" alt="image" border="0" style="border-right-width: 0px; margin: 0px 10px 0px 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px"/>Enums,
kleine lijstjes met waarden die helpen bij het Type-safe en
leesbaar houden van je code in de gevallen dat je een keuze wilt
afdwingen of controleren. Maar je kan er zo bar weinig mee. De
methode waar ik de voorkeur aan geef? Het Descriptor
Pattern.</strong></p>

<p>We gebruiken ze allemaal, de enums. Een lijst met hard
gecodeerde waarden. Maar buiten de Type-safety en het eventueel
'flaggable' maken (meerdere keuzes tegelijkertijd) is er niet bij.
Zo niet bij het Descriptor Pattern. <a
href="http://www.sanderhoogendoorn.com">Sander Hoogendoorn</a>
heeft in juni 2005 een mooi artikel gepubliceerd in het .Net
magazine waarin hij&nbsp; vijf verschillende wijzen beschrijft hoe
met een lijst met waarden om te gaan. <a
href="http://download.microsoft.com/download/6/2/2/622ef058-691c-4f4e-b17b-da29c44a5e57/Net9_p53-57_105.pdf">
Sanders artikel is een echte aanrader</a>.</p>

<p>Het Descriptor Pattern passen wij in het <a
href="http://www.venum.nl">Venum</a> project veel toe. Zeker omdat
de lijsten die we gebruiken vaak net wat meer informatie weer
moeten geven. Om hier gestructureerd mee om te gaan hebben we een
DescriptorBase class gedefinieerd. Die het lastige werk van het
creëren van List&lt;T&gt;, ToString()&nbsp; en instantiëren voor
zijn rekening neemt.</p>

<p>Nu eerst een stuk basis. Een eenvoudige Descriptor is als
volgt:</p>

<p><!-- code formatted by http://manoli.net/csharpformat/ --></p>

<pre class="csharpcode">
<span class="kwrd">public</span> <span
class="kwrd">class</span> SampleDescriptor
{
  <span class="kwrd">public</span> <span
class="kwrd">static</span> SampleDescriptor None = <span
class="kwrd">new</span> SampleDescriptor(<span
class="str">"None"</span>);
  <span class="kwrd">public</span> <span
class="kwrd">static</span> SampleDescriptor Yes  = <span
class="kwrd">new</span> SampleDescriptor(<span
class="str">"Yes"</span>);
  <span class="kwrd">public</span> <span
class="kwrd">static</span> SampleDescriptor No   = <span
class="kwrd">new</span> SampleDescriptor(<span
class="str">"No"</span>);

  <span class="kwrd">private</span> <span
class="kwrd">string</span> _value;

  <span class="kwrd">private</span> SampleDescriptor(<span
class="kwrd">string</span> <span class="kwrd">value</span>){
    _value = <span class="kwrd">value</span>;
  }

  <span class="kwrd">public</span> <span
class="kwrd">override</span> <span
class="kwrd">string</span> ToString() {
    <span class="kwrd">return</span> _value;
  }
}
</pre>

<p>De static fields kunnen we direct gebruiken als waarden in onze
IDE. De Type-safety is gegarandeerd. De descriptor heeft een
private constructor, een andere instantie maken is dus niet
mogelijk. De aanroep van deze lijst is eenvoudig, bijvoorbeeld:</p>

<p><!-- code formatted by http://manoli.net/csharpformat/ --></p>

<pre class="csharpcode">
var x = SampleDescriptor.None;
<span class="kwrd">if</span> (x == SampleDescriptor.Yes)
  Console.WriteLine(<span class="str">"Yes, it is."</span>);;
Console.WriteLine(x);
</pre>

<p>Om deze lijst bijvoorbeeld weer te geven in een DropDownBox,
kunnen we de datasource gewoon richten op de Descriptor, maar we
moeten dan wel een method hebben die de Descriptor omzet naar een
lijst.</p>

<p><!-- code formatted by http://manoli.net/csharpformat/ --></p>

<pre class="csharpcode">
<span
class="kwrd">public</span> List&lt;SampleDescriptor&gt; GetList()
{
  var result = <span
class="kwrd">new</span> List&lt;SampleDescriptor&gt;();
  <span class="kwrd">foreach</span> (var e <span
class="kwrd">in</span> <span
class="kwrd">this</span>.GetType().GetFields())
    <span class="kwrd">if</span> (e.FieldType == <span
class="kwrd">this</span>.GetType())
      result.Add((SampleDescriptor)e.GetValue(<span
class="kwrd">null</span>))
  <span class="kwrd">return</span> result;
}
</pre>

<p>Een uitgewerkt voorbeeld en een bruikbare DescriptorBase class
heb ik in deze zip geplaatst : <a
href="/media/441/descriptorsample.zip">DescriptorSample.zip</a> .
Bekijk deze en maak er gebruik van, je zal zien dat dit een
werkelijk geweldige manier is om met lijsten te werken. In het
voorbeeld maak&nbsp; ik ook gebruik van een resource file voor de
beschrijvingen, op deze manier is nu eenvoudig mogelijk om de lijst
te gebruiken in een meertalige User Interface.</p>
]]></description></item><item><title>Waarom ik liever een Extension Method gebruik</title><link>http://www.dejongensvanwazzup.nl/2010/7/4/waarom-ik-liever-een-extension-method-gebruik.aspx</link><pubDate>Sun, 04 Jul 2010 23:57:16 GMT</pubDate><guid>http://www.dejongensvanwazzup.nl/2010/7/4/waarom-ik-liever-een-extension-method-gebruik.aspx</guid><description><![CDATA[ 
<p><img src="/media/184/WindowsLiveWriter_Hijdieopvoedtniethijdieverwektisdevader_14917_image_thumb_2.png" width="54" height="64" alt="image" border="0" style="border-right-width: 0px; margin: 0px 10px 0px 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px"/><strong>Een ieder die werkt met het .Net Framework
3.0 of hoger werkt vast en zeker met de zogenaamde <em>Extension
Methods</em>. Althans, dat dacht ik. Toch spreek ik regelmatig
vakgenoten die er weinig of geen gebruik van maken. Hoe komt dit
toch? Is het het aloude <em>onbekend maakt onbemind</em> of licht
er meer aan ten grondslag?</strong></p>

<p>Maar eerst, wat is een Extension Method? Vrij vertaald is het
een uitbreidingsfunctie. Een functie die wordt toegevoegd aan de
bestaande set van functies van een bepaald Type. Deze functie is
statisch en kan te allen tijd worden aangeroepen. Een klein
voorbeeld: het object van het Type String beschikt niet van nature
over de mogelijkheid om te bepalen of de tekst die het bevat een
geldig e-mailadres bevat. De volgende syntax zou tot niets
leiden:</p>

<p><!-- code formatted by http://manoli.net/csharpformat/ --></p>

<pre class="csharpcode">
var s = <span class="str">"misschien een emailadres"</span>;
<span class="kwrd">if</span> (s.IsValidEmail()) <span
class="kwrd">continue</span>;
</pre>

<p>&nbsp;</p>

<p>Zodra ik echter de Extension Method IsValidEmail heb
gedefinieerd, dan kan ik deze te pas en te onpas aanroepen. Nu hoor
ik de lezer al denken: "leuk allemaal, maar we hadden toch al de
gewone 'helper' methods die ik in mijn bibliotheek had staan?"
Inderdaad, die heb je al, en ik pleit er voor om deze af te stoffen
en desnoods zelfs te herschrijven naar Extension Methods. Waarom?
Omdat het zo veel meer leesbare code oplevert!</p>

<p>Nu hoorde ik laatst een collega van mij opperen dat er ook
nadelen zitten aan het gebruik van Extension Methods. De nadelen
die ik later vond stonden gewoon vermeld in de <a
href="http://msdn.microsoft.com/en-us/library/bb383977.aspx">msdn
documentatie</a>. En ja, deze zou je als nadelen kunnen betitelen,
zelf zie ik ze als slechts een kleine beperking op het grote gemak
dat deze functies ons bieden. Volgens de <a
href="http://msdn.microsoft.com/en-us/library/bb383977.aspx">msdn
documentatie</a> is het beter om je eigen types te definiëren daar
waar mogelijk, je loopt immers het risico dat het Type dat je
uitbreidt door een andere partij wordt gewijzigd. Daarmee komt je
Extension Method potentieel in de gevarenzone.</p>

<p>Deze waarschuwing uit de documentatie moeten we wel in de gaten
houden, het is een terecht punt. Niettemin, denk aan de kracht die
Visual Studio je nu kan bieden! Al die oude 'helper' methods worden
nu via IntelliSense aangeboden (mits je uiteraard de namespace van
de extensionmethod in je using directives hebt geplaatst). Geen
uitingen meer van: 'welke functie had ik hier voor bedacht!'</p>

<p>Vandaag heb ik nog een Extension Method voor een simpele
afvanging van <em>is null</em> gemaakt. Ik zat met het uitvragen
van custom properties in een Xml node.</p>

<p><!-- code formatted by http://manoli.net/csharpformat/ --></p>

<pre class="csharpcode">
var s = node.GetProperty(<span
class="str">"SomePropertyName"</span>).Value;
</pre>

<p>&nbsp;</p>

<p>Zodra de property niet gevonden zou worden, zou ik een
Null-reference Exception om mijn oren krijgen. Bedenk nu dat ik
vele van deze regels code moest bewerken. De volgende oplossing
werkt dan wel, maar zou mijn code enorm 'vervuilen':</p>

<p><!-- code formatted by http://manoli.net/csharpformat/ --></p>

<pre class="csharpcode">
var s = node.GetProperty(<span
class="str">"SomePropertyName"</span>)!=<span
class="kwrd">null</span>?
                node.GetProperty(<span
class="str">"SomePropertyName"</span>).Value:
                   String.Empty;
</pre>

<p>&nbsp;</p>

<p>Liever maak ik snel een Extension method aldus:</p>

<p><!-- code formatted by http://manoli.net/csharpformat/ --></p>

<pre class="csharpcode">
<span class="kwrd">public</span> <span
class="kwrd">static</span> <span
class="kwrd">string</span> GetNullableValue(<span
class="kwrd">this</span> Property <span class="kwrd">value</span>)
{
   <span class="kwrd">if</span> (<span
class="kwrd">value</span> == <span class="kwrd">null</span>) <span
class="kwrd">return</span> <span class="kwrd">string</span>.Empty;
   <span class="kwrd">return</span> <span
class="kwrd">value</span>.Value;
}
</pre>

<p>&nbsp;</p>

<p>Dit zorgt er voor dat ik nu elke regel als volgt kan
toepassen:</p>

<p><!-- code formatted by http://manoli.net/csharpformat/ --></p>

<pre class="csharpcode">
var s = node.GetProperty(<span
class="str">"SomePropertyName"</span>).GetNullableValue();
</pre>

<p>&nbsp;</p>

<p>Dus, waarom gebruik ik bijna overal een Extension Method:</p>

<ul>
<li>leesbare code;</li>

<li>ondersteuning IntelliSense;</li>

<li>snelle opbouw van mijn codebibliotheek;</li>

<li>en het is zoooo makkelijk.</li>
</ul>

<p>&nbsp;</p>
]]></description></item><item><title>Onze ORM tooling keuze voor Venum</title><link>http://www.dejongensvanwazzup.nl/2010/6/28/onze-orm-tooling-keuze-voor-venum.aspx</link><pubDate>Mon, 28 Jun 2010 09:47:40 GMT</pubDate><guid>http://www.dejongensvanwazzup.nl/2010/6/28/onze-orm-tooling-keuze-voor-venum.aspx</guid><description><![CDATA[ 
<blockquote>
<p><a
href="/media/245/WindowsLiveWriter_OnzeORMtoolingkeuzevoorVenum_89A6_clip_image002_2.jpg">
<img src="/media/250/WindowsLiveWriter_OnzeORMtoolingkeuzevoorVenum_89A6_clip_image002_thumb.jpg" width="54" height="58" alt="clip_image002" border="0" style="border-right-width: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px"/></a> <strong>Er zijn veel ORM tools beschikbaar voor
.Net waarvan de belangrijkste hieronder genoemd.&nbsp;<br />
 - ADO.NET Entity Framework<br />
 - Linq to SQL- ADO .NET<br />
 - LLBL Gen<br />
 - NHibernate</strong></p>
</blockquote>

<h4><strong>ADO.Net Entity Framework</strong></h4>

<p>We hebben met ADO.NET Entity Framework geëxperimenteerd. Echter
viel deze optie al vrij snel af. Want de versie die wij gebruikten
(.NET 3.5, VS2008, SP1) kon classes uit een bestaande database
genereren. Daarbij waren de objecten "vervuild" met specifieke
Entity Framework attributen en overervingen. En laat dat nu net het
tegenovergestelde zijn van Domain Driven Design. Voor Visual Studio
2010 is er een nieuwe versie beschikbaar die wel op basis classes
een database kan genereren. Erg mooi, maar de database definiëren
zit niet het meeste werk in, en de classes blijven 'vervuild' met
Entity Framework objecten.</p>

<h4><strong>Linq to SQL</strong></h4>

<p>Linq is een techniek die we in het Venum project vaak toepassen
om resultaten te krijgen uit collecties door middel van een query.
Hierdoor lijkt Linq to SQL de perfecte keuze voor het Venum
project. Echter zit er een groot nadeel in het gebruik van Linq to
SQL, en wel het volgende: Linq to SQL vertaald classes 1 op 1 met
tabellen. Hierdoor heb je niet de gehele vrijheid in het
ontwikkelen van het Domein Model. Zo moeten alle properties bestaan
in de class die in de corresponderende tabel zijn gedefinieerd. Ook
is het tot nu toe voor ons onduidelijk hoe Linq to SQL om kan gaan
met overervingen.</p>

<h4><strong>LLBL Gen</strong></h4>

<p>Wij zijn niet diep in de techniek van LLBL Gen gedoken omdat
vrij snel duidelijk was dat het de code in het domein model
"vervuild" met LLBL Gen specifieke code.</p>

<h4><strong>NHibernate</strong></h4>

<p>NHibernate is behoorlijk complex om te leren maar dat lijkt
achteraf het enige nadeel van NHibernate. Want het voldoet aan alle
eisen die wij stellen aan de ORM tooling voor het Venum project.
Ten eerste hoeft het domein model niet "vervuild" te worden met
NHibernate attributen of overervingen. Ten tweede geeft NHibernate
de vrijheid de database naar keuze in te richten nadat het domein
model is gedefinieerd en eventueel visa versa als men Data Driven
Design wil toepassen. Wij maken gretig gebruik van deze vrijheid,
met als voorbeeld dat we voor een abstract class 1 tabel definiëren
met alle eigenschappen van de gerelateerde superclasses. Er zitten
echter nog wel wat "addertjes onder het gras" maar die zullen
worden beschreven in het volgende hoofdstuk.</p>

<h3><strong>Hoe wij ORM toepassen in Venum</strong></h3>

<p>In Venum hebben wij meerdere typen datalagen geïmplementeerd.
Hieronder vallen de volgende implementaties:</p>

<p>- Mock: Voor het testen van de applicatie</p>

<p>- WCF: Voor het communiceren met de webservice(s).</p>

<p>- Database: Voor het schrijven en lezen uit een database.</p>

<p>De bovenstaande implementaties implementeren dezelfde interface
hetgeen het mogelijk maakt een andere implementatie te injecteren
in de testomgeving dan in de productieomgeving.</p>

<p>In dit hoofdstuk laten we de Mock en de WCF implementatie van de
datalagen ongemoeid en zullen we enkel de database implementatie
onder de loep nemen. Dit is immers de enige implementatie die
gebruik maakt van ORM (NHibernate). Nergens anders in de applicatie
zullen we ORM gerelateerde referenties tegenkomen.</p>

<h4><strong>Onze ORM regels</strong></h4>

<p>ORM-tools moet weten hoe instanties van objecten in de database
opgeslagen worden. Hiervoor moeten 'mappings' worden gedefinieerd
die dit beschrijven.</p>

<p>Er zijn een paar basis-regels die wij hanteren voor ORM binnen
het Venum project.</p>

<h5><strong>Schoon domein model</strong></h5>

<p>We hebben gekozen om geen ORM gerelateerde code of attributen in
het domeinmodel te verwerken. Hiermee verliezen we aan de ene kant
opties om mapping simpel te maken, aan de andere kant winnen we op
het gebied van flexibiliteit. Alle mapping gebeurd aan de hand van
de xml bestanden in de database laag.</p>

<h5><strong>1 op 1 relaties</strong></h5>

<p>Alle 1 op 1 relaties worden in de database in dezelfde tabel
opgeslagen, tenzij de relatie null kan zijn.</p>

<p>Stel je hebt class Person met property Address van het type
GeoAddress:</p>

<p><!-- code formatted by http://manoli.net/csharpformat/ --></p>

<pre class="csharpcode">
<span class="kwrd">public</span> <span
class="kwrd">class</span> Person
{
    <span class="kwrd">private</span> GeoAddress m_address = <span
class="kwrd">new</span> GeoAddress();

    <span class="kwrd">public</span> <span
class="kwrd">string</span> Name{ get; set; }

    <span class="kwrd">public</span> GeoAddress Address
    {
      get { <span class="kwrd">return</span> m_address; }
      set { m_address = <span class="kwrd">value</span>; }
    }

    <span class="kwrd">public</span> <span
class="kwrd">class</span> GeoAddress
    {
      <span class="kwrd">public</span> <span
class="kwrd">string</span> Street{ get; set; }
      <span class="kwrd">public</span> <span
class="kwrd">string</span> City { get; set; }
    }
}
</pre>

<p>&nbsp;</p>

<p>Dan wordt de tabel tblPerson als volgt gedefineerd:</p>

<p>&nbsp;</p>

<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="92" valign="top">
<p><strong>tblPerson</strong></p>
</td>
</tr>

<tr>
<td width="92" valign="top">
<p>Name</p>
</td>
</tr>

<tr>
<td width="92" valign="top">
<p>Street</p>
</td>
</tr>

<tr>
<td width="92" valign="top">
<p>City</p>
</td>
</tr>
</tbody>
</table>

<p><br />
<br />
</p>

<p>Het voordeel van het opslaan van 1 op 1 relaties van het
domeinmodel in de database tables is dat er geen join statements in
de queries naar de database hoeven worden uitgevoerd wat de
snelheid van data opslaan en uitlezen bevorderd. Let wel, de
bovenstaande constructie gaat (helaas) niet op voor 1 op 1 relaties
die null kunnen zijn.</p>

<h5>Overervingen</h5>

<p>Verschillende overervingen van subclasses worden in 1 tabel
opgeslagen. Het exacte type van de instantie wordt door NHibernate
achterhaald aan de hand van een zogenoemde discriminator waarde.
Voor elke superclasse kan een discriminator waarde worden
gedefineerd waarmee NHibernate kan achterhalen welke waarden moeten
worden opgeslagen voor welk type. En nog belangrijker, welk type
superclass NHibernate moet retourneren bij het uitlezen van een
record uit de table.</p>

<p>Hieronder een voorbeeld van overervingen:</p>

<p><!-- code formatted by http://manoli.net/csharpformat/ --></p>

<pre class="csharpcode">
<span class="kwrd">public</span> <span
class="kwrd">class</span> Boss: Person
{
  <span
class="kwrd">public</span> DateTime DateOfBirth { get; set; }
}
<span class="kwrd">public</span> <span
class="kwrd">class</span> Employee: Person
{
  <span class="kwrd">public</span> <span
class="kwrd">string</span> CompanyName { get; set; }
}
<span class="kwrd">public</span> <span
class="kwrd">abstract</span> <span class="kwrd">class</span> Person
{
  <span class="kwrd">public</span> <span
class="kwrd">string</span> Name{ get; set; }
}
</pre>

<p>&nbsp;</p>

<p>Dan wordt de tabel als volgt gedefineerd, waarbij de
discriminator waarde in PersonTypeID wordt opgeslagen:</p>

<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="92" valign="top">
<p><strong>tblPerson</strong></p>
</td>
</tr>

<tr>
<td width="92" valign="top">
<p>PersonTypeID</p>
</td>
</tr>

<tr>
<td width="92" valign="top">
<p>Name</p>
</td>
</tr>

<tr>
<td width="92" valign="top">
<p>DateOfBirth</p>
</td>
</tr>

<tr>
<td width="92" valign="top">
<p>CompanyName</p>
</td>
</tr>
</tbody>
</table>

<p><br />
<br />
</p>

<p>Het voordeel van het opslaan van superclassen in een tabel met
de naam van de subclass is dat er geen waarden dubbel hoeven worden
beschreven voor NHibernate. Hierbij hoeft bijvoorbeeld maar 1 tabel
worden uitgebreid als de class Person wordt aangevuld met extra
properties.</p>

<h5><strong>Database validatie</strong></h5>

<p>Vrijwel alle validatie van instanties worden uitgevoerd door het
domein en zo min mogelijk door de database, hoewel deze wel veel
mogelijkheden daartoe biedt. Echter zou dat betekenen dat we
validatie dubbel op aan het implementeren zijn.</p>

<p>Alle kolommen van de tables in de database mogen null-waardes
bevatten, behalve de kolommen die als primaire sleutel zijn
gedefinieerd.<br />
 Wel worden er foreign keys gedefinieerd maar niet met oogpunt van
relationele integriteit, maar om NHibernate te helpen met
beschrijven van relaties. De naam van de foreign keys kunnen
namelijk gebruikt worden voor het beschrijven van relaties voor
NHibernate.</p>

<h4><strong>Onderhoud van data</strong></h4>

<p>Het schrijven van SQL-queries voor onderhoud van de data raden
wij af. Dit om twee redenen, namelijk:</p>

<p>1. Extra onderhoud van het product, de SQL queries zouden ook
moeten worden bijgewerkt als er veranderingen optreden in het
domeinmodel.</p>

<p>2. Er kan corrupte data ontstaan omdat men met behulp van SQL
queries kolommen met foutieve waarden kan vullen die niet meer goed
te mappen zijn met het domein model.</p>

<p>Om toch snel en effectief bijvoorbeeld onderhoud applicaties te
kunnen schrijven maken we gebruik van het domeinmodel met het
bijbehorende NHibernate project. Denk bijvoorbeeld aan het starten
van een nieuw project die gebruik maakt van de bovengenoemde
projecten. Hierbij wordt het relationele databeheer volledig aan
NHibernate overgelaten en wordt het data beheer volledig geschreven
in code aan de hand van instanties uit het domeinmodel die
gepersisteerd moeten worden.</p>

<p><em>In het vervolg van dit artikel kunt u informatie verwachten
met voorbeelden van NHibernate en over de architectuur van
Venum.</em></p>
]]></description></item><item><title>Meerdere soorten Views in PRISM</title><link>http://www.dejongensvanwazzup.nl/2010/6/28/meerdere-soorten-views-in-prism.aspx</link><pubDate>Mon, 28 Jun 2010 09:38:04 GMT</pubDate><guid>http://www.dejongensvanwazzup.nl/2010/6/28/meerdere-soorten-views-in-prism.aspx</guid><description><![CDATA[ 
<p><a
href="/media/209/WindowsLiveWriter_MeerderesoortenViewsinPRISM_83B8_image_2.png">
<img src="/media/214/WindowsLiveWriter_MeerderesoortenViewsinPRISM_83B8_image_thumb.png" width="64" height="56" alt="image" border="0" style="border-right-width: 0px; margin: 0px 10px 5px 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px"/></a>
In deze post ga ik het hebben over een probleem waar ik tegen aan
ben gelopen bij het gebruik van Prism. Deze techniek wordt
toegepast in Silverlight -waarin wij werken- maar ook in WPF
applicaties. Deze techniek zorgt er voor dat de verschillende delen
van de applicatie losgekoppeld worden en daarmee makkelijk te
veranderen of te hergebruiken zijn. Voor meer informatie over Prism
ga naar <a
href="http://compositewpf.codeplex.com/">http://compositewpf.codeplex.com/</a>
of volg de goede tutorial van Channel9 hier: <a
href="http://channel9.msdn.com/posts/akMSFT/Creating-a-modular-application-using-Prism-V2-Part-1-of-4--Creating-a-shell-and-modules/">
http://channel9.msdn.com/posts/akMSFT/Creating-a-modular-application-using-Prism-V2-Part-1-of-4--Creating-a-shell-and-modules/</a>.</p>

<p><strong>Het probleem<br />
</strong> Wanneer ik in Prism verschillende Regions defineer en
daar views in stop, kan ik niet de lay-out van mijn applicatie
drastisch veranderen per scherm.&nbsp; Neem bijvoorbeeld deze
lay-out:</p>

<p><a
href="/media/219/WindowsLiveWriter_MeerderesoortenViewsinPRISM_83B8_image_4.png">
<img src="/media/224/WindowsLiveWriter_MeerderesoortenViewsinPRISM_83B8_image_thumb_1.png" width="554" height="384" alt="image" border="0" style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px"/></a></p>

<p>Wat als ik nou een loginscherm wil hebben waarbij bijvoorbeeld
linksboven het login gedeelte zit en in het midden een news feed?
Dan moeten mijn regions wel heel anders gedefinieerd zijn dan
hierboven het geval is. Na een tijdje hiermee gestoeid te hebben
ben ik tot de volgende oplossing gekomen.</p>

<p><strong>De oplossing<br />
</strong></p>

<p>Eerst heb ik een full screen region gemaakt in de shell.xaml.
Dit is de enige region in de Shell.</p>

<p><!-- code formatted by http://manoli.net/csharpformat/ --></p>

<pre class="csharpcode">
&lt;ContentControl regions:RegionManager.RegionName=<span
class="str">"FullScreen"</span>
  VerticalContentAlignment=<span class="str">"Stretch"</span>
  HorizontalContentAlignment=<span class="str">"Stretch"</span>&gt;
&lt;/ContentControl&gt;
</pre>

<p>&nbsp;</p>

<p>Wanneer de applicatie opstart registreer ik de Welcome view met
het fullscreen region:</p>

<p><!-- code formatted by http://manoli.net/csharpformat/ --></p>

<pre class="csharpcode">
m_regionManager.RegisterViewWithRegion(Regions.FullScreen.ToString(), () =&gt;
   m_container.Resolve&lt;ViewWelcome&gt;());
</pre>

<p>&nbsp;</p>

<p>De ViewWelcome heeft zijn eigen regions voor het login scherm,
zoals ik boven beschreven heb.</p>

<p>Wanneer de gebruiker is ingelogd, deactiveer ik het Welcome
scherm en activeer ik het Main scherm, deze bevat alle andere
regions zoals boven in het plaatje te zien is. Ik doe dit in de
Shell.xaml.cs codebehind, door me te subscriben aan een event door
gebruik te maken van de eventaggregator zoals hier in de
constructor:</p>

<p><!-- code formatted by http://manoli.net/csharpformat/ --></p>

<pre class="csharpcode">
m_regionManager.RegisterViewWithRegion(Regions.FullScreen.ToString(), () =&gt; 
  m_container.Resolve&lt;ViewWelcome&gt;());
</pre>

<p>&nbsp;</p>

<p>En dit is de method die gebruikt wordt om tussen de views te
wisselen:</p>

<p><!-- code formatted by http://manoli.net/csharpformat/ --></p>

<pre class="csharpcode">
<span class="kwrd">private</span> <span
class="kwrd">void</span> switchViewsEventHandler(<span
class="kwrd">string</span> viewSetName)
{
  <span class="kwrd">switch</span> (viewSetName.ToLower())
  {
    <span class="kwrd">case</span> <span
class="str">"login"</span>:
      RegionViewManager.DeactivateView(         
         m_regionManager.Regions[Regions.FullScreen.ToString()],
           <span class="kwrd">typeof</span>(ViewMain));
      RegionViewManager.AddAndActivateView(
         m_regionManager.Regions[Regions.FullScreen.ToString()],
           <span
class="kwrd">typeof</span>(ViewWelcome), m_container);
      <span class="kwrd">break</span>;
    <span class="kwrd">case</span> <span class="str">"main"</span>:
      RegionViewManager.DeactivateView(
         m_regionManager.Regions[Regions.FullScreen.ToString()],
           <span class="kwrd">typeof</span>(ViewWelcome));
      RegionViewManager.AddAndActivateView(
         m_regionManager.Regions[Regions.FullScreen.ToString()],
           <span
class="kwrd">typeof</span>(ViewMain), m_container);
      <span class="kwrd">break</span>;
  }
}
</pre>

<p>&nbsp;</p>

<p>Wat hier het interessante is, is waarschijnlijk de deactiveer en
activeer methods in de RegionViewManager class, dus die laat ik
hier zien.</p>

<p><!-- code formatted by http://manoli.net/csharpformat/ --></p>

<pre class="csharpcode">
<span class="kwrd">public</span> <span
class="kwrd">static</span> <span
class="kwrd">class</span> RegionViewManager
{
  <span class="kwrd">public</span> <span
class="kwrd">static</span> <span
class="kwrd">void</span> DeactivateView(IRegion region, Type viewType)
  {
    <span class="kwrd">foreach</span> (<span
class="kwrd">object</span> view <span
class="kwrd">in</span> region.Views)
    {
      <span class="kwrd">if</span> (view.GetType() == viewType)
      {
        region.Deactivate(view);
      }
    }
  }
  <span class="kwrd">public</span> <span
class="kwrd">static</span> <span
class="kwrd">void</span> AddAndActivateView(IRegion region, Type viewType, 
      IUnityContainer container)
  {
    <span class="kwrd">bool</span> found = <span
class="kwrd">false</span>;
    <span class="kwrd">foreach</span> (var existingView <span
class="kwrd">in</span> region.Views)
    {
      <span
class="kwrd">if</span>(existingView.GetType() == viewType)
      {
        region.Activate(existingView);
        found = <span class="kwrd">true</span>;
        <span class="kwrd">break</span>;
      }
    }
    <span class="kwrd">if</span> (!found)
    {
      var view = container.Resolve(viewType);
      region.Add(view);
      region.Activate(view);
    }
  }
}
</pre>

<p>&nbsp;</p>

<p>Om het samen te vatten: eerst activeer ik de Welcome view, die
in de fullscreen region zit. Dan, wanneer ik inlog, deactiveer ik
de Welcome view en activeer ik de main view, die ook in de
Fullscreen region zit. Deze views hebben beide hun eigen regions.
Dit maakt het mogelijk om zoveel verschillende layouts voor mijn
applicatie te gebruiken als ik wil.</p>

<p>We zijn nog steeds bezig deze technieken te verbeteren. Als je
tips hebt, twijfel dan niet te reageren.</p>
]]></description></item><item><title>Hij die opvoedt, niet hij die verwekt is de vader.</title><link>http://www.dejongensvanwazzup.nl/2010/6/27/hij-die-opvoedt,-niet-hij-die-verwekt-is-de-vader.aspx</link><pubDate>Sun, 27 Jun 2010 23:51:21 GMT</pubDate><guid>http://www.dejongensvanwazzup.nl/2010/6/27/hij-die-opvoedt,-niet-hij-die-verwekt-is-de-vader.aspx</guid><description><![CDATA[ 
<p><a
href="/media/179/WindowsLiveWriter_Hijdieopvoedtniethijdieverwektisdevader_14917_image_6.png">
<img src="/media/184/WindowsLiveWriter_Hijdieopvoedtniethijdieverwektisdevader_14917_image_thumb_2.png" width="54" height="64" alt="image" border="0" style="border-bottom: 0px; border-left: 0px; margin: 0px 10px 0px 0px; display: inline; float: left; border-top: 0px; border-right: 0px"/></a><strong>Al vele malen heb ik mijn vakgenoten hun
werk, de geschreven code, hun 'kindjes' horen noemen. Het is dan
ook niet vreemd dat velen van hen zich direct op de tenen voelen
getrapt wanneer je iets van kritiek levert, hoe opbouwend dan ook.
Buiten het niet kunnen velen dat er kritiek wordt geleverd gaat de
analogie wellicht nog verder.</strong></p>

<p>Als software architect bij <a
href="http://www.wazzupinc.com/">Wazzup Inc</a> wordt mij gevraagd
nieuwe software systemen te ontwerpen maar ook te implementeren.
Het mooie van het ontwerpproces is dat je prachtige constructies
kan bedenken die al het gevraagde aan zal kunnen. Je wordt
geconfronteerd met puzzels waarbij bestaande en nog te ontdekken
technieken gebruikt kunnen worden. Dit onderdeel dat wellicht nog
het meest te vergelijken valt met het flirten, daten en wat nog
meer is een prachtige beleving.</p>

<p>Het realiseren van de verschillende plannen die bedacht zijn
heeft meer weg van het opvoeden van het kind dat uiteindelijk de
wijde wereld in zal gaan en op eigen benen moet kunnen staan
-wellicht nog wat hulp hier en daar van de ouders, maar goed.</p>

<p>Met de beste intenties kan er helaas heel erg veel misgaan. Dat
wat nu een goed plan lijkt, kan na verloop van tijd desastreuse
effecten hebben. In de jaren 60 en 70 raadpleegden veel ouders de
adviezen van dr. Spock, wij software ontwikkelaars hebben echter
meer baat bij de design patterns van Booch, Gamma, Fowler en
Martin.</p>

<p>Bij het opvoeden is het van belang om zo consequent mogelijk te
zijn doch flexibel op gezette momenten. De lijnen moeten duidelijk
zijn en het pad uitgezet. En toch, toch blijft het gevaar van al
die zaken waar geen -echte- controle op te krijgen is. Vrienden, de
anderen, waar gaat het kind mee praten. Zal het nog steeds zijn
verworven identiteit behouden. Zal het nog kunnen functioneren?</p>

<p>Ik hoop de komende tijd genoeg opvoedkundige tips met jullie te
kunnen delen en uiteraard genoeg op te pikken om de zwakke punten
in mijn opvoeding te verbeteren.</p>
]]></description></item><item><title>Welkom</title><link>http://www.dejongensvanwazzup.nl/2010/4/29/welkom.aspx</link><pubDate>Fri, 11 Dec 2009 14:21:47 GMT</pubDate><guid>http://www.dejongensvanwazzup.nl/2010/4/29/welkom.aspx</guid><description><![CDATA[ 
<p><strong>Hoi!</strong> Welkom op deze nieuwe blogsite van de 'de
jongens van Wazzup'! We willen met deze site onze technische
ervaringen en verkenningen delen met de rest van de wereld.</p>

<p><strong>Wie we zijn?</strong> 'de jongens van Wazzup'!&nbsp; De
software ontwikkelaars van <a href="http://www.wazzupinc.com"
target="_blank" title="Wazzup Inc">Wazzup Inc</a>.</p>

<p><strong>Waar we het meest mee werken?</strong> Microsoft
technologie!</p>

<p>&nbsp;</p>
]]></description></item></channel></rss>

