<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">MsCorEE</title><subtitle type="html">JeffGonzalez : IScalable</subtitle><id>http://weblogs.asp.net/jgonzalez/atom.aspx</id><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jgonzalez/default.aspx" /><link rel="self" type="application/atom+xml" href="http://weblogs.asp.net/jgonzalez/atom.aspx" /><generator uri="http://communityserver.org" version="3.0.20510.895">Community Server</generator><updated>2007-02-19T23:48:00Z</updated><entry><title>MSBuild, MbUnit 2.4 and CruiseControl.NET</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jgonzalez/archive/2007/03/30/msbuild-mbunit-2-4-and-cruisecontrol-net.aspx" /><id>http://weblogs.asp.net/jgonzalez/archive/2007/03/30/msbuild-mbunit-2-4-and-cruisecontrol-net.aspx</id><published>2007-03-30T06:01:00Z</published><updated>2007-03-30T06:01:00Z</updated><content type="html">Getting all of these technologies synced up was pretty neat to see in&lt;br /&gt;
action.  I hadn&amp;#39;t really done much more than a very vanilla&lt;br /&gt;
installation of CruiseControl in the past.  I have had a good chunk of&lt;br /&gt;
time to dedicate to this project so I wanted to add some bells and&lt;br /&gt;
whistles.&lt;br /&gt;
&lt;br /&gt;
At first getting MSBuild and MbUnit to place nicely was a challenge.&lt;br /&gt;
For whatever reason, unless you have the MbUnit dlls in the framework&lt;br /&gt;
folder and in the bin folder where your test dll is located, MSBuild&lt;br /&gt;
will not execute the MbUnit task correctly.&lt;br /&gt;
&lt;br /&gt;
It feels like a hack, but I guess I can live with it.  I do hope it&lt;br /&gt;
gets some attention in a future release of MbUnit, but if I understand&lt;br /&gt;
the problem correctly, it might have to wait for a bit.&lt;br /&gt;
&lt;br /&gt;
I ended up writing this utility MSBuild target to make sure this got&lt;br /&gt;
done during a build.  This target checks to see if the each of the&lt;br /&gt;
MbUnit files needed to execute properly is not present in the&lt;br /&gt;
Framework folder.  If it isn&amp;#39;t found (this condition is only satisfied&lt;br /&gt;
on the very first run of the build), we copy the files to the&lt;br /&gt;
framework folder.&lt;br /&gt;
&lt;br /&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Target&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;CopyMbUnitToFramework&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Copy&lt;/span&gt; &lt;span class="attr"&gt;SourceFiles&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;$(LibraryFolder)\$(MbUnitFrameworkDll)&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;DestinationFiles&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;$(FrameworkPath)\$(MbUnitFrameworkDll)&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Condition&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;!exists(&amp;#39;$(FrameworkPath)\$(MbUnitFrameworkDll)&amp;#39;)&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Copy&lt;/span&gt; &lt;span class="attr"&gt;SourceFiles&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;$(LibraryFolder)\$(QuickGraphDll)&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;DestinationFiles&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;$(FrameworkPath)\$(QuickGraphDll)&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Condition&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;!exists(&amp;#39;$(FrameworkPath)\$(QuickGraphDll)&amp;#39;)&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Copy&lt;/span&gt; &lt;span class="attr"&gt;SourceFiles&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;$(LibraryFolder)\$(QuickGraphAlgorithmDll)&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;DestinationFiles&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;$(FrameworkPath)\$(QuickGraphAlgorithmDll)&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Condition&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;!exists(&amp;#39;$(FrameworkPath)\$(QuickGraphAlgorithmDll)&amp;#39;)&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Copy&lt;/span&gt; &lt;span class="attr"&gt;SourceFiles&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;$(LibraryFolder)\$(ReflyDll)&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;DestinationFiles&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;$(FrameworkPath)\$(ReflyDll)&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Condition&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;!exists(&amp;#39;$(FrameworkPath)\$(ReflyDll)&amp;#39;)&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Copy&lt;/span&gt; &lt;span class="attr"&gt;SourceFiles&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;$(LibraryFolder)\$(TestFuDll)&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;DestinationFiles&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;$(FrameworkPath)\$(TestFuDll)&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Condition&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;!exists(&amp;#39;$(FrameworkPath)\$(TestFuDll)&amp;#39;)&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Target&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;br /&gt;
Once I had MsBuild and MbUnit successfully integrated, it was a simple&lt;br /&gt;
matter of merging the report xml from my tests into the ccnet server&lt;br /&gt;
config.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[tags: msbuild, mbunit, cruisecontrol,continuousintegration continuous&lt;br /&gt;
integration, ccnet, cruisecontrol.net]&lt;br /&gt;
&lt;br /&gt;&lt;a href="http://weblogs.asp.net/jgonzalez"&gt;&lt;/a&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=2149836" width="1" height="1"&gt;</content><author><name>likwid</name><uri>http://weblogs.asp.net/members/likwid.aspx</uri></author><category term="ccnet" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/ccnet/default.aspx" /><category term="cruisecontrol.net" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/cruisecontrol.net/default.aspx" /><category term="cruisecontrol" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/cruisecontrol/default.aspx" /><category term="msbuild" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/msbuild/default.aspx" /><category term="mbunit" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/mbunit/default.aspx" /><category term="continuousintegration continuous" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/continuousintegration+continuous/default.aspx" /></entry><entry><title>Problems updating an svn:External in Subversion using https/ssl via CruiseControl.Net</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jgonzalez/archive/2007/03/30/problems-updating-an-svn-external-in-subversion-using-https-ssl-via-cruisecontrol-net.aspx" /><id>http://weblogs.asp.net/jgonzalez/archive/2007/03/30/problems-updating-an-svn-external-in-subversion-using-https-ssl-via-cruisecontrol-net.aspx</id><published>2007-03-30T05:51:24Z</published><updated>2007-03-30T05:51:24Z</updated><content type="html">I have been diligently working on the build process here at work and I&lt;br/&gt;ran into an interesting problem.  There is plenty of information on&lt;br/&gt;the matter on Thoughtworks website, but I wanted to post it here as a&lt;br/&gt;reference.&lt;br/&gt;&lt;br/&gt;The problem is an interesting one, I don't know if I can explain it&lt;br/&gt;well enough, but I will try.&lt;br/&gt;&lt;br/&gt;We have a couple of dependencies on third party files in our product.&lt;br/&gt;These third party files are part of our source code repository via a&lt;br/&gt;feature called Externals.  I would say this is somewhat equatable to a&lt;br/&gt;symlink for Subversion.  We can reference a different subversion&lt;br/&gt;repository as a directory in our repository.&lt;br/&gt;&lt;br/&gt;Suppose I have a repository like this:&lt;br/&gt;&lt;br/&gt;svnroot&lt;br/&gt;    trunk&lt;br/&gt;        MyCoolCode&lt;br/&gt;&lt;br/&gt;I put all of my local project files into the "MyCoolCode" directory.&lt;br/&gt;Let's say someone has a really cool utility library that I want to&lt;br/&gt;include in my project as well.  There are several options, but&lt;br/&gt;svn:Externals allows me to check out the code from a remote repository&lt;br/&gt;down into my local files.  This makes managing the consumption of an&lt;br/&gt;external project much easier.&lt;br/&gt;&lt;br/&gt;Back to the problem....I happen to be pulling this external codebase&lt;br/&gt;from an svn repository that is over https.  So when I execute the svn&lt;br/&gt;update command from a command line for the first time, I get a warning&lt;br/&gt;or prompt stating that I need to either Reject, Accept Temporarily or&lt;br/&gt;Accept permanently the https certificate.  This is all fine and dandy&lt;br/&gt;and it works when I do it manually, but my ccnet service is currently&lt;br/&gt;running under the LocalSystem account.  I am just testing some things&lt;br/&gt;out with the build process in general, normally I would create a&lt;br/&gt;service account to run it under.  What I ended up having to do was&lt;br/&gt;launch a cmd.exe running under the LocalSystem account and then run&lt;br/&gt;the svn update command again and permanently accept the http&lt;br/&gt;certificate.&lt;br/&gt;&lt;br/&gt;A bit of a beating if you ask me.  The links below made it pretty easy&lt;br/&gt;to solve the issue.&lt;br/&gt;&lt;br/&gt;&lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/Subversion+Source+Control+Block?showComments=false"&gt;http://confluence.public.thoughtworks.org/display/CCNET/Subversion+Source+Control+Block?showComments=false&lt;/a&gt;&lt;br/&gt;&lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/The+Server+Service+Application"&gt;http://confluence.public.thoughtworks.org/display/CCNET/The+Server+Service+Application&lt;/a&gt;&lt;br/&gt;&lt;a href="http://blogs.msdn.com/adioltean/articles/271063.aspx"&gt;http://blogs.msdn.com/adioltean/articles/271063.aspx&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;[tags:subversion, svn, external, externals, build process, build,&lt;br/&gt;ccnet, cruisecontrol.net, http, ssl]&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=2149812" width="1" height="1"&gt;</content><author><name>likwid</name><uri>http://weblogs.asp.net/members/likwid.aspx</uri></author><category term="external" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/external/default.aspx" /><category term="build process" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/build+process/default.aspx" /><category term="http" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/http/default.aspx" /><category term="externals" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/externals/default.aspx" /><category term="ssl" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/ssl/default.aspx" /><category term="svn" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/svn/default.aspx" /><category term="subversion" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/subversion/default.aspx" /><category term="ccnet" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/ccnet/default.aspx" /><category term="build" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/build/default.aspx" /><category term="cruisecontrol.net" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/cruisecontrol.net/default.aspx" /></entry><entry><title>Install Vista from USB Key</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jgonzalez/archive/2007/03/28/install-vista-from-usb-key.aspx" /><id>http://weblogs.asp.net/jgonzalez/archive/2007/03/28/install-vista-from-usb-key.aspx</id><published>2007-03-28T22:34:29Z</published><updated>2007-03-28T22:34:29Z</updated><content type="html">                     &lt;div class=Section1&gt;  &lt;p class=MsoNormal style='margin-bottom:12.0pt'&gt;[tags: vista, install vista, usb]&lt;/p&gt;  &lt;p class=MsoNormal&gt;This is pretty sweet: &lt;a href="http://kurtsh.spaces.live.com/blog/cns!DA410C7F7E038D!1665.entry"&gt;http://kurtsh.spaces.live.com/blog/cns!DA410C7F7E038D!1665.entry&lt;/a&gt;&lt;/p&gt;    &lt;p class=MsoNormal&gt;I was able to use vsLite(&lt;a href="http://www.vlite.net/"&gt;http://www.vlite.net/&lt;/a&gt;) to trim my vista install down to around 1200 MB.&amp;nbsp; It took 13:51 minutes from the start to finish to install Vista just the way I like it.&lt;/p&gt;    &lt;/div&gt;    &lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=2138862" width="1" height="1"&gt;</content><author><name>likwid</name><uri>http://weblogs.asp.net/members/likwid.aspx</uri></author><category term="usb" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/usb/default.aspx" /><category term="install vista" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/install+vista/default.aspx" /><category term="vista" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/vista/default.aspx" /></entry><entry><title>My new-new job</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jgonzalez/archive/2007/03/25/my-new-new-job.aspx" /><id>http://weblogs.asp.net/jgonzalez/archive/2007/03/25/my-new-new-job.aspx</id><published>2007-03-26T01:31:00Z</published><updated>2007-03-26T01:31:00Z</updated><content type="html">&lt;p&gt;I almost forgot...I start my new job tomorrow.&amp;nbsp; It is at a little place you might have heard of...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.codesmithtools.com" title="CodeSmith Tools!"&gt;CodeSmith Tools&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Eric and I have been wanting to work together for awhile now, but the timing always seemed off.&amp;nbsp; I am excited to be working there, not only do I get to sponge knowledge off Eric&amp;#39;s greatness, but we are in the same offices as Telligent, so I should be working in the vicinity of some really smart people.&lt;br /&gt;&lt;br /&gt;I also am getting reunited with my boss from my last job, Shannon (still no blog, I&amp;#39;ll keep working on it), so it should be a blast.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=2094606" width="1" height="1"&gt;</content><author><name>likwid</name><uri>http://weblogs.asp.net/members/likwid.aspx</uri></author><category term="new job" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/new+job/default.aspx" /><category term="codesmith" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/codesmith/default.aspx" /></entry><entry><title>Anonymous methods, generics and bears...Oh my</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jgonzalez/archive/2007/03/25/anonymous-methods-generics-and-bears-oh-my.aspx" /><id>http://weblogs.asp.net/jgonzalez/archive/2007/03/25/anonymous-methods-generics-and-bears-oh-my.aspx</id><published>2007-03-26T01:09:00Z</published><updated>2007-03-26T01:09:00Z</updated><content type="html">I stumbled across an &lt;a href="http://weblogs.asp.net/jeff/archive/2007/03/23/using-an-anonymous-delegate-in-list-t-findall.aspx" title="interesting conversation"&gt;interesting conversation&lt;/a&gt; on Jeff&amp;#39;s(I am not speaking in the third person, &lt;a href="http://weblogs.asp.net/jeff/default.aspx" title="this Jeff"&gt;this Jeff&lt;/a&gt;) blog.&amp;nbsp; Like any other time, I have plenty to say on the matter....&lt;br /&gt;&lt;br /&gt;Microsoft (via FxCop) suggests that you don&amp;#39;t expose List&amp;lt;T&amp;gt; via public members.&amp;nbsp; I think the reasons I have heard mentioned in the past are around versioning your collections and the API for List&amp;lt;T&amp;gt; being too large for public APIs.&lt;br /&gt;&lt;br /&gt;While I don&amp;#39;t agree with Ramon&amp;#39;s random &amp;quot;suggestions&amp;quot; about language fluency, I do think he makes a good point about losing the flexibility of generic types by making a class directly inherit from List&amp;lt;T&amp;gt;.&amp;nbsp; With the current example (I realize this may or may not be contrived), following that route would require you to create a collection class for each class in your project.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;I suppose you could do 1 of 2 things (if you were so inclined):&lt;br /&gt;&lt;br /&gt;Create a generic type that inherits from list&amp;lt;T&amp;gt;, which is pretty close to what you have.&amp;nbsp; Only a slight modification need be made:&lt;br /&gt;&lt;br /&gt;public class GenericList&amp;lt;T&amp;gt; : List&amp;lt;T&amp;gt;&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Or you could create a generic type that implements List&amp;lt;T&amp;gt; as an inner list and expose only the stuff you need from List&amp;lt;T&amp;gt;.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;public class GenericList&amp;lt;T&amp;gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private List&amp;lt;T&amp;gt; _innerList;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public MyListTwo()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _innerList = new List&amp;lt;T&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void Add(T obj)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _innerList.Add(obj);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public T Find(Predicate&amp;lt;T&amp;gt; pred)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return _innerList.Find(pred);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;(This one has my vote).&lt;br /&gt;&lt;br /&gt;Either of these would accomplish the same thing, but without the loss of flexibility.&lt;br /&gt;&lt;br /&gt;As for the complexity of the anonymous methods, I don&amp;#39;t think it is bad looking at all for very simple things, most of the time you are just wanting to get an item or a series of items based on a particular property.&amp;nbsp; I do think for complex things, you should go ahead and make a method that encapsulates all of the logic for the particular predicate.&lt;br /&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=2094349" width="1" height="1"&gt;</content><author><name>likwid</name><uri>http://weblogs.asp.net/members/likwid.aspx</uri></author><category term=".NET" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/.NET/default.aspx" /><category term="C#" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/C_2300_/default.aspx" /><category term="jeff" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/jeff/default.aspx" /><category term="generics" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/generics/default.aspx" /><category term="collections" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/collections/default.aspx" /><category term="anonymous methods" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/anonymous+methods/default.aspx" /></entry><entry><title>Model View Presenter Redemption</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jgonzalez/archive/2007/03/08/model-view-presenter-redemption.aspx" /><id>http://weblogs.asp.net/jgonzalez/archive/2007/03/08/model-view-presenter-redemption.aspx</id><published>2007-03-09T05:37:00Z</published><updated>2007-03-09T05:37:00Z</updated><content type="html">&lt;p&gt;I just wanted to clarify that I figured out my issue with the databinding.&amp;nbsp;&amp;nbsp; Rookie mistake, I forgot to wrap OnItemDataBound with ItemType check.&amp;nbsp; I can&amp;#39;t believe I missed that.&amp;nbsp; Thanks to members of the Faithful 21 (The endearing term for all of my 21 readers =P)&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Sorry, I forgot to post the solution:&lt;br /&gt;&lt;br /&gt;void CustomerRepeaterCodeBehind_ItemDataBound(object sender, RepeaterItemEventArgs e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch(e.Item.ItemType)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case ListItemType.AlternatingItem:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case ListItemType.Item:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RepeaterItem item = e.Item;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Customer c = item.DataItem as Customer;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Label nameLabel = e.Item.FindControl(&amp;quot;NameLabel&amp;quot;) as Label;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nameLabel.Text = c.Name;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&amp;nbsp;&lt;/p&gt;&lt;p&gt;It does sort of beg the question on how to handle this scenario.&amp;nbsp; I mean if the View is supposed to be lightweight and you have to write custom databinding logic, it seems like you lose the testability aspect of the view.&amp;nbsp; I haven&amp;#39;t figured this part out yet, if anyone has any experience with it or has read about this kind of case (which is pretty common in my world) I would love to hear about it.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Thanks!&amp;nbsp;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=1972230" width="1" height="1"&gt;</content><author><name>likwid</name><uri>http://weblogs.asp.net/members/likwid.aspx</uri></author></entry><entry><title>Model View Presenter Woes</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jgonzalez/archive/2007/03/07/model-view-presenter-woes.aspx" /><id>http://weblogs.asp.net/jgonzalez/archive/2007/03/07/model-view-presenter-woes.aspx</id><published>2007-03-08T01:50:00Z</published><updated>2007-03-08T01:50:00Z</updated><content type="html">&lt;p&gt;Jumping on the bandwagon for Model View Presenter.&amp;nbsp; It is something I have been intrigued with for quite awhile, but I am just getting around to implementing it.&lt;br /&gt;&lt;br /&gt;How come almost all of the examples for MVP are the absolute most basic thing you can think of.&amp;nbsp; Most of them seem to be edit pages also.&amp;nbsp; I get that you put properties on your View and then set those from the Presenter, but what about list pages?&amp;nbsp; Those don&amp;#39;t seem to get enough attention.&lt;br /&gt;&lt;br /&gt;So I set about trying to implement a list page today and I ran into a showstopping issue.&amp;nbsp; I searched around and it seems like a lot of people have had this same issue, but I don&amp;#39;t see it really being addressed in the way I am thinking.&lt;/p&gt;&lt;p&gt;What I am trying to do is use the ItemDataBound method of my repeater for listing out the obligatory Customer entity.&amp;nbsp; Sorry, I am an unoriginal *** and I couldn&amp;#39;t think of anything clever.&amp;nbsp; So I created a view ( ICustomerListView ), a presenter ( CustomerListPresenter ) and an entity ( Customer ).&lt;br /&gt;&lt;br /&gt;When I use declarative databinding on the repeater, this pattern works fine.&amp;nbsp; Unfortunately, I am in a situation where I cannot use declarative databinding.&amp;nbsp; At my new job their architecture is based around everything being in the CodeBehind and while I don&amp;#39;t necessarily agree with it, I do understand the apprehension against it.&amp;nbsp; Pretty soon you end up putting a lot of display logic into your aspx page and it can get a little messy.&amp;nbsp; The problem I am running into happens in the ItemDataBound method.&amp;nbsp; It acts like it cannot see the items in the repeater, which is odd, because it is firing the ItemDataBound event.&amp;nbsp; It is almost like it fires the event and then loses all knowledge of having items in the repeater.&amp;nbsp; Here is the code, I have tried to keep it short, maybe someone smarter than me can point out my n00bish error.&lt;br /&gt;&lt;br /&gt;View:&lt;br /&gt;namespace JeffGonzalez.SupervisingController&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public interface ICustomerListView&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;Customer&amp;gt; Customers { set; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Presenter:&lt;br /&gt;namespace JeffGonzalez.SupervisingController&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class CustomerListPresenter&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private ICustomerListView _View;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public CustomerListPresenter(ICustomerListView view)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _View = view;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void UpdateView()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;Customer&amp;gt; list = new List&amp;lt;Customer&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list.Add(new Customer(&amp;quot;ABC Customer&amp;quot;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list.Add(new Customer(&amp;quot;DEF Customer&amp;quot;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list.Add(new Customer(&amp;quot;GHI Customer&amp;quot;));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _View.Customers = list;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CodeBehind:&lt;br /&gt;namespace JeffGonzalez.SupervisingController&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public partial class _Default : System.Web.UI.Page, ICustomerListView&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private CustomerListPresenter _Presenter;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected override void OnLoad(EventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; base.OnLoad(e);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CustomerRepeaterCodeBehind.ItemDataBound += new RepeaterItemEventHandler(CustomerRepeaterCodeBehind_ItemDataBound);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _Presenter = new CustomerListPresenter(this);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _Presenter.UpdateView();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void CustomerRepeaterCodeBehind_ItemDataBound(object sender, RepeaterItemEventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RepeaterItem item = e.Item;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Customer c = item.DataItem as Customer;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Label nameLabel = e.Item.FindControl(&amp;quot;NameLabel&amp;quot;) as Label;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nameLabel.Text = c.Name;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public List&amp;lt;Customer&amp;gt; Customers&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.CustomerRepeaterDeclarative.DataSource = value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.CustomerRepeaterCodeBehind.DataSource = value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.CustomerRepeaterDeclarative.DataBind();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.CustomerRepeaterCodeBehind.DataBind(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;For brevity I am only including the repeater with the problem, the declarative one works fine, using the &amp;lt;%# Eval(&amp;quot;Name&amp;quot;) %&amp;gt; syntax:&lt;br /&gt;&amp;lt;asp:Repeater id=&amp;quot;CustomerRepeaterCodeBehind&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;headertemplate&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;table summary=&amp;quot;This table displays a list of customers&amp;quot; width=&amp;quot;500&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;caption&amp;gt;List of customers that can be individually edited&amp;lt;/caption&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;thead&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/thead&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tbody&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/headertemplate&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;itemtemplate&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;asp:label id=&amp;quot;NameLabel&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;&amp;lt;/asp:label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/itemtemplate&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;footertemplate&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tbody&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/table&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/footertemplate&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/asp:Repeater&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;So you can see here, I created a label called NameLabel and in the ItemDataBound method of my codebehind/View I want to get that label and set its Text property.&amp;nbsp; However when I get into this method via debugging, e.Item.FindControl(&amp;quot;NameLabel&amp;quot;) returns null and e.Item.* returns a nullreferenceexception.&amp;nbsp; I cannot get to e.Item.DataItem or anything else.&amp;nbsp; I don&amp;#39;t get it....&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=1955782" width="1" height="1"&gt;</content><author><name>likwid</name><uri>http://weblogs.asp.net/members/likwid.aspx</uri></author><category term="asp.net" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/asp.net/default.aspx" /><category term="C#" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/C_2300_/default.aspx" /><category term="mvp pattern" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/mvp+pattern/default.aspx" /><category term="modelviewpresenter" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/modelviewpresenter/default.aspx" /><category term="model-view-presenter" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/model-view-presenter/default.aspx" /><category term="mvp" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/mvp/default.aspx" /><category term="supervisingcontroller" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/supervisingcontroller/default.aspx" /><category term="model view presenter pattern" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/model+view+presenter+pattern/default.aspx" /><category term="supervising controller" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/supervising+controller/default.aspx" /><category term="model view presenter" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/model+view+presenter/default.aspx" /></entry><entry><title>ModalPopupExtender experiences</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jgonzalez/archive/2007/03/02/modalpopupextender-experiences.aspx" /><id>http://weblogs.asp.net/jgonzalez/archive/2007/03/02/modalpopupextender-experiences.aspx</id><published>2007-03-03T01:42:00Z</published><updated>2007-03-03T01:42:00Z</updated><content type="html">I ran into a problem today while working with the ModalPopupExtender.&amp;nbsp; It was a self imposed problem, but it through me for a loop just the same. I made a confirmation modal window.&amp;nbsp; I have a need for a user to make a decision when they save something to the database.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
So what I did was create a panel like this:&lt;br /&gt;
&lt;br /&gt;

&lt;pre style="border: 1px dashed #999999; padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: #000000; background-color: #eeeeee; font-size: 12px; line-height: 14px; width: 100%"&gt;&lt;code&gt;&amp;lt;asp:Panel id=&amp;quot;SamplePanel&amp;quot; CssClass=&amp;quot;modal-popup&amp;quot; style='display:none;' runat='server'&amp;gt;&lt;br /&gt;
    &amp;lt;table&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td class=&amp;quot;modal-content&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;p&amp;gt;&lt;br /&gt;
                    This is a message detailing a warning.&lt;br /&gt;
                &amp;lt;/p&amp;gt;&lt;br /&gt;
                &amp;lt;p class=&amp;quot;modal-warning&amp;quot;&amp;gt;&lt;br /&gt;
                    Do you want to proceed with this action?&lt;br /&gt;
                &amp;lt;/p&amp;gt;&lt;br /&gt;
                &amp;lt;asp:button id=&amp;quot;YesButton&amp;quot; runat=&amp;quot;server&amp;quot; text=&amp;quot;Yes&amp;quot; cssclass=&amp;quot;modal-button&amp;quot;/&amp;gt;&lt;br /&gt;
                &amp;lt;asp:button id=&amp;quot;NoButton&amp;quot; runat=&amp;quot;server&amp;quot; text=&amp;quot;No&amp;quot; cssclass=&amp;quot;modal-button&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/table&amp;gt;    &lt;br /&gt;
&amp;lt;/asp:Panel&amp;gt;&lt;br /&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
This allows the user to choose yes or no, and it sets a hidden form field with this value.&amp;nbsp; I set up my ModalPopupExtender like this:&lt;br /&gt;
&lt;br /&gt;

&lt;pre style="border: 1px dashed #999999; padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: #000000; background-color: #eeeeee; font-size: 12px; line-height: 14px; width: 100%"&gt;&lt;code&gt;&amp;lt;ajax:ModalPopupExtender &lt;br /&gt;
    id=&amp;quot;ModalPopupExtender&amp;quot; &lt;br /&gt;
    runat=&amp;quot;server&amp;quot; &lt;br /&gt;
    dropshadow=&amp;quot;true&amp;quot;&lt;br /&gt;
    targetcontrolid=&amp;quot;SaveButton&amp;quot; &lt;br /&gt;
    popupcontrolid=&amp;quot;SamplePanel&amp;quot; &lt;br /&gt;
    backgroundcssclass=&amp;quot;modal-background&amp;quot;&lt;br /&gt;
    okcontrolid=&amp;quot;YesButton&amp;quot; &lt;br /&gt;
    onokscript=&amp;quot;onConfirm()&amp;quot;&lt;br /&gt;
    cancelcontrolid=&amp;quot;NoButton&amp;quot;&lt;br /&gt;
    oncancelscript=&amp;quot;onCancel()&amp;quot;/&amp;gt;&lt;/code&gt;&amp;nbsp;&lt;/pre&gt;
With this I was able to popup my modal window.&amp;nbsp; I had to craft some javascript for the ok/cancel stuff still.&amp;nbsp; I did that by registering a script block from the codebehind (Thanks Shannon!).&amp;nbsp; Here it is:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="border: 1px dashed #999999; padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: #000000; background-color: #eeeeee; font-size: 12px; line-height: 14px; width: 100%"&gt;&lt;code&gt;private void BuildModalScript()&lt;br /&gt;{&lt;br /&gt;    StringBuilder yesScript = new StringBuilder();&lt;br /&gt;    StringBuilder noScript = new StringBuilder();&lt;br /&gt;&lt;br /&gt;    yesScript.AppendFormat(&amp;quot;function onConfirm(){0}&amp;quot;, Environment.NewLine);&lt;br /&gt;    yesScript.Append(&amp;quot;{&amp;quot;).Append(Environment.NewLine);&lt;br /&gt;    yesScript.AppendFormat(&amp;quot;var hidden = $get(\&amp;quot;{0}\&amp;quot;);{1}&amp;quot;, HiddenField.ClientID, Environment.NewLine);&lt;br /&gt;    yesScript.AppendFormat(&amp;quot;hidden.value = \&amp;quot;true\&amp;quot;;{0}&amp;quot;, Environment.NewLine);&lt;br /&gt;    yesScript.Append(Page.ClientScript.GetPostBackEventReference(SaveButton, String.Empty));&lt;br /&gt;    yesScript.Append(&amp;quot;}&amp;quot;).Append(Environment.NewLine);&lt;br /&gt;&lt;br /&gt;    noScript.AppendFormat(&amp;quot;function onCancel(){0}&amp;quot;, Environment.NewLine);&lt;br /&gt;    noScript.Append(&amp;quot;{&amp;quot;).Append(Environment.NewLine);&lt;br /&gt;    noScript.AppendFormat(&amp;quot;var hidden = $get(\&amp;quot;{0}\&amp;quot;);{1}&amp;quot;, HiddenField.ClientID, Environment.NewLine);&lt;br /&gt;    noScript.AppendFormat(&amp;quot;hidden.value = \&amp;quot;false\&amp;quot;;{0}&amp;quot;, Environment.NewLine);&lt;br /&gt;    noScript.Append(Page.ClientScript.GetPostBackEventReference(SaveButton, String.Empty)).Append(Environment.NewLine);&lt;br /&gt;    noScript.Append(&amp;quot;}&amp;quot;).Append(Environment.NewLine);&lt;br /&gt;&lt;br /&gt;    if (!Page.ClientScript.IsClientScriptBlockRegistered(&amp;quot;onConfirm&amp;quot;))&lt;br /&gt;        Page.ClientScript.RegisterClientScriptBlock(typeof(_Default), &amp;quot;onConfirm&amp;quot;, yesScript.ToString(), true);&lt;br /&gt;&lt;br /&gt;    if (!Page.ClientScript.IsClientScriptBlockRegistered(&amp;quot;onCancel&amp;quot;))&lt;br /&gt;        Page.ClientScript.RegisterClientScriptBlock(typeof(_Default), &amp;quot;onCancel&amp;quot;, noScript.ToString(), true);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
When I first started this little project, I was used to faking postbacks using the script like this:&amp;nbsp; __doPostBack(Control.ClientId);&amp;nbsp;&amp;nbsp; Oddly that works if you set the enableeventvalidation property to true.&amp;nbsp; However, it doesn&amp;#39;t work if your page is part of a masterpage.&amp;nbsp; The lead architect, Brian, at my new job and I were banging our heads against the wall trying to figure it out.&amp;nbsp; He knew there was something in .net that handled this but he couldn&amp;#39;t think of the name.&amp;nbsp; I remembered seeing something like postbackreference during my travels through the documentation.&amp;nbsp; It turned out to be the correct answer.&amp;nbsp; I guess you could call it a team effort =P&amp;nbsp; It was really weird the way the problem manifested itself, because I had two different projects, it worked in one and not the other.&amp;nbsp; Once I made them exactly the same, we could see there was definitely an issue with master pages.&amp;nbsp; So chalk that one up to experience.&lt;br /&gt;&lt;br /&gt;In any case, I now have a nifty modal confirmation dialog.&amp;nbsp; &lt;a href="http://www.sumnurv.com/Playground.zip" title="Here"&gt;Here&lt;/a&gt; is the project for vs2005 if you want to take a look.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=1875542" width="1" height="1"&gt;</content><author><name>likwid</name><uri>http://weblogs.asp.net/members/likwid.aspx</uri></author><category term=".NET" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/.NET/default.aspx" /><category term="asp.net" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/asp.net/default.aspx" /><category term="ajax" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/ajax/default.aspx" /><category term="modalpopupextender" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/modalpopupextender/default.aspx" /></entry><entry><title>Persistance Ignorance</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jgonzalez/archive/2007/02/21/persistance-ignorance.aspx" /><id>http://weblogs.asp.net/jgonzalez/archive/2007/02/21/persistance-ignorance.aspx</id><published>2007-02-22T04:09:00Z</published><updated>2007-02-22T04:09:00Z</updated><content type="html">&lt;p&gt;I took the plunge into Persistance Ignorance today while working on this side project that a couple of my coworkers and I have.&amp;nbsp; I have been reading about O\R Mapping, &lt;a href="http://www.springframework.net" title="Dependency Injection"&gt;Dependency Injection&lt;/a&gt;, and &lt;a href="http://domaindrivendesign.org/" title="Domain Driven Design"&gt;Domain Driven Design&lt;/a&gt; for the past few months, but I really haven&amp;#39;t had a chance to implement any of the ideas I have.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;We haven&amp;#39;t completely solved the database portion of this project yet, but I wanted to try not worrying about persistence at all.&amp;nbsp; I think you almost have to take this position if you want to concentrate on the domain.&amp;nbsp; I am also using this experience to do some TDD.&amp;nbsp; I don&amp;#39;t quite have that down, but I am at least writing unit tests.&amp;nbsp; My goal for tonight was to rebuild my SiteMapProvider using the domain instead of Data Abstraction objects (which are very coupled to the database at this point).&amp;nbsp; I haven&amp;#39;t quite figured out how to test ProjectSiteMapProvider class yet, so I will have to research that.&lt;br /&gt;&lt;br /&gt;Here is some of the code (in pseudo form for brevity) I have been playing with tonight:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Really simple interface for a Repository.&amp;nbsp; I am pretty sure this won&amp;#39;t be my final version, but it is a start.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;blockquote&gt;public interface IRepository&amp;lt;T&amp;gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; T GetOne(Int32 id);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;T&amp;gt; GetAll();&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br /&gt;This is the concrete implmentation of my repository.&amp;nbsp; It is located in a Stubs namespace, just to keep it seperate from my real repositories.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;blockquote&gt;public class SiteMapRepository : IRepository&amp;lt;SiteMap&amp;gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region IRepository&amp;lt;SiteMap&amp;gt; Members&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public SiteMap GetOne(int id)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Some code trimmmed for room....&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SiteMap root = new SiteMap(1, &amp;quot;Root&amp;quot;, null, 0, null, true, null, String.Empty);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root.Children.Add(purchases);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return root;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public List&amp;lt;SiteMap&amp;gt; GetAll()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;SiteMap&amp;gt; list = new List&amp;lt;SiteMap&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list.Add(GetOne(1));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return list;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br /&gt;I have a SiteMapProvider class that I have created also which handles getting the SiteMap domain objects from the repository and then turning them into SiteMapNode objects.&amp;nbsp; I won&amp;#39;t post all of the code here, but just enough to get an idea of what is happening.&amp;nbsp; I cannot for the life of me remember who wrote this ObjectFactory
class, but it is dang handy for sure.&amp;nbsp; It is a wrapper for the meat of
the SpringFramework implementation code that I am using.&amp;nbsp; As you can
see, it is a generic class that allows me to get an instance of the
repository class that is defined in xml in the web.config.&amp;nbsp; This is a
pretty neat feature, I think, because it allows me to change to a
production repository without a recompile.&amp;nbsp; If you wrote the
ObjectFactory class, please speak up so I can give you credit.&amp;nbsp; I
really like it!&lt;br /&gt;&lt;br /&gt;Edit:&amp;nbsp; I located the author of the &lt;a href="http://codebetter.com/blogs/scott.bellware/archive/2006/10/20/150642.aspx" title="Factory&amp;lt;&amp;gt;"&gt;Factory&amp;lt;&amp;gt; &lt;/a&gt;class.&amp;nbsp; &lt;a href="http://codebetter.com/blogs/scott.bellware/" title="Scott Bellware"&gt;Scott Bellware&lt;/a&gt; is the man!&lt;br /&gt;&lt;/p&gt;&lt;blockquote&gt;public override SiteMapNode BuildSiteMap()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lock (_SyncRoot)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (null != Root)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return Root;&lt;br /&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;Domain.SiteMap&amp;gt; map = ObjectFactory&amp;lt;SiteMapRepository&amp;gt;.Create().GetAll() ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Domain.SiteMap rootSiteMap = null;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (map.Count &amp;gt; 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rootSiteMap = map[0] as Domain.SiteMap;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Root = CreateNodeFromDomain(map[0]);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (Domain.SiteMap siteMap in rootSiteMap.Children)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SiteMapNode node = CreateNodeFromDomain(siteMap);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AddNode(node, CreateNodeFromDomain(siteMap.Parent));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return Root;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br /&gt;This method is pretty self explanatory, but for clarity, it takes a domain sitemap and turns it into a SiteMapNode.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;blockquote&gt;private SiteMapNode CreateNodeFromDomain(Domain.SiteMap siteMap)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return new SiteMapNode(this, siteMap.Id.ToString(), siteMap.Uri, siteMap.Name, siteMap.Description);&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br /&gt;Here is the configuration for SpringFramework taken from the web.config file.&amp;nbsp; As I mentioned up above, I can simply remove the Stubs namespace from the type attribute to have my application using a live database repository.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;blockquote&gt;&amp;lt;spring&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;context&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;resource uri=&amp;quot;config://spring/objects&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/context&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;objects xmlns=&amp;quot;http://www.springframework.net&amp;quot; &amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;object&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; id=&amp;quot;SiteMapRepository&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; type=&amp;quot;CodeMakerX.Tracking.Infrastructure.Stubs.SiteMapRepository, CodeMakerX.Tracking.Infrastructure&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/objects&amp;gt;&lt;br /&gt;&amp;lt;/spring&amp;gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br /&gt;So that is my foray into Persistance Ignorance and Domain Driven Design so far.&amp;nbsp; I am really digging it.&lt;br /&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=1751915" width="1" height="1"&gt;</content><author><name>likwid</name><uri>http://weblogs.asp.net/members/likwid.aspx</uri></author><category term=".NET" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/.NET/default.aspx" /><category term="asp.net" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/asp.net/default.aspx" /><category term="spring" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/spring/default.aspx" /><category term="domain driven design" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/domain+driven+design/default.aspx" /><category term="spring framework" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/spring+framework/default.aspx" /><category term="domaindrivendesign" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/domaindrivendesign/default.aspx" /><category term="springframework" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/springframework/default.aspx" /></entry><entry><title>Provider, Strategy, Adapter pattern discussion</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jgonzalez/archive/2007/02/19/provider-strategy-adapter-pattern-discussion.aspx" /><id>http://weblogs.asp.net/jgonzalez/archive/2007/02/19/provider-strategy-adapter-pattern-discussion.aspx</id><published>2007-02-20T05:48:00Z</published><updated>2007-02-20T05:48:00Z</updated><content type="html">Some of my coworkers and I were having a discussion today regarding the aforementioned patterns. &amp;nbsp;First we debated the validity of the Provider pattern actually being considered a pattern, or if it was really just a renamed Strategy or Adapter pattern.&lt;br /&gt;&lt;br /&gt;Here is some background on the patterns for reference. &amp;nbsp;I took my definitions from &lt;a href="http://www.dofactory.com/Patterns/Patterns.aspx" title="DOFactory"&gt;DOFactory&lt;/a&gt;. &amp;nbsp;I use their site quite a bit when referencing patterns or when I need a refresher.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Adapter&lt;/strong&gt;&lt;br /&gt;Converts the interface of a class into another interface clients expect. &amp;nbsp;Adapter lets classes work together that couldn&amp;#39;t otherwise because of incompatible interfaces. &amp;nbsp;Forgive the Java naming conventions. &amp;nbsp;=P&lt;br /&gt;&lt;br /&gt;Suppose you have two separate interfaces:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;interface Iterator&lt;br /&gt;{&lt;br /&gt; &amp;nbsp; &amp;nbsp;HasNext()&lt;br /&gt; &amp;nbsp; &amp;nbsp;Next()&lt;br /&gt; &amp;nbsp; &amp;nbsp;Remove()&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote&gt;interface Enumeration&lt;br /&gt;{&lt;br /&gt; &amp;nbsp; &amp;nbsp;HasMoreElements()&lt;br /&gt; &amp;nbsp; &amp;nbsp;NextElement()&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;These two interfaces are pretty similar, but they have different method names and Iterator is read-write while Enumeration is read-only. &amp;nbsp; For my example, I want to adapt Enumeration to the Iterator interface. &amp;nbsp;In Java most things use the Iterator interface now, but it is possible that some legacy code might still be using the Enumeration interface. &amp;nbsp;This pattern allows us to use the Iterator interface, but provides a method to interoperate with the Enumeration interface as well.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;public class EnumerationIterator : Iterator&lt;br /&gt;{&lt;br /&gt;&lt;blockquote&gt;private Enumeration _Enumeration;&lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote&gt;public EnumerationIterator(Enumeration enum)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; _Enumeration = enum;&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote&gt;public Boolean HasNext() { return enum.HasMoreElements(); }&lt;br /&gt;public Object Next() { return enum.NextElement(); }&lt;br /&gt;public void Remove() { throw new NotImplementedException(); }&lt;br /&gt;&lt;/blockquote&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;div style="direction: ltr"&gt;&lt;br /&gt;&lt;strong&gt;Strategy&lt;/strong&gt;&lt;br /&gt;Define a family of algorithms, encapsulate each one, and make them interchangeable. &amp;nbsp;Strategy lets the algorithm vary independently from the clients that use it.&lt;br /&gt;&lt;/div&gt;&lt;div style="direction: ltr"&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="direction: ltr"&gt;IComparable is a good example of the Strategy pattern. &amp;nbsp;IComparable defines a single member called CompareTo (Object o). &amp;nbsp;This allows different classes to define different strategies for comparison. &amp;nbsp;As long as the class implements IComparable and the CompareTo member, the implementation is up to the class itself.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Provider&lt;/strong&gt;&lt;br /&gt;I couldn&amp;#39;t exactly find the definition of this pattern on DOFactory, so I looked at &lt;a href="http://weblogs.asp.net/rhoward" title="Rob Howard"&gt;Rob Howard&lt;/a&gt;&amp;#39;s &lt;a href="http://msdn2.microsoft.com/en-us/library/ms972319.aspx" title="article"&gt;article&lt;/a&gt; on MSDN. &amp;nbsp;He states, &amp;quot;Defined, a provider is simply a contract between an API and the Business Logic/Data Abstraction Layer. The provider is the implementation of the API separate from the API itself.&amp;quot;&lt;br /&gt;&lt;br /&gt;This pattern was advocated pretty heavily by the folks at Microsoft during the .NET 2.0 framework development cycle. &amp;nbsp;The Membership API is a good example of the concrete implementation. &amp;nbsp;The Membership API contains several methods and properties like CreateUser, GetAllUsers, and ValidateUser. &amp;nbsp; By default the Membership API uses the built in providers that Microsoft developed. &amp;nbsp;They realized that Joe Developer might want to store his users in SQL Server, and Josie Developer might want to talk to Active Directory for her users. &amp;nbsp;To that end, they created the provider pattern. &amp;nbsp;I won&amp;#39;t rehash the whole thing, but for clarification check out Rob&amp;#39;s article.&lt;br /&gt;&lt;br /&gt;I think the provider pattern also happens to have a bit of Dependency Injection/Inversion of Control flavor to it. &amp;nbsp;It doesn&amp;#39;t specifically use a container technology like Windsor or Spring.NET, but by preferring configuration over convention it allows the developer to configure their API to use a specific provider without a huge amount of coding.&lt;br /&gt;&lt;/div&gt;&lt;div style="direction: ltr"&gt;&lt;br /&gt;&lt;span style="font-weight: bold"&gt;Discussion&lt;/span&gt;&lt;br /&gt;Our conversation today centered around whether the Provider pattern is a unique pattern or just a representation of the Strategy/Adapter patterns. &amp;nbsp;Both Strategy and Adapter seem very similar on the surface, but if you look deeper, they seem to be diametrically opposed to each other. &amp;nbsp;Implementation of the Strategy pattern seems like part of the design process, prior to coding. &amp;nbsp;You establish a need for an interchangeable algorithm and create an interface that supports it. Then you code the different implementations for each strategy. &amp;nbsp;On the other hand, the Adapter pattern seems to be sort of an afterthought. You have an established interface that maybe is used in a lot of places, but you want to adapt it to another more current interface. This is a pretty common scenario when dealing with legacy code.&lt;br /&gt;&lt;br /&gt;I was advocating the idea of the Provider pattern really being a Strategy. &amp;nbsp;As I mentioned earlier, the Membership API might have a different strategy for storing user data between two developers. &amp;nbsp;One developer uses SQL Server and another uses Active Directory. &amp;nbsp;My boss Shannon (sorry, no blog&amp;hellip;yet) stated that you could argue that the Membership API was adapting each of those implementations to fit the needs of the developer.&lt;/div&gt;&lt;div style="direction: ltr"&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="direction: ltr"&gt;We commented that depending on your point of view the Provider pattern could fit either of those patterns, it just depends on when and where you start.&lt;br /&gt;&lt;br /&gt;What do you think?&lt;/div&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=1725990" width="1" height="1"&gt;</content><author><name>likwid</name><uri>http://weblogs.asp.net/members/likwid.aspx</uri></author><category term=".NET" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/.NET/default.aspx" /><category term="strategy" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/strategy/default.aspx" /><category term="design patterns" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/design+patterns/default.aspx" /><category term="adapter" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/adapter/default.aspx" /><category term="designpatterns" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/designpatterns/default.aspx" /><category term="pattern" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/pattern/default.aspx" /><category term="patterns" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/patterns/default.aspx" /><category term="design pattern" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/design+pattern/default.aspx" /><category term="provider" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/provider/default.aspx" /><category term="designpattern" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/designpattern/default.aspx" /></entry></feed>
