<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type='text/xsl' href='http://iancooper.spaces.live.com/mmm2008-07-17_13.29/rsspretty.aspx?rssquery=en-US;http%3a%2f%2fiancooper.spaces.live.com%2ffeed.rss' version='1.0'?><rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:msn="http://schemas.microsoft.com/msn/spaces/2005/rss" xmlns:live="http://schemas.microsoft.com/live/spaces/2006/rss" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Staccato Signals</title><description>"Staccato signals of constant information" -- Paul Simon</description><link>http://iancooper.spaces.live.com/</link><language>en-US</language><pubDate>Thu, 24 Jul 2008 02:31:26 GMT</pubDate><lastBuildDate>Thu, 24 Jul 2008 02:31:26 GMT</lastBuildDate><generator>Microsoft Spaces v1.1</generator><docs>http://www.rssboard.org/rss-specification</docs><ttl>60</ttl><live:identity><live:id>-8913799585426915684</live:id><live:alias>iancooper</live:alias></live:identity><image><title>Staccato Signals</title><url>http://byfiles.storage.live.com/y1pc8MVQG0jGF4exDTUeetalu-UAfvLkMdoQjqfT_ZHARp2b7a5MH1sPA</url><link>http://iancooper.spaces.live.com/</link></image><cf:listinfo><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="typelabel" label="Type" /><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="tag" label="Tag" /><cf:group element="category" label="Category" /><cf:sort element="pubDate" label="Date" data-type="date" default="true" /><cf:sort element="title" label="Title" data-type="string" /><cf:sort ns="http://purl.org/rss/1.0/modules/slash/" element="comments" label="Comments" data-type="number" /></cf:listinfo><item><title>Moving to CodeBetter</title><link>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!537.entry</link><description>Well &lt;a href="http://codebetter.com/blogs/jeremy.miller/archive/2007/11/15/welcome-ian-cooper-to-codebetter.aspx"&gt;the cat is out of the bag&lt;/a&gt;. I am really excited to have been invited to move this blog over to the &lt;a href="http://codebetter.com/"&gt;CodeBetter&lt;/a&gt; site. I met up with some of the CodeBetter team last year, and discovered that we had a &lt;a href="http://codebetter.com/blogs/brendan.tompkins/pages/63976.aspx"&gt;shared set of values&lt;/a&gt;, focused on spreading the word to the .NET community about the best practices, tools, and techniques to deliver great software.&lt;br&gt;&lt;br&gt;I'm looking forward to reaching a new audience, but I also hope those of you who have found this blog useful will follow me over to the CodeBetter site. Frankly, you should be reading what the guys there have to say, even if I was not moving.&lt;br&gt;&lt;br&gt;I have some big posts lined up to help folks learn how to architect applications that use LINQ, based on prior experience and proven practice with other ORM frameworks. You will need to &lt;a href="http://feeds.feedburner.com/CodeBetter"&gt;subscribe to the CodeBetter feed&lt;/a&gt; or bookmark &lt;a href="http://codebetter.com/"&gt;CodeBetter&lt;/a&gt; or &lt;a href="http://codebetter.com/blogs/ian_cooper/default.aspx"&gt;this page&lt;/a&gt;.&lt;br&gt;&lt;br&gt;Looking forward to welcoming you all to my new home.&lt;br&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8913799585426915684&amp;page=RSS%3a+Moving+to+CodeBetter&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=iancooper.spaces.live.com&amp;amp;GT1=iancooper"&gt;</description><category>Computers and Internet</category><comments>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!537.entry#comment</comments><guid isPermaLink="true">http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!537.entry</guid><pubDate>Fri, 16 Nov 2007 09:12:07 GMT</pubDate><slash:comments>6</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://iancooper.spaces.live.com/blog/cns!844BD2811F9ABE9C!537/comments/feed.rss</wfw:commentRss><wfw:comment>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!537.entry#comment</wfw:comment><dcterms:modified>2007-11-16T09:12:07Z</dcterms:modified></item><item><title>What is the MVC noise all about, anyway? Pt 3</title><link>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!533.entry</link><description>&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;b&gt;&lt;span style="font-size:13.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;Forms and Leaky Abstractions&lt;/span&gt;&lt;/b&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;The model on Windows for rich-client programming is event-driven. Your window waits for a message, which is dispatched to a handler method it has registered with the OS (the &lt;/span&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/aa383738.aspx"&gt;&lt;span style="font-size:8.5pt;font-family:'Verdana','sans-serif'"&gt;Window Procedure&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;). Frameworks hide this complexity here: in Windows Forms you register a delegate to listen an event and the underlying framework calls that delegate for you when it receives the event you were listening for.&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;Web applications work by a request-response paradigm. The browser sends a message to the server, which spins up your application in response to the request. Your application processes the request and responds with a message that tells the browser what content to display now. &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;WebForms’ server side controls brought the familiar world of event-driven programming to the web, by the trick of parsing the request to determine what action had caused the request and then raising an appropriate event on the target page. &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;Windows applications are stateful. While we react to events, the state of the application is preserved across those events, for the lifetime of the application.&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;By contrast web applications are stateless. The server spins up a new instance of our application to service each request.&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;As well as giving the illusion of event-driven programming, WebForms’ also created an illusion of state-fullness. The state of our page was preserved between requests using hidden fields embedded within the HTML and restored when the request was parsed so that our page felt as though it was stateful.&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;This illusion of event-driven, stateful behavior provided a familiar model for forms developers to use when tackling web projects and enabled programmers with little web experience to transition to web development.&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;The question is whether this illusion hinders as much as it helps. ViewState, the mechanism used to provide the stateful illusion has resulted in heavy pages as developers fail to grasp how it works ‘&lt;/span&gt;&lt;a href="http://weblogs.asp.net/infinitiesloop/archive/2006/08/03/Truly-Understanding-Viewstate.aspx"&gt;&lt;span style="font-size:8.5pt;font-family:'Verdana','sans-serif'"&gt;under the hood&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;’ and make mistakes in its usage; developers no longer understand what HTML elements like input controls and forms are for; mixing dynamic HTML client-side behavior i.e. Ajax with server-side WebForms controls becomes messy rapidly; the postback model for raising events results in pages that flicker and are unresponsive; the loading of control state on requests encourages developers to think they are interacting with controls, not that they are rendering HTML for display by the browser; the page lifecycle is sufficiently torturous that is has become a favorite interview question.&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;WebForms have become a leaky abstraction, hiding too much so that the underlying protocols have been obscured and many developers cannot understand how to resolve problems when they hit them.&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;So the divorce of frameworks like MonoRail from the server-side control model is deliberate. While WebForms developers may look on hesitantly, the truth is that a model that reflects how the web works is in many ways easier to understand.&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;People who encounter MVC frameworks for the first time often stumble upon how useful they seem to be to RESTian services. The reality, of course, is that ,REST, Monorail et al all seem to have an affinity, because they expose how the web works, instead of obscuring it under a borrowed, and ill-fitting paradigm.&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;b&gt;&lt;span style="font-size:13.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;&lt;/b&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;b&gt;&lt;span style="font-size:13.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;Testing&lt;/span&gt;&lt;/b&gt;
&lt;p style="margin:0cm 0cm 12pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;&lt;br&gt;One facet of good design is software that is amenable to change. When we think about the cost of software we need to consider the total cost of ownership, not just the cost to live. Sadly that often gets forgotten, because people don’t add the two costs together when thinking about software, leading to short-term approaches in build, in an effort to reduce cost, even if the overall cost then increases. &lt;/span&gt;
&lt;p style="margin:0cm 0cm 12pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;When we talk about cost of ownership, the big cost is how amenable is the software to change. As the business the software serves changes, so must the software. While I have been told many times, 'we do not need to worry about good design, we will never need to change the software' I have never seen that to be true. In fact, change usually happens long before the first release. &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; It turns out that Test Driven Development encourages the adoption of MVC frameworks because UIs tend to require hosting in a context (browser, windows message pump, and console) that vanilla testing frameworks can't simulate. It's much easier with TDD to use a &lt;/span&gt;&lt;a href="http://www.martinfowler.com/bliki/TestDouble.html"&gt;&lt;span style="font-size:8.5pt;font-family:'Verdana','sans-serif'"&gt;Test Double&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; and replace the view with something that you can test. &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;Of course you might want to replace the model too if it talks to the DB, but that's a separate story. ‘&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;It's worth repeating an earlier blog here. There is a danger that some xUnit testing frameworks try too hard to solve the problem of hard to test code. They introduce the risk that you are no longer encouraged by those ‘hard to test’ areas to adopt best practices. Testing frameworks need to be smart enough, but no smarter.&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;So, as other posters have mentioned the addition of an MVC framework enables people who want to work in a Test-First way. However it’s important to recognize that one facet of putting your code under test, is the emergence of good design, so designing for testability is also good design.&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size:13.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;Just-enough architecture?&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;div&gt;&lt;span style="font-size:8.5pt;color:#444444;line-height:115%;font-family:'Verdana','sans-serif'"&gt;I do have some sympathy with people who resist ideas like &lt;/span&gt;&lt;span style="font-size:11pt;line-height:115%;font-family:'Calibri','sans-serif'"&gt;&lt;a href="http://domaindrivendesign.org/discussion/messageboardarchive/UbiquitousLanguage.html"&gt;&lt;span style="font-size:8.5pt;line-height:115%;font-family:'Verdana','sans-serif'"&gt;ubiquitous language&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style="font-size:8.5pt;color:#444444;line-height:115%;font-family:'Verdana','sans-serif'"&gt;, do not want to think about &lt;/span&gt;&lt;span style="font-size:11pt;line-height:115%;font-family:'Calibri','sans-serif'"&gt;&lt;a href="http://domaindrivendesign.org/discussion/messageboardarchive/Entities.html"&gt;&lt;span style="font-size:8.5pt;line-height:115%;font-family:'Verdana','sans-serif'"&gt;entities &lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style="font-size:8.5pt;color:#444444;line-height:115%;font-family:'Verdana','sans-serif'"&gt;and &lt;/span&gt;&lt;span style="font-size:11pt;line-height:115%;font-family:'Calibri','sans-serif'"&gt;&lt;a href="http://domaindrivendesign.org/discussion/messageboardarchive/ValueObjects.html"&gt;&lt;span style="font-size:8.5pt;line-height:115%;font-family:'Verdana','sans-serif'"&gt;value types&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style="font-size:8.5pt;color:#444444;line-height:115%;font-family:'Verdana','sans-serif'"&gt;, &lt;/span&gt;&lt;span style="font-size:11pt;line-height:115%;font-family:'Calibri','sans-serif'"&gt;&lt;a href="http://domaindrivendesign.org/discussion/messageboardarchive/Repositories.html"&gt;&lt;span style="font-size:8.5pt;line-height:115%;font-family:'Verdana','sans-serif'"&gt;repositories &lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style="font-size:8.5pt;color:#444444;line-height:115%;font-family:'Verdana','sans-serif'"&gt;and &lt;/span&gt;&lt;span style="font-size:11pt;line-height:115%;font-family:'Calibri','sans-serif'"&gt;&lt;a href="http://domaindrivendesign.org/discussion/messageboardarchive/Aggregates.html"&gt;&lt;span style="font-size:8.5pt;line-height:115%;font-family:'Verdana','sans-serif'"&gt;aggregates &lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style="font-size:8.5pt;color:#444444;line-height:115%;font-family:'Verdana','sans-serif'"&gt;when the project is a simple CRUD website with limited behavior. Those people often want to know what is 'just-enough' design, what is the minimum they could do to improve the maintainability of their software. I would say for those simple web sites MVC, coupled with a pattern like Active Record to shift the data around, is that: just-enough. I do not want you to discourage you from an understanding of &lt;/span&gt;&lt;span style="font-size:11pt;line-height:115%;font-family:'Calibri','sans-serif'"&gt;&lt;a href="http://www.domaindrivendesign.org/"&gt;&lt;span style="font-size:8.5pt;line-height:115%;font-family:'Verdana','sans-serif'"&gt;Domain Driven Design&lt;/span&gt;&lt;/a&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color:#404040"&gt;or &lt;a href="http://www.wirfs-brock.com/PDFs/A_Brief-Tour-of-RDD.pdf"&gt;&lt;u&gt;&lt;font color="#800080"&gt;Responsibility-Driven Design&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:8.5pt;color:#444444;line-height:115%;font-family:'Verdana','sans-serif'"&gt;, but if you are building a simple CRUD website with limited behaviors in the domain, then MVC-Active Record may well be the way to go. Certainly the popularity of Ruby on Rails would seem to attest that people can ‘get stuff done’ with that approach.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size:8.5pt;color:#444444;line-height:115%;font-family:'Verdana','sans-serif'"&gt;&lt;/span&gt; &lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8913799585426915684&amp;page=RSS%3a+What+is+the+MVC+noise+all+about%2c+anyway%3f+Pt+3&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=iancooper.spaces.live.com&amp;amp;GT1=iancooper"&gt;</description><category>Computers and Internet</category><comments>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!533.entry#comment</comments><guid isPermaLink="true">http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!533.entry</guid><pubDate>Wed, 14 Nov 2007 20:48:47 GMT</pubDate><slash:comments>40</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://iancooper.spaces.live.com/blog/cns!844BD2811F9ABE9C!533/comments/feed.rss</wfw:commentRss><wfw:comment>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!533.entry#comment</wfw:comment><dcterms:modified>2007-11-14T20:48:47Z</dcterms:modified></item><item><title>What is the MVC noise all about, anyway? Pt 2</title><link>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!532.entry</link><description>&lt;div&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;b&gt;&lt;span style="font-size:13.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;Monorail and ASP.NET MVC&lt;/span&gt;&lt;/b&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;Now, if you are sold on the principle of clean separation of your model, view and controller, and you want to start using application controllers and separated views then you could &lt;/span&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms978723.aspx"&gt;&lt;span style="font-size:8.5pt;font-family:'Verdana','sans-serif'"&gt;roll your own&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; implementation. A better solution however is to use an off-the-shelf alternative to WebForms such as Monorail or, in the future perhaps, the ASP.NET MVC framework to provide this type of framework. &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;b&gt;&lt;span style="font-size:13.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;Monorail&lt;/span&gt;&lt;/b&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;The &lt;/span&gt;&lt;a href="http://www.castleproject.org/index.html"&gt;&lt;span style="font-size:8.5pt;font-family:'Verdana','sans-serif'"&gt;Castle Project&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; was founded by &lt;/span&gt;&lt;a href="http://hammett.castleproject.org/"&gt;&lt;span style="font-size:8.5pt;font-family:'Verdana','sans-serif'"&gt;Hamilton Verissimo de Oliveira&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; originally to develop an Inversion of Control container but later expanded its mission to common enterprise and web applications. Key projects include: MicroKernel &amp;amp; Windsor IoC containers, the MonoRail web framework, Active Record for NHibernate, Aspect # AOP framework, and a Dynamic Proxy generator.&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;Monorail is an MVC web framework built on the ASP.NET platform. &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;a href="http://www.castleproject.org/monorail/index.html"&gt;&lt;span style="font-size:8.5pt;font-family:'Verdana','sans-serif'"&gt;Monorail&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; has distinct controllers and views. This makes the controllers easy to test. A Monorail controller for example looks something like this:&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&lt;span style=""&gt;   &lt;/span&gt;[&lt;/font&gt;&lt;span style="color:#2b91af"&gt;Layout&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span style="color:#a31515"&gt;&amp;quot;default&amp;quot;&lt;/span&gt;&lt;font color="#000000"&gt;), &lt;/font&gt;&lt;span style="color:#2b91af"&gt;Rescue&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span style="color:#a31515"&gt;&amp;quot;generalerror&amp;quot;&lt;/span&gt;&lt;font color="#000000"&gt;)]&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;span style=""&gt;&lt;font color="#000000"&gt;    &lt;/font&gt;&lt;/span&gt;&lt;span style="color:blue"&gt;public&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color:blue"&gt;class&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color:#2b91af"&gt;ProductController&lt;/span&gt;&lt;font color="#000000"&gt; : &lt;/font&gt;&lt;span style="color:#2b91af"&gt;SmartDispatcherController&lt;/span&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&lt;span style=""&gt;    &lt;/span&gt;{&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;span style=""&gt;&lt;font color="#000000"&gt;        &lt;/font&gt;&lt;/span&gt;&lt;span style="color:blue"&gt;public&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color:blue"&gt;void&lt;/span&gt;&lt;font color="#000000"&gt; List()&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&lt;span style=""&gt;        &lt;/span&gt;{&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&lt;span style=""&gt;             &lt;/span&gt;PropertyBag[&lt;/font&gt;&lt;span style="color:#a31515"&gt;&amp;quot;products&amp;quot;&lt;/span&gt;&lt;font color="#000000"&gt;] = &lt;/font&gt;&lt;span style="color:#2b91af"&gt;Product&lt;/span&gt;&lt;font color="#000000"&gt;.FindAll();&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&lt;span style=""&gt;       &lt;/span&gt;&lt;span style=""&gt;      &lt;/span&gt;RenderView(&lt;/font&gt;&lt;span style="color:#a31515"&gt;&amp;quot;list&amp;quot;&lt;/span&gt;&lt;font color="#000000"&gt;);&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&lt;span style=""&gt;        &lt;/span&gt;}&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&lt;span style=""&gt;    &lt;/span&gt;}&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;Here ProductController is our controller, identified by its base class (ultimately Controller). The controller exposes a number of public methods, which Monorail terms actions. Actions are requests to the controller – to provide a response to a request. Within the action we ask the model (Product) for data, which we pass to the view (via PropertyBag) for display. We then pick an appropriate view and tell it to render (&lt;i style=""&gt;Monorail will actually render the view with the same name as the action by default – we just show it here for clarity&lt;/i&gt;).&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;MonoRail, acting as the front controller, decides which (application) controller to display using the url of the request. The url which has the form &amp;lt;site&amp;gt;\&amp;lt;area&amp;gt;\&amp;lt;controller&amp;gt;\&amp;lt;action&amp;gt;.rails&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;The view is a template written in NVelocity (though you can use other view engines like Brail), that takes the data from the model (via the property bag) and generates html for the response:&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;color:#a31515;font-family:Consolas"&gt;h3&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;Product list&lt;/font&gt;&lt;span style="color:blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;h3&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;color:#a31515;font-family:Consolas"&gt;p&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;&amp;gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;color:#a31515;font-family:Consolas"&gt;a&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;color:red;font-family:Consolas"&gt;href&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color:blue"&gt;new.rails&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;font color="#000000"&gt;Create new Product&lt;/font&gt;&lt;span style="color:blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;a&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:10pt;color:#a31515;font-family:Consolas"&gt;p&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;&amp;gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;color:#a31515;font-family:Consolas"&gt;table&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;color:red;font-family:Consolas"&gt;width&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color:blue"&gt;100%&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;border&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color:blue"&gt;1&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;cellpadding&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color:blue"&gt;2&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color:blue"&gt; &lt;/span&gt;&lt;span style="color:red"&gt;cellspacing&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color:blue"&gt;0&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;color:#a31515;font-family:Consolas"&gt;tr&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;&amp;gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;color:#a31515;font-family:Consolas"&gt;th&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;Id&lt;/font&gt;&lt;span style="color:blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;th&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;color:#a31515;font-family:Consolas"&gt;th&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;Name&lt;/font&gt;&lt;span style="color:blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;th&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;color:#a31515;font-family:Consolas"&gt;th&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;Supplier&lt;/font&gt;&lt;span style="color:blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;th&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;color:#a31515;font-family:Consolas"&gt;th&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:10pt;color:red;font-family:Consolas"&gt;&amp;amp;nbsp;&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:10pt;color:#a31515;font-family:Consolas"&gt;th&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;&amp;gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:10pt;color:#a31515;font-family:Consolas"&gt;tr&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;&amp;gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;#foreach($product in $products)&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;color:#a31515;font-family:Consolas"&gt;tr&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;&amp;gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;color:#a31515;font-family:Consolas"&gt;td&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;color:red;font-family:Consolas"&gt;align&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color:blue"&gt;center&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;font color="#000000"&gt;$product.Id&lt;/font&gt;&lt;span style="color:blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;td&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;color:#a31515;font-family:Consolas"&gt;td&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;color:red;font-family:Consolas"&gt;align&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color:blue"&gt;center&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;font color="#000000"&gt;$product.Name&lt;/font&gt;&lt;span style="color:blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;td&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;color:#a31515;font-family:Consolas"&gt;td&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;color:red;font-family:Consolas"&gt;align&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color:blue"&gt;center&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;font color="#000000"&gt;$product.Supplier.Name&lt;/font&gt;&lt;span style="color:blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;td&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;color:#a31515;font-family:Consolas"&gt;td&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;color:red;font-family:Consolas"&gt;align&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color:blue"&gt;center&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;&lt;span style=""&gt;        &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;color:#a31515;font-family:Consolas"&gt;a&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;color:red;font-family:Consolas"&gt;href&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color:blue"&gt;edit.rails?id=${product.Id}&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;font color="#000000"&gt;Edit&lt;/font&gt;&lt;span style="color:blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;a&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;font color="#000000"&gt; | &lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;&lt;span style=""&gt;        &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;color:#a31515;font-family:Consolas"&gt;a&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;color:red;font-family:Consolas"&gt;href&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color:blue"&gt;delete.rails?id=${product.Id}&lt;/span&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;font color="#000000"&gt;Delete&lt;/font&gt;&lt;span style="color:blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;a&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:10pt;color:#a31515;font-family:Consolas"&gt;td&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;&amp;gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:10pt;color:#a31515;font-family:Consolas"&gt;tr&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;&amp;gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;#end&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size:10pt;color:#a31515;font-family:Consolas"&gt;table&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;Monorail uses a composite view pattern equivalent to master pages. Note that on the controller class we attribute the Layout. The layout is the master for the controller and the view we render in response to the request is the child of this master.&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;In this case our layout looks like:&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.1//EN&amp;quot; &amp;quot;http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd&amp;quot;&amp;gt;&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&amp;lt;html&amp;gt;&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&amp;lt;head&amp;gt;&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=iso-8859-1&amp;quot; /&amp;gt;&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;title&amp;gt;Layout&amp;lt;/title&amp;gt;&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;$siteRoot/Content/css/base.css&amp;quot; /&amp;gt;&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&amp;lt;/head&amp;gt;&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&amp;lt;body&amp;gt;&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;$childContent&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&amp;lt;/body&amp;gt;&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;font color="#000000"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&amp;lt;/html&amp;gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;&lt;/span&gt;&lt;/font&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;Where $childContent is the placeholder for our view.&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;The model is just a Plain Old C# object, likely representing an object within our domain. In this case we have a simple Product object. We use the Castle Project’s Active Record framework build on NHibernate to provide persistence for this object:&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;[&lt;/font&gt;&lt;span style="color:#2b91af"&gt;ActiveRecord&lt;/span&gt;&lt;font color="#000000"&gt;]&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas"&gt;public&lt;/span&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color:blue"&gt;class&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color:#2b91af"&gt;Product&lt;/span&gt;&lt;font color="#000000"&gt; : &lt;/font&gt;&lt;span style="color:#2b91af"&gt;ActiveRecordBase&lt;/span&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&lt;span style=""&gt;    &lt;/span&gt;[&lt;/font&gt;&lt;span style="color:#2b91af"&gt;PrimaryKey&lt;/span&gt;&lt;font color="#000000"&gt;]&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;span style=""&gt;&lt;font color="#000000"&gt;    &lt;/font&gt;&lt;/span&gt;&lt;span style="color:blue"&gt;public&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color:blue"&gt;int&lt;/span&gt;&lt;font color="#000000"&gt; Id {&lt;/font&gt;&lt;span style="color:blue"&gt;get&lt;/span&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;span style="color:blue"&gt;set&lt;/span&gt;&lt;font color="#000000"&gt;;}&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&lt;span style=""&gt;    &lt;/span&gt;[&lt;/font&gt;&lt;span style="color:#2b91af"&gt;Property&lt;/span&gt;&lt;font color="#000000"&gt;]&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;span style=""&gt;&lt;font color="#000000"&gt;    &lt;/font&gt;&lt;/span&gt;&lt;span style="color:blue"&gt;public&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color:blue"&gt;string&lt;/span&gt;&lt;font color="#000000"&gt; Name {&lt;/font&gt;&lt;span style="color:blue"&gt;get&lt;/span&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;span style="color:blue"&gt;set&lt;/span&gt;&lt;font color="#000000"&gt;;}&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&lt;span style=""&gt;    &lt;/span&gt;[&lt;/font&gt;&lt;span style="color:#2b91af"&gt;Property&lt;/span&gt;&lt;font color="#000000"&gt;]&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;span style=""&gt;&lt;font color="#000000"&gt;    &lt;/font&gt;&lt;/span&gt;&lt;span style="color:blue"&gt;public&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color:blue"&gt;decimal&lt;/span&gt;&lt;font color="#000000"&gt; Price {&lt;/font&gt;&lt;span style="color:blue"&gt;get&lt;/span&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;span style="color:blue"&gt;set&lt;/span&gt;&lt;font color="#000000"&gt;;}&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&lt;span style=""&gt;    &lt;/span&gt;[&lt;/font&gt;&lt;span style="color:#2b91af"&gt;BelongsTo&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span style="color:#a31515"&gt;&amp;quot;SupplierId&amp;quot;&lt;/span&gt;&lt;font color="#000000"&gt;)]&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;span style=""&gt;&lt;font color="#000000"&gt;    &lt;/font&gt;&lt;/span&gt;&lt;span style="color:blue"&gt;public&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color:#2b91af"&gt;Supplier&lt;/span&gt;&lt;font color="#000000"&gt; Supplier {&lt;/font&gt;&lt;span style="color:blue"&gt;get&lt;/span&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;span style="color:blue"&gt;set&lt;/span&gt;&lt;font color="#000000"&gt;;}&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;span style=""&gt;&lt;font color="#000000"&gt;    &lt;/font&gt;&lt;/span&gt;&lt;span style="color:blue"&gt;public&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color:blue"&gt;static&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color:#2b91af"&gt;Product&lt;/span&gt;&lt;font color="#000000"&gt;[] FindAll()&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&lt;span style=""&gt;    &lt;/span&gt;{&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/font&gt;&lt;span style="color:blue"&gt;return&lt;/span&gt;&lt;font color="#000000"&gt; (&lt;/font&gt;&lt;span style="color:#2b91af"&gt;Product&lt;/span&gt;&lt;font color="#000000"&gt;[]) FindAll(&lt;/font&gt;&lt;span style="color:blue"&gt;typeof&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span style="color:#2b91af"&gt;Product&lt;/span&gt;&lt;font color="#000000"&gt;));&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&lt;span style=""&gt;    &lt;/span&gt;}&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;span style=""&gt;&lt;font color="#000000"&gt;    &lt;/font&gt;&lt;/span&gt;&lt;span style="color:blue"&gt;public&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color:blue"&gt;static&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color:#2b91af"&gt;Product&lt;/span&gt;&lt;font color="#000000"&gt; FindById(&lt;/font&gt;&lt;span style="color:blue"&gt;int&lt;/span&gt;&lt;font color="#000000"&gt; id)&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&lt;span style=""&gt;    &lt;/span&gt;{&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/font&gt;&lt;span style="color:blue"&gt;return&lt;/span&gt;&lt;font color="#000000"&gt; (&lt;/font&gt;&lt;span style="color:#2b91af"&gt;Product&lt;/span&gt;&lt;font color="#000000"&gt;) FindByPrimaryKey(&lt;/font&gt;&lt;span style="color:blue"&gt;typeof&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span style="color:#2b91af"&gt;Product&lt;/span&gt;&lt;font color="#000000"&gt;), id);&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;&lt;span style=""&gt;    &lt;/span&gt;}&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;font-family:Consolas"&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;Hopefully you can see the clean separation of concerns that MonoRail enables. &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;You can work through the example this code was taken from at: &lt;/span&gt;&lt;a href="http://www.castleproject.org/monorail/gettingstarted/index.html"&gt;&lt;span style="font-size:8.5pt;font-family:'Verdana','sans-serif'"&gt;http://www.castleproject.org/monorail/gettingstarted/index.html&lt;/span&gt;&lt;/a&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt; 
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;More...&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8913799585426915684&amp;page=RSS%3a+What+is+the+MVC+noise+all+about%2c+anyway%3f+Pt+2&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=iancooper.spaces.live.com&amp;amp;GT1=iancooper"&gt;</description><category>Computers and Internet</category><comments>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!532.entry#comment</comments><guid isPermaLink="true">http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!532.entry</guid><pubDate>Wed, 14 Nov 2007 20:47:29 GMT</pubDate><slash:comments>17</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://iancooper.spaces.live.com/blog/cns!844BD2811F9ABE9C!532/comments/feed.rss</wfw:commentRss><wfw:comment>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!532.entry#comment</wfw:comment><dcterms:modified>2007-11-14T20:48:12Z</dcterms:modified></item><item><title>What is the MVC noise all about, anyway? Pt 1</title><link>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!531.entry</link><description>&lt;div&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;Scott Gu has a post describing the &lt;/span&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2007/11/13/asp-net-mvc-framework-part-1.aspx"&gt;&lt;span style="font-size:8.5pt;font-family:'Verdana','sans-serif'"&gt;&lt;u&gt;&lt;font color="#800080"&gt;ASP.NET MVC framework&lt;/font&gt;&lt;/u&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; that he presented on an altnetconf and you can see the &lt;/span&gt;&lt;a href="http://www.hanselman.com/blog/ScottGuMVCPresentationAndScottHaScreencastFromALTNETConference.aspx"&gt;&lt;span style="font-size:8.5pt;font-family:'Verdana','sans-serif'"&gt;video of that presentation on Scott Hanselman's site&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;. A lot of the noise has assumed that you comprehend what that means, and why some folks are jazzed about it, particularly the ALT.NET gang. But on the off chance that MVC frameworks have eluded you so far let's talk about what they are and why they are important.&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;&lt;br&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size:13.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;Separation of Concerns&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;The MVC in the acronym stands for Model-View-Controller. MVC is a pattern for separating what you are representing from how you are presenting it:&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 1.8pt 13.2pt;text-indent:-18pt;line-height:normal;tab-stops:list 36.0pt"&gt;&lt;span style="font-size:10pt;color:#444444;font-family:Symbol"&gt;&lt;span style=""&gt;·&lt;span style="font:7pt 'Times New Roman'"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b style=""&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;The View&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;: which knows how to render the UI &lt;/span&gt;
&lt;p style="margin:0cm 0cm 1.8pt 13.2pt;text-indent:-18pt;line-height:normal;tab-stops:list 36.0pt"&gt;&lt;span style="font-size:10pt;color:#444444;font-family:Symbol"&gt;&lt;span style=""&gt;·&lt;span style="font:7pt 'Times New Roman'"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b style=""&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;The Controller&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;: which knows how to initialize the UI and react to actions. &lt;/span&gt;
&lt;p style="margin:0cm 0cm 1.8pt 13.2pt;text-indent:-18pt;line-height:normal;tab-stops:list 36.0pt"&gt;&lt;span style="font-size:10pt;color:#444444;font-family:Symbol"&gt;&lt;span style=""&gt;·&lt;span style="font:7pt 'Times New Roman'"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b style=""&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;The Model&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;: which encapsulates the information we are interested in displaying. &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;By separating these different concerns we make it easy to maintain them. Elements adhere to the &lt;/span&gt;&lt;a href="http://iancooper.spaces.live.com/mmm2007-10-05_20.12/www.objectmentor.com/resources/articles/srp.pdf"&gt;&lt;span style="font-size:8.5pt;font-family:'Verdana','sans-serif'"&gt;single-responsibility principle&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;: an object has one and only one reason to change. For example, if we want to change the way we render our elements, but not how we persist or calculate those elements, we don't have to touch the model. This reduces risk: we do not have to modify code that is unrelated to our changes, and thus risk introducing errors in parts of the system that are orthogonal to the alteration we are making. &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;Classic forms based programming tends to mix everything together in the event handler: in response to a new price being entered, the code within the event handler calculates a new yield and sets its value on a label on the form. The problem here is that if we want that algorithm elsewhere, we have to first separate it from its interaction with the UI widgets. Often what happens is that instead, the algorithm is repeated elsewhere in a different form. Now when we want to change the algorithm we have to do it in two places. MVC tries to break the high-coupling between these separate concerns.&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;We use an abstract type (interface or virtual methods) for the controller, view, and model, so that we can provide new implementations of any one element without modifying the others. This is the &lt;/span&gt;&lt;a href="http://www.objectmentor.com/resources/articles/ocp.pdf"&gt;&lt;span style="font-size:8.5pt;font-family:'Verdana','sans-serif'"&gt;open-closed principle&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;: software entities should be open for extension, but closed for modification.&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 12pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;You might use this facet of MVC to provide alternative views of the same data, say a graph and a spreadsheet. MVC allows you to swap provide additional implementations because it encapsulates its display in a view. &lt;/span&gt;
&lt;p style="margin:0cm 0cm 12pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;Because MVC encapsulates the response mechanism in a controller object, it also allows you to change the way a view responds without changing its visual representation, for example to make a view read-only for low privilege users, or to provide a different workflow for different user roles.&lt;/span&gt;
&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;span style="font-size:8.5pt;color:#404040;font-family:'Verdana','sans-serif'"&gt;This ability to provide many concrete implementations of an abstract type, polymorphism, is an example of the Strategy pattern. A &lt;a href="http://en.wikipedia.org/wiki/Strategy_pattern"&gt;&lt;u&gt;&lt;font color="#800080"&gt;Strategy&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; is a type that represents an algorithm, and by providing new implementations of that type you can vary details of that algorithm or its internal data structures.&lt;/span&gt;
&lt;p style="margin:0cm 0cm 12pt;line-height:normal"&gt;&lt;b&gt;&lt;span style="font-size:13.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;Variations on a theme&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;There is smorgasbord of terminology used for MVC variants, such as Model-View-Presenter or Application Controller. Fowler has a pretty good &lt;/span&gt;&lt;a href="http://www.martinfowler.com/eaaDev/uiArchs.html"&gt;&lt;span style="font-size:8.5pt;font-family:'Verdana','sans-serif'"&gt;summary of the various flavors and phrases&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; like &lt;/span&gt;&lt;a href="http://www.martinfowler.com/eaaDev/SupervisingPresenter.html"&gt;&lt;span style="font-size:8.5pt;font-family:'Verdana','sans-serif'"&gt;Supervising Controller&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;, &lt;/span&gt;&lt;a href="http://www.martinfowler.com/eaaDev/PassiveScreen.html"&gt;&lt;span style="font-size:8.5pt;font-family:'Verdana','sans-serif'"&gt;Passive View&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;, and &lt;/span&gt;&lt;a href="http://www.martinfowler.com/eaaDev/PresentationModel.html"&gt;&lt;span style="font-size:8.5pt;font-family:'Verdana','sans-serif'"&gt;Presentation Model&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;. The variation is mainly around view-model interaction. For example Supervising Controller recognizes the presence of data-binding frameworks and so admits view-model interaction to refresh data. The Passive View has the controller mediate all interaction, and as a result is easier to test. The Presentation Model takes state and behavior out of the view into one class –a controller-model combination. &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;The key is to recognize the common thread: these patterns strive for a clean separation of concerns between what we are representing and how we represent it. &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;The &lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Observer_design_pattern"&gt;&lt;span style="font-size:8.5pt;font-family:'Verdana','sans-serif'"&gt;observer pattern&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; is a common adjunct to the separation when you have multiple views displayed simultaneously, such as in an MDI application. The model is an observable, and the view or controller can subscribe by registering an observer interface. If the model is updated outside of the current view, for example by a rate feed, then the views are notified to render themselves afresh. However, it’s not relevant in the presentation tier for a web application where you cannot push updates to the browser. Passive View is a variation of MVC where the controller is responsible for synching state between the model and the view, and does not rely on the Observer pattern, so it’s a common choice for web applications.&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;MVC also tends to support the notion of composite views, a view which itself contains other views, all of which may have their own controller and model. So your page is a view, but all of the controls on the page are also views. MVC identifies this as a composite view. A composite view may be used wherever a view can, but also delegates to its child views, which, of course, may in turn be composite. Control trees in UIs are in expression of this idea of composition.&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;a&gt;&lt;/a&gt;&lt;a&gt;&lt;/a&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;The Model-View architecture has been a particularly recurrent variation. In this form the controller and the view are merged into one. It has been particularly prevalent in frameworks to support event-driven programming on windowing systems. MFC’s document view architecture is a classic example here; the form both knows how to render the controls and how to respond to events. The loser here is testability – to test the controller we need to instantiate the view.&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;A related danger here is the temptation to merge the model in as well, which is the anti-pattern of business logic in the UI. This is especially true when there is no tradition of separating out the model, such as in forms based development.&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;Some people don’t like the view talking to the model and try to improve the separation by using a Data Transfer Object between the view and the model. For my part as long as the view does not embed the business logic, but leaves it within the view, and is passed the model instead of holding a reference to it, I’m prepared to let the view access the model’s state. I don’t think that the protection of a DTO is always worth the cost. YMMV. &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;The view embedding behaviors that ought to be methods on the model and the view calling those methods and not the controller are the real smells we want to avoid.&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;b&gt;&lt;span style="font-size:13.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;View-Controller in WebForms &lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;Within WebForms we handle any HTTP request in the code-behind, so we can identify it as having the responsibilities of the controller. The template code gives us the layout of the html we return in the response and represents the view. However, the code-behind file and the template are coupled, because controls declared on the aspx become fields in the code-behind, so there is no true separation between them. So within WebForms the built in model &lt;/span&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms998540.aspx"&gt;&lt;span style="font-size:8.5pt;font-family:'Verdana','sans-serif'"&gt;is Model-View&lt;/span&gt;&lt;/a&gt;&lt;font size=3&gt;&lt;font face=Calibri&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color:#404040"&gt;and not Model-View-Controller&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="font-size:8.5pt;color:#404040;font-family:'Verdana','sans-serif'"&gt;. No shock here, perhaps, as the design goal was to move the forms rich-client programming model server side.&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;Unfortunately we get very poor testability from a view/controller, because we cannot test the controller logic in isolation from the view. This is a problem because in order to instantiate a view we need to spin up whatever hosts the view: in this case we need to launch the asp.net pipeline. This is difficult to do within most xUnit test runners, and even where it is supported, for example by MSTest, the tests are slow and fragile.&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;b&gt;&lt;span style="font-size:13.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;Types of Controllers&lt;/span&gt;&lt;/b&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;In a web application when the web server (IIS et al.) forwards our application an HTTP request we need to provide a response. Under ASP.NET an implementation of &lt;/span&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/system.web.ihttphandler(VS.71).aspx"&gt;&lt;span style="font-size:8.5pt;font-family:'Verdana','sans-serif'"&gt;IHttpHandler&lt;/span&gt;&lt;/a&gt;&lt;font face=Calibri color="#000000" size=3&gt; &lt;/font&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;&lt;span style=""&gt; &lt;/span&gt;forms the end point for the request and sends the response. &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;Within WebForms, Page derived objects implement of IHttpHandler and are the end points for requests. &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;The key takeaway is that there an affinity between controller and page. Each page has one controller, each controller has one page. Fowler calls this a &lt;/span&gt;&lt;a href="http://www.martinfowler.com/eaaCatalog/pageController.html"&gt;&lt;span style="font-size:8.5pt;font-family:'Verdana','sans-serif'"&gt;Page Controller&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; and it is &lt;/span&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms998548.aspx"&gt;&lt;span style="font-size:8.5pt;font-family:'Verdana','sans-serif'"&gt;WebForms architecture&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;. Note that although we have a controller, we are still implementing model-view with WebForms because the controller and view are coupled.&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;A Page Controller makes re-use hard. If several actions lead to the same view being displayed, but with differing data we end up with a lot of conditional logic in the page controller or duplication between cut &amp;amp; paste variants of the same page. A page controller also makes navigation hard, for example when coding a wizard, because the logic is embedded within a page, not between the pages, again leading to re-use.&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;There are other models, particularly &lt;/span&gt;&lt;a href="http://www.martinfowler.com/eaaCatalog/frontController.html"&gt;&lt;span style="font-size:8.5pt;font-family:'Verdana','sans-serif'"&gt;Front Controller&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; and &lt;/span&gt;&lt;a href="http://www.martinfowler.com/eaaCatalog/applicationController.html"&gt;&lt;span style="font-size:8.5pt;font-family:'Verdana','sans-serif'"&gt;Application Controller&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; where the view-controller relationship is broken and controllers dispatch requests to the desired views, after first deciding which view and which data. &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;There is only ever one Front Controller, which decides what action to call in response to the request. &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;There are potentially many application controllers, to which the front controller forwards a request, which decide what action to take and redirect to the required view. &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt;Front and application controllers make it much easier to orchestrate navigation within your application, because the navigation code no longer lives within the forms. Instead navigation is handled by the controllers.&lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;b&gt;&lt;span style="font-size:13.5pt;color:#444444;font-family:'Verdana','sans-serif'"&gt; &lt;/span&gt;&lt;/b&gt;
&lt;p style="margin:0cm 0cm 0pt;line-height:normal"&gt;&lt;font face=Calibri color="#000000" size=3&gt;More...&lt;/font&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8913799585426915684&amp;page=RSS%3a+What+is+the+MVC+noise+all+about%2c+anyway%3f+Pt+1&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=iancooper.spaces.live.com&amp;amp;GT1=iancooper"&gt;</description><category>Computers and Internet</category><comments>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!531.entry#comment</comments><guid isPermaLink="true">http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!531.entry</guid><pubDate>Wed, 14 Nov 2007 20:46:07 GMT</pubDate><slash:comments>11</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://iancooper.spaces.live.com/blog/cns!844BD2811F9ABE9C!531/comments/feed.rss</wfw:commentRss><wfw:comment>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!531.entry#comment</wfw:comment><dcterms:modified>2007-11-14T20:46:07Z</dcterms:modified></item><item><title>Agile and Just-Enough Design</title><link>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!527.entry</link><description>&lt;div&gt;I'm always amazed at the number of people that believe that if you are doing agile you do not do analysis or design. What changes with agile is not whether you do them, but when you do them or to quote Kent Beck &amp;quot;[the] question is not whether or not to design, the question is when to design&amp;quot;.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Agile collapses the waterfall model: analysis-design-code-test into a single phase: build that includes all activities all the time. So we write our code test-first, folding our testing activity into the act of implementing; we design as we implement, revising our theory of how to deliver a software solution as we deliver it. The reason agile takes this approach is feedback. By merging these three activities each one gives rapid feedback on the others and makes change easy (and cheap). So the first thing to recognize is that agile does all the activities, just all the time. The second thing to recognize is that agile does its analysis, design, and testing at the same time as development to avoid wasted effort. The attacks provide immediate feedback to each other when conducted in proximity, feedback that helps us refine our efforts, feedback which allows us to make low cost change in-phase, instead of high cost change out-of-phase.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;But in addition to this, agile methods do have an analysis period up front where we gather the users' requirements and begin to uncover how we will model them, before we start building. Some agile methodologies are better at talking about this phase than others, but it remains implicit in the nature of planning activities such as blitz planning or the planning game that we must have done the work up front to gather the user stories or use cases that we will then estimate against. Projects tend to have to leap over some sort of governance gateway to begin, and while the amount of ceremony varies by organization, we often have a need to know just enough up front to understand if we can solve the problem and how expensive it is likely to be. The number of stories we need to gather for approval, the whole 'project', the first few iterations, or just the next iteration tends to depend on the maturity of both the organisation and the system under development.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Of course when we gather those stories or use cases and estimate them, we are doing some design, even if it is only tacitly in our heads, because we are beginning to think about how we will implement them in order to estimate and cost them. For me at what point you cross the line between analysis and design is not an easy one. I have heard it stated that analysis is something that can be discussed with the user, design is what happens after that, but the boundary is murky in a lot of writing.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Methodologies do differ on to what depth this upfront analysis goes. How much do we sketch out in advance, how much do we defer to the iteration in which the story first appears. The methodologies I know (XP, Scrum, Cystal) all capture user stories or use cases to create a requirements list for the system. Classically, XP defers further investigation until the iteration where we build. Crystal recognizes the need for a little more upfront activity called an Exploratory 360. &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;

