<?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>2005-08-17T00:52: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><entry><title>DataTableReader</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jgonzalez/archive/2006/05/18/datatablereader.aspx" /><id>http://weblogs.asp.net/jgonzalez/archive/2006/05/18/datatablereader.aspx</id><published>2006-05-18T16:39:00Z</published><updated>2006-05-18T16:39:00Z</updated><content type="html">I am sure everyone but me knows about this thing by now...But man is it sweet.&amp;nbsp; Thanks to &lt;a href="http://codebetter.com/blogs/john.papa/"&gt;John Papa&lt;/a&gt; for his &lt;a href="http://codebetter.com/blogs/john.papa/archive/2006/05/18/144860.aspx"&gt;ADODOTNET2 Demos&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;DataTable dtNewCustomerTable;&lt;br /&gt;using (SqlConnection cn = new SqlConnection(sql2005CnString))&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Create the Command and Adapter&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (SqlCommand cmd = new SqlCommand(this.sqlAllCustomers, cn))&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; SqlDataAdapter adpt = new SqlDataAdapter(cmd);&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; /// Create a DataTable and fill it &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; DataTable dtCustomers = new DataTable("Customers");&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; adpt.Fill(dtCustomers);&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; /// Create the DataTableReader (it is disconnected)&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; DataTableReader dtRdrCustomers = dtCustomers.CreateDataReader();&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; //// Loop through all of the rows and display the first col of each. Just for kicks.&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; //while (dtRdrCustomers.Read())&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; Console.WriteLine(dtRdrCustomers.GetValue(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; Console.WriteLine(string.Format("DataTableReader has {0} fields.", dtRdrCustomers.FieldCount));&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; /// Create a DataTable and load a &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; /// DataTable in it from the DataTableReader&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; dtNewCustomerTable = new DataTable();&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; dtNewCustomerTable.Load(dtRdrCustomers);&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; Console.WriteLine("Back to DataTable ... ");&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; /// or load a DataSet from the DataTableReader&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; ///DataSet dsCustomers = new DataSet();&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; ///dsCustomers.Load(tableRdrCustomers, LoadOption.OverwriteChanges, "Customers");&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; ///Console.WriteLine(dsCustomers.Tables["Customers"];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=447002" width="1" height="1"&gt;</content><author><name>likwid</name><uri>http://weblogs.asp.net/members/likwid.aspx</uri></author><category term="ADO.NET DataTableReader" scheme="http://weblogs.asp.net/jgonzalez/archive/tags/ADO.NET+DataTableReader/default.aspx" /></entry><entry><title>Smart Client/Web Application discussion</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jgonzalez/archive/2005/12/05/432367.aspx" /><id>http://weblogs.asp.net/jgonzalez/archive/2005/12/05/432367.aspx</id><published>2005-12-05T16:02:00Z</published><updated>2005-12-05T16:02:00Z</updated><content type="html">&lt;p&gt;&lt;A href="http://weblogs.asp.net/PaulBallard/"&gt;Paul Ballard&lt;/a&gt; made a &lt;A href="http://weblogs.asp.net/PaulBallard/archive/2005/12/05/432323.aspx"&gt;post&lt;/a&gt; advocating the use of Smart Clients versus Web Applications.&amp;nbsp; I don't agree with everything he is saying, but I thought it was pretty well written.&lt;/p&gt; &lt;p&gt;I will admit, I know next to nothing when it comes to Smart Client applications, but I think he is over-generalizing the problem.&amp;nbsp; It is true you need to know several technologies in order to create web pages, but I would argue that the same problem holds true (maybe on a slightly smaller scale) for really well done Smart Client applications.&amp;nbsp; Take a scenario where you don't control the database servers or access to them.&amp;nbsp; Your Smart Client application cannot directly access the database server through a firewall.&amp;nbsp; This means you are required to create a Service interface using some sort of Web Services.&amp;nbsp; At the minimum this means you will have to know C# or VB, XSD, and WSDL.&amp;nbsp; You still need to learn the Windows Forms development paradigm, which is going to be a learning curve for most of us who have been doing web development for so long.&amp;nbsp; I'm not saying it is overly difficult, but it still takes some getting used to. If you are using Web Services, you still have the "using state over a stateless protocol" problem.&amp;nbsp;&amp;nbsp; For performance your application would probably still want to use the caching mechanisms that Paul described.&amp;nbsp;&amp;nbsp; Web interfaces are incredibly difficult for most developers to create.&amp;nbsp; Web interfaces are difficult to build for most developers to build, I will concede that point.&amp;nbsp; I have found with a really good ui/client side person AND a developer they can educate each other on the "best" way to accomplish things.&amp;nbsp; I think of it as client side pair programming.&lt;/p&gt; &lt;p&gt;Web applications are pretty dang easy to deploy imho, but I understand that Smart Client applications are pretty easy as well.&amp;nbsp; I haven't worked on very many public facing websites for most of my development career.&amp;nbsp;&amp;nbsp; Everything I have done seems to either be internal or a Line of Business application.&amp;nbsp; In most of these cases, I get to control the browser, so I haven't felt as much pain there.&amp;nbsp; It seems like the reasons Paul mentioned for performance problems with web applications would be just as pervasive, that is more of a developer discipline problem to me.&lt;/p&gt; &lt;p&gt;As for the ajax/remote scripting stuff, I am not a huge fan.&amp;nbsp; I will leave it at that.&amp;nbsp; As for the online/offline paradigm, I think it really does depend on your users and your capabilities.&lt;br /&gt;In a perfect world, it would be nice to develop every application with offline capability, but realistically, do I care if I can browse the JC Penney's catalog while my internet is down?&amp;nbsp; I can't buy anything while the&amp;nbsp;internet is down&amp;nbsp; =)&lt;/p&gt; &lt;p&gt;I will agree with what Paul's advice is...You should think about your customers.&amp;nbsp; I am just not making the same bet Paul is.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=432367" width="1" height="1"&gt;</content><author><name>likwid</name><uri>http://weblogs.asp.net/members/likwid.aspx</uri></author></entry><entry><title>2005 Web Projects...</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jgonzalez/archive/2005/08/22/423298.aspx" /><id>http://weblogs.asp.net/jgonzalez/archive/2005/08/22/423298.aspx</id><published>2005-08-22T17:08:00Z</published><updated>2005-08-22T17:08:00Z</updated><content type="html">&lt;p&gt;So I asked &lt;A href="http://weblogs.asp.net/ScottGu"&gt;ScottGu&lt;/a&gt; about our particular virtualization strategy that we use at work &lt;A href="http://weblogs.asp.net/scottgu/archive/2005/08/21/423201.aspx#423226"&gt;here&lt;/a&gt;.&amp;nbsp; I think I have extolled on the architecture before, but I will go over it again just in case.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;We host about 5,500 automotive dealership's websites.&amp;nbsp; Obviously those sites need to look different so we came up with the concepts of themes and variations.&amp;nbsp; Themes represent a particular navigational style like leftnav, topnav, etc... Variations are just color changes of existing themes.&amp;nbsp; We also generate several files for each site... things like theme headers with dealership names&amp;nbsp;or OEM logo, forms created by the dealer (we abstracted forms into a data model and we allow the dealers to create their own forms, label them the way they want, add validation, etc...), and menucontrols.&amp;nbsp; Everything is stored in our database and I do mean everything.&amp;nbsp; Sites, urls, pages, controls, data for those controls, etc...&amp;nbsp;&amp;nbsp;One thing we attempted to do for performance reasons was generate these files and deploy them to a Sites folder.&amp;nbsp; This sites folder contained around 5000 folders named after the site.&amp;nbsp; Each of these folders contained several ascx files for the things I mentioned above like sectors (to encapsulate the logos in a header for example), forms ascx(forms are generated a site creation and placed in this folder to save performance from all of the complex logic that would have to occur at runtime) and menuitems (they are hierarchical so we figured that it would be easiest to generate these as ascx files instead of at runtime).&amp;nbsp; &lt;br /&gt;&lt;br /&gt;The problem(s) that we ran into was around number of assemblies loaded.&amp;nbsp; If you had this application running on 1 server (we don't) at about 500 assemblies the memory for the w3wp.exe process spirals out of control and completely crashes.&amp;nbsp; The first thing we figured out was that &amp;lt;compilation debug="true"/&amp;gt;&amp;nbsp; == bad.&amp;nbsp;&amp;nbsp;This is really the same type of problem that we had,&amp;nbsp;but because of the nature of compilation when this setting is true in&amp;nbsp;the web.config we noticed it after about 2 months.&amp;nbsp; Sites were&amp;nbsp;being added to our architecture in this time and we didn't catch it in testing.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;The second thing that we figured out was that for each directory codebehinds and aspx|ascx get compiled into different dlls.&amp;nbsp; Duly noted.&amp;nbsp; Although the nature of the actual compilation&amp;nbsp;threw us for a loop.&amp;nbsp; While all of the aspx|ascx files get compiled into 1 assembly, a seperate assembly is created for each codebehind.&amp;nbsp; Even if you have debug="false in the compilation element.&amp;nbsp; To me this makes absolutely no sense whatsoever.&amp;nbsp; For example take a folder that has 5 ascx files and 5 codebehinds, you will actually end up with 6 assemblies in this folder.&amp;nbsp; If you can compile all of the ascx files into 1 assembly, why can't you do that with the codebehinds also?&amp;nbsp; We ended up working around this problem by wrapping all logic normally found in codebehinds into &amp;lt;script runat="server"&amp;gt; tags.&amp;nbsp; This allowed us to effectively have 1 assembly per directory.&amp;nbsp; We also did some load balancing at the network layer using F5 BigIP to distribute the load across our 28 web servers more effectively.&lt;br /&gt;&lt;br /&gt;While there has been much talk about the new compilation model for 2.0, this really hasn't changed much at all from what Scott said.&amp;nbsp; Scott said that this type of scenario was "not optimal."&amp;nbsp; I don't necessarily disagree with him.&amp;nbsp; He did say that the compilation changes for 2.0 were made more granular because of developers working on projects with large amounts of items in the project.&amp;nbsp; He used the example of 5,000 aspx pages and 4,000 images across 36 directories with 250 items per folder.&amp;nbsp;&amp;nbsp;&amp;nbsp; Doesn't that scenario seem less than optimal also?&amp;nbsp;&amp;nbsp; I mean, if you have 5,000 different pages in a website.... who would want to maintain that?&amp;nbsp;&amp;nbsp; At least in our architecture everything is generated.&amp;nbsp;&amp;nbsp;We don't have to maintain those files.&amp;nbsp; I understand that your example was contrived, but if Scott Guthrie says you can do X, I guarantee people are going to try and do it.&amp;nbsp; It seems like if you can tell us that our architecture is "less than optimal" you could have told the people with an especially large number of files the same thing.&amp;nbsp; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=423298" width="1" height="1"&gt;</content><author><name>likwid</name><uri>http://weblogs.asp.net/members/likwid.aspx</uri></author></entry><entry><title>Fun with Generics</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jgonzalez/archive/2005/08/18/422976.aspx" /><id>http://weblogs.asp.net/jgonzalez/archive/2005/08/18/422976.aspx</id><published>2005-08-18T16:10:00Z</published><updated>2005-08-18T16:10:00Z</updated><content type="html">&lt;p&gt;This c++ ninja that I work with schooled me on Generics the other day.&amp;nbsp; I was struggling to return a List from our EntityManager&amp;nbsp;class while keeping it pretty generic.&amp;nbsp; I had a property like:&lt;br /&gt;&lt;br /&gt;public List&amp;lt;IEntityObject&amp;gt; CollectionInstance&lt;br /&gt;{&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;get{ return new List&amp;lt;Customer&amp;gt;(); } &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;That doesn't work.&amp;nbsp; I get an error about the fact that an explicit conversion exists.&amp;nbsp; I spent a couple of hours trying all kinds of hacks.&amp;nbsp; I guess I should know by now square peg != round hole.&lt;br /&gt;&lt;br /&gt;The solution that Patrick (the c++ ninja) came up with was pretty simple.&amp;nbsp; We templatized (he kept calling generics templates...dang c++ programmers)&amp;nbsp;our EntityManager class also.&lt;br /&gt;&lt;br /&gt;So before we had something like:&lt;br /&gt;&lt;br /&gt;public abstract&amp;nbsp;class EntityManager&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public abstract List&amp;lt;IEntityObject&amp;gt; CollectionInstance&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;and now we have:&lt;br /&gt;&lt;br /&gt;public abstract&amp;nbsp;class EntityManager&amp;lt;T&amp;gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public abstract List&amp;lt;T&amp;gt; CollectionInstance&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;This allows us to refer to everything in the base class as T instead of the interface IEntityObject.&amp;nbsp; This is pretty nice.&amp;nbsp; Now our concrete class looks something like this:&lt;br /&gt;&lt;br /&gt;public class CustomerManager : EntityManager&amp;lt;Customer&amp;gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public List&amp;lt;Customer&amp;gt; CollectionInstance&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;get{ return 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; &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I really liked the way this turned out, it is much cleaner than the method I attempted and I never even considered making the manager generic.&amp;nbsp;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=422976" width="1" height="1"&gt;</content><author><name>likwid</name><uri>http://weblogs.asp.net/members/likwid.aspx</uri></author></entry><entry><title>Geek Crush?</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/jgonzalez/archive/2005/08/17/422814.aspx" /><id>http://weblogs.asp.net/jgonzalez/archive/2005/08/17/422814.aspx</id><published>2005-08-17T05:52:00Z</published><updated>2005-08-17T05:52:00Z</updated><content type="html">Ever since I found the Castle Project &lt;a href="http://www.castleproject.org/index.php/Main_Page"&gt;website&lt;/a&gt;, I have been enthralled by the code and concepts &lt;a href="http://jroller.com/page/hammett/"&gt;Hamilton *hammett* Verissimo&lt;/a&gt; advocates.&amp;nbsp; I know that he isn't the first person to discuss these concepts, but he happens to be the person that made this click for me.&amp;nbsp; He has several different projects going under the Castle banner from Inversion of Control containers to an MVC architecture called MonoRail that is loosely based on Ruby On Rails.&lt;br /&gt;&lt;br /&gt;I have been toying with MonoRail after hours and it is pretty nice.&amp;nbsp; I am really digging on hammet's IoC stuff though.&amp;nbsp; Take a look at hammet's take on IoC &lt;a href="http://codeproject.com/csharp/IntroducingCastle.asp"&gt;here&lt;/a&gt;.&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=422814" width="1" height="1"&gt;</content><author><name>likwid</name><uri>http://weblogs.asp.net/members/likwid.aspx</uri></author></entry></feed>