<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>Craig Shoemaker</title><link>http://www.dotnetjunkies.com/WebLog/craigshoemaker/default.aspx</link><description /><dc:language>en-US</dc:language><generator>CommunityServer 1.0 (Build: 1.0.1.50214)</generator><item><title>This Blog Has Moved</title><link>http://www.dotnetjunkies.com/WebLog/craigshoemaker/archive/2007/12/06/391885.aspx</link><pubDate>Thu, 06 Dec 2007 22:08:00 GMT</pubDate><guid isPermaLink="false">58df7014-fd75-437c-9641-150997716d1c:391885</guid><dc:creator>drazz75</dc:creator><slash:comments>0</slash:comments><comments>http://www.dotnetjunkies.com/WebLog/craigshoemaker/comments/391885.aspx</comments><wfw:commentRss>http://www.dotnetjunkies.com/WebLog/craigshoemaker/commentrss.aspx?PostID=391885</wfw:commentRss><description>&lt;p&gt;I have moved this blog over to a new account. Please update your aggregators to point to&lt;/p&gt;
&lt;h2&gt;http://feeds.feedburner.com/PolymorphicPodcastBlog&lt;/h2&gt;
&lt;p&gt;...and you will automatically be updated with any future changes to the this feed.&lt;/p&gt;
&lt;p&gt;Thanks,&lt;/p&gt;
&lt;p&gt;Craig Shoemaker&lt;/p&gt;&lt;img src="http://www.dotnetjunkies.com/WebLog/aggbug.aspx?PostID=391885" width="1" height="1"&gt;</description></item><item><title>Why I Quit My Job: So I Can Podcast More for You</title><link>http://www.dotnetjunkies.com/WebLog/craigshoemaker/archive/2007/11/14/366194.aspx</link><pubDate>Wed, 14 Nov 2007 14:46:00 GMT</pubDate><guid isPermaLink="false">58df7014-fd75-437c-9641-150997716d1c:366194</guid><dc:creator>drazz75</dc:creator><slash:comments>6</slash:comments><comments>http://www.dotnetjunkies.com/WebLog/craigshoemaker/comments/366194.aspx</comments><wfw:commentRss>http://www.dotnetjunkies.com/WebLog/craigshoemaker/commentrss.aspx?PostID=366194</wfw:commentRss><description>&lt;h3&gt;I Quit With a Smile on My Face&lt;/h3&gt;
&lt;p&gt;I recently quit my job for a much bigger and decidedly better opportunity. I am elated to announce that I have accepted a new position with &lt;a href="http://infragistics.com/"&gt;Infragistics&lt;/a&gt; as a New Media Evangelist. This means that I get to spend my days doing the things I love in hopes that I can help bring the developer community closer to a great company.&lt;/p&gt;

&lt;h3&gt;What does this mean for the Polymorphic Podcast?&lt;/h3&gt;
&lt;p&gt;I see great things on the horizon. While I retain 100% control over the show, Infragistics is allowing me to spend time during my workday on development and production of the show. In the past I have always had to steal an hour here or an hour there to work on production, but now I have dedicated time to apply to the growth the Polymorphic Podcast.&lt;/p&gt;

&lt;p&gt;What this &lt;em&gt;does not&lt;/em&gt; mean is that the Polymorphic Podcast is now a corporate extension of Infragistics. You don’t need to worry that I will be dropping the URL of my employer all over the place. There is no veiled marketing going on here. Infragistics just realizes there is a lot of value to keeping me connected to an established community. I thank &lt;a href="http://blogs.infragistics.com/blogs/jason_beres/"&gt;Jason Beres&lt;/a&gt; and &lt;a href="http://blogs.infragistics.com/blogs/ambrose_little/"&gt;Ambrose Little&lt;/a&gt; for their hard work in making this happen.&lt;/p&gt;

&lt;h3&gt;So When Do You Get a New Show?&lt;/h3&gt;
&lt;p&gt;How about three? I’ve been promising you a video on how to install Subversion on a Windows box. &lt;a href="http://polymorphicpodcast.com/podcast/video/subversion/"&gt;Wait no longer because that video is now here&lt;/a&gt;. I have also recorded a show demonstrating how to use a new utility I call MVP Commander (thanks &lt;a href="http://blog.wekeroad.com/"&gt;Rob Conery&lt;/a&gt;!) that generates MVP stubs right in Visual Studio. This way you are not forced to go to the &lt;a href="http://polymorphicpodcast.com/tools/mvp-stub/"&gt;tools page on my website&lt;/a&gt; to generate this code. &lt;a href="http://polymorphicpodcast.com/shows/mvpcommander/"&gt;Please checkout the notes and download links for the code and video here&lt;/a&gt;. Finally I recorded an audio catch-up show to announce my affiliation with Infragistics, tell you about the video shows and answer some reader email. You can listen to the show on the &lt;a href="http://polymorphicpodcast.com/shows/mvpcommander/"&gt;MVP Commander show-notes page&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Get Ready!&lt;/h3&gt;
&lt;p&gt;Between the work I am doing on my blog and podcast, the new podcasts, videos and screen-casts coming from the Infragistics website, and some appearances I am making at user groups and conferences throughout the year - some of you might be regretting asking for more! ;)&lt;/p&gt;&lt;img src="http://www.dotnetjunkies.com/WebLog/aggbug.aspx?PostID=366194" width="1" height="1"&gt;</description></item><item><title>Podcast: Architecting for Extensibility II : Interview with Miguel Castro on Extensibility Patterns in CodeBreeze</title><link>http://www.dotnetjunkies.com/WebLog/craigshoemaker/archive/2007/10/05/329801.aspx</link><pubDate>Fri, 05 Oct 2007 13:19:00 GMT</pubDate><guid isPermaLink="false">58df7014-fd75-437c-9641-150997716d1c:329801</guid><dc:creator>drazz75</dc:creator><slash:comments>0</slash:comments><comments>http://www.dotnetjunkies.com/WebLog/craigshoemaker/comments/329801.aspx</comments><wfw:commentRss>http://www.dotnetjunkies.com/WebLog/craigshoemaker/commentrss.aspx?PostID=329801</wfw:commentRss><description>&lt;h2&gt;&lt;a href="http://polymorphicpodcast.com/shows/architectextensibility2"&gt;Listen to the show here&lt;/a&gt;&lt;/h2&gt;


&lt;p&gt;Craig Shoemaker sits down with &lt;a href="http://dotnetdude.com/"&gt;Miguel Castro&lt;/a&gt; to follow up on the first show on &lt;a href="http://polymorphicpodcast.com/shows/architectextensibility/"&gt;Architecting for Extensibility&lt;/a&gt;. In the previous show, Miguel takes us through a number of the patterns that make it possible for you to design points of extensibility into your applications. In the sequel to part one, Miguel describes in detail how he uses this pattern in &lt;a href="http://steelbluesolutions.com/Summary/CodeBreeze/"&gt;CodeBreeze&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Raising Money for Diabetes with Halo 3 on Oct 11&lt;/h2&gt;
&lt;p&gt;Join Scott Hanselman in his enduring fight against diabetes by playing Halo 3 in high-def! For details on the event
check out &lt;a href="http://tinyurl.com/yue4qm"&gt;Scott's blog (http://tinyurl.com/yue4qm)&lt;/a&gt;. To sign up go to &lt;a href="http://iammasterchief.com/"&gt;http://iammasterchief.com/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Thanks!&lt;/h3&gt;
&lt;p&gt;I want to send a warm greeting and a big thanks to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Jeffrey Norris&lt;/li&gt;
&lt;li&gt;Buddy Stein&lt;/li&gt;

&lt;li&gt;Brian Deacon&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Still an MVP&lt;/h3&gt;
&lt;p&gt;My ASP.NET MVP award was renewed this year!&lt;/p&gt;&lt;img src="http://www.dotnetjunkies.com/WebLog/aggbug.aspx?PostID=329801" width="1" height="1"&gt;</description></item><item><title>Podcast: Subversion Quickstart for .NET Developers</title><link>http://www.dotnetjunkies.com/WebLog/craigshoemaker/archive/2007/08/09/279213.aspx</link><pubDate>Thu, 09 Aug 2007 13:58:00 GMT</pubDate><guid isPermaLink="false">58df7014-fd75-437c-9641-150997716d1c:279213</guid><dc:creator>drazz75</dc:creator><slash:comments>1</slash:comments><comments>http://www.dotnetjunkies.com/WebLog/craigshoemaker/comments/279213.aspx</comments><wfw:commentRss>http://www.dotnetjunkies.com/WebLog/craigshoemaker/commentrss.aspx?PostID=279213</wfw:commentRss><description>&lt;h2&gt;&lt;a href="http://polymorphicpodcast.com/shows/subversion/"&gt;Listen to the Show!&lt;/a&gt;&lt;/h2&gt;