&lt;div&gt;With Cystal's Exploratory 360 we want to do just enough to ensure we have captured the knowledge we need to decide if and what to build, but no more. We don't want to know how we will build, but be sure about what the user wants us to build. In order to defer cost until it is needed, upfront we only want to capture the elements of the domain that are essential, because we otherwise risk doing detailed analysis for requirements that never get implemented. In an exporatory 360 we typically: capture key use cases and actors, sketch the core of the domain model, spike technologies that may be involved, and then using the planning game or blitz planning sketch out a project plan. Cockburn says of this analysis that it is done &amp;quot;in a coarse-grained fashion, to detect whether the intended team and projected methodology, using the intended technology around the projected domain model, can deliver the intended business value with the projected set of requirements according to the draft project plan. The exploratory 360° results in a set of adjustments to the project setup, or in the most drastic case, a decision by the executive sponsor to cancel the project (better now than later!).&amp;quot; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Remember here that the domain model is the layer of your solution that should be comprehensible to an expert user, not all the other objects that go toward making software run such as UI widgets or persistence technology. It's the place of Domain Driven Design's Ubiquitious Language. Focus up-front on the domain model only. The other objects will emerge as we build, from our discussions on how to automate this domain. It is the builders not the expert users who care about them.  &lt;/div&gt;
&lt;div&gt;This is not big-design up front it is just-enough design to get us started. It is a few days of activity, or perhaps one or two weeks for a large project. &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Beck in the 2nd Ed. of XP recognizes the value of this activity: &amp;quot;McConnell writes, &amp;quot;In ten years the pendulum has swung from 'design everything' to 'design nothing.' But the alternative to BDUF [Big Design Up Front] isn't no design up front, it's a Little Design Up Front (LDUF) or Enough Design Up Front (ENUF).&amp;quot; This is a strawman argument. The alternative to designing before implementing is designing after implementing. Some design up-front is necessary, but just enough to get the initial implementation. Further design takes place once the implementation is in place and the real constraints on the design are obvious. Far from &amp;quot;design nothing,&amp;quot; the XP strategy is &amp;quot;design always.&amp;quot;&amp;quot;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;The trouble for most people is figuring out what the 'just enough' is. The push from agile methodologies early on was against the BDUF style of methodologies such as SSADM and an environment of vendors pushing CASE tools. So the emphasis was on doing design during the build phase, not before. Activity was about weaning people of their BDUF addiction. But as more people approach agile from a zero-methodology background, where there was little or no design, we have to be careful to reinforce the message that agile methodologies do design, but do just-enough to get to build.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt; &lt;br&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8913799585426915684&amp;page=RSS%3a+Agile+and+Just-Enough+Design&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=iancooper.spaces.live.com&amp;amp;GT1=iancooper"&gt;</description><category>Computers and Internet</category><comments>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!527.entry#comment</comments><guid isPermaLink="true">http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!527.entry</guid><pubDate>Sun, 11 Nov 2007 16:24:58 GMT</pubDate><slash:comments>7</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://iancooper.spaces.live.com/blog/cns!844BD2811F9ABE9C!527/comments/feed.rss</wfw:commentRss><wfw:comment>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!527.entry#comment</wfw:comment><dcterms:modified>2007-11-12T13:32:47Z</dcterms:modified></item><item><title>All aboard the Monorail</title><link>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!522.entry</link><description>Thanks to everyone at NextGenUG for letting me come up to talk about Monorail &lt;a href="http://www.nxtgenug.net/ViewEvent.aspx?EventID=86"&gt;last night&lt;/a&gt;.&lt;br&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8913799585426915684&amp;page=RSS%3a+All+aboard+the+Monorail&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=iancooper.spaces.live.com&amp;amp;GT1=iancooper"&gt;</description><category>Computers and Internet</category><comments>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!522.entry#comment</comments><guid isPermaLink="true">http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!522.entry</guid><pubDate>Wed, 31 Oct 2007 22:11:54 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://iancooper.spaces.live.com/blog/cns!844BD2811F9ABE9C!522/comments/feed.rss</wfw:commentRss><wfw:comment>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!522.entry#comment</wfw:comment><dcterms:modified>2007-10-31T22:11:54Z</dcterms:modified></item><item><title>London .NET user group 27th November</title><link>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!523.entry</link><description>&lt;div&gt;The line up is out. I'll confirm venue details soon. Feel free to &lt;a href="http://www.dnug.org.uk/"&gt;sign up&lt;/a&gt;.&lt;br&gt;&lt;br&gt;Time 18:30 - 21:30&lt;br&gt;&lt;br&gt;&lt;strong&gt;Office as a development platform with Visual Studio 2008&lt;/strong&gt; - Daniel Moth The 2007 Microsoft Office System is extensible like never before. In this session we'll look at the numerous ways to extend the various Office applications such as Word, Excel, Outlook and others. Customisations demonstrated will include the new designers and&lt;br&gt;templates for the Ribbon, Actions Pane, Task Pane, Content Controls and Form Regions. This will all be done in managed code from within Visual Studio 2008 and we will also see how to interop in both directions with VBA code.&lt;br&gt;&lt;br&gt;&lt;strong&gt;All aboard the Monorail&lt;/strong&gt; - Ian Cooper&lt;br&gt;WebForms have been to bedrock of ASP.NET development for the last four years, but the success of Ruby on Rails, and the growth of TDD, has created fresh interest in the MVC approach for building web sites. In this presentation we look at both the pattern and the open source project MonoRail which provides a new and popular way to build&lt;br&gt;websites.&lt;br&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8913799585426915684&amp;page=RSS%3a+London+.NET+user+group+27th+November&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=iancooper.spaces.live.com&amp;amp;GT1=iancooper"&gt;</description><category>Computers and Internet</category><comments>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!523.entry#comment</comments><guid isPermaLink="true">http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!523.entry</guid><pubDate>Wed, 31 Oct 2007 22:11:37 GMT</pubDate><slash:comments>5</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://iancooper.spaces.live.com/blog/cns!844BD2811F9ABE9C!523/comments/feed.rss</wfw:commentRss><wfw:comment>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!523.entry#comment</wfw:comment><dcterms:modified>2007-10-31T22:11:37Z</dcterms:modified></item><item><title>DDD6 registration is now live</title><link>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!519.entry</link><description>Just to let you know that &lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032357828&amp;amp;Culture=en-GB"&gt;registration for DDD6 is now live&lt;/a&gt;. Usually it fills up fast, so you may want to register now. There is a little bit of lag getting the agenda up... soon.&lt;br&gt; &lt;br&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8913799585426915684&amp;page=RSS%3a+DDD6+registration+is+now+live&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=iancooper.spaces.live.com&amp;amp;GT1=iancooper"&gt;</description><category>Computers and Internet</category><comments>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!519.entry#comment</comments><guid isPermaLink="true">http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!519.entry</guid><pubDate>Wed, 24 Oct 2007 12:10:08 GMT</pubDate><slash:comments>5</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://iancooper.spaces.live.com/blog/cns!844BD2811F9ABE9C!519/comments/feed.rss</wfw:commentRss><wfw:comment>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!519.entry#comment</wfw:comment><dcterms:modified>2007-10-24T12:11:04Z</dcterms:modified></item><item><title>Uncle Bob on writing acceptance tests</title><link>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!518.entry</link><description>Uncle Bob has posted about the old saw of whether &lt;a href="http://blog.objectmentor.com/articles/2007/10/17/tdd-with-acceptance-tests-and-unit-tests"&gt;acceptance tests should precede unit tests&lt;/a&gt; or vice-versa. He comes down on the side of writing the acceptance tests first, and he follows the XP approach of customers writing the acceptance tests at the beginning of the iteration for developers to implement when they begin work on  a story.&lt;br&gt;&lt;br&gt;We're still bad at this and tend to lean toward both developers writing acceptance tests and acceptance tests are coded after the unit tests. I know, bad Ian no biscuit. &lt;br&gt;&lt;br&gt;We have never really got on with &lt;a href="http://fit.c2.com/"&gt;FIT&lt;/a&gt;. The idea, that we have a format we can exchange tests descriptions with customers in, is great, but the implementation is clunky and constrained. We have tended to rely on homebrew front ends that exercise specific scenarios, calling into our back-end. Similar in principles to FIT, but different in execution. But that can add a lot of effort. So I'm more and more interested in some of the tools emerging from &lt;a href="http://blog.daveastels.com/files/BDD_Intro.pdf"&gt;BDD&lt;/a&gt; like &lt;a href="http://nbehave.org/"&gt;NBehave &lt;/a&gt;as they, to me, seem to be a better way of expressing the acceptance test requirements. &lt;br&gt;&lt;br&gt;Greg Young had an interesting post recently about the &lt;a href="http://codebetter.com/blogs/gregyoung/archive/2007/10/16/bdd-and-the-shared-language.aspx"&gt;relationship between BDD and DDDs ubiquitous language&lt;/a&gt; btw and particularly the danger that BDD may inhibit the formation of DDD's &lt;a href="http://domaindrivendesign.org/discussion/messageboardarchive/UbiquitousLanguage.html"&gt;ubiquitous language&lt;/a&gt; because communication about the model is expressed via BDD's abstraction and not the shared abstraction of the domain. Food for thought, though I'm not sure that we do not actually have two distinct domain languages in play: one concerned with how we validate the other.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span style="font-weight:bold"&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8913799585426915684&amp;page=RSS%3a+Uncle+Bob+on+writing+acceptance+tests&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=iancooper.spaces.live.com&amp;amp;GT1=iancooper"&gt;</description><comments>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!518.entry#comment</comments><guid isPermaLink="true">http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!518.entry</guid><pubDate>Thu, 18 Oct 2007 12:10:56 GMT</pubDate><slash:comments>5</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://iancooper.spaces.live.com/blog/cns!844BD2811F9ABE9C!518/comments/feed.rss</wfw:commentRss><wfw:comment>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!518.entry#comment</wfw:comment><dcterms:modified>2007-10-18T12:10:56Z</dcterms:modified></item><item><title>DDD6 voting is now open</title><link>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!511.entry</link><description>&lt;div&gt;As I am sure many of you know, the community sets the agenda for DDD6. The proposed sessions are now in and submission is closed. So now it is time to vote on what you want to see on the day. Go &lt;a href="http://www.developerday.co.uk/ddd/votesessions.asp"&gt;here &lt;/a&gt;to vote for the sessions you want to see.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;I have a session on Monorail and one on n-tier architecture for the LINQ world, but there is a pretty good smorgasboard of sessions there for you to choose from.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8913799585426915684&amp;page=RSS%3a+DDD6+voting+is+now+open&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=iancooper.spaces.live.com&amp;amp;GT1=iancooper"&gt;</description><category>Computers and Internet</category><comments>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!511.entry#comment</comments><guid isPermaLink="true">http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!511.entry</guid><pubDate>Sat, 13 Oct 2007 14:20:38 GMT</pubDate><slash:comments>4</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://iancooper.spaces.live.com/blog/cns!844BD2811F9ABE9C!511/comments/feed.rss</wfw:commentRss><wfw:comment>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!511.entry#comment</wfw:comment><dcterms:modified>2007-10-13T14:20:38Z</dcterms:modified></item><item><title>London .NET User Group 25th October</title><link>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!510.entry</link><description>&lt;div&gt;Location: &lt;a href="http://www.toynbeehall.org.uk/default.asp"&gt;TonyBee Hall&lt;/a&gt; &lt;/div&gt;
&lt;div&gt;&lt;br&gt;Time: 18:30 - 21:30&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;strong&gt;The Importance of Application Security&lt;/strong&gt;&lt;br&gt;&lt;a href="http://blog.searyblog.com/"&gt;Chris Seary&lt;/a&gt;&lt;br&gt;&lt;/div&gt;
&lt;div&gt;'Why is application security so important now? Chris will discuss why the onus is on developers to produce secure systems.&lt;br&gt;We'll look at what hackers can do with a system improperly secured, and how to protect it.&lt;br&gt;Many organisations have raised their security baseline over the last few years, and developers need to be aware of this. Chris will guide you through the most common pitfalls of commercially produced applications so you don't make the same mistakes.'&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;strong&gt;An overview of WPF - the end of Windows Forms?&lt;/strong&gt;&lt;br&gt;&lt;a href="http://www.sturmnet.org/blog/"&gt;Oliver Sturm&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;&lt;br&gt;Windows Presentation Foundation (WPF) is an important pillar of Microsoft's new and upcoming development platform. It's available today as part of .NET 3, but its importance will grow considerably with the release of Visual Studio 2008 very close. Other tools like Expression Blend complete the picture, providing functionality but at the same time adding complexity to the development environment. This session shows what the framework contains and how to use it in your applications, as well as shedding some light on Microsoft's ideas of software development tomorrow.&lt;/div&gt;
&lt;div&gt;&lt;br&gt; &lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8913799585426915684&amp;page=RSS%3a+London+.NET+User+Group+25th+October&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=iancooper.spaces.live.com&amp;amp;GT1=iancooper"&gt;</description><category>Computers and Internet</category><comments>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!510.entry#comment</comments><guid isPermaLink="true">http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!510.entry</guid><pubDate>Sat, 13 Oct 2007 14:17:21 GMT</pubDate><slash:comments>5</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://iancooper.spaces.live.com/blog/cns!844BD2811F9ABE9C!510/comments/feed.rss</wfw:commentRss><wfw:comment>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!510.entry#comment</wfw:comment><dcterms:modified>2007-10-13T14:17:21Z</dcterms:modified></item><item><title>London AltNetConf?</title><link>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!505.entry</link><description>So one positive take from the &lt;a href="http://www.altnetconf.com/home/closed"&gt;altnetconf&lt;/a&gt; is the suggestion that folks hold their own local &lt;a href="http://weblogs.asp.net/bsimser/archive/2007/10/11/ryo-altnetconf.aspx"&gt;altnetconf&lt;/a&gt;. Franchising the idea seems to be a good way too avoid accusations of elitism and empower instead. I have been talking about an Agile and Open source conference next year, but it make some sense to look at this meme as well. Obviously there is crossover in format with &lt;a href="http://barcamp.org/BarCampLondon"&gt;BarCamp&lt;/a&gt;, but I don't think that having a .NET focused event as well would hurt as I suspect we don't draw the same audience. With Tech Ed and DDD on the horizon I suspect that it makes no sense to hold this before next year, but we could think about putting one on in January 2008.&lt;br&gt;&lt;br&gt;Interested?&lt;br&gt;&lt;br&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8913799585426915684&amp;page=RSS%3a+London+AltNetConf%3f&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=iancooper.spaces.live.com&amp;amp;GT1=iancooper"&gt;</description><category>Computers and Internet</category><comments>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!505.entry#comment</comments><guid isPermaLink="true">http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!505.entry</guid><pubDate>Fri, 12 Oct 2007 12:19:20 GMT</pubDate><slash:comments>11</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://iancooper.spaces.live.com/blog/cns!844BD2811F9ABE9C!505/comments/feed.rss</wfw:commentRss><wfw:comment>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!505.entry#comment</wfw:comment><dcterms:modified>2007-10-12T12:19:20Z</dcterms:modified></item><item><title>LONDON ALT.NET User Group?</title><link>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!500.entry</link><description>&lt;div&gt;The &lt;a href="http://laribee.com/blog/2007/04/10/altnet/"&gt;ALT.NET&lt;/a&gt; crew seem to have had a successful conference in the US. On a basic level it is great to see people holding a successful conference for .NET developers focused on Agile and Open source. &lt;a href="http://www.craigmurphy.com/blog/"&gt;Craig&lt;/a&gt; and I have been discussing doing something along that line in the UK next year.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;But I have &lt;a href="http://iancooper.spaces.live.com/blog/cns!844BD2811F9ABE9C!386.entry"&gt;posted before&lt;/a&gt; that I have some misgivings around movements and some folks have already been &lt;a href="http://samgentile.com/blogs/samgentile/archive/2007/10/07/codebetter-and-alt-net-the-short-version.aspx"&gt;alienated&lt;/a&gt;, which is worrying. Still it is early days, and I have a lot of respect for folks like &lt;a href="http://codebetter.com/blogs/jeremy.miller/"&gt;Jeremy Miller&lt;/a&gt; so I am hopeful it can be a powerful way of packaging up ideas instead of something elitist.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;a href="http://martinfowler.com/bliki/AltNetConf.html"&gt;Martin Fowler&lt;/a&gt;, who attended, mentioned the question of ALT.NET user groups came up and whether they should be seperate from existing groups. &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;My feeling is that the goal of any ALT.NET movement must surely be to spread its ideas, not just to the faithful, but to the wide audience, and that the audience of any user group, who are by their attendance likely to be motivated developers to start with, is an ideal one for the ALT.NET message. &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;The London .NET user group has certainly always has a focus on ALT.NET. Over the years we have had (October 2006: TDD, September 2006: Agile OO design, May 2006: NHibernate, July 2006: eXtreme.NET (XP), July 2005: XP Planning game, May 2005: NMock, May 2005: FIT, January 2005: NHibernate, March 2004: Design Patterns , September 2003: Test-Driven Development).&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;So, for sure, the London .NET user group is also the London ALT.NET user group. And if that appeals so be it. But we are a broad church and I hope that we appeal to all .NET developers, so I'm happy to just use LDNUG for now.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Craig and I have been considering what to call our conference. I'm not sure about the ALT.NET tag. Some folks have suggested Pragmatic.NET (shades of The Pragmatic Programmer), although we also quite like Indie .NET to convey the idea of picking up on stuff from outside the big house.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8913799585426915684&amp;page=RSS%3a+LONDON+ALT.NET+User+Group%3f&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=iancooper.spaces.live.com&amp;amp;GT1=iancooper"&gt;</description><comments>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!500.entry#comment</comments><guid isPermaLink="true">http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!500.entry</guid><pubDate>Wed, 10 Oct 2007 21:27:03 GMT</pubDate><slash:comments>10</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://iancooper.spaces.live.com/blog/cns!844BD2811F9ABE9C!500/comments/feed.rss</wfw:commentRss><wfw:comment>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!500.entry#comment</wfw:comment><dcterms:modified>2007-10-10T21:27:03Z</dcterms:modified></item><item><title>Use the source, Luke</title><link>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!495.entry</link><description>Having spent a number of years programming in C++ with libs like MFC and ATL I grew used to being able to step into the framework source when debugging. It can be inordinately helpful when the framework behavior defies your expectations. So it has always been a little bit of a trial in .NET that the closest you can get to this is to go spelunking with &lt;a href="http://www.aisto.com/roeder/dotnet/"&gt;Reflector&lt;/a&gt;.&lt;br&gt;&lt;br&gt;So its great that&lt;a href="http://weblogs.asp.net/scottgu/archive/2007/10/03/releasing-the-source-code-for-the-net-framework-libraries.aspx"&gt; Scott Guthrie has announced that MS will be releasing the source to the .NET framework&lt;/a&gt; for use with VS 2008. Now you will be able to look under the hood at issues as you hit them. We've been asking for this for a while, it's great that the hoops (usually around cleaning up the source for distribution) have been overcome.&lt;br&gt;&lt;br&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8913799585426915684&amp;page=RSS%3a+Use+the+source%2c+Luke&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=iancooper.spaces.live.com&amp;amp;GT1=iancooper"&gt;</description><category>Computers and Internet</category><comments>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!495.entry#comment</comments><guid isPermaLink="true">http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!495.entry</guid><pubDate>Thu, 04 Oct 2007 08:24:08 GMT</pubDate><slash:comments>4</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://iancooper.spaces.live.com/blog/cns!844BD2811F9ABE9C!495/comments/feed.rss</wfw:commentRss><wfw:comment>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!495.entry#comment</wfw:comment><dcterms:modified>2007-10-04T08:24:08Z</dcterms:modified></item><item><title>London .NET Geek Dinner October 9th</title><link>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!493.entry</link><description>Zi is &lt;a href="http://www.zimakki.com/blog/index.php/2007/09/30/9th-october-geek-dinner/"&gt;putting together another geek dinner&lt;/a&gt;. Sign up via his &lt;a href="http://www.zimakki.com/wiki/09OctGeekDinne.ashx"&gt;wiki&lt;/a&gt;. Hope to see a lot of the &lt;a href="http://www.dnug.org.uk"&gt;LDNUG &lt;/a&gt;regulars there.&lt;br&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8913799585426915684&amp;page=RSS%3a+London+.NET+Geek+Dinner+October+9th&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=iancooper.spaces.live.com&amp;amp;GT1=iancooper"&gt;</description><category>Computers and Internet</category><comments>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!493.entry#comment</comments><guid isPermaLink="true">http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!493.entry</guid><pubDate>Mon, 01 Oct 2007 12:23:59 GMT</pubDate><slash:comments>4</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://iancooper.spaces.live.com/blog/cns!844BD2811F9ABE9C!493/comments/feed.rss</wfw:commentRss><wfw:comment>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!493.entry#comment</wfw:comment><dcterms:modified>2007-10-01T12:23:59Z</dcterms:modified></item><item><title>DDD6 and call for sessions</title><link>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!492.entry</link><description>While I was away we announced the dates for &lt;a href="http://www.developerday.co.uk/ddd/default.asp"&gt;DDD6&lt;/a&gt;. It will be on the 24th November. DDD is a premier UK community event, free to attend and held at a weekend. It it always over-subscribed, so fix the date in your calendar and watch this space for more.&lt;br&gt;&lt;br&gt;As usual we are looking for community speakers to&lt;a href="http://www.developerday.co.uk/ddd/agendaddd6.asp"&gt; submit sessions&lt;/a&gt;. Once we have a full agenda we will ask the public to vote on those sessions that they would like to see. Remember DDD is a conference that you, the community, shape both by proposing the sessions and by deciding which sessions happen.&lt;br&gt;&lt;br&gt;Looking forward to seeing you there.&lt;br&gt;&lt;br&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8913799585426915684&amp;page=RSS%3a+DDD6+and+call+for+sessions&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=iancooper.spaces.live.com&amp;amp;GT1=iancooper"&gt;</description><category>Computers and Internet</category><comments>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!492.entry#comment</comments><guid isPermaLink="true">http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!492.entry</guid><pubDate>Mon, 01 Oct 2007 08:43:59 GMT</pubDate><slash:comments>6</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://iancooper.spaces.live.com/blog/cns!844BD2811F9ABE9C!492/comments/feed.rss</wfw:commentRss><wfw:comment>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!492.entry#comment</wfw:comment><dcterms:modified>2007-10-01T08:43:59Z</dcterms:modified></item><item><title>VBUG Conference: 17th and 18th October</title><link>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!487.entry</link><description>&lt;div&gt;Hi guys,&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;I just wanted to pass on a reminder that VBUG have their conference on 17th and 18th of October at Microsoft in Reading (same place as DDD). There is a good line up, and you don't have to put up with me speaking this time. You can find out more at: &lt;/div&gt;
&lt;div&gt;&lt;a href="http://www.vbug.net/Conference/2007/default.aspx"&gt;http://www.vbug.net/Conference/2007/default.aspx&lt;/a&gt; &lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8913799585426915684&amp;page=RSS%3a+VBUG+Conference%3a+17th+and+18th+October&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=iancooper.spaces.live.com&amp;amp;GT1=iancooper"&gt;</description><comments>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!487.entry#comment</comments><guid isPermaLink="true">http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!487.entry</guid><pubDate>Tue, 11 Sep 2007 21:18:23 GMT</pubDate><slash:comments>4</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://iancooper.spaces.live.com/blog/cns!844BD2811F9ABE9C!487/comments/feed.rss</wfw:commentRss><wfw:comment>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!487.entry#comment</wfw:comment><dcterms:modified>2007-09-11T21:18:23Z</dcterms:modified></item><item><title>September 27th: Partial Rendering for AJAX Purists and AJAX Real Programmers</title><link>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!486.entry</link><description>On 27th September the London .NET user group will be hosting noted .NET author and speaker &lt;a href="http://weblogs.asp.net/despos/"&gt;Dino Esposito&lt;/a&gt;. We will be at Microsoft's &lt;a href="http://download.microsoft.com/documents/uk/about/downloads/victoria_map.pdf"&gt;new venue in Victoria&lt;/a&gt; (start time 7pm). This will be a great talk and I encourage you to sign up to attend either via mailing us through our &lt;a href="http://www.dnug.org.uk/"&gt;website &lt;/a&gt;or by joining our &lt;a href="http://groups.yahoo.com/group/londondotnet/"&gt;yahoo group&lt;/a&gt;&lt;br&gt;&lt;p&gt;&lt;u&gt;&lt;font color=navy face=Arial size=2&gt;&lt;span style="font-size:10pt;color:navy;font-family:Arial"&gt;Partial Rendering for 
AJAX Purists and AJAX Real Programmers&lt;/span&gt;&lt;/font&gt;&lt;/u&gt;

&lt;p&gt;&lt;font color=navy face=Arial size=2&gt;&lt;span style="font-size:10pt;color:navy;font-family:Arial"&gt;The advent of AJAX is 
radically modifying the user’s perception of a Web application and it is 
subsequently forcing developers to apply newer and richer models to build modern 
Web applications. In ASP.NET AJAX Extensions, we find two approaches to AJAX : 
partial rendering and script services. As dramatic as it may seem, only the 
second approach is pure AJAX . Partial rendering has little to do with AJAX , 
but it's an incredibly smart trick that brings with it flicker-free pages. In 
this talk, I'll give an architectural perspective of partial rendering and 
unveil some of its inner secrets&lt;/span&gt;&lt;/font&gt;&lt;br&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8913799585426915684&amp;page=RSS%3a+September+27th%3a+Partial+Rendering+for+AJAX+Purists+and+AJAX+Real+Programmers&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=iancooper.spaces.live.com&amp;amp;GT1=iancooper"&gt;</description><comments>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!486.entry#comment</comments><guid isPermaLink="true">http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!486.entry</guid><pubDate>Mon, 10 Sep 2007 16:08:57 GMT</pubDate><slash:comments>6</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://iancooper.spaces.live.com/blog/cns!844BD2811F9ABE9C!486/comments/feed.rss</wfw:commentRss><wfw:comment>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!486.entry#comment</wfw:comment><dcterms:modified>2007-09-14T15:01:19Z</dcterms:modified></item><item><title>Silverlight 1.0 is out, and Moonlight is providing support on Linux</title><link>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!484.entry</link><description>Silverlight, which brings the power of WPF and the CLR to the browser, hits 1.0 yesterday widening the capabilities for rich content delivery to the browser. What's more, Microsoft has inked a deal with Novell to provide Linux support through Mono's Moonlight offering. For .NET developers the fact that Microsoft is happily endorsing Mono with this kind of announcement is great news for reach.&lt;br&gt;&lt;br&gt;&lt;a href="http://blog.wired.com/monkeybites/2007/09/microsoft-launc.html"&gt;Read the news over at Wired&lt;/a&gt;.&lt;br&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-8913799585426915684&amp;page=RSS%3a+Silverlight+1.0+is+out%2c+and+Moonlight+is+providing+support+on+Linux&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=iancooper.spaces.live.com&amp;amp;GT1=iancooper"&gt;</description><comments>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!484.entry#comment</comments><guid isPermaLink="true">http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!484.entry</guid><pubDate>Wed, 05 Sep 2007 12:51:06 GMT</pubDate><slash:comments>2</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://iancooper.spaces.live.com/blog/cns!844BD2811F9ABE9C!484/comments/feed.rss</wfw:commentRss><wfw:comment>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!484.entry#comment</wfw:comment><dcterms:modified>2007-09-05T12:51:06Z</dcterms:modified></item><item><title>VBUG Brighton</title><link>http://iancooper.spaces.live.com/Blog/cns!844BD2811F9ABE9C!483.entry</link><description>I went down to &lt;a href="http://www.vbug.com/"&gt;VBUG&lt;/a&gt; Brighton last night to give my presentations on &lt;a href="http://msdn2.microsoft.com/en-gb/netframework/aa904594.aspx"&gt;LINQ &lt;/a&gt;(the general one) and &lt;a href="http://weblogs.asp.net/scottgu/archive/2007/08/27/linq-to-sql-part-8-executing-custom-sql-expressions.aspx"&gt;LINQ to SQL&lt;/a&gt; (the deeper dive on one of the LINQ technologies). It was a good crowd, and still feels quite local to me (I'm one of those Londoners that likes to think of Brighton as London-On-Sea, which probably offends everyone living in Brighton.&lt;br&gt;&lt;br&gt;There was a huge turnout from local software house &lt;a href="http://www.madgex.com/"&gt;Madgex&lt;/a&gt;, the team behind the &lt;a href="http://mixuk07.backnetwork.com/"&gt;Mix UK 07 back network&lt;/a&gt;. When I see this kind of commitment from a team to personal learning, I always suspect that their shop is a great place for developers to work, and the conversations with the team and their questions certainly left me with the impression that they were a switched on group. I'm told they are hiring too, so if you on the south coast and looki