&lt;h1&gt;Subversion&lt;/h1&gt;
        &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Subversion_%28software%29"&gt;Subversion, sometimes known as SVN, is an open source version control system. 
        Subversion allows users to keep track of changes made over time to any type of electronic data. Typical uses are 
        versioning source code, web pages or design documents.&lt;/a&gt;&lt;/p&gt;
    
    &lt;h2&gt;Why Subversion over Visual Source Safe?&lt;/h2&gt;
        &lt;p&gt;While Visual Source Safe (VSS) is fully integrated into the Visual Studio environment, there are many 
        disadvantages that can not be ignored.&lt;/p&gt;
        
        &lt;h3&gt;Reliability&lt;/h3&gt;
            &lt;p&gt;Sam Gentile, in his blog post entitled "&lt;a href="http://codebetter.com/blogs/sam.gentile/archive/2006/03/02/139641.aspx"&gt;No More VSS, Its Subversion&lt;/a&gt;", 
            is so bold to just link to the search terms "&lt;a href="http://www.google.com/search?hl=en&amp;q=VSS+%2Bcorrupt"&gt;VSS+corrupt&lt;/a&gt;" on Google to make a case for the ubiquity of VSS problems.&lt;/p&gt;

            &lt;ul&gt;
                &lt;li&gt;&lt;strong&gt;Numerous accounts of crashing and corruption:&lt;/strong&gt; See links above...&lt;/li&gt;
                &lt;li&gt;&lt;strong&gt;Not a client-server application:&lt;/strong&gt; The current VSS setup makes it difficult to expose source code to developer's outside your network.&lt;/li&gt;
                &lt;li&gt;&lt;strong&gt;Database size restriction:&lt;/strong&gt; Some say the limit is 2GB, others say 10GB. Even if it's 100GB - who want's to worry about a size restriction?&lt;/li&gt;
            &lt;/ul&gt;
            
        &lt;h3&gt;Preferential Issues&lt;/h3&gt;
        &lt;p&gt;There are also a number of issues with VSS that are most fairly described as "preferential issues". I cite these issues because
        while they are not technically "bugs" they do represent limitations that many developers find as a hurdle to deal with in the 
        real world. Examples of some of these issues are exclusive file locking and VSS's method of tagging and branching make it difficult at times
        to work with.&lt;/p&gt;
        
    &lt;h2&gt;Operation&lt;/h2&gt;
        &lt;p&gt;Subversion features the operations you would come to expect from any source control system. If you come from a VSS background, some of the
        terms may seem a bit awkward. Below is a list of the most common operations you encounter while using Subversion.&lt;/p&gt;
        &lt;h3&gt;Trunk&lt;/h3&gt;
        &lt;p&gt;The trunk is the main thread where you will often work on your source code. The trunk acts as the basis where you can branch off and make
        changes or create point-in-time copies of your code. The trunk, just like a tree, is what supports a source code project.&lt;/p&gt;
        &lt;h3&gt;Checkout&lt;/h3&gt;
        &lt;p&gt;As opposed to a "check out" in VSS, a Subversion checkout is when you contact the code repository for the first time
        and bring down the files on to your machine. When you do a checkout the file and directory structure is created on your computer
        and a hidden folder is created under each folder under source control that helps maintain the state of each file.&lt;/p&gt;
        &lt;h3&gt;Add&lt;/h3&gt;
        &lt;p&gt;When you want to add a new file to the source control repository, you must first mark the file as being added. This will signal
        to Subversion that the next time you synch up with the repository, the file must be copied from its location on your machine
        to a versioned state on the Subversion server.&lt;/p&gt;
        &lt;h3&gt;Commit&lt;/h3&gt;
        &lt;p&gt;Many changes that you make to files will require a two-step process to expose the changes to other users of the repository. After you
        have added or changed a file, you must commit the changes up to the Subversion server. This will allow you to make many changes, but submit
        all the changes to the repository in a single transaction. Changes to the repository are atomic actions.&lt;/p&gt;
        &lt;p&gt;The two-step process also enables Subversion to keep the code repository's integrity while not requiring a exclusive lock
        on files under source control.&lt;/p&gt;
        &lt;h3&gt;Conflict Resolution&lt;/h3&gt;
        &lt;p&gt;When multiple people are working on the same project, inevitably they will end up editing the same file at the same time. When
        this happens there is a conflict in file states that must be resolved. When you go to commit your changes to Subversion, if a 
        conflict is detected you will have an opportunity to resolve the conflict. Some of the UI tools make the experience prettier, but the 
        process is the same whether or not you are using a GUI tool or the command line. Conflict resolution will expect you to choose portions
        of a file or entire files all together as the file version of the file. You do have an opportunity to say, "give me this section from file 1
        and this section from file two" in order to reliably keep everyones changes. Conflict resoution is usually a non-event as
        often two developers are not working on the same line of code in the same file. If the changes in question are on the same lines of
        code among what the developers changed, then a decision must be made as to who's changes to keep and the application must be tested 
        or perhaps refactored to not break this build.&lt;/p&gt;
        &lt;h3&gt;Branching&lt;/h3&gt;
        &lt;p&gt;A feature that Subversion implements well is the branching feature. Rather than maintaing some huge change log off the main
        repository thread as to what a "branch" is, Subversion makes a copy of the trunk and allows you to make any changes necessary.
        To bring the changes back down to the trunk you will merge the changes down to the trunk.&lt;/p&gt;
        &lt;h3&gt;Merging&lt;/h3&gt;
        &lt;p&gt;Once you have created a branch that you need to bring down to the trunk you will run a merge operation. Merging a branch down to the 
        trunk is equivalent to comitting a large-scale change to the repository. If there are any conflicts during a merge Subversion will 
        give you a chance to resolve the conflicts.&lt;/p&gt;
        &lt;h3&gt;Tagging&lt;/h3&gt;
        &lt;p&gt;Tagging gives you a way to set aside the trunk at a point and "label" the state of the trunk.&lt;/p&gt;
        
        &lt;h3&gt;Branching vs Tagging&lt;/h3&gt;
        &lt;p&gt;Often people wonder what is the difference between branching and tagging. You use a branch when you want to make significant
        changes to the trunk and still need source control features of commiting changes to the server, but don't want those changes to 
        effect the users of the trunk. Branching creates an isolated environment for someone to make changes to the code.&lt;/p&gt;
        &lt;p&gt;Tagging is best used as a point-in-time snapshot of the repository. For instance at each version release of your code
        you would want to tag the code base.&lt;/p&gt;
    
        
    
    &lt;h2&gt;Integration&lt;/h2&gt;
        &lt;p&gt;When someone says they have Subversion installed on thier machine, often they mean they have a Windows Exporer shell installed
        and not the server on the box. Subversion is a client-server application where the service, security and database all live on 
        a single server and clients (developer machines) use a separate tool for accessing the repository. The most common tool on Windows
        is Tortoise SVN.&lt;/p&gt;
        
        &lt;h4&gt;Tortoise SVN&lt;/h4&gt;
        &lt;p&gt;File system integration is seamless. Tortoise SVN is a Windows Explorer shell extension that grants you access to the Subversion repository natively from
        Windows Explorer. If you right-click in a Windows Explorer window you immediately have access to the Subversion system. The 
        greatest benefit from granting access from a shell extension is that the access is pervasive. Any window that grants you listing 
        of the file system will expose the Tortoise menu (ex: File-&gt; Open dialog boxes).&lt;/p&gt;
        &lt;p&gt;&lt;a href="http://tortoisesvn.net/downloads"&gt;You may download Tortoise SVN here.&lt;/a&gt;&lt;/p&gt;
        &lt;p&gt;As a .NET developer, there is one issue that you must be aware of before you begin using Tortoise SVN for your Visual Studio projects.
        Tortoise SVN uses hidden folders within the file system to help maintain the link with the central repository. These hidden folders are 
        by default named ".svn". You will find this folder under &lt;strong&gt;every&lt;/strong&gt; folder that is under source control with
        Tortoise SVN.&lt;/p&gt;
        &lt;p&gt;For some reason, the ".svn" naming convention is nothing but trouble to the Visual Studio IDE. If you try to use Tortoise SVN
        using it's default settings you will eventually encounter the following error while trying to run your projects and solutions in Visual ]
        Studio:&lt;/p&gt;
        &lt;blockquote&gt;Cannot load project information from server&lt;/blockquote&gt;
        &lt;p&gt;While this is technically an error stemming from a problem in the Visual Studio IDE, the Tortoise development team seemed to concede
        that it was easier to make a small change in the Tortoise setup rather than wait for an update to Visual Studio.&lt;/p&gt;
        &lt;p&gt;&lt;strong&gt;Therefore before you begin using Tortoise SVN for the first time, be sure to change the settings for Tortoise to use
        a hidden folder named "_svn" rather than ".svn".&lt;/strong&gt;The following section will walk you through the 
        process.&lt;/p&gt;
        
        &lt;h5&gt;Configuring Tortoise SVN for use with Visual Studio&lt;/h5&gt;
        &lt;p&gt;Once Tortoise SVN is installed on your machine, open a Windows Explorer menu and right-click to open the context menu. From the menu
        do the following:&lt;/p&gt;
        
        &lt;ol&gt;
            &lt;li&gt;Select &lt;strong&gt;TortoiseSVN&lt;/strong&gt;&lt;/li&gt;
            &lt;li&gt;Select &lt;strong&gt;Settings&lt;/strong&gt;&lt;/li&gt;
            &lt;li&gt;Check the box labeled &lt;strong&gt;Use "_svn" instead of ".svn" directories&lt;/strong&gt;&lt;/li&gt;
            &lt;li&gt;Click &lt;strong&gt;OK&lt;/strong&gt;&lt;/li&gt;
        &lt;/ol&gt;
        
        &lt;p&gt;Then you are prompted to reboot your machine. While the reboot is annoying, it is required.&lt;/p&gt;
        
        &lt;div align="center"&gt;&lt;img src="http://polymorphicpodcast.com/images/imgTortoiseSVNPropertiesMenu.png" alt="Menu path to TortoiseSVN Settings" width="364" height="364" /&gt;&lt;/div&gt;
        &lt;div align="center"&gt;
            &lt;img src="http://polymorphicpodcast.com/images/imgTortoiseSVNProperties.png" alt="TortoiseSVN Settings Panel" width="659" height="468" /&gt;
            &lt;blockquote&gt;Note: The change in directory setting is appropriate for all Visual Studio versions, not just for Visual Studio 2003.&lt;/blockquote&gt;
        &lt;/div&gt;
        
        &lt;h3&gt;Visual Studio&lt;/h3&gt;
        &lt;p&gt;When you begin using Subversion, you will appreciate the ease-of-use and performance, if you do not have a way to integrate
        with Visual Studio you will find it hard to use. Particularly if you have to somehow keep track of which files were added to 
        your project and so on.&lt;/p&gt;
        &lt;p&gt;There are at least two options available to you to integrate access to the Subversion repository from within the Solution 
        Explorer inside Visual Studio.&lt;/p&gt;
        &lt;ul&gt;
            &lt;li&gt;&lt;a href="http://ankhsvn.tigris.org/"&gt;AnkhSVN&lt;/a&gt;: AnkhSVN is &lt;strong&gt;free&lt;/strong&gt; and provides the same types of services
            that you would expect from VSS integration with Visual Studio. The only downside to AnkhSVN is that the UI implementation 
            sometimes feels a little clunky. Asethetics aside - AnkhSVN is a solid program which allows you to seamlessly integrate with 
            the Subversion repository.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href="http://www.visualsvn.com/"&gt;VisualSVN&lt;/a&gt;: VisualSVN is much like AnkhSVN, but the UI experince is cleaner. Also
            the icons used in the context menus are exactly the same as in Tortoise SVN. This little touch just makes it easier 
            to keep track of what operations you are performing since the experience looks the same in and out of the exporer shell.
            Functionally though VisualSVN's capabilities are equivalent to AnkhSVN. VisualSVN is not free.&lt;/li&gt;
        &lt;/ul&gt;
        
        &lt;h3&gt;Continuous Integration&lt;/h3&gt;
        &lt;p&gt;One of the great benefits of working with a source control sysetm that is open source and extensibile, is how it will 
        interface with other components in the development lifecycle.&lt;/p&gt;
        
        &lt;p&gt;Subversion integrates with many of the &lt;a href="http://damagecontrol.codehaus.org/Continuous+Integration+Server+Feature+Matrix"&gt;open 
        source continuous integration packages&lt;/a&gt; as well as with &lt;a href="http://msbuildtasks.tigris.org/"&gt;MSBuild&lt;/a&gt;.&lt;/p&gt;


    &lt;h2&gt;Resources&lt;/h2&gt;
    &lt;p&gt;&lt;/p&gt;
    
    &lt;blockquote&gt;Note: Opening up access to your repository over the web can prove difficult on a Windows machine. Many 
    people setting up for remote access will configure the repository on a Linux box running Apache.&lt;/blockquote&gt;
    
    &lt;ul&gt;
        &lt;li&gt;&lt;a href="http://www.yolinux.com/TUTORIALS/Subversion.html"&gt;Subversion Commands &amp; Scripts&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="http://software.pmade.com/svnauto"&gt;Subervsion Automation&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="http://www.digitalmediaminute.com/article/2251/how-to-move-a-subversion-repository"&gt;Move Subersion Repository Between Machines&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="http://www.howtoforge.com/subversion_web_access_apache?s=518d5a6a3a7039504116739e7ca35b42&amp;"&gt;How To Configure Web Access To Subversion Repositories Using Apache&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="http://msbuildtasks.tigris.org/"&gt;MSBuild Tasks for Subversion&lt;/a&gt;&lt;/li&gt;        
    &lt;/ul&gt;
    
    &lt;h2&gt;Books on Subversion&lt;/h2&gt;

    &lt;p&gt;&lt;a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;location=http%3A%2F%2Fwww.amazon.com%2FVersion-Control-Subversion-Michael-Pilato%2Fdp%2F0596004486%3Fie%3DUTF8%26s%3Dbooks%26qid%3D1186145162%26sr%3D8-1&amp;tag=drazz75-20&amp;linkCode=ur2&amp;camp=1789&amp;creative=9325"&gt;&lt;img src="http://polymorphicpodcast.com/images/VersionControlWithSubersion.jpg" border="0" /&gt;&lt;br /&gt;Version Control with Subversion (printed copy)&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=drazz75-20&amp;l=ur2&amp;o=1" width="1" height="1" border="0" alt="" /&gt;
    | &lt;a href="http://svnbook.red-bean.com/"&gt;Free e-book!&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;&lt;a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;location=http%3A%2F%2Fwww.amazon.com%2FPragmatic-Version-Control-Subversion-Starter%2Fdp%2F0977616657%3Fie%3DUTF8%26s%3Dbooks%26qid%3D1186145162%26sr%3D8-2&amp;tag=drazz75-20&amp;linkCode=ur2&amp;camp=1789&amp;creative=9325"&gt;&lt;img src="http://polymorphicpodcast.com/images/PragmaticVersionControl.jpg" border="0" /&gt;&lt;br /&gt; Pragmatic Version Control: Using Subversion&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=drazz75-20&amp;l=ur2&amp;o=1" width="1" height="1" border="0" alt="" /&gt;&lt;/p&gt;

    &lt;p&gt;&lt;a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;location=http%3A%2F%2Fwww.amazon.com%2FPractical-Subversion-Second-Experts-Source%2Fdp%2F1590597532%3Fie%3DUTF8%26s%3Dbooks%26qid%3D1186145162%26sr%3D8-3&amp;tag=drazz75-20&amp;linkCode=ur2&amp;camp=1789&amp;creative=9325"&gt;&lt;img src="http://polymorphicpodcast.com/images/PracticalSubversion.jpg" border="0" /&gt;&lt;br /&gt;Practical Subversion, Second Edition&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=drazz75-20&amp;l=ur2&amp;o=1" width="1" height="1" border="0" alt="" /&gt;&lt;/p&gt;
 
    

    &lt;h2&gt;References&lt;/h2&gt;
        &lt;ol&gt;
            &lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Subversion_%28software%29"&gt;Subversion entry on Wikipedia&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href="http://www.kirit.com/Moving%20from%20Visual%20SourceSafe%20to%20Subversion"&gt;Moving from Visual SourceSafe to Subversion&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href="http://www.szabgab.com/subversion_vs_xyz.html"&gt;How does Subversion compare to XYZ Version Control System?&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href="http://www.hanselman.com/blog/CVSAndSubversionVsVSSSourceSafe.aspx"&gt;CVS and Subversion vs. VSS/SourceSafe - Scott Hanselman&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href="http://weblogs.asp.net/jezell/archive/2004/02/26/80640.aspx"&gt;Top Reasons Why I like Subversion Better than SourceSafe - Jesse Ezell&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href="http://damagecontrol.codehaus.org/Continuous+Integration+Server+Feature+Matrix"&gt;Open source Continuous Integration Feature Matrix&lt;/a&gt;&lt;/li&gt;
        &lt;/ol&gt;

&lt;h2&gt;&lt;a href="http://polymorphicpodcast.com/shows/subversion/"&gt;Listen to the Show!&lt;/a&gt;&lt;/h2&gt;&lt;img src="http://www.dotnetjunkies.com/WebLog/aggbug.aspx?PostID=279213" width="1" height="1"&gt;</description></item><item><title>Life with Visual Studio 2008</title><link>http://www.dotnetjunkies.com/WebLog/craigshoemaker/archive/2007/08/02/275544.aspx</link><pubDate>Thu, 02 Aug 2007 14:07:00 GMT</pubDate><guid isPermaLink="false">58df7014-fd75-437c-9641-150997716d1c:275544</guid><dc:creator>drazz75</dc:creator><slash:comments>0</slash:comments><comments>http://www.dotnetjunkies.com/WebLog/craigshoemaker/comments/275544.aspx</comments><wfw:commentRss>http://www.dotnetjunkies.com/WebLog/craigshoemaker/commentrss.aspx?PostID=275544</wfw:commentRss><description>&lt;p&gt;For those of you who are digging into Visual Studio 2008, check out Wally's blog series he's started. He calls it &amp;quot;&lt;a href="http://morewally.com/cs/blogs/wallym/archive/tags/My+life+with+Visual+Studio+2008/default.aspx"&gt;My Life with Visual Studio 2008&lt;/a&gt;&amp;quot;. Check it out!&lt;/p&gt;&lt;img src="http://www.dotnetjunkies.com/WebLog/aggbug.aspx?PostID=275544" width="1" height="1"&gt;</description></item><item><title>Video: Web Navigation Strategies: Creating Contracts for Your Web Pages</title><link>http://www.dotnetjunkies.com/WebLog/craigshoemaker/archive/2007/06/30/254548.aspx</link><pubDate>Sat, 30 Jun 2007 14:35:00 GMT</pubDate><guid isPermaLink="false">58df7014-fd75-437c-9641-150997716d1c:254548</guid><dc:creator>drazz75</dc:creator><slash:comments>1</slash:comments><comments>http://www.dotnetjunkies.com/WebLog/craigshoemaker/comments/254548.aspx</comments><wfw:commentRss>http://www.dotnetjunkies.com/WebLog/craigshoemaker/commentrss.aspx?PostID=254548</wfw:commentRss><description>&lt;p&gt;The video and code for download is now posted at &lt;a href="http://polymorphicpodcast.com/shows/webnavigator/"&gt;http://polymorphicpodcast.com/shows/webnavigator/&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Learn an object oriented way to encapsulate the location of your web pages, shielding the physical location of the pages to your application and creating a programmatic contract for required resources.&lt;/p&gt;&lt;p&gt;[advertisement] Watch the show and learn how to get &lt;a href="http://polymorphicpodcast.com/shows/webnavigator/"&gt;$100 off&lt;/a&gt; an &lt;a href="http://polymorphicpodcast.com/advisor/"&gt;Advisor Summit&lt;/a&gt; event in Sept 2007.&lt;/p&gt;
&lt;div align="center"&gt;&lt;a href="http://polymorphicpodcast.com/advisor/"&gt;&lt;img src="http://polymorphicpodcast.com/images/sponsors/lgoAdvisorMedia.gif" alt="Advisor Media" border="0" height="72" width="175"&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.dotnetjunkies.com/WebLog/aggbug.aspx?PostID=254548" width="1" height="1"&gt;</description></item><item><title>Podcast:: Web Navigation Strategies: Creating Contracts for Your Web Pages</title><link>http://www.dotnetjunkies.com/WebLog/craigshoemaker/archive/2007/06/21/250223.aspx</link><pubDate>Thu, 21 Jun 2007 18:09:00 GMT</pubDate><guid isPermaLink="false">58df7014-fd75-437c-9641-150997716d1c:250223</guid><dc:creator>drazz75</dc:creator><slash:comments>7</slash:comments><comments>http://www.dotnetjunkies.com/WebLog/craigshoemaker/comments/250223.aspx</comments><wfw:commentRss>http://www.dotnetjunkies.com/WebLog/craigshoemaker/commentrss.aspx?PostID=250223</wfw:commentRss><description>&lt;br /&gt;&lt;h2&gt;&lt;a href="http://polymorphicpodcast.com/shows/webnavigator/"&gt;Listen to the show&lt;/a&gt;&lt;/h2&gt;&lt;br&gt;
&lt;h2&gt;&lt;a href="http://polymorphicpodcast.com/podcast/video/webnavigator/"&gt;Watch the video&lt;/a&gt;&lt;/h2&gt;&lt;br&gt;
&lt;h2&gt;&lt;a href="http://polymorphicpodcast.com/podcast/video/PolymorphicPodcast-2007-06-29-WebNavigator.zip"&gt;Download the code&lt;/a&gt;&lt;/h2&gt;&lt;br&gt;
        &lt;h2&gt;Problem:&lt;/h2&gt;
        &lt;p&gt;You and Joe are working on a sizable web application. Nasty-Coder Joe, who is on another team, creates a new page 
        that requires 2 session variables and a query string parameter in order for his page to work properly. 
        You now need to pass data to this page to finish your last feature before you leave for vacation in one 
        hour. Without reading Nasty-Coder Joe's code to try and figure out what the necessary session variables and QueryString 
        paramenters are, how do you use his page?&lt;/p&gt;

        &lt;h2&gt;Introduction:&lt;/h2&gt;
        &lt;p&gt;Controlling page flow on the web has a number of distinct problems. Since the web is literally a 
        "web" often the entry points to any one page are numerous. Many developers have come up with 
        solutions to addressing the problem of page-flow in a web application, but the solutions sometimes end up 
        becoming a thick mire of XML structures that try to be predictive in page-flow rather than facilitate the 
        choose-your-own-adventures style of navigation often found in a web app.&lt;/p&gt;

        &lt;p&gt;Web Navigator is a technique, or pattern or approach that I came up with when I was faced with the 
        same problem as stated at the beginning of this show. I was working alongside a developer who was creating 
        pages that I needed to use, but I had no idea how to pass the correct information to the page.&lt;/p&gt;

        &lt;p&gt;What I came up with I call "WebNavigator".&lt;/p&gt;
        
        &lt;blockquote class="med"&gt;Yes, I know I was wearing my terribly-original-idea-hat that day...&lt;/blockquote&gt;

        &lt;h3&gt;Web Navigatior is:&lt;/h3&gt;
        &lt;ul&gt;
            &lt;li&gt;A way for you to encapsulate the contract that each page has for required data
                &lt;ul&gt;
                    &lt;li&gt;If you change the contract, you experience compilation errors&lt;/li&gt;
                &lt;/ul&gt;
            &lt;/li&gt;
            &lt;li&gt;Abstract the location to pages to support change
                &lt;ul&gt;
                    &lt;li&gt;Who really cares if the login page is under a login folder or at the root of the site? You 
                    just want to get your user there!&lt;/li&gt;
                &lt;/ul&gt;
            &lt;/li&gt;
            &lt;li&gt;A way to organize and create a composable model of your site's navigation
                &lt;ul&gt;
                    &lt;li&gt;Once you have tens of pages, how will you know which pages relate to one another?&lt;/li&gt;
                &lt;/ul&gt;
            &lt;/li&gt;
            &lt;li&gt;A way to allow simple was to weave in and out of secured areas of the site
                &lt;ul&gt;
                    &lt;li&gt;Using SSL can be tricky. There are rules about how you must enter and exit secure areas of your 
                    site. Having a object to manage the changes in SSL makes your life easier&lt;/li&gt;
                &lt;/ul&gt;
            &lt;/li&gt;
        &lt;/ul&gt;

        &lt;h3&gt;What is its Structure?&lt;/h3&gt;
        &lt;p&gt;The syntax is based around a &lt;a href="http://www.martinfowler.com/bliki/FluentInterface.html" title="Martin Fowler's definition of a fluent interface"&gt;fluent interface&lt;/a&gt;. For example if you wanted to navigate 
        to the homepage of the website, you would use:&lt;/p&gt;

        &lt;pre class="code"&gt;WebNavigator.GoTo(WebNavigator.URLFor.Home());&lt;/pre&gt;

        &lt;h3&gt;Important points:&lt;/h3&gt;
        &lt;ol&gt;
            &lt;li&gt;&lt;span class="itemHeader"&gt;Redirects are not done autmatically.&lt;/span&gt; The destination methods (ex: &lt;span class="codeInText"&gt;WebNavigator.URLFor.Home()&lt;/span&gt;) 
            will always return strings. This is so you can still use the Web Navigator class to build URLs for you without requiring a post 
            back to build the URL.&lt;/li&gt;
            
            &lt;li&gt;&lt;span class="itemHeader"&gt;Redirection is done only when necessary.&lt;/span&gt; &lt;span class="codeInText"&gt;WebNavigator.GoTo()&lt;/span&gt; handles the redirection. 
            You can overload the method to support Server.Transfers and instructions to use SSL&lt;/li&gt;
            
            &lt;li&gt;&lt;span class="itemHeader"&gt;Composition helps the readability of the navigational structure of your code.&lt;/span&gt; For example, the following should
            give you a very good idea of where the user will end up: 
            &lt;span class="codeInText"&gt;WebNavigator.GoTo(WebNavigator.URLFor.Membership.Login());&lt;/span&gt;&lt;/li&gt;
            
            &lt;li&gt;&lt;span class="itemHeader"&gt;Often pages don't require data, but they do change locations.&lt;/span&gt; If you have the access to 
            a page wrapped up in &lt;span class="codeInText"&gt;WebNavigator.URLFor.Login()&lt;/span&gt; and it's real URL is 
            &lt;span class="codeInText"&gt;http://domain.com/login.aspx&lt;/span&gt;, but used to be 
            &lt;span class="codeInText"&gt;http://domain.com/login/default.aspx&lt;/span&gt; your website will not experience any broken links. You will
            change the mapping to the new location in one place and the rest of the site will reflect this change.&lt;/li&gt;
            
        &lt;/ol&gt;

       &lt;h3&gt;Examples of Encapsulation&lt;/h3&gt;
       &lt;p&gt;When using pages throughout the website, some pages will require simple QueryString values and other pages will need session variables
       set and perhaps other requirements. Web Navigator will encapsulate the requirements of a page. When you are a developer consuming the page 
       all you care about is what the destination method contracts in it's method signature.&lt;/p&gt;
       
       &lt;p&gt;For example, the following listing will show you how to pass a user's email address to the login screen.&lt;/p&gt;
       
&lt;pre class="code"&gt;string userName;

// set userName to something... perhaps from the database

WebNavigator.GoTo(WebNavigator.URLFor.Membership.Login(userName));
&lt;/pre&gt;
       
       &lt;h4&gt;Using QueryString Values&lt;/h4&gt;
       &lt;p&gt;The most common use of a destination method is to encapsulate the use of a QueryString parameter. The following example
       will show you how to hide the QueryString requirements.&lt;/p&gt;
       
&lt;pre class="code"&gt;public class Membership
{
    public string Login(string userName)
    {
        return string.Format("~/login/default.aspx?userName={0}",userName);
    }
}
&lt;/pre&gt;
       
       &lt;h4&gt;Using Session Variables and Other Resources&lt;/h4&gt;
       &lt;p&gt;Sometimes you do not want to pass an item the QueryString, or a page requires a complex-type before you can use it. (Think of a page
       requiring an object collection in memory). In these types of cases you could pass the data around in a session variable. The 
       following will show you how to use session variables.&lt;/p&gt;
       
&lt;pre class="code"&gt;public class Reports
{
    public string SalesReport(OrderCollection orders)
    {
        System.Web.HttpContext.Current.Session.Add("SalesReport",orders);
        
        return "~/reports/sales.aspx";
    }
}
&lt;/pre&gt;

        &lt;p&gt;Using this method will set aside anything you need into session and then return the destination URL for you to 
        use whenever necessary. The fun doesn't have to stop at session variables. You can use the same technique for application
        variables, context items, etc.&lt;/p&gt;

        &lt;p&gt;The point is that what is inside the implementaton does (setup QueryString vales, add Session variables, etc..) 
        is completely hidden from the developer who is using the page. The method signature of the URLFor method will 
        establish a contract for any required information for the page.&lt;/p&gt;
        
        &lt;h3&gt;Contract Changes&lt;/h3&gt;
        &lt;p&gt;If the contract to a page changes, you will encounter compilation errors. If the page in the past 
        did not require any external data, but then was changed to needing a piece of data, the updated destination method signature 
        will cause the application to encounter compilation errors where ever the page is used. This will ensure the page is always 
        getting what it needs.&lt;/p&gt;
        
        &lt;p&gt;For instance if your content editor page previously did not require a content ID the method might look
        something like this:&lt;/p&gt;
        
&lt;pre class="code"&gt;WebNavigator.URLFor.ContentEditor();
&lt;/pre&gt;. 
    
        &lt;p&gt;Now you have decided you want to pass in the content ID so the call would look like this:&lt;/p&gt;
        
&lt;pre class="code"&gt;int contentID; 

// get contentID from somewhere

WebNavigator.URLFor.ContentEditor(contentID);
&lt;/pre&gt;

        &lt;h3&gt;Handling SSL&lt;/h3&gt;
          You can implement it in different ways. I have done it as follows in the past:

&lt;pre class="code"&gt;WebNavigator.GoTo(WebNavigator.Secure(WebNavigator.URLFor.Login()));&lt;/pre&gt;
        
        &lt;h2&gt;Conculsion&lt;/h2&gt;
        &lt;p&gt;Web Navigator is a pattern that you can use to help manage navigation throughout your websites. The strengths of this technique are:&lt;/p&gt;
        
        &lt;ol&gt;
            &lt;li&gt;Encapsulation of page location&lt;/li&gt;
            &lt;li&gt;Public contract of page requirements&lt;/li&gt;
            &lt;li&gt;Single place of change for URLs (avoiding broken links)&lt;/li&gt;
            &lt;li&gt;Manage SSL "auto-magically"&lt;/li&gt;
            &lt;li&gt;Makes code easy to read and maintain&lt;/li&gt;
        &lt;/ol&gt;

&lt;a href="http://www.dotnetkicks.com/kick/?url=http://polymorphicpodcast.com/shows/webnavigator/"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://polymorphicpodcast.com/shows/webnavigator/" alt="kick it on DotNetKicks.com" border="0"&gt;&lt;/a&gt;&lt;img src="http://www.dotnetjunkies.com/WebLog/aggbug.aspx?PostID=250223" width="1" height="1"&gt;</description></item><item><title>Model View Presenter Q and A</title><link>http://www.dotnetjunkies.com/WebLog/craigshoemaker/archive/2007/06/08/243210.aspx</link><pubDate>Fri, 08 Jun 2007 13:11:00 GMT</pubDate><guid isPermaLink="false">58df7014-fd75-437c-9641-150997716d1c:243210</guid><dc:creator>drazz75</dc:creator><slash:comments>3</slash:comments><comments>http://www.dotnetjunkies.com/WebLog/craigshoemaker/comments/243210.aspx</comments><wfw:commentRss>http://www.dotnetjunkies.com/WebLog/craigshoemaker/commentrss.aspx?PostID=243210</wfw:commentRss><description>&lt;p&gt;I’ve had some questions on the &lt;a href="http://polymorphicpodcast.com/shows/mv-patterns/"&gt;Model View Presenter&lt;/a&gt; series I
produced recently building up in my inbox, so I thought I would make this post
an opportunity to answer the questions.&lt;/p&gt;


&lt;br /&gt;


&lt;blockquote&gt;In one of your recent videos you showed us how to implement
a service layer. Would you normally have your service layer talking to a
separate data layer with provider specific (sql, xml) or implement directly in
the service layer classes to the required data source?&lt;/blockquote&gt;



&lt;p&gt;The service layer is a &lt;a href="http://www.dofactory.com/Patterns/PatternFacade.aspx"&gt;façade&lt;/a&gt;
that sits on top of the various objects you have created the in the business
layer. The purpose of the service layer is to “provide a service” of
"something". &lt;/p&gt;



&lt;p&gt;For instance if you need a collection of the Products class
returned to you from the data base based on a specific query, then you might
create a ProductService class that will take a criteria object as a parameter
and return to you the collection. The point is that you are then shielded from
having to worry about using your data layer to fill the collection and closing
any database connections (if necessary).&lt;/p&gt;



&lt;p&gt;The service layer keeps this all hidden for you.&lt;/p&gt;



&lt;p&gt;I still haven’t answered your question specifically. I use
&lt;a href="http://subsonicproject.com/"&gt;SubSonic&lt;/a&gt; as my data layer or O/RM so all my
tables have entity classes generated for them. Therefore I use the objects
created against my tables to do all my database interaction and just use the
service layer to glue together the appropriate objects to return what is
necessary.&lt;/p&gt;

&lt;br /&gt;



&lt;blockquote&gt;I am trying to move away from database mirroring in my
objects. I light of this fact, if you have a model that had a relationship say
the Product and Category classes, how would you represent that in the business
layer and service layer?&lt;/blockquote&gt;



&lt;p&gt;This is a noble pursuit. The best way to do this is to
approach it with a layered strategy. In order to keep some sanity in the
development process you will still want to have objects in your application
that map 1 to 1 to database tables. Having these classes available gives you
the encapsulation of doing the work that no developer these days should be
doing… CRUD (Create, Read, Update and Delete). There are just too many good O/R
Mapping or code-generation frameworks available for you to be writing your own
data access code.&lt;/p&gt;



&lt;p&gt;That being said, you can generate the classes that talk to
your database tables, but then encapsulate them into a larger object that has a
rich behavior model. To build off your example perhaps you implement the
Product class. The product class has a property off of it which is a collection
of categories. While you may have individual tables for these classes your
product class can have the interface of only what you want the then talk to the
table objects behind the scenes.&lt;/p&gt;

&lt;br /&gt;



&lt;blockquote&gt;I would like to apply paging on the database side as opposed
to using the built-in paging mechanism of the ASP.NET. What's the best way to
apply paging and sorting to grid/list controls without violating the MVP
pattern?&lt;/blockquote&gt;



&lt;p&gt;This is a great question. The answer to just about
everything in the MVP pattern is to add the required items as properties to
your view interface. All you would need to do is add a SortExpression property
and SortItems event to the interface. Then, when you SortItems event is raised
you can do all your work in the presentation layer and when you are done,
re-bind the data source to the UI control.&lt;/p&gt;

&lt;br /&gt;



&lt;blockquote&gt;Have you looked at &lt;a href="http://www.codeplex.com/websf"&gt;Microsoft's Web Client Software Factory&lt;/a&gt;? It seems to do some of what you have
described in the podcast, and I'd just like to get your take on the project.&lt;/blockquote&gt;
&lt;p&gt;I have looked at the Web Client Software Factory. I wanted
to dig into it deeper, but I found that there is a lot to learn in order to
make significant use of it. I emailed someone at Microsoft a few months back to
come on the show and talk about the Factory’s use, but I haven't heard back from anyone yet.&lt;/p&gt;
&lt;p&gt;So right now I am holding off digging into the Factory just
because of time constraints.&lt;/p&gt;&lt;img src="http://www.dotnetjunkies.com/WebLog/aggbug.aspx?PostID=243210" width="1" height="1"&gt;</description></item><item><title>Add a Sub Header Row to GridViews or Repeaters</title><link>http://www.dotnetjunkies.com/WebLog/craigshoemaker/archive/2007/06/05/240324.aspx</link><pubDate>Tue, 05 Jun 2007 18:01:00 GMT</pubDate><guid isPermaLink="false">58df7014-fd75-437c-9641-150997716d1c:240324</guid><dc:creator>drazz75</dc:creator><slash:comments>0</slash:comments><comments>http://www.dotnetjunkies.com/WebLog/craigshoemaker/comments/240324.aspx</comments><wfw:commentRss>http://www.dotnetjunkies.com/WebLog/craigshoemaker/commentrss.aspx?PostID=240324</wfw:commentRss><description>&lt;p&gt;Have you ever wanted to add a sub header row in the middle of a series of rows in a GridView or Repeater? The easiest way I found was to add a literal control to build the HTML you need for the header row.&lt;/p&gt;
&lt;p&gt;The first thing you need to do is determine you are on the data item that will represent the header. In the example below I am binding my repeater to a collection of objects. If the object I am looking at has a value SubHeaderText property then I will add a literal control to the current item’s parent. &lt;/p&gt;

&lt;p&gt;Check it out!&lt;/p&gt;

&lt;pre&gt;
protected void rptStoreDetail_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    OSATStoreDetailItem item;
    Literal lit;
    try
    {
        if (e.Item.ItemType == ListItemType.AlternatingItem ||
            e.Item.ItemType == ListItemType.Item)
        {
            item = (OSATStoreDetailItem)e.Item.DataItem;

            if (!string.IsNullOrEmpty(item.SubLabelText))
            {
                lit = new Literal();
                lit.Text = string.Format(“&lt;tr&gt;&lt;td&gt;{0}&lt;/td&gt;&lt;/tr&gt;”,item.SubLabelText);
                e.Item.Parent.Controls.Add(lit);
            }
        }
    }
    catch (Exception ex)
    {
        //TODO: Publish Exception
        System.Diagnostics.Debug.WriteLine(ex.Message);
        throw;
    }
}
&lt;/pre&gt;&lt;img src="http://www.dotnetjunkies.com/WebLog/aggbug.aspx?PostID=240324" width="1" height="1"&gt;</description></item><item><title>Model View * Patterns Series Complete</title><link>http://www.dotnetjunkies.com/WebLog/craigshoemaker/archive/2007/04/27/231637.aspx</link><pubDate>Fri, 27 Apr 2007 14:51:00 GMT</pubDate><guid isPermaLink="false">58df7014-fd75-437c-9641-150997716d1c:231637</guid><dc:creator>drazz75</dc:creator><slash:comments>2</slash:comments><comments>http://www.dotnetjunkies.com/WebLog/craigshoemaker/comments/231637.aspx</comments><wfw:commentRss>http://www.dotnetjunkies.com/WebLog/craigshoemaker/commentrss.aspx?PostID=231637</wfw:commentRss><description>&lt;p&gt;The &lt;a href="http://polymorphicpodcast.com/shows/mv-patterns/" title="Design Patterns Bootcamp : Model View * Patterns"&gt;Design Patterns Bootcamp : Model View * Patterns&lt;/a&gt; series is now complete!&lt;/p&gt;

&lt;p&gt;The series features two audio pieces and five instructional videos. The audio portions take care of introducing the concepts and answering frequently asked questions, while the videos cover the following topics:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="http://polymorphicpodcast.com/podcast/video/mv-patterns/1/" title="Implementing Model View Presenter"&gt;Implementing Model View Presenter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://polymorphicpodcast.com/podcast/video/mv-patterns/winforms/" title="Supporting Windows Forms"&gt;Supporting Windows Forms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://polymorphicpodcast.com/podcast/video/mv-patterns/usermessages/" title="Controlling User Messages"&gt;Controlling User Messages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://polymorphicpodcast.com/podcast/video/mv-patterns/DataSources-ServiceLayer-State/" title="Data Sources, Service Layers &amp;amp; Maintaining State"&gt;Data Sources, Service Layers &amp;amp; Maintaining State&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://polymorphicpodcast.com/podcast/video/mv-patterns/DropDownLists/" title="Encapsultaing DropDownList Data Sources"&gt;Encapsultaing DropDownList Data Sources&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Good luck while you build your applications to last!&lt;/p&gt;&lt;img src="http://www.dotnetjunkies.com/WebLog/aggbug.aspx?PostID=231637" width="1" height="1"&gt;</description></item><item><title>Video: Implementing User Messages with Model View Presenter</title><link>http://www.dotnetjunkies.com/WebLog/craigshoemaker/archive/2007/04/03/220350.aspx</link><pubDate>Tue, 03 Apr 2007 20:03:00 GMT</pubDate><guid isPermaLink="false">58df7014-fd75-437c-9641-150997716d1c:220350</guid><dc:creator>drazz75</dc:creator><slash:comments>0</slash:comments><comments>http://www.dotnetjunkies.com/WebLog/craigshoemaker/comments/220350.aspx</comments><wfw:commentRss>http://www.dotnetjunkies.com/WebLog/craigshoemaker/commentrss.aspx?PostID=220350</wfw:commentRss><description>&lt;br /&gt;
Check out the latest release in the video releases of the &lt;a href="http://polymorphicpodcast.com/shows/mv-patterns/" title="Design Patterns Bootcamp Series: Model View * Patterns"&gt;Design Patterns Bootcamp Series: Model View * Patterns&lt;/a&gt;. &lt;a href="http://polymorphicpodcast.com/podcast/video/mv-patterns/usermessages/"&gt;This video will show you&lt;/a&gt; how to report messages back to users in a web application written with MVP (Supervising Controller).
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.dotnetjunkies.com/WebLog/aggbug.aspx?PostID=220350" width="1" height="1"&gt;</description></item><item><title>Video: Implementing WinForms with Model View Presenter</title><link>http://www.dotnetjunkies.com/WebLog/craigshoemaker/archive/2007/04/03/220349.aspx</link><pubDate>Tue, 03 Apr 2007 20:02:00 GMT</pubDate><guid isPermaLink="false">58df7014-fd75-437c-9641-150997716d1c:220349</guid><dc:creator>drazz75</dc:creator><slash:comments>1</slash:comments><comments>http://www.dotnetjunkies.com/WebLog/craigshoemaker/comments/220349.aspx</comments><wfw:commentRss>http://www.dotnetjunkies.com/WebLog/craigshoemaker/commentrss.aspx?PostID=220349</wfw:commentRss><description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Check out the latest release in the video releases of the &lt;a href="http://polymorphicpodcast.com/shows/mv-patterns/" title="Design Patterns Bootcamp Series: Model View * Patterns"&gt;Design Patterns Bootcamp Series: Model View * Patterns&lt;/a&gt;. &lt;a href="http://polymorphicpodcast.com/podcast/video/mv-patterns/winforms/" title="Implementing WinForms with MVP"&gt;This video will show you&lt;/a&gt; how to take an existing web application written with MVP (Supervising Controller) and re-purpose the lower layers for use in a WinForms application.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.dotnetjunkies.com/WebLog/aggbug.aspx?PostID=220349" width="1" height="1"&gt;</description></item><item><title>Video: Implementing WebForms with Model View Presenter</title><link>http://www.dotnetjunkies.com/WebLog/craigshoemaker/archive/2007/04/03/220348.aspx</link><pubDate>Tue, 03 Apr 2007 20:01:00 GMT</pubDate><guid isPermaLink="false">58df7014-fd75-437c-9641-150997716d1c:220348</guid><dc:creator>drazz75</dc:creator><slash:comments>0</slash:comments><comments>http://www.dotnetjunkies.com/WebLog/craigshoemaker/comments/220348.aspx</comments><wfw:commentRss>http://www.dotnetjunkies.com/WebLog/craigshoemaker/commentrss.aspx?PostID=220348</wfw:commentRss><description>&amp;nbsp;
&lt;p&gt;Check out the latest release in the video releases of the &lt;a href="http://polymorphicpodcast.com/shows/mv-patterns/" title="Design Patterns Bootcamp Series: Model View * Patterns"&gt;Design Patterns Bootcamp Series: Model View * Patterns&lt;/a&gt;. &lt;a href="http://polymorphicpodcast.com/podcast/video/mv-patterns/1/"&gt;This video will show you&lt;/a&gt; how to implement a web application using the Model View Presenter (Supervising Controller) design pattern.&lt;/p&gt;

&lt;p&gt;Make sure to keep checking the &lt;a href="http://polymorphicpodcast.com/shows/mv-patterns/"&gt;show notes&lt;/a&gt; page as there will be more in this series of videos!&lt;br /&gt;
&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.dotnetjunkies.com/WebLog/aggbug.aspx?PostID=220348" width="1" height="1"&gt;</description></item><item><title>The Polymorphic Podcast is now on www.asp.net!</title><link>http://www.dotnetjunkies.com/WebLog/craigshoemaker/archive/2007/03/10/210003.aspx</link><pubDate>Sat, 10 Mar 2007 22:17:00 GMT</pubDate><guid isPermaLink="false">58df7014-fd75-437c-9641-150997716d1c:210003</guid><dc:creator>drazz75</dc:creator><slash:comments>1</slash:comments><comments>http://www.dotnetjunkies.com/WebLog/craigshoemaker/comments/210003.aspx</comments><wfw:commentRss>http://www.dotnetjunkies.com/WebLog/craigshoemaker/commentrss.aspx?PostID=210003</wfw:commentRss><description>&lt;p&gt;Every once in a while something happens that is really special. When you maintain a blog, podcast or a newsletter list - as much as a labor of love as it may be - at the end of the day you want people listening to what you have to say. Recently Microsoft&amp;#39;s own &lt;span id="_user_simonmu@microsoft.com"&gt;&lt;a href="http://blogs.msdn.com/simonmu/" title="Simon Muzio"&gt;Simon Muzio&lt;/a&gt; helped make that wish come true for me with a little more force. The &lt;a title="Polymorphic Podcast" href="http://polymorphicpodcast.com/"&gt;Polymorphic Podcast&lt;/a&gt; is now listed under the &lt;a title="The official ASP.NET website" href="http://www.asp.net/learn/podcasts/default.aspx?tabid=63"&gt;podcasts section of the official ASP.NET website&lt;/a&gt;. It&amp;#39;s nice to be in such good company as Scott Hanselman (&lt;a title="Hanselminutes" href="http://hanselminutes.com/"&gt;Hanselminutes&lt;/a&gt;), Carl Franklin and Richard Campbell (&lt;a title=".NET Rocks!" href="http://dotnetrocks.com/"&gt;.NET Rocks!&lt;/a&gt;), Wally McClure (&lt;a title="ASP.NET Podcast" href="http://aspnetpodcast.com/"&gt;ASP.NET Podcast&lt;/a&gt;) and &lt;a title="Podcast Studio.NET" href="http://www.podcaststudio.net/Archive.aspx"&gt;Podcast Studio.NET&lt;/a&gt;.&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Thanks, Simon!&lt;/p&gt;&lt;img src="http://www.dotnetjunkies.com/WebLog/aggbug.aspx?PostID=210003" width="1" height="1"&gt;</description></item><item><title>Podcast:: Design Patterns Bootcamp: Model View * Patterns</title><link>http://www.dotnetjunkies.com/WebLog/craigshoemaker/archive/2007/03/08/209568.aspx</link><pubDate>Thu, 08 Mar 2007 16:16:00 GMT</pubDate><guid isPermaLink="false">58df7014-fd75-437c-9641-150997716d1c:209568</guid><dc:creator>drazz75</dc:creator><slash:comments>0</slash:comments><comments>http://www.dotnetjunkies.com/WebLog/craigshoemaker/comments/209568.aspx</comments><wfw:commentRss>http://www.dotnetjunkies.com/WebLog/craigshoemaker/commentrss.aspx?PostID=209568</wfw:commentRss><description>&lt;h2&gt;Design Patterns Bootcamp: Model View * Patterns&lt;/h2&gt;
&lt;h3&gt;&lt;a href="http://polymorphicpodcast.com/shows/mv-patterns/"&gt;Listen to the Show!&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Thanks to &lt;a href="http://davebost.com/"&gt;Dave Bost&lt;/a&gt; for the intro!&lt;/p&gt;
 
&lt;h3&gt;What is the Purpose of These Patterns?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Put code in its proper place&lt;/li&gt;

&lt;li&gt;Way to provide clean reuse of the domain model&lt;/li&gt;

&lt;li&gt;
&lt;br /&gt;&lt;/li&gt;

&lt;li&gt;Way to increase testablity&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Rocky Lhotka wrote a blog post about a year ago that
 discusses where validation logic should live in an application. 
 The entire post is great, but by the end of the post he make a 
 point that reaches beyond the question of where validation should live... 
 &lt;a href="http://www.lhotka.net/WeBlog/ShouldValidationBeInTheUIOrInBusinessObjects.aspx"&gt;&amp;quot;
 There&amp;#39;s nothing more expensive than a line of code in the UI - 
 because you _know_ it has a half-life of about 1-2 years. Everyone 
 is rewriting their ASP.NET 1.0 UI code to ASP.NET 2.0. Everyone is 
 tweaking their Windows Forms 1.0 code for 2.0. And all of it is junk 
 when WinFX comes out, since WPF is intended to replace both Windows 
 and Web UI development in most cases. Thus code in the UI is expensive, 
 because you&amp;#39;ll need to rewrite it in less than 2 years in most cases.&amp;quot;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Model View * Patterns... What are they?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms998540.aspx"&gt;Model View Controller (MVC)&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href="http://www.martinfowler.com/eaaDev/ModelViewPresenter.html"&gt;Model View Presenter (MVP)&lt;/a&gt;&lt;/li&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.martinfowler.com/eaaDev/PassiveScreen.html"&gt;Passive View&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href="http://www.martinfowler.com/eaaDev/SupervisingPresenter.html"&gt;Supervising Controller&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;

&lt;p&gt;The main drawback to these patterns is usually the learning curve... this show will hopefully remove that barrier-to-entry. The first on the scene and primary pattern to all each involved is the Model View Controller. This pattern is used throughout many of the modern development platforms. The quickest way to describe MVC in the terms a .NET developer will understand is that you code your pages in such a way that you place the code that would be in your code-behind, into a separate class. This class is called a &amp;quot;controller&amp;quot;. The &amp;quot;model&amp;quot; are your domain objects (business objects or data access objects).&lt;/p&gt;

&lt;p&gt;So your controller will tell your domain objects what to do. Once the work is done, then the user interface must be updated. The code in the user interface is known as the &amp;quot;view&amp;quot;. So if you can picture that the code-behind in an ASPX file is no longer where you do any real work and can re-label that code the &amp;quot;view&amp;quot;, and you can picture a new class that would act as a bucket for the code you would have written in your code behind to do the work (call that the &amp;quot;controller&amp;quot;) and imagine the finaly peice of the puzzle as a class that talks to the database, to encapsulates some business logic or does something else completely unlreated to any user interace (and call that the &amp;quot;model&amp;quot;), then you, my friend have just understood the most difficult part of the Model View * patterns.&lt;/p&gt;

&lt;h4&gt;What&amp;#39;s built into ASP.NET?&lt;/h4&gt;
&lt;p&gt;Some people say that ASP.NET has the MVC pattern implicitly 
implemented in the web forms architecture. The thinking goes like this... 
the ASPX markup constitues the view, the code behind plays the role of 
the controller and domain objects represent the model. While this seems 
to fit nicely into the formal definition of MVC you quickly run into 
problems.&lt;/p&gt;

&lt;p&gt;Michael Hamrah makes the point that &lt;a href="http://www.michaelhamrah.com/blog/2006/11/declarative-progamming-with-aspnet-20.html"&gt;ASP.NET declarative controls don&amp;#39;t break pattern, just limit your flexibility.&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;What is the Difference Between MVC and MVP?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;in MVC view talks to Model&lt;/li&gt;

&lt;li&gt;in MVP view can know about model, but won&amp;#39;t send message&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;How is MVP Constructed?&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://www.martinfowler.com/eaaDev/ModelViewPresenter.html"&gt;Model View Presenter&lt;/a&gt; comes in two flavors:&lt;a href="http://www.martinfowler.com/eaaDev/SupervisingPresenter.html"&gt;Supervising Controller&lt;/a&gt; and &lt;a href="http://www.martinfowler.com/eaaDev/PassiveScreen.html"&gt;Passive View&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://polymorphicpodcast.com/tools/mvp-stub/"&gt;Make sure to check out the MVP stub generator!&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supervising controller will has some logic in UI, such as databindingd, etc.&lt;/li&gt;

&lt;li&gt;Passive view will have NO logic in UI&lt;/li&gt;

&lt;li&gt;Supervising controller is less complex and less-testable&lt;/li&gt;

&lt;li&gt;Passive view is more complex and more testable&lt;/li&gt;
&lt;/ul&gt;

&lt;a href="http://www.dotnetkicks.com/kick/?url=http://polymorphicpodcast.com/shows/mv-patterns/"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://polymorphicpodcast.com/shows/mv-patterns/" alt="kick it on DotNetKicks.com" border="0" /&gt;&lt;/a&gt;

&lt;h3&gt;Resources&lt;/h3&gt;

&lt;ul&gt;
    
&lt;li&gt;&lt;a href="http://polymorphicpodcast.com/tools/mvp-stub/"&gt;Polymorphic Podcast MVP Stub Generator&lt;/a&gt;&lt;/li&gt;
    
&lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms998252.aspx"&gt;Microsoft User Interface Process Application Block&lt;/a&gt;&lt;/li&gt;
    
&lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms998540.aspx"&gt;Model View Controller&lt;/a&gt;&lt;/li&gt;
    
&lt;li&gt;&lt;a href="http://www.martinfowler.com/eaaDev/ModelViewPresenter.html"&gt;Model View Presenter&lt;/a&gt;&lt;/li&gt;
    
&lt;li&gt;&lt;a href="http://www.martinfowler.com/eaaDev/SupervisingPresenter.html"&gt;Supervising Controller&lt;/a&gt;&lt;/li&gt;
    
&lt;li&gt;&lt;a href="http://www.martinfowler.com/eaaDev/PassiveScreen.html"&gt;Passive View&lt;/a&gt;&lt;/li&gt;
    
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Model-view-controller"&gt;Wikipedia - Model View Controller&lt;/a&gt;&lt;/li&gt;
    
&lt;li&gt;&lt;a href="http://haacked.com/archive/2006/08/09/ASP.NETSupervisingControllerModelViewPresenterFromSchematicToUnitTestsToCode.aspx"&gt;Phil Haack - ASP.NET Supervising Controller (Model View Presenter) From Schematic To Unit Tests to Code&lt;/a&gt;&lt;/li&gt;
    
&lt;li&gt;&lt;a href="http://www.codeproject.com/useritems/ModelViewPresenter.asp"&gt;Billy McCafferty : Model View Presenter with ASP.NET&lt;/a&gt;&lt;/li&gt;
    
&lt;li&gt;&lt;a href="http://codebetter.com/blogs/jeremy.miller/archive/2006/02/01/137457.aspx"&gt;Jeremy Miller : Test Driven Development with ASP.Net and the Model View Presenter Pattern&lt;/a&gt;&lt;/li&gt;
    
&lt;li&gt;&lt;a href="http://www.michaelhamrah.com/blog/2006/11/declarative-progamming-with-aspnet-20.html"&gt;Michael Hamrah: Declarative Progamming with ASP.NET 2.0&lt;/a&gt;&lt;/li&gt;
    
&lt;li&gt;&lt;a href="http://geekswithblogs.net/billy/archive/2006/07/20/85815.aspx"&gt;Billy McCafferty : Model-View-Presenter split into two &amp;quot;new&amp;quot; patterns&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://www.dotnetjunkies.com/WebLog/aggbug.aspx?PostID=209568" width="1" height="1"&gt;</description></item></channel></rss>