<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="http://www.codeplex.com/rss.xsl"?><rss version="2.0"><channel><title>NMVP Framework</title><link>http://www.codeplex.com/nmvp/Project/ProjectRss.aspx</link><description>NMVP is a framework for creating Composite MVP Architectures.   MVP is an achronym for Model-View-Presenter and is a widespread pattern for development of UI&amp;#180;s with less coupling.</description><item><title>New Post: MVP Pattern Reuse Pages</title><link>http://www.codeplex.com/nmvp/Thread/View.aspx?ThreadId=39096</link><description>&lt;div style="line-height: normal;"&gt;&lt;div id="ctl00_ctl00_MasterContent_TabContentPanel_Content_PostRepeater_ctl00_BodyDiv"&gt;&lt;span style="font-family:arial"&gt;&lt;span style="font-family:verdana"&gt;Hi,&lt;/span&gt;
&lt;p&gt;&lt;span style="font-family:verdana"&gt;I have multiple aspx pages which have the same layout but differs in the data being populated based on the query string coming to the page and other Business rules.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:verdana"&gt;Is there anyway i can combine these redundant aspx pages into one single aspx page in MVP pattern??&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:verdana"&gt;I am using same view in all the redundant aspx pages as of now.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:verdana"&gt;&lt;strong&gt;Does this open source framework solves my problem above?&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:verdana"&gt;Any comments or suggestions here are welcome.&lt;/span&gt;&lt;/p&gt;
&lt;p align=left&gt;&lt;span style="font-family:verdana"&gt;&lt;/span&gt; &lt;span style="font-family:verdana"&gt;Thanks in advance.&lt;/span&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;</description><author>PradeepY</author><pubDate>Mon, 03 Nov 2008 15:29:46 GMT</pubDate><guid isPermaLink="false">New Post: MVP Pattern Reuse Pages 20081103032946P</guid></item><item><title>UPDATED WIKI: Home</title><link>http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Home&amp;version=49</link><description>&lt;div class="wikidoc"&gt;
&lt;img src="http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=nmvp&amp;amp;DownloadId=4148" alt="logo2.gif" /&gt;&lt;br /&gt;&lt;h1&gt;
Welcome to Project NMVP Framework
&lt;/h1&gt; &lt;br /&gt;Project NMVP has moved to &lt;a href="http://stormwind-trac.cvsdude.com/NMVP" class="externalLink"&gt;http://stormwind-trac.cvsdude.com/NMVP&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;. This is the NMVP TRAC site for Stormwind Community. We'll be improving it from there.&lt;br /&gt; &lt;br /&gt;Check out our new community website at &lt;a href="http://www.stormwindproject.org/" class="externalLink"&gt;http://www.stormwindproject.org/&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;To check out the 1.0.0 Vision Statement Document go here: &lt;a href="http://stormwind-trac.cvsdude.com/NMVP/wiki/Documentation" class="externalLink"&gt;http://stormwind-trac.cvsdude.com/NMVP/wiki/Documentation&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;To check on the Home Page for CodePlex as it used to be go here: &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=OldFirstPage&amp;amp;referringTitle=Home"&gt;OldFirstPage&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;</description><author>Ohad</author><pubDate>Fri, 02 Nov 2007 20:24:50 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: Home 20071102082450P</guid></item><item><title>NEW POST: NMVP Project</title><link>http://www.codeplex.com/nmvp/Thread/View.aspx?ThreadId=16906</link><description>&lt;div class="wikidoc"&gt;
Hmmm... I just now see the phpBB forums.&lt;br /&gt;
&lt;/div&gt;</description><author>Ohad</author><pubDate>Thu, 25 Oct 2007 08:23:21 GMT</pubDate><guid isPermaLink="false">NEW POST: NMVP Project 20071025082321A</guid></item><item><title>NEW POST: NMVP Project</title><link>http://www.codeplex.com/nmvp/Thread/View.aspx?ThreadId=16906</link><description>&lt;div class="wikidoc"&gt;
So, finally I've started working with this project, and I start reviewing its code, and this project looks like great project (I didn't like MonoRail, and as I said in the previous post - I was looking for a MVC / MVP framework to work with)&lt;br /&gt; &lt;br /&gt;The question are:&lt;br /&gt;1. Are you still working on this project?&lt;br /&gt;2. What next? I'd like to help with this project. As I was saying - I'm an ASP.NET developer so I can help with the Web project.&lt;br /&gt;3. What with the Stormwind? You were writing:&lt;br /&gt;&amp;quot;Now our next steps are to get the Web Site for the Community online (Any help is immensely appreciated) and a forum (that one will be easier since we already have one chosen). We'll probably be providing blogs for the community in blogs.stormwindproject.org.&amp;quot;&lt;br /&gt; &lt;br /&gt;Are you looking for a community and a forum? what about CommunityServer? or Yet another forum?&lt;br /&gt;&lt;a href="http://www.yetanotherforum.net/" class="externalLink"&gt;http://www.yetanotherforum.net/&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;BTW,&lt;br /&gt;42 is &lt;b&gt;not&lt;/b&gt; the answer to life.&lt;br /&gt; &lt;br /&gt;Ohad&lt;br /&gt;
&lt;/div&gt;</description><author>Ohad</author><pubDate>Thu, 25 Oct 2007 08:16:05 GMT</pubDate><guid isPermaLink="false">NEW POST: NMVP Project 20071025081605A</guid></item><item><title>NEW POST: Is this project still active?</title><link>http://www.codeplex.com/nmvp/Thread/View.aspx?ThreadId=13805</link><description>&lt;div class="wikidoc"&gt;
k... :)&lt;br /&gt;
&lt;/div&gt;</description><author>Ohad</author><pubDate>Thu, 30 Aug 2007 05:15:25 GMT</pubDate><guid isPermaLink="false">NEW POST: Is this project still active? 20070830051525A</guid></item><item><title>NEW POST: Is this project still active?</title><link>http://www.codeplex.com/nmvp/Thread/View.aspx?ThreadId=13805</link><description>&lt;div class="wikidoc"&gt;
I am... I got pulse...&lt;br /&gt;:)&lt;br /&gt;I&amp;#180;m waiting on your evaluation of the NMVP code :)&lt;br /&gt; &lt;br /&gt;Thanks&lt;br /&gt;
&lt;/div&gt;</description><author>Heynemann</author><pubDate>Wed, 29 Aug 2007 14:00:31 GMT</pubDate><guid isPermaLink="false">NEW POST: Is this project still active? 20070829020031P</guid></item><item><title>NEW POST: Is this project still active?</title><link>http://www.codeplex.com/nmvp/Thread/View.aspx?ThreadId=13805</link><description>&lt;div class="wikidoc"&gt;
Are you alive?&lt;br /&gt;
&lt;/div&gt;</description><author>Ohad</author><pubDate>Wed, 29 Aug 2007 13:02:52 GMT</pubDate><guid isPermaLink="false">NEW POST: Is this project still active? 20070829010252P</guid></item><item><title>NEW POST: Is this project still active?</title><link>http://www.codeplex.com/nmvp/Thread/View.aspx?ThreadId=13805</link><description>&lt;div class="wikidoc"&gt;
Great! I thought that this project is dead,&lt;br /&gt; &lt;br /&gt;I hope I'll have enough time next week to go over the code, and try it,&lt;br /&gt;In the last month I was learning about MVC/MVP, and maybe I will help you!&lt;br /&gt; &lt;br /&gt;I'm a webdeveloper (ASP.NET, C#, and in the past Classic ASP).&lt;br /&gt; &lt;br /&gt;Ohad.&lt;br /&gt;
&lt;/div&gt;</description><author>Ohad</author><pubDate>Sun, 26 Aug 2007 19:24:16 GMT</pubDate><guid isPermaLink="false">NEW POST: Is this project still active? 20070826072416P</guid></item><item><title>UPDATED WIKI: OldFirstPage</title><link>http://www.codeplex.com/nmvp/Wiki/View.aspx?title=OldFirstPage&amp;version=4</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;&lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Features&amp;amp;referringTitle=OldFirstPage"&gt;Features&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Tutorial&amp;amp;referringTitle=OldFirstPage"&gt;Tutorial&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Documentation&amp;amp;referringTitle=OldFirstPage"&gt;Documentation&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Downloads&amp;amp;referringTitle=OldFirstPage"&gt;Downloads&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Links&amp;amp;referringTitle=OldFirstPage"&gt;Links&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=F.A.Q.&amp;amp;referringTitle=OldFirstPage"&gt;F.A.Q.&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Glossary&amp;amp;referringTitle=OldFirstPage"&gt;Glossary&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Current%20Release&amp;amp;referringTitle=OldFirstPage"&gt;Current Release&lt;/a&gt;&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://www.codeplex.com/nmvp/Project/FileDownload.aspx?DownloadId=17859" alt="logo2.gif" /&gt;&lt;br /&gt;&lt;h1&gt;
Welcome to Project NMVP Framework
&lt;/h1&gt; &lt;br /&gt;&lt;h2&gt;
News
&lt;/h2&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt; Date &lt;/th&gt;&lt;th&gt; News &lt;/th&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; 16-Aug-2007 &lt;/td&gt;&lt;td&gt; NMVP V1.0.0 is in the Oven - Help out by contributing to it's vision statement at &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=v10Vision&amp;amp;referringTitle=OldFirstPage"&gt;Vision Statement&lt;/a&gt;. By the way, 21.000+ visitors to the project and growing. Thanks for the interest guys!&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; 11-Feb-2007 &lt;/td&gt;&lt;td&gt; The first three chapters of the book &amp;quot;NMVP Inside-Out&amp;quot; have been released! Make sure you check them out &lt;a href="http://manicprogrammer.com/cs/blogs/heynemann/archive/2007/02/11/377.aspx" class="externalLink"&gt;here&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;! &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; 03-Feb-2007 &lt;/td&gt;&lt;td&gt; Release &lt;a href="http://www.codeplex.com/nmvp/Release/ProjectReleases.aspx?ReleaseId=1708"&gt;0.3.0 Production&lt;/a&gt; is out! This is the release that features both bindable MvpContainer for ASP.Net and the new MockFactory that allows for ZERO-WORK mocking! Be sure to check both out! &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; 03-Feb-2007 &lt;/td&gt;&lt;td&gt; Srihari Suresh joined the team! Welcome aboard buddy! &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; 27-Jan-2007 &lt;/td&gt;&lt;td&gt; Release &lt;a href="http://www.codeplex.com/nmvp/Release/ProjectReleases.aspx?ReleaseId=1494"&gt;0.2.0 Production&lt;/a&gt; is out! It has tons of new features and a tutorial on all of those as well as framework structure explanation will be posted soon. Keep posted! &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;b&gt;Showing News 1-5 of 12&lt;/b&gt; - &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=News&amp;amp;referringTitle=OldFirstPage"&gt;Click here for older news&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Staff
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=BernardoBio&amp;amp;referringTitle=OldFirstPage"&gt;Bernardo Heynemann&lt;/a&gt; - Coordinator&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=MarcioBio&amp;amp;referringTitle=OldFirstPage"&gt;M&amp;#225;rcio Duarte&lt;/a&gt; - Developer&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=SadekBio&amp;amp;referringTitle=OldFirstPage"&gt;Sadek Drobi&lt;/a&gt; - Developer&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=SrihariBio&amp;amp;referringTitle=OldFirstPage"&gt;Srihari Suresh&lt;/a&gt; - Developer&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;NMVP&lt;/b&gt; is an acronym for .&lt;b&gt;N&lt;/b&gt;et &lt;b&gt;M&lt;/b&gt;odel-&lt;b&gt;V&lt;/b&gt;iew-&lt;b&gt;P&lt;/b&gt;resenter Framework.&lt;br /&gt;The NMVP Framework is a framework for helping in building Model-View-Presenter (MVP) based UI architectures.&lt;br /&gt; &lt;br /&gt;Even though it&amp;#180;s possible to create very simple MVP Architectures using NMVP, it really shines when used to build Composite MVP Architectures. If you don&amp;#180;t know MVP yet, please check out our &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Links&amp;amp;referringTitle=OldFirstPage"&gt;Links&lt;/a&gt; page. There are several good articles about it there.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Intro
&lt;/h2&gt;First let&amp;#180;s understand what every component does in the bigger picture. Each one of these classes is better documented in the reference of the project (that comes with each release).&lt;br /&gt; &lt;br /&gt;&lt;img src="http://www.codeplex.com/nmvp/Project/FileDownload.aspx?DownloadId=17860" alt="NMVP.Classes.jpg" /&gt;&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Resolver - This is the Dependency Injection container and is responsible for resolving a fully configured and hooked &lt;b&gt;HostPresenter&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Host Presenter - The HostPresenter class is responsible for orchestrating every single other presenter. This is the component that receives the Init, Load and Save calls from the Host (the ASP.Net Page for instance). This class has references to the current Security Context (ISecurityContext), the current Configuration Context (Config) and for the current Transaction Context (used for maintaining the same transaction across different presenter calls).&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;IHost - The IHost interface is responsible for defining the contract of a Host. This interface contains a property called IsValid that is responsible for telling the HostPresenter the state of validity of the Host.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;IContract - The IContract interface defines the contract that the view must implement. Every single interface that views implement MUST inherit from this one.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;IContainer - The IContainer interface defines a container. A container is a model that has dynamic models attached to it. Likely this model will be used for multiple relationships like participants on a project, for instance (you don&amp;#180;t know at first hand how many there will be, so you need a dynamic container).&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;ISecurityContext - The ISecurityContext interface is responsible for defining a security context model. Any implementation of this interface can be used in the framework as Security Context.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Config - The Config class is responsible for obtaining the current MVP configuration (for the model being executed). This class reads this configurations of a XML configuration file.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;PresenterBase - The PresenterBase class is the base class of the generic presenter. It has a few base implementations of the main methods, and a few important properties and events.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Presenter&amp;lt;&amp;gt; - The Presenter&amp;lt;&amp;gt; class is the base class from whom all the presenters (all but the Container ones) must inherit, since it allows a type-safe usage of the Model that the presenter is bound to. This class inherits from PresenterBase.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;ContainerPresenterBase - The ContainerPresenterBase class is responsible for performing container presenter operations. This is the class that the generic ContainerPresenter inherits from. This class inherits from PresenterBase.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;ContainerPresenter&amp;lt;&amp;gt; - The ContainerPresenter&amp;lt;&amp;gt; class is the class from whom all the ContainerPresenter classes must inherit, since it allows a type-safe usage of the Container that the presenter is bound to. This class inherits from ContainerPresenterBase.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;h2&gt;
ASP.Net Support
&lt;/h2&gt; &lt;br /&gt;&lt;img src="http://www.codeplex.com/nmvp/Project/FileDownload.aspx?DownloadId=17861" alt="NMVP.Web.jpg" /&gt;&lt;br /&gt; &lt;br /&gt;NMVp supports ASP.Net usage of presenters by default. If you want your page and/or user controls to be automatically hooked to their presenters all you have to do is inherit from MvpPage or MvpUserControl and everything gets done for you.&lt;br /&gt; &lt;br /&gt;If you inherit from MvpPage all you have to do is add the presenter class full name in the header of your page:&lt;br /&gt; &lt;br /&gt;&amp;lt;%@ Page Language=&amp;quot;C#&amp;quot; AutoEventWireup=&amp;quot;true&amp;quot; Codebehind=&amp;quot;LoginMvpPage.aspx.cs&amp;quot; Inherits=&amp;quot;NMvp.Web.Testing.LoginMvpPage&amp;quot;&lt;br /&gt;	&lt;b&gt;PresenterId=&amp;quot;NMvp.TestModel.Login.LoginFormPresenter, NMvp.TestModel&amp;quot;&lt;/b&gt; %&amp;gt;&lt;br /&gt; &lt;br /&gt;If you prefer that it&amp;#180;s an user control, just add the presenter class full name to the user control declaration:&lt;br /&gt; &lt;br /&gt;&amp;lt;uc1:MvpLoginForm ID=&amp;quot;MvpLoginForm1&amp;quot; runat=&amp;quot;server&amp;quot; &lt;b&gt;PresenterId=&amp;quot;NMvp.TestModel.Login.LoginFormPresenter, NMvp.TestModel&amp;quot;&lt;/b&gt; /&amp;gt;&lt;br /&gt; &lt;br /&gt;Those are the main features. More details will be loaded here in the wiki at a later time.&lt;br /&gt;
&lt;/div&gt;</description><author>Heynemann</author><pubDate>Sun, 26 Aug 2007 04:25:06 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: OldFirstPage 20070826042506A</guid></item><item><title>UPDATED WIKI: Home</title><link>http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Home&amp;version=48</link><description>&lt;div class="wikidoc"&gt;
&lt;img src="http://www.codeplex.com/nmvp/Project/FileDownload.aspx?DownloadId=4148" alt="logo2.gif" /&gt;&lt;br /&gt;&lt;h1&gt;
Welcome to Project NMVP Framework
&lt;/h1&gt; &lt;br /&gt;Project NMVP has moved to &lt;a href="http://stormwind-trac.cvsdude.com/NMVP" class="externalLink"&gt;http://stormwind-trac.cvsdude.com/NMVP&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;. This is the NMVP TRAC site for Stormwind Community. We'll be improving it from there.&lt;br /&gt; &lt;br /&gt;Soon there will be more news about it here.&lt;br /&gt; &lt;br /&gt;To check out the 1.0.0 Vision Statement Document go here: &lt;a href="http://stormwind-trac.cvsdude.com/NMVP/wiki/Documentation" class="externalLink"&gt;http://stormwind-trac.cvsdude.com/NMVP/wiki/Documentation&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;To check on the Home Page for CodePlex as it used to be go here: &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=OldFirstPage&amp;amp;referringTitle=Home"&gt;OldFirstPage&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;</description><author>Heynemann</author><pubDate>Sun, 26 Aug 2007 04:24:12 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: Home 20070826042412A</guid></item><item><title>UPDATED WIKI: Home</title><link>http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Home&amp;version=47</link><description>&lt;div class="wikidoc"&gt;
&lt;img src="http://www.codeplex.com/nmvp/Project/FileDownload.aspx?DownloadId=4148" alt="logo2.gif" /&gt;&lt;br /&gt;&lt;h1&gt;
Welcome to Project NMVP Framework
&lt;/h1&gt;&lt;img src="http://www.codeplex.com/nmvp/Project/FileDownload.aspx?DownloadId=5309" alt="NMVP.Classes.jpg" /&gt;&lt;br /&gt;&lt;img src="http://www.codeplex.com/nmvp/Project/FileDownload.aspx?DownloadId=5310" alt="NMVP.Web.jpg" /&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Project NMVP has moved to &lt;a href="http://stormwind-trac.cvsdude.com/NMVP" class="externalLink"&gt;http://stormwind-trac.cvsdude.com/NMVP&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;. This is the NMVP TRAC site for Stormwind Community. We'll be improving it from there.&lt;br /&gt; &lt;br /&gt;Soon there will be more news about it here.&lt;br /&gt; &lt;br /&gt;To check out the 1.0.0 Vision Statement Document go here: &lt;a href="http://stormwind-trac.cvsdude.com/NMVP/wiki/Documentation" class="externalLink"&gt;http://stormwind-trac.cvsdude.com/NMVP/wiki/Documentation&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;To check on the Home Page for CodePlex as it used to be go here: &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=OldFirstPage&amp;amp;referringTitle=Home"&gt;OldFirstPage&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;</description><author>Heynemann</author><pubDate>Sun, 26 Aug 2007 04:23:44 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: Home 20070826042344A</guid></item><item><title>UPDATED WIKI: OldFirstPage</title><link>http://www.codeplex.com/nmvp/Wiki/View.aspx?title=OldFirstPage&amp;version=3</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;&lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Features&amp;amp;referringTitle=OldFirstPage"&gt;Features&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Tutorial&amp;amp;referringTitle=OldFirstPage"&gt;Tutorial&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Documentation&amp;amp;referringTitle=OldFirstPage"&gt;Documentation&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Downloads&amp;amp;referringTitle=OldFirstPage"&gt;Downloads&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Links&amp;amp;referringTitle=OldFirstPage"&gt;Links&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=F.A.Q.&amp;amp;referringTitle=OldFirstPage"&gt;F.A.Q.&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Glossary&amp;amp;referringTitle=OldFirstPage"&gt;Glossary&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Current%20Release&amp;amp;referringTitle=OldFirstPage"&gt;Current Release&lt;/a&gt;&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;img src="http://www.codeplex.com/nmvp/Project/FileDownload.aspx?DownloadId=17859" alt="logo2.gif" /&gt;&lt;br /&gt;&lt;h1&gt;
Welcome to Project NMVP Framework
&lt;/h1&gt; &lt;br /&gt;&lt;h2&gt;
News
&lt;/h2&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt; Date &lt;/th&gt;&lt;th&gt; News &lt;/th&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; 16-Aug-2007 &lt;/td&gt;&lt;td&gt; NMVP V1.0.0 is in the Oven - Help out by contributing to it's vision statement at &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=v10Vision&amp;amp;referringTitle=OldFirstPage"&gt;Vision Statement&lt;/a&gt;. By the way, 21.000+ visitors to the project and growing. Thanks for the interest guys!&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; 11-Feb-2007 &lt;/td&gt;&lt;td&gt; The first three chapters of the book &amp;quot;NMVP Inside-Out&amp;quot; have been released! Make sure you check them out &lt;a href="http://manicprogrammer.com/cs/blogs/heynemann/archive/2007/02/11/377.aspx" class="externalLink"&gt;here&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;! &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; 03-Feb-2007 &lt;/td&gt;&lt;td&gt; Release &lt;a href="http://www.codeplex.com/nmvp/Release/ProjectReleases.aspx?ReleaseId=1708"&gt;0.3.0 Production&lt;/a&gt; is out! This is the release that features both bindable MvpContainer for ASP.Net and the new MockFactory that allows for ZERO-WORK mocking! Be sure to check both out! &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; 03-Feb-2007 &lt;/td&gt;&lt;td&gt; Srihari Suresh joined the team! Welcome aboard buddy! &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; 27-Jan-2007 &lt;/td&gt;&lt;td&gt; Release &lt;a href="http://www.codeplex.com/nmvp/Release/ProjectReleases.aspx?ReleaseId=1494"&gt;0.2.0 Production&lt;/a&gt; is out! It has tons of new features and a tutorial on all of those as well as framework structure explanation will be posted soon. Keep posted! &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;b&gt;Showing News 1-5 of 12&lt;/b&gt; - &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=News&amp;amp;referringTitle=OldFirstPage"&gt;Click here for older news&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Staff
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=BernardoBio&amp;amp;referringTitle=OldFirstPage"&gt;Bernardo Heynemann&lt;/a&gt; - Coordinator&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=MarcioBio&amp;amp;referringTitle=OldFirstPage"&gt;M&amp;#225;rcio Duarte&lt;/a&gt; - Developer&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=SadekBio&amp;amp;referringTitle=OldFirstPage"&gt;Sadek Drobi&lt;/a&gt; - Developer&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=SrihariBio&amp;amp;referringTitle=OldFirstPage"&gt;Srihari Suresh&lt;/a&gt; - Developer&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;NMVP&lt;/b&gt; is an acronym for .&lt;b&gt;N&lt;/b&gt;et &lt;b&gt;M&lt;/b&gt;odel-&lt;b&gt;V&lt;/b&gt;iew-&lt;b&gt;P&lt;/b&gt;resenter Framework.&lt;br /&gt;The NMVP Framework is a framework for helping in building Model-View-Presenter (MVP) based UI architectures.&lt;br /&gt; &lt;br /&gt;Even though it&amp;#180;s possible to create very simple MVP Architectures using NMVP, it really shines when used to build Composite MVP Architectures. If you don&amp;#180;t know MVP yet, please check out our &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Links&amp;amp;referringTitle=OldFirstPage"&gt;Links&lt;/a&gt; page. There are several good articles about it there.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Intro
&lt;/h2&gt;First let&amp;#180;s understand what every component does in the bigger picture. Each one of these classes is better documented in the reference of the project (that comes with each release).&lt;br /&gt; &lt;br /&gt;&lt;span class="unresolved"&gt;Cannot resolve link: &lt;/span&gt;[image:NMVP.Classes.jpg]&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Resolver - This is the Dependency Injection container and is responsible for resolving a fully configured and hooked &lt;b&gt;HostPresenter&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Host Presenter - The HostPresenter class is responsible for orchestrating every single other presenter. This is the component that receives the Init, Load and Save calls from the Host (the ASP.Net Page for instance). This class has references to the current Security Context (ISecurityContext), the current Configuration Context (Config) and for the current Transaction Context (used for maintaining the same transaction across different presenter calls).&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;IHost - The IHost interface is responsible for defining the contract of a Host. This interface contains a property called IsValid that is responsible for telling the HostPresenter the state of validity of the Host.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;IContract - The IContract interface defines the contract that the view must implement. Every single interface that views implement MUST inherit from this one.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;IContainer - The IContainer interface defines a container. A container is a model that has dynamic models attached to it. Likely this model will be used for multiple relationships like participants on a project, for instance (you don&amp;#180;t know at first hand how many there will be, so you need a dynamic container).&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;ISecurityContext - The ISecurityContext interface is responsible for defining a security context model. Any implementation of this interface can be used in the framework as Security Context.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Config - The Config class is responsible for obtaining the current MVP configuration (for the model being executed). This class reads this configurations of a XML configuration file.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;PresenterBase - The PresenterBase class is the base class of the generic presenter. It has a few base implementations of the main methods, and a few important properties and events.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Presenter&amp;lt;&amp;gt; - The Presenter&amp;lt;&amp;gt; class is the base class from whom all the presenters (all but the Container ones) must inherit, since it allows a type-safe usage of the Model that the presenter is bound to. This class inherits from PresenterBase.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;ContainerPresenterBase - The ContainerPresenterBase class is responsible for performing container presenter operations. This is the class that the generic ContainerPresenter inherits from. This class inherits from PresenterBase.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;ContainerPresenter&amp;lt;&amp;gt; - The ContainerPresenter&amp;lt;&amp;gt; class is the class from whom all the ContainerPresenter classes must inherit, since it allows a type-safe usage of the Container that the presenter is bound to. This class inherits from ContainerPresenterBase.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;h2&gt;
ASP.Net Support
&lt;/h2&gt; &lt;br /&gt;&lt;span class="unresolved"&gt;Cannot resolve link: &lt;/span&gt;[image:NMVP.Web.jpg]&lt;br /&gt; &lt;br /&gt;NMVp supports ASP.Net usage of presenters by default. If you want your page and/or user controls to be automatically hooked to their presenters all you have to do is inherit from MvpPage or MvpUserControl and everything gets done for you.&lt;br /&gt; &lt;br /&gt;If you inherit from MvpPage all you have to do is add the presenter class full name in the header of your page:&lt;br /&gt; &lt;br /&gt;&amp;lt;%@ Page Language=&amp;quot;C#&amp;quot; AutoEventWireup=&amp;quot;true&amp;quot; Codebehind=&amp;quot;LoginMvpPage.aspx.cs&amp;quot; Inherits=&amp;quot;NMvp.Web.Testing.LoginMvpPage&amp;quot;&lt;br /&gt;	&lt;b&gt;PresenterId=&amp;quot;NMvp.TestModel.Login.LoginFormPresenter, NMvp.TestModel&amp;quot;&lt;/b&gt; %&amp;gt;&lt;br /&gt; &lt;br /&gt;If you prefer that it&amp;#180;s an user control, just add the presenter class full name to the user control declaration:&lt;br /&gt; &lt;br /&gt;&amp;lt;uc1:MvpLoginForm ID=&amp;quot;MvpLoginForm1&amp;quot; runat=&amp;quot;server&amp;quot; &lt;b&gt;PresenterId=&amp;quot;NMvp.TestModel.Login.LoginFormPresenter, NMvp.TestModel&amp;quot;&lt;/b&gt; /&amp;gt;&lt;br /&gt; &lt;br /&gt;Those are the main features. More details will be loaded here in the wiki at a later time.&lt;br /&gt;
&lt;/div&gt;</description><author>Heynemann</author><pubDate>Sun, 26 Aug 2007 04:22:58 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: OldFirstPage 20070826042258A</guid></item><item><title>UPDATED WIKI: OldFirstPage</title><link>http://www.codeplex.com/nmvp/Wiki/View.aspx?title=OldFirstPage&amp;version=2</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;&lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Features&amp;amp;referringTitle=OldFirstPage"&gt;Features&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Tutorial&amp;amp;referringTitle=OldFirstPage"&gt;Tutorial&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Documentation&amp;amp;referringTitle=OldFirstPage"&gt;Documentation&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Downloads&amp;amp;referringTitle=OldFirstPage"&gt;Downloads&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Links&amp;amp;referringTitle=OldFirstPage"&gt;Links&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=F.A.Q.&amp;amp;referringTitle=OldFirstPage"&gt;F.A.Q.&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Glossary&amp;amp;referringTitle=OldFirstPage"&gt;Glossary&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Current%20Release&amp;amp;referringTitle=OldFirstPage"&gt;Current Release&lt;/a&gt;&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class="unresolved"&gt;Cannot resolve link: &lt;/span&gt;[image:logo2.gif]&lt;br /&gt;&lt;h1&gt;
Welcome to Project NMVP Framework
&lt;/h1&gt; &lt;br /&gt;&lt;h2&gt;
News
&lt;/h2&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt; Date &lt;/th&gt;&lt;th&gt; News &lt;/th&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; 16-Aug-2007 &lt;/td&gt;&lt;td&gt; NMVP V1.0.0 is in the Oven - Help out by contributing to it's vision statement at &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=v10Vision&amp;amp;referringTitle=OldFirstPage"&gt;Vision Statement&lt;/a&gt;. By the way, 21.000+ visitors to the project and growing. Thanks for the interest guys!&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; 11-Feb-2007 &lt;/td&gt;&lt;td&gt; The first three chapters of the book &amp;quot;NMVP Inside-Out&amp;quot; have been released! Make sure you check them out &lt;a href="http://manicprogrammer.com/cs/blogs/heynemann/archive/2007/02/11/377.aspx" class="externalLink"&gt;here&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;! &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; 03-Feb-2007 &lt;/td&gt;&lt;td&gt; Release &lt;a href="http://www.codeplex.com/nmvp/Release/ProjectReleases.aspx?ReleaseId=1708"&gt;0.3.0 Production&lt;/a&gt; is out! This is the release that features both bindable MvpContainer for ASP.Net and the new MockFactory that allows for ZERO-WORK mocking! Be sure to check both out! &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; 03-Feb-2007 &lt;/td&gt;&lt;td&gt; Srihari Suresh joined the team! Welcome aboard buddy! &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; 27-Jan-2007 &lt;/td&gt;&lt;td&gt; Release &lt;a href="http://www.codeplex.com/nmvp/Release/ProjectReleases.aspx?ReleaseId=1494"&gt;0.2.0 Production&lt;/a&gt; is out! It has tons of new features and a tutorial on all of those as well as framework structure explanation will be posted soon. Keep posted! &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;b&gt;Showing News 1-5 of 12&lt;/b&gt; - &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=News&amp;amp;referringTitle=OldFirstPage"&gt;Click here for older news&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Staff
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=BernardoBio&amp;amp;referringTitle=OldFirstPage"&gt;Bernardo Heynemann&lt;/a&gt; - Coordinator&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=MarcioBio&amp;amp;referringTitle=OldFirstPage"&gt;M&amp;#225;rcio Duarte&lt;/a&gt; - Developer&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=SadekBio&amp;amp;referringTitle=OldFirstPage"&gt;Sadek Drobi&lt;/a&gt; - Developer&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=SrihariBio&amp;amp;referringTitle=OldFirstPage"&gt;Srihari Suresh&lt;/a&gt; - Developer&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;NMVP&lt;/b&gt; is an acronym for .&lt;b&gt;N&lt;/b&gt;et &lt;b&gt;M&lt;/b&gt;odel-&lt;b&gt;V&lt;/b&gt;iew-&lt;b&gt;P&lt;/b&gt;resenter Framework.&lt;br /&gt;The NMVP Framework is a framework for helping in building Model-View-Presenter (MVP) based UI architectures.&lt;br /&gt; &lt;br /&gt;Even though it&amp;#180;s possible to create very simple MVP Architectures using NMVP, it really shines when used to build Composite MVP Architectures. If you don&amp;#180;t know MVP yet, please check out our &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Links&amp;amp;referringTitle=OldFirstPage"&gt;Links&lt;/a&gt; page. There are several good articles about it there.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Intro
&lt;/h2&gt;First let&amp;#180;s understand what every component does in the bigger picture. Each one of these classes is better documented in the reference of the project (that comes with each release).&lt;br /&gt; &lt;br /&gt;&lt;span class="unresolved"&gt;Cannot resolve link: &lt;/span&gt;[image:NMVP.Classes.jpg]&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Resolver - This is the Dependency Injection container and is responsible for resolving a fully configured and hooked &lt;b&gt;HostPresenter&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Host Presenter - The HostPresenter class is responsible for orchestrating every single other presenter. This is the component that receives the Init, Load and Save calls from the Host (the ASP.Net Page for instance). This class has references to the current Security Context (ISecurityContext), the current Configuration Context (Config) and for the current Transaction Context (used for maintaining the same transaction across different presenter calls).&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;IHost - The IHost interface is responsible for defining the contract of a Host. This interface contains a property called IsValid that is responsible for telling the HostPresenter the state of validity of the Host.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;IContract - The IContract interface defines the contract that the view must implement. Every single interface that views implement MUST inherit from this one.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;IContainer - The IContainer interface defines a container. A container is a model that has dynamic models attached to it. Likely this model will be used for multiple relationships like participants on a project, for instance (you don&amp;#180;t know at first hand how many there will be, so you need a dynamic container).&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;ISecurityContext - The ISecurityContext interface is responsible for defining a security context model. Any implementation of this interface can be used in the framework as Security Context.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Config - The Config class is responsible for obtaining the current MVP configuration (for the model being executed). This class reads this configurations of a XML configuration file.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;PresenterBase - The PresenterBase class is the base class of the generic presenter. It has a few base implementations of the main methods, and a few important properties and events.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Presenter&amp;lt;&amp;gt; - The Presenter&amp;lt;&amp;gt; class is the base class from whom all the presenters (all but the Container ones) must inherit, since it allows a type-safe usage of the Model that the presenter is bound to. This class inherits from PresenterBase.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;ContainerPresenterBase - The ContainerPresenterBase class is responsible for performing container presenter operations. This is the class that the generic ContainerPresenter inherits from. This class inherits from PresenterBase.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;ContainerPresenter&amp;lt;&amp;gt; - The ContainerPresenter&amp;lt;&amp;gt; class is the class from whom all the ContainerPresenter classes must inherit, since it allows a type-safe usage of the Container that the presenter is bound to. This class inherits from ContainerPresenterBase.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;h2&gt;
ASP.Net Support
&lt;/h2&gt; &lt;br /&gt;&lt;span class="unresolved"&gt;Cannot resolve link: &lt;/span&gt;[image:NMVP.Web.jpg]&lt;br /&gt; &lt;br /&gt;NMVp supports ASP.Net usage of presenters by default. If you want your page and/or user controls to be automatically hooked to their presenters all you have to do is inherit from MvpPage or MvpUserControl and everything gets done for you.&lt;br /&gt; &lt;br /&gt;If you inherit from MvpPage all you have to do is add the presenter class full name in the header of your page:&lt;br /&gt; &lt;br /&gt;&amp;lt;%@ Page Language=&amp;quot;C#&amp;quot; AutoEventWireup=&amp;quot;true&amp;quot; Codebehind=&amp;quot;LoginMvpPage.aspx.cs&amp;quot; Inherits=&amp;quot;NMvp.Web.Testing.LoginMvpPage&amp;quot;&lt;br /&gt;	&lt;b&gt;PresenterId=&amp;quot;NMvp.TestModel.Login.LoginFormPresenter, NMvp.TestModel&amp;quot;&lt;/b&gt; %&amp;gt;&lt;br /&gt; &lt;br /&gt;If you prefer that it&amp;#180;s an user control, just add the presenter class full name to the user control declaration:&lt;br /&gt; &lt;br /&gt;&amp;lt;uc1:MvpLoginForm ID=&amp;quot;MvpLoginForm1&amp;quot; runat=&amp;quot;server&amp;quot; &lt;b&gt;PresenterId=&amp;quot;NMvp.TestModel.Login.LoginFormPresenter, NMvp.TestModel&amp;quot;&lt;/b&gt; /&amp;gt;&lt;br /&gt; &lt;br /&gt;Those are the main features. More details will be loaded here in the wiki at a later time.&lt;br /&gt;
&lt;/div&gt;</description><author>Heynemann</author><pubDate>Sun, 26 Aug 2007 04:22:43 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: OldFirstPage 20070826042243A</guid></item><item><title>UPDATED WIKI: OldFirstPage</title><link>http://www.codeplex.com/nmvp/Wiki/View.aspx?title=OldFirstPage&amp;version=1</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;&lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Features&amp;amp;referringTitle=OldFirstPage"&gt;Features&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Tutorial&amp;amp;referringTitle=OldFirstPage"&gt;Tutorial&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Documentation&amp;amp;referringTitle=OldFirstPage"&gt;Documentation&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Downloads&amp;amp;referringTitle=OldFirstPage"&gt;Downloads&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Links&amp;amp;referringTitle=OldFirstPage"&gt;Links&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=F.A.Q.&amp;amp;referringTitle=OldFirstPage"&gt;F.A.Q.&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Glossary&amp;amp;referringTitle=OldFirstPage"&gt;Glossary&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Current%20Release&amp;amp;referringTitle=OldFirstPage"&gt;Current Release&lt;/a&gt;&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class="unresolved"&gt;Cannot resolve link: &lt;/span&gt;[image:logo2.gif]&lt;br /&gt;&lt;h1&gt;
Welcome to Project NMVP Framework
&lt;/h1&gt; &lt;br /&gt;&lt;h2&gt;
News
&lt;/h2&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt; Date &lt;/th&gt;&lt;th&gt; News &lt;/th&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; 16-Aug-2007 &lt;/td&gt;&lt;td&gt; NMVP V1.0.0 is in the Oven - Help out by contributing to it's vision statement at &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=v10Vision&amp;amp;referringTitle=OldFirstPage"&gt;Vision Statement&lt;/a&gt;. By the way, 21.000+ visitors to the project and growing. Thanks for the interest guys!&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; 11-Feb-2007 &lt;/td&gt;&lt;td&gt; The first three chapters of the book &amp;quot;NMVP Inside-Out&amp;quot; have been released! Make sure you check them out &lt;a href="http://manicprogrammer.com/cs/blogs/heynemann/archive/2007/02/11/377.aspx" class="externalLink"&gt;here&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;! &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; 03-Feb-2007 &lt;/td&gt;&lt;td&gt; Release &lt;a href="http://www.codeplex.com/nmvp/Release/ProjectReleases.aspx?ReleaseId=1708"&gt;0.3.0 Production&lt;/a&gt; is out! This is the release that features both bindable MvpContainer for ASP.Net and the new MockFactory that allows for ZERO-WORK mocking! Be sure to check both out! &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; 03-Feb-2007 &lt;/td&gt;&lt;td&gt; Srihari Suresh joined the team! Welcome aboard buddy! &lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt; 27-Jan-2007 &lt;/td&gt;&lt;td&gt; Release &lt;a href="http://www.codeplex.com/nmvp/Release/ProjectReleases.aspx?ReleaseId=1494"&gt;0.2.0 Production&lt;/a&gt; is out! It has tons of new features and a tutorial on all of those as well as framework structure explanation will be posted soon. Keep posted! &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;b&gt;Showing News 1-5 of 12&lt;/b&gt; - &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=News&amp;amp;referringTitle=OldFirstPage"&gt;Click here for older news&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Staff
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=BernardoBio&amp;amp;referringTitle=OldFirstPage"&gt;Bernardo Heynemann&lt;/a&gt; - Coordinator&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=MarcioBio&amp;amp;referringTitle=OldFirstPage"&gt;M&amp;#225;rcio Duarte&lt;/a&gt; - Developer&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=SadekBio&amp;amp;referringTitle=OldFirstPage"&gt;Sadek Drobi&lt;/a&gt; - Developer&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=SrihariBio&amp;amp;referringTitle=OldFirstPage"&gt;Srihari Suresh&lt;/a&gt; - Developer&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;b&gt;NMVP&lt;/b&gt; is an acronym for .&lt;b&gt;N&lt;/b&gt;et &lt;b&gt;M&lt;/b&gt;odel-&lt;b&gt;V&lt;/b&gt;iew-&lt;b&gt;P&lt;/b&gt;resenter Framework.&lt;br /&gt;The NMVP Framework is a framework for helping in building Model-View-Presenter (MVP) based UI architectures.&lt;br /&gt; &lt;br /&gt;Even though it&amp;#180;s possible to create very simple MVP Architectures using NMVP, it really shines when used to build Composite MVP Architectures. If you don&amp;#180;t know MVP yet, please check out our &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Links&amp;amp;referringTitle=OldFirstPage"&gt;Links&lt;/a&gt; page. There are several good articles about it there.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Intro
&lt;/h2&gt;First let&amp;#180;s understand what every component does in the bigger picture. Each one of these classes is better documented in the reference of the project (that comes with each release).&lt;br /&gt; &lt;br /&gt;&lt;span class="unresolved"&gt;Cannot resolve link: &lt;/span&gt;[image:NMVP.Classes.jpg]&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Resolver - This is the Dependency Injection container and is responsible for resolving a fully configured and hooked &lt;b&gt;HostPresenter&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Host Presenter - The HostPresenter class is responsible for orchestrating every single other presenter. This is the component that receives the Init, Load and Save calls from the Host (the ASP.Net Page for instance). This class has references to the current Security Context (ISecurityContext), the current Configuration Context (Config) and for the current Transaction Context (used for maintaining the same transaction across different presenter calls).&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;IHost - The IHost interface is responsible for defining the contract of a Host. This interface contains a property called IsValid that is responsible for telling the HostPresenter the state of validity of the Host.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;IContract - The IContract interface defines the contract that the view must implement. Every single interface that views implement MUST inherit from this one.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;IContainer - The IContainer interface defines a container. A container is a model that has dynamic models attached to it. Likely this model will be used for multiple relationships like participants on a project, for instance (you don&amp;#180;t know at first hand how many there will be, so you need a dynamic container).&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;ISecurityContext - The ISecurityContext interface is responsible for defining a security context model. Any implementation of this interface can be used in the framework as Security Context.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Config - The Config class is responsible for obtaining the current MVP configuration (for the model being executed). This class reads this configurations of a XML configuration file.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;PresenterBase - The PresenterBase class is the base class of the generic presenter. It has a few base implementations of the main methods, and a few important properties and events.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Presenter&amp;lt;&amp;gt; - The Presenter&amp;lt;&amp;gt; class is the base class from whom all the presenters (all but the Container ones) must inherit, since it allows a type-safe usage of the Model that the presenter is bound to. This class inherits from PresenterBase.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;ContainerPresenterBase - The ContainerPresenterBase class is responsible for performing container presenter operations. This is the class that the generic ContainerPresenter inherits from. This class inherits from PresenterBase.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;ContainerPresenter&amp;lt;&amp;gt; - The ContainerPresenter&amp;lt;&amp;gt; class is the class from whom all the ContainerPresenter classes must inherit, since it allows a type-safe usage of the Container that the presenter is bound to. This class inherits from ContainerPresenterBase.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;h2&gt;
ASP.Net Support
&lt;/h2&gt; &lt;br /&gt;&lt;span class="unresolved"&gt;Cannot resolve link: &lt;/span&gt;[image:NMVP.Web.jpg]&lt;br /&gt; &lt;br /&gt;NMVp supports ASP.Net usage of presenters by default. If you want your page and/or user controls to be automatically hooked to their presenters all you have to do is inherit from MvpPage or MvpUserControl and everything gets done for you.&lt;br /&gt; &lt;br /&gt;If you inherit from MvpPage all you have to do is add the presenter class full name in the header of your page:&lt;br /&gt; &lt;br /&gt;&amp;lt;%@ Page Language=&amp;quot;C#&amp;quot; AutoEventWireup=&amp;quot;true&amp;quot; Codebehind=&amp;quot;LoginMvpPage.aspx.cs&amp;quot; Inherits=&amp;quot;NMvp.Web.Testing.LoginMvpPage&amp;quot;&lt;br /&gt;	&lt;b&gt;PresenterId=&amp;quot;NMvp.TestModel.Login.LoginFormPresenter, NMvp.TestModel&amp;quot;&lt;/b&gt; %&amp;gt;&lt;br /&gt; &lt;br /&gt;If you prefer that it&amp;#180;s an user control, just add the presenter class full name to the user control declaration:&lt;br /&gt; &lt;br /&gt;&amp;lt;uc1:MvpLoginForm ID=&amp;quot;MvpLoginForm1&amp;quot; runat=&amp;quot;server&amp;quot; &lt;b&gt;PresenterId=&amp;quot;NMvp.TestModel.Login.LoginFormPresenter, NMvp.TestModel&amp;quot;&lt;/b&gt; /&amp;gt;&lt;br /&gt; &lt;br /&gt;Those are the main features. More details will be loaded here in the wiki at a later time.&lt;br /&gt;
&lt;/div&gt;</description><author>Heynemann</author><pubDate>Sun, 26 Aug 2007 04:22:06 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: OldFirstPage 20070826042206A</guid></item><item><title>UPDATED WIKI: Home</title><link>http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Home&amp;version=46</link><description>&lt;div class="wikidoc"&gt;
&lt;img src="http://www.codeplex.com/nmvp/Project/FileDownload.aspx?DownloadId=4148" alt="logo2.gif" /&gt;&lt;br /&gt;&lt;h1&gt;
Welcome to Project NMVP Framework
&lt;/h1&gt; &lt;br /&gt;Project NMVP has moved to &lt;a href="http://stormwind-trac.cvsdude.com/NMVP" class="externalLink"&gt;http://stormwind-trac.cvsdude.com/NMVP&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;. This is the NMVP TRAC site for Stormwind Community. We'll be improving it from there.&lt;br /&gt; &lt;br /&gt;Soon there will be more news about it here.&lt;br /&gt; &lt;br /&gt;To check out the 1.0.0 Vision Statement Document go here: &lt;a href="http://stormwind-trac.cvsdude.com/NMVP/wiki/Documentation" class="externalLink"&gt;http://stormwind-trac.cvsdude.com/NMVP/wiki/Documentation&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;To check on the Home Page for CodePlex as it used to be go here: &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=OldFirstPage&amp;amp;referringTitle=Home"&gt;OldFirstPage&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;</description><author>Heynemann</author><pubDate>Sun, 26 Aug 2007 04:21:51 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: Home 20070826042151A</guid></item><item><title>UPDATED WIKI: v10Vision</title><link>http://www.codeplex.com/nmvp/Wiki/View.aspx?title=v10Vision&amp;version=28</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;&lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Features&amp;amp;referringTitle=v10Vision"&gt;Features&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Tutorial&amp;amp;referringTitle=v10Vision"&gt;Tutorial&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Documentation&amp;amp;referringTitle=v10Vision"&gt;Documentation&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Downloads&amp;amp;referringTitle=v10Vision"&gt;Downloads&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Links&amp;amp;referringTitle=v10Vision"&gt;Links&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=F.A.Q.&amp;amp;referringTitle=v10Vision"&gt;F.A.Q.&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Glossary&amp;amp;referringTitle=v10Vision"&gt;Glossary&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Current%20Release&amp;amp;referringTitle=v10Vision"&gt;Current Release&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;h1&gt;
Version 1.0.0 Vision Statement
&lt;/h1&gt; &lt;br /&gt;&lt;h2&gt;
Introduction
&lt;/h2&gt;After several production applications using NMVP we learned some invaluable experience. The most critical points being:&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Not every UI wants to SAVE, and still the presenter comes with the Save method bundled. Not every UI needs a HOST and HOST PRESENTER, but again, the presenter has them. This confuses the developers making them use the framework in incorrect ways or worst of all, don't use them for fear to be using incorrectly.&lt;/li&gt;&lt;li&gt;Validation is hard to be done as of today, since NMVP does not help one bit in this as of today. This was very bad since the developers spread the validation logic between the presenter, the view and the domain.&lt;/li&gt;&lt;li&gt;Enabling/Disabling and Showing/Hiding fields is not accomplished correctly with IsReadOnly attribute, since it can only cover the most simple scenarios.&lt;/li&gt;&lt;li&gt;The Web Forms lifecycle makes it HARD on developers to do some trivial tasks, like AJAX. It's been HELL using NMVP with the Microsoft Ajax 1.0 Framework. It came to the point where we had to rewrite some parts of the application just to eliminate MS Ajax, and replace it with a more lightweight approach. I'm not saying it does not work. But it encourages bad behavior.&lt;/li&gt;&lt;li&gt;Devs have a hard time today setting up the NMVP structure, since it still requires a lot of effort to get Contracts, Views, Presenters and Unit Tests off the ground.&lt;/li&gt;
&lt;/ul&gt;We'll approach each of these problems at a time.&lt;br /&gt; &lt;br /&gt;Other than these issues, there are some new features that we want to improve on:&lt;br /&gt;&lt;ol&gt;
&lt;li&gt;MonoRail integration. We are aware that MonoRail is MVC. Even so, we have a vision where both can peacefully coexist, and one from which you can take advantage of what's best in each. This integration will allow a great deal of client-side integration with the MVP lifecycle through AJAX calls.&lt;/li&gt;&lt;li&gt;WebForms &lt;b&gt;better&lt;/b&gt; integration. The new features will need to be integrated with web forms. Since NMVP was built essentially to cover up for WebForms flawed &lt;a href="http://en.wikipedia.org/wiki/Separation_of_concerns" class="externalLink"&gt;SOC&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; model.&lt;/li&gt;&lt;li&gt;Assure Easier Testability - We'll have to choose here to evolve the Testing Infrastructure present in NMVP or simply go with Rhino Mocks, the best Mocking framework around.&lt;/li&gt;&lt;li&gt;Improved Namespace Organization. The namespaces of the NMVP project will probably be reorganized in the sake of clarity.&lt;/li&gt;
&lt;/ol&gt; &lt;br /&gt;&lt;h2&gt;
Backwards Compatibility
&lt;/h2&gt;This is a major concern for current users of the framework that plan on upgrading to this version: &lt;b&gt;THIS VERSION WILL NOT BE BACKWARDS COMPATIBLE&lt;/b&gt;! &lt;br /&gt; &lt;br /&gt;After thorough consideration of the pros and cons of this matter, I (Bernardo Heynemann) decided that it's in the best interest of the community to have all projects under the same umbrella and not scattered around like they are.&lt;br /&gt; &lt;br /&gt;This means the birth of project Stormwind. NMVP will now be Stormwind.NMvp, Validation Everywhere will be Stormwind.ValEver, and so on... &lt;br /&gt; &lt;br /&gt;There will be an identity between the projects that now share the same parent project. &lt;br /&gt; &lt;br /&gt;This is a good point for current users of the framework, since you'll be able to keep both versions running in the same project, as they'll have different namespaces, assembly names, assembly versions, and so on.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Stormwind Community
&lt;/h2&gt;One of the pre-requisites of NMVP Version 1.0.0 is to deploy the Stormwind Community that will feature:&lt;br /&gt;&lt;ol&gt;
&lt;li&gt;SVN Server for all the projects&lt;/li&gt;&lt;li&gt;Build Server for all the projects&lt;/li&gt;&lt;li&gt;Wiki for the Community and for each project (Project Documentation)&lt;/li&gt;&lt;li&gt;Forum for the Community and for each project&lt;/li&gt;&lt;li&gt;Tracking of bugs and change requests&lt;/li&gt;&lt;li&gt;Allow contribution of patches from the community&lt;/li&gt;&lt;li&gt;Plugin Repository for NMVP. This will allow contribution of plug-ins from the community to be integrated in the NMVP Contrib project.&lt;/li&gt;
&lt;/ol&gt;Read more about it in &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Stormwind%20Community&amp;amp;referringTitle=v10Vision"&gt;Stormwind Community&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
1 - Presenters
&lt;/h2&gt;The presenter tree as it is today makes it hard for developers to know when to use each presenter feature. Developers usually get confused on things like:&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Why is there a method Save if I don't need to Save anything?&lt;/li&gt;&lt;li&gt;Why is there a Host and HostPresenter if I don't even know what Composite MVP is?&lt;/li&gt;&lt;li&gt;What is a SecurityContext? And a TransactionContext? And a ConfigurationContext?&lt;/li&gt;
&lt;/ul&gt;Those are all valid concerns and ones that will be addressed in the next version of NMVP. We'll be providing a more meaningful tree of presenters for this new release. One that leverages only the features that the user really needs.&lt;br /&gt;The definition for this issue will be in the document &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Presenter%20Hierarchy%20for%201.0.0%20Release&amp;amp;referringTitle=v10Vision"&gt;Presenter Hierarchy for 1.0.0 Release&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
2 - Validation
&lt;/h2&gt;Validation of user input is a certain part of EVERY UI, so if NMVP is an UI Framework (Both Supervising Presenter and Passive View are UI Design Patterns and both are supported in NMVP), it's appropriate that it helps the user to deal with the Validation of views in a more straightforward way. There are two approaches here: Client-side Validation and Server-Side Validation. &lt;br /&gt; &lt;br /&gt;As of today in our production apps we have a hard time finding scenarios where client-side validation would be used alone, since we have an UI requirement of displaying ALL the validation messages to the user together (one message box only with all the messages, or one summary or whatever). I'm not saying this is a MUST have, but it's something, I as an user, like. I don't want to get a message saying that I missed several fields, only to fill them and get another message saying that the customer I'm filling ALL that data for is disabled for operations above USD10K (Server-Side validation).&lt;br /&gt; &lt;br /&gt;Even so, we have to catter for both scenarios in the framework, and I do believe that by doing the Server-Side validation correctly we already are, since there are GREAT tools out there to do client-side validation (ASP.Net Validators, MonoRail uses Prototype, JQuery, Ext just to name a few). For Windows Forms there are some good client-side ones, but if you are targeting windows forms as well as ASP.Net I'd go with Server side validation only, since it will make it easier on you to unit test validation logic, and it will get done in one place only. So we'll focus in Server side validation in this release.&lt;br /&gt; &lt;br /&gt;If there's one thing that's blurred today in NMVP usage is where do I put my validation logic? From experience developers tend to spread it among layers, so some bits go into the code-behind file, some into the Presenter, some into the Domain classes. The problem with that approach is that it's VERY hard to unit test validation logic if it's done like this. Even if you spread your validation logic between client and server, testing will be harder.&lt;br /&gt; &lt;br /&gt;So, our plans for validation is to have a ValidatingPresenter attribute, or a Validate presenter in the hierarchy that will allow validation to be performed. &lt;br /&gt; &lt;br /&gt;Server side validation will be present in two ways:&lt;br /&gt;&lt;ol&gt;
&lt;li&gt;Via attributes in the view Contract (provided by Validation Everywhere)&lt;/li&gt;&lt;li&gt;Via a Validate() method in the presenter, that will get called by the NMVP engine in the case of a validating scenario occur (more about this in the MonoRail and WebForms Integration part of the Vision Statement).&lt;/li&gt;
&lt;/ol&gt;By doing this we are concentrating the Validation of the view's data in one tier only: the MVP Tier. Neither the UI tier, nor the Domain tier have to know about validations performed for the view.&lt;br /&gt; &lt;br /&gt;One aspect that is regularly overlooked in several Validation Frameworks is how to return feedback on the validation for the developer, so he can in turn display it to the user. This subject will be dealt with in the WebForms Integration and MonoRail Integration parts of this document.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
3 - Fields State Control
&lt;/h2&gt;Enabling/Disabling and Showing/Hiding fields is a very complex task as of now in NMVP. You never know when to place this logic in the presenter or in the view, or even worse, in both. We learned the hard way that spreading this among both has a very ill effect. You get a lot of unexpected behavior because of the involved parts lifecycle (WebForms vs WinForms, ASP.Net's one, Unit testing frameworks, and so on). This way you disable a field, just to see it enabled in the UI, because in some later time somewhere in the view, the presenter or somewhere else the field got re-enabled. It's really painful to find out where this kind of thing happen.&lt;br /&gt; &lt;br /&gt;This seems to be a very trivial thing to pursue, but it's far from that. The most logical place for this kind of logic to be is in the view, but again this has some drawbacks when it comes to testability and a lot of non-trivial issues related to lifecycle, not to mention that some fields state is defined by some domain state, and as such should be defined by the presenter.&lt;br /&gt; &lt;br /&gt;Now if this logic is in the presenter, and it's very easy to get why the presenter should handle this, how can he be able to enable/disable/hide/show fields when he doesn't even know what fields are. The presenter is presentation-layer agnostic. He does not know whether the UI is in WebForms or Windows Forms. So how can he perform actions on unkown entities? Our first choice was by contract. So we defined a DisableFields() method in the contract or something like that, and just call it through the presenter if it's needed. The problem with this is that it kinda defeats the state-only contract approach that we favor. And besides, if the disabling logic is in the Presentation tier (the presenter just calls it) you would have a hard time mocking it.&lt;br /&gt; &lt;br /&gt;So right now where we stand? Well we still believe that the logic should be in the presenter, but the engine should manage somehow to make it easier on the developer to just disable fields. Something like: DisableFieldOfProperty(&amp;quot;CustomerName&amp;quot;), this would disable the field that represents the Contract CustomerName property in the view. The thing here is how would the NMVP engine have knowledge of the fields in the view.&lt;br /&gt; &lt;br /&gt;*This item is still under study, but MUST be solved by release 1.0.0.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
4 - MonoRail Integration
&lt;/h2&gt;We had a hard time in all our projects due to the WebForms life cycle. Plugging the NMVP Lifecycle (much smaller than WebForms') in the WebForms' one was really painful. Even worse, our developers made several mistakes due to how complex all the structure became. The customer wanted his forms to be full AJAX, so the picture became even uglier, since we decided at the time to go with Microsoft Ajax 1.0, which encourages several worst practices.&lt;br /&gt; &lt;br /&gt;After a lot of pain we decided that we had to look around for better solutions (or build one). We were very thrilled when we found out how advanced MonoRail was. I knew the &lt;a href="http://www.castleproject.org" class="externalLink"&gt;Castle Project&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; from way back, since NMVP is built on top of Windsor, but finding out about ActiveRecord and MonoRail was really a blessing.&lt;br /&gt; &lt;br /&gt;One of the best features of MonoRail for me is allowing the user to access a method in the controller (an action that renders a view) via it's URL. This is insanely useful on the AJAX scenario, as we really want our JavaScript code to call on the controller for any AJAX call (since the Controller is easily testable).&lt;br /&gt; &lt;br /&gt;Another great improvement is on the View Engines that make it a LOT easier to maintain pages. I wrote an entry on my blog about it &lt;a href="http://manicprogrammer.com/cs/blogs/heynemann/archive/2007/07/22/shortsighted-way-of-evaluating-your-options.aspx" class="externalLink"&gt;here&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;. The ViewComponents and Helpers are also a great addition to our toolbox.&lt;br /&gt; &lt;br /&gt;The only thing we missed in MonoRail is the contract-based approach enforced by NMVP. We learned with our teams that contract-based development really improved the way we build software in a way that we now can develop against a typed contract and not a ViewState or PropertyBag collection. I know that the web is stateless, and all you get from each Request is an HTTP message, but it's nice to have it all sorted out for me BEFORE reaching the UI logic. That's where NMVP will come on top of MonoRail.&lt;br /&gt; &lt;br /&gt;We're planning on having two special controllers: RegularController and CompositeController, responsible for, respectively, Model-View-Presenter support and Composite Model-View-Presenter Support (you can learn more about CMVP in this wiki or in my book - the draft is in my blog).&lt;br /&gt; &lt;br /&gt;We are planning some nice features for MonoRail integration:&lt;br /&gt;&lt;ol&gt;
&lt;li&gt;&amp;quot;Automagically&amp;quot; created client-side functions that hook on:&lt;/li&gt;&lt;ol&gt;
&lt;li&gt;NMVP Validation Engine&lt;/li&gt;&lt;li&gt;NMVP Security Context&lt;/li&gt;&lt;li&gt;NMVP Persistence Engine&lt;/li&gt;&lt;li&gt;NMVP Custom Plug-ins&lt;/li&gt;
&lt;/ol&gt;&lt;li&gt;Composeability of Views via CompositeController and Host.vm (view that will contain render views for all the children views).&lt;/li&gt;&lt;li&gt;Helpers for NMVP related tasks (still to be decided).&lt;/li&gt;&lt;li&gt;ViewComponents to help using NMVP container.&lt;/li&gt;
&lt;/ol&gt; &lt;br /&gt;The MonoRail integration is detailed in another vision statement for V1.0.0 - &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=monoRailv100Vision&amp;amp;referringTitle=v10Vision"&gt;MonoRail Integration Version 1.0.0 Vision Statement&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;Essentially we'll have to provide some work-around to be able to provide the same things (given the constraints) to WebForms. This integration is detailed in another vision statement for V1.0.0 - &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=webFormsv100Vision&amp;amp;referringTitle=v10Vision"&gt;WebForms Integration Version 1.0.0 Vision Statement&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Feedback
&lt;/h2&gt;We need your feedback to be able to provide a better solution to real problems. Help us help you! We're eager to hearing from you in the discussion forums.&lt;br /&gt;
&lt;/div&gt;</description><author>Heynemann</author><pubDate>Fri, 24 Aug 2007 19:20:45 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: v10Vision 20070824072045P</guid></item><item><title>UPDATED WIKI: v10Vision</title><link>http://www.codeplex.com/nmvp/Wiki/View.aspx?title=v10Vision&amp;version=27</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;&lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Features&amp;amp;referringTitle=v10Vision"&gt;Features&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Tutorial&amp;amp;referringTitle=v10Vision"&gt;Tutorial&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Documentation&amp;amp;referringTitle=v10Vision"&gt;Documentation&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Downloads&amp;amp;referringTitle=v10Vision"&gt;Downloads&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Links&amp;amp;referringTitle=v10Vision"&gt;Links&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=F.A.Q.&amp;amp;referringTitle=v10Vision"&gt;F.A.Q.&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Glossary&amp;amp;referringTitle=v10Vision"&gt;Glossary&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Current%20Release&amp;amp;referringTitle=v10Vision"&gt;Current Release&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;h1&gt;
Version 1.0.0 Vision Statement
&lt;/h1&gt; &lt;br /&gt;&lt;h2&gt;
Introduction
&lt;/h2&gt;After several production applications using NMVP we learned some invaluable experience. The most critical points being:&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Not every UI wants to SAVE, and still the presenter comes with the Save method bundled. Not every UI needs a HOST and HOST PRESENTER, but again, the presenter has them. This confuses the developers making them use the framework in incorrect ways or worst of all, don't use them for fear to be using incorrectly.&lt;/li&gt;&lt;li&gt;Validation is hard to be done as of today, since NMVP does not help one bit in this as of today. This was very bad since the developers spread the validation logic between the presenter, the view and the domain.&lt;/li&gt;&lt;li&gt;Enabling/Disabling and Showing/Hiding fields is not accomplished correctly with IsReadOnly attribute, since it can only cover the most simple scenarios.&lt;/li&gt;&lt;li&gt;The Web Forms lifecycle makes it HARD on developers to do some trivial tasks, like AJAX. It's been HELL using NMVP with the Microsoft Ajax 1.0 Framework. It came to the point where we had to rewrite some parts of the application just to eliminate MS Ajax, and replace it with a more lightweight approach. I'm not saying it does not work. But it encourages bad behavior.&lt;/li&gt;&lt;li&gt;Devs have a hard time today setting up the NMVP structure, since it still requires a lot of effort to get Contracts, Views, Presenters and Unit Tests off the ground.&lt;/li&gt;
&lt;/ul&gt;We'll approach each of these problems at a time.&lt;br /&gt; &lt;br /&gt;Other than these issues, there are some new features that we want to improve on:&lt;br /&gt;&lt;ol&gt;
&lt;li&gt;MonoRail integration. We are aware that MonoRail is MVC. Even so, we have a vision where both can peacefully coexist, and one from which you can take advantage of what's best in each. This integration will allow a great deal of client-side integration with the MVP lifecycle through AJAX calls.&lt;/li&gt;&lt;li&gt;WebForms &lt;b&gt;better&lt;/b&gt; integration. The new features will need to be integrated with web forms. Since NMVP was built essentially to cover up for WebForms flawed &lt;a href="http://en.wikipedia.org/wiki/Separation_of_concerns" class="externalLink"&gt;SOC&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; model.&lt;/li&gt;&lt;li&gt;Assure Easier Testability - We'll have to choose here to evolve the Testing Infrastructure present in NMVP or simply go with Rhino Mocks, the best Mocking framework around.&lt;/li&gt;&lt;li&gt;Improved Namespace Organization. The namespaces of the NMVP project will probably be reorganized in the sake of clarity.&lt;/li&gt;
&lt;/ol&gt; &lt;br /&gt;&lt;h2&gt;
Backwards Compatibility
&lt;/h2&gt;This is a major concern for current users of the framework that plan on upgrading to this version: &lt;b&gt;THIS VERSION WILL NOT BE BACKWARDS COMPATIBLE&lt;/b&gt;! &lt;br /&gt; &lt;br /&gt;After thorough consideration of the pros and cons of this matter, I (Bernardo Heynemann) decided that it's in the best interest of the community to have all projects under the same umbrella and not scattered around like they are.&lt;br /&gt; &lt;br /&gt;This means the birth of project Stormwind. NMVP will now be Stormwind.NMvp, Validation Everywhere will be Stormwind.ValEver, and so on... &lt;br /&gt; &lt;br /&gt;There will be an identity between the projects that now share the same parent project. &lt;br /&gt; &lt;br /&gt;This is a good point for current users of the framework, since you'll be able to keep both versions running in the same project, as they'll have different namespaces, assembly names, assembly versions, and so on.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Stormwind Community
&lt;/h2&gt;One of the pre-requisites of NMVP Version 1.0.0 is to deploy the Stormwind Community that will feature:&lt;br /&gt;&lt;ol&gt;
&lt;li&gt;SVN Server for all the projects&lt;/li&gt;&lt;li&gt;Build Server for all the projects&lt;/li&gt;&lt;li&gt;Wiki for the Community and for each project (Project Documentation)&lt;/li&gt;&lt;li&gt;Forum for the Community and for each project&lt;/li&gt;&lt;li&gt;Tracking of bugs and change requests&lt;/li&gt;&lt;li&gt;Allow contribution of patches from the community&lt;/li&gt;&lt;li&gt;Plugin Repository for NMVP. This will allow contribution of plug-ins from the community to be integrated in the NMVP Contrib project.&lt;/li&gt;
&lt;/ol&gt;Read more about it in &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Stormwind%20Community&amp;amp;referringTitle=v10Vision"&gt;Stormwind Community&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
1 - Presenters
&lt;/h2&gt;The presenter tree as it is today makes it hard for developers to know when to use each presenter feature. Developers usually get confused on things like:&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Why is there a method Save if I don't need to Save anything?&lt;/li&gt;&lt;li&gt;Why is there a Host and HostPresenter if I don't even know what Composite MVP is?&lt;/li&gt;&lt;li&gt;What is a SecurityContext? And a TransactionContext? And a ConfigurationContext?&lt;/li&gt;
&lt;/ul&gt;Those are all valid concerns and ones that will be addressed in the next version of NMVP. We'll be providing a more meaningful tree of presenters for this new release. One that leverages only the features that the user really needs.&lt;br /&gt;The definition for this issue will be in the document &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Presenter%20Hierarchy%20for%201.0.0%20Release&amp;amp;referringTitle=v10Vision"&gt;Presenter Hierarchy for 1.0.0 Release&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
2 - Validation
&lt;/h2&gt;Validation of user input is a certain part of EVERY UI, so if NMVP is an UI Framework (Both Supervising Presenter and Passive View are UI Design Patterns and both are supported in NMVP), it's appropriate that it helps the user to deal with the Validation of views in a more straightforward way. There are two approaches here: Client-side Validation and Server-Side Validation. &lt;br /&gt; &lt;br /&gt;As of today in our production apps we have a hard time finding scenarios where client-side validation would be used alone, since we have an UI requirement of displaying ALL the validation messages to the user together (one message box only with all the messages, or one summary or whatever). I'm not saying this is a MUST have, but it's something, I as an user, like. I don't want to get a message saying that I missed several fields, only to fill them and get another message saying that the customer I'm filling ALL that data for is disabled for operations above USD10K (Server-Side validation).&lt;br /&gt; &lt;br /&gt;Even so, we have to catter for both scenarios in the framework, and I do believe that by doing the Server-Side validation correctly we already are, since there are GREAT tools out there to do client-side validation (ASP.Net Validators, MonoRail uses Prototype, JQuery, Ext just to name a few). For Windows Forms there are some good client-side ones, but if you are targeting windows forms as well as ASP.Net I'd go with Server side validation only, since it will make it easier on you to unit test validation logic, and it will get done in one place only. So we'll focus in Server side validation in this release.&lt;br /&gt; &lt;br /&gt;If there's one thing that's blurred today in NMVP usage is where do I put my validation logic? From experience developers tend to spread it among layers, so some bits go into the code-behind file, some into the Presenter, some into the Domain classes. The problem with that approach is that it's VERY hard to unit test validation logic if it's done like this. Even if you spread your validation logic between client and server, testing will be harder.&lt;br /&gt; &lt;br /&gt;So, our plans for validation is to have a ValidatingPresenter attribute, or a Validate presenter in the hierarchy that will allow validation to be performed. &lt;br /&gt; &lt;br /&gt;Server side validation will be present in two ways:&lt;br /&gt;&lt;ol&gt;
&lt;li&gt;Via attributes in the view Contract (provided by Validation Everywhere)&lt;/li&gt;&lt;li&gt;Via a Validate() method in the presenter, that will get called by the NMVP engine in the case of a validating scenario occur (more about this in the MonoRail and WebForms Integration part of the Vision Statement).&lt;/li&gt;
&lt;/ol&gt;By doing this we are concentrating the Validation of the view's data in one tier only: the MVP Tier. Neither the UI tier, nor the Domaing tier have to know about validations performed for the view.&lt;br /&gt; &lt;br /&gt;One aspect that is regularly overlooked in several Validation Frameworks is how to return feedback on the validation for the developer, so he can in turn display it to the user. This subject will be dealt with in the WebForms Integration and MonoRail Integration parts of this document.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
3 - Fields State Control
&lt;/h2&gt;Enabling/Disabling and Showing/Hiding fields is a very complex task as of now in NMVP. You never know when to place this logic in the presenter or in the view, or even worse, in both. We learned the hard way that spreading this among both has a very ill effect. You get a lot of unexpected behavior because of the involved parts lifecycle (WebForms vs WinForms, ASP.Net's one, Unit testing frameworks, and so on). This way you disable a field, just to see it enabled in the UI, because in some later time somewhere in the view, the presenter or somewhere else the field got re-enabled. It's really painful to find out where this kind of thing happen.&lt;br /&gt; &lt;br /&gt;This seems to be a very trivial thing to pursue, but it's far from that. The most logical place for this kind of logic to be is in the view, but again this has some drawbacks when it comes to testability and a lot of non-trivial issues related to lifecycle, not to mention that some fields state is defined by some domain state, and as such should be defined by the presenter.&lt;br /&gt; &lt;br /&gt;Now if this logic is in the presenter, and it's very easy to get why the presenter should handle this, how can he be able to enable/disable/hide/show fields when he doesn't even know what fields are. The presenter is presentation-layer agnostic. He does not know whether the UI is in WebForms or Windows Forms. So how can he perform actions on unkown entities? Our first choice was by contract. So we defined a DisableFields() method in the contract or something like that, and just call it through the presenter if it's needed. The problem with this is that it kinda defeats the state-only contract approach that we favor. And besides, if the disabling logic is in the Presentation tier (the presenter just calls it) you would have a hard time mocking it.&lt;br /&gt; &lt;br /&gt;So right now where we stand? Well we still believe that the logic should be in the presenter, but the engine should manage somehow to make it easier on the developer to just disable fields. Something like: DisableFieldOfProperty(&amp;quot;CustomerName&amp;quot;), this would disable the field that represents the Contract CustomerName property in the view. The thing here is how would the NMVP engine have knowledge of the fields in the view.&lt;br /&gt; &lt;br /&gt;*This item is still under study, but MUST be solved by release 1.0.0.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
4 - MonoRail Integration
&lt;/h2&gt;We had a hard time in all our projects due to the WebForms life cycle. Plugging the NMVP Lifecycle (much smaller than WebForms') in the WebForms' one was really painful. Even worse, our developers made several mistakes due to how complex all the structure became. The customer wanted his forms to be full AJAX, so the picture became even uglier, since we decided at the time to go with Microsoft Ajax 1.0, which encourages several worst practices.&lt;br /&gt; &lt;br /&gt;After a lot of pain we decided that we had to look around for better solutions (or build one). We were very thrilled when we found out how advanced MonoRail was. I knew the &lt;a href="http://www.castleproject.org" class="externalLink"&gt;Castle Project&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; from way back, since NMVP is built on top of Windsor, but finding out about ActiveRecord and MonoRail was really a blessing.&lt;br /&gt; &lt;br /&gt;One of the best features of MonoRail for me is allowing the user to access a method in the controller (an action that renders a view) via it's URL. This is insanely useful on the AJAX scenario, as we really want our JavaScript code to call on the controller for any AJAX call (since the Controller is easily testable).&lt;br /&gt; &lt;br /&gt;Another great improvement is on the View Engines that make it a LOT easier to maintain pages. I wrote an entry on my blog about it &lt;a href="http://manicprogrammer.com/cs/blogs/heynemann/archive/2007/07/22/shortsighted-way-of-evaluating-your-options.aspx" class="externalLink"&gt;here&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;. The ViewComponents and Helpers are also a great addition to our toolbox.&lt;br /&gt; &lt;br /&gt;The only thing we missed in MonoRail is the contract-based approach enforced by NMVP. We learned with our teams that contract-based development really improved the way we build software in a way that we now can develop against a typed contract and not a ViewState or PropertyBag collection. I know that the web is stateless, and all you get from each Request is an HTTP message, but it's nice to have it all sorted out for me BEFORE reaching the UI logic. That's where NMVP will come on top of MonoRail.&lt;br /&gt; &lt;br /&gt;We're planning on having two special controllers: RegularController and CompositeController, responsible for, respectively, Model-View-Presenter support and Composite Model-View-Presenter Support (you can learn more about CMVP in this wiki or in my book - the draft is in my blog).&lt;br /&gt; &lt;br /&gt;We are planning some nice features for MonoRail integration:&lt;br /&gt;&lt;ol&gt;
&lt;li&gt;&amp;quot;Automagically&amp;quot; created client-side functions that hook on:&lt;/li&gt;&lt;ol&gt;
&lt;li&gt;NMVP Validation Engine&lt;/li&gt;&lt;li&gt;NMVP Security Context&lt;/li&gt;&lt;li&gt;NMVP Persistence Engine&lt;/li&gt;&lt;li&gt;NMVP Custom Plug-ins&lt;/li&gt;
&lt;/ol&gt;&lt;li&gt;Composeability of Views via CompositeController and Host.vm (view that will contain render views for all the children views).&lt;/li&gt;&lt;li&gt;Helpers for NMVP related tasks (still to be decided).&lt;/li&gt;&lt;li&gt;ViewComponents to help using NMVP container.&lt;/li&gt;
&lt;/ol&gt; &lt;br /&gt;The MonoRail integration is detailed in another vision statement for V1.0.0 - &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=monoRailv100Vision&amp;amp;referringTitle=v10Vision"&gt;MonoRail Integration Version 1.0.0 Vision Statement&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;Essentially we'll have to provide some work-around to be able to provide the same things (given the constraints) to WebForms. This integration is detailed in another vision statement for V1.0.0 - &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=webFormsv100Vision&amp;amp;referringTitle=v10Vision"&gt;WebForms Integration Version 1.0.0 Vision Statement&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Feedback
&lt;/h2&gt;We need your feedback to be able to provide a better solution to real problems. Help us help you! We're eager to hearing from you in the discussion forums.&lt;br /&gt;
&lt;/div&gt;</description><author>Heynemann</author><pubDate>Fri, 24 Aug 2007 19:19:03 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: v10Vision 20070824071903P</guid></item><item><title>UPDATED WIKI: v10Vision</title><link>http://www.codeplex.com/nmvp/Wiki/View.aspx?title=v10Vision&amp;version=26</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;&lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Features&amp;amp;referringTitle=v10Vision"&gt;Features&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Tutorial&amp;amp;referringTitle=v10Vision"&gt;Tutorial&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Documentation&amp;amp;referringTitle=v10Vision"&gt;Documentation&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Downloads&amp;amp;referringTitle=v10Vision"&gt;Downloads&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Links&amp;amp;referringTitle=v10Vision"&gt;Links&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=F.A.Q.&amp;amp;referringTitle=v10Vision"&gt;F.A.Q.&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Glossary&amp;amp;referringTitle=v10Vision"&gt;Glossary&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Current%20Release&amp;amp;referringTitle=v10Vision"&gt;Current Release&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;h1&gt;
Version 1.0.0 Vision Statement
&lt;/h1&gt; &lt;br /&gt;&lt;h2&gt;
Introduction
&lt;/h2&gt;After several production applications using NMVP we learned some invaluable experience. The most critical points being:&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Not every UI wants to SAVE, and still the presenter comes with the Save method bundled. Not every UI needs a HOST and HOST PRESENTER, but again, the presenter has them. This confuses the developers making them use the framework in incorrect ways or worst of all, don't use them for fear to be using incorrectly.&lt;/li&gt;&lt;li&gt;Validation is hard to be done as of today, since NMVP does not help one bit in this as of today. This was very bad since the developers spread the validation logic between the presenter, the view and the domain.&lt;/li&gt;&lt;li&gt;Enabling/Disabling and Showing/Hiding fields is not accomplished correctly with IsReadOnly attribute, since it can only cover the most simple scenarios.&lt;/li&gt;&lt;li&gt;The Web Forms lifecycle makes it HARD on developers to do some trivial tasks, like AJAX. It's been HELL using NMVP with the Microsoft Ajax 1.0 Framework. It came to the point where we had to rewrite some parts of the application just to eliminate MS Ajax, and replace it with a more lightweight approach. I'm not saying it does not work. But it encourages bad behavior.&lt;/li&gt;&lt;li&gt;Devs have a hard time today setting up the NMVP structure, since it still requires a lot of effort to get Contracts, Views, Presenters and Unit Tests off the ground.&lt;/li&gt;
&lt;/ul&gt;We'll approach each of these problems at a time.&lt;br /&gt; &lt;br /&gt;Other than these issues, there are some new features that we want to improve on:&lt;br /&gt;&lt;ol&gt;
&lt;li&gt;MonoRail integration. We are aware that MonoRail is MVC. Even so, we have a vision where both can peacefully coexist, and one from which you can take advantage of what's best in each. This integration will allow a great deal of client-side integration with the MVP lifecycle through AJAX calls.&lt;/li&gt;&lt;li&gt;WebForms &lt;b&gt;better&lt;/b&gt; integration. The new features will need to be integrated with web forms. Since NMVP was built essentially to cover up for WebForms flawed &lt;a href="http://en.wikipedia.org/wiki/Separation_of_concerns" class="externalLink"&gt;SOC&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; model.&lt;/li&gt;&lt;li&gt;Assure Easier Testability - We'll have to choose here to evolve the Testing Infrastructure present in NMVP or simply go with Rhino Mocks, the best Mocking framework around.&lt;/li&gt;&lt;li&gt;Improved Namespace Organization. The namespaces of the NMVP project will probably be reorganized in the sake of clarity.&lt;/li&gt;
&lt;/ol&gt; &lt;br /&gt;&lt;h2&gt;
Backwards Compatibility
&lt;/h2&gt;This is a major concern for current users of the framework that plan on upgrading to this version: &lt;b&gt;THIS VERSION WILL NOT BE BACKWARDS COMPATIBLE&lt;/b&gt;! &lt;br /&gt; &lt;br /&gt;After thorough consideration of the pros and cons of this matter, I (Bernardo Heynemann) decided that it's in the best interest of the community to have all projects under the same umbrella and not scattered around like they are.&lt;br /&gt; &lt;br /&gt;This means the birth of project Stormwind. NMVP will now be Stormwind.NMvp, Validation Everywhere will be Stormwind.ValEver, and so on... &lt;br /&gt; &lt;br /&gt;There will be an identity between the projects that now share the same parent project. &lt;br /&gt; &lt;br /&gt;This is a good point for current users of the framework, since you'll be able to keep both versions running in the same project, as they'll have different namespaces, assembly names, assembly versions, and so on.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Stormwind Community
&lt;/h2&gt;One of the pre-requisites of NMVP Version 1.0.0 is to deploy the Stormwind Community that will feature:&lt;br /&gt;&lt;ol&gt;
&lt;li&gt;SVN Server for all the projects&lt;/li&gt;&lt;li&gt;Build Server for all the projects&lt;/li&gt;&lt;li&gt;Wiki for the Community and for each project (Project Documentation)&lt;/li&gt;&lt;li&gt;Forum for the Community and for each project&lt;/li&gt;&lt;li&gt;Tracking of bugs and change requests&lt;/li&gt;&lt;li&gt;Allow contribution of patches from the community&lt;/li&gt;&lt;li&gt;Plugin Repository for NMVP. This will allow contribution of plug-ins from the community to be integrated in the NMVP Contrib project.&lt;/li&gt;
&lt;/ol&gt;Read more about it in &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Stormwind%20Community&amp;amp;referringTitle=v10Vision"&gt;Stormwind Community&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
1 - Presenters
&lt;/h2&gt;The presenter tree as it is today makes it hard for developers to know when to use each presenter feature. Developers usually get confused on things like:&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Why is there a method Save if I don't need to Save anything?&lt;/li&gt;&lt;li&gt;Why is there a Host and HostPresenter if I don't even know what Composite MVP is?&lt;/li&gt;&lt;li&gt;What is a SecurityContext? And a TransactionContext? And a ConfigurationContext?&lt;/li&gt;
&lt;/ul&gt;Those are all valid concerns and ones that will be addressed in the next version of NMVP. We'll be providing a more meaningful tree of presenters for this new release. One that leverages only the features that the user really needs.&lt;br /&gt;The definition for this issue will be in the document &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Presenter%20Hierarchy%20for%201.0.0%20Release&amp;amp;referringTitle=v10Vision"&gt;Presenter Hierarchy for 1.0.0 Release&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
2 - Validation
&lt;/h2&gt;Validation of user input is a certain part of EVERY UI, so if NMVP is an UI Framework (Both Supervising Presenter and Passive View are UI Design Patterns and both are supported in NMVP), it's appropriate that it helps the user to deal with the Validation of views in a more straightforward way. There are two approaches here: Client-side Validation and Server-Side Validation. &lt;br /&gt; &lt;br /&gt;As of today in our production apps we have a hard time finding scenarios where client-side validation would be used alone, since we have an UI requirement of displaying ALL the validation messages to the user together (one message box only with all the messages, or one summary or whatever). I'm not saying this is a MUST have, but it's something, I as an user, like. I don't want to get a message saying that I missed several fields, only to fill them and get another message saying that the customer I'm filling ALL that data for is disabled for operations above USD10K (Server-Side validation).&lt;br /&gt; &lt;br /&gt;Even so, we have to catter for both scenarios in the framework, and I do believe that by doing the Server-Side validation correctly we already are, since there are GREAT tools out there to do client-side validation (ASP.Net Validators, MonoRail uses Prototype, JQuery, Ext just to name a few. For Windows Forms there are some good client-side ones, but if you are targeting windows forms as well as ASP.Net I'd go with Server side validation only, since it will make it easier on you to unit test validation logic, and it will get done in one place only). So we'll focus in Server side validation in this release.&lt;br /&gt; &lt;br /&gt;If there's one thing that's blurred today in NMVP usage is where do I put my validation logic? From experience developers tend to spread it among layers, so some bits go into the code-behind file, some into the Presenter, some into the Domain classes. The problem with that approach is that it's VERY hard to unit test validation logic if it's done like this. Even if you spread your validation logic between client and server, testing will be harder.&lt;br /&gt; &lt;br /&gt;So, our plans for validation is to have a ValidatingPresenter attribute, or a Validate presenter in the hierarchy that will allow validation to be performed. &lt;br /&gt; &lt;br /&gt;Server side validation will be present in two ways:&lt;br /&gt;&lt;ol&gt;
&lt;li&gt;Via attributes in the view Contract (provided by Validation Everywhere)&lt;/li&gt;&lt;li&gt;Via a Validate() method in the presenter, that will get called by the NMVP engine in the case of a validating scenario occur (more about this in the MonoRail and WebForms Integration part of the Vision Statement).&lt;/li&gt;
&lt;/ol&gt;By doing this we are concentrating the Validation of the view's data in one tier only: the MVP Tier. Neither the UI tier, nor the Domaing tier have to know about validations performed for the view.&lt;br /&gt; &lt;br /&gt;One aspect that is regularly overlooked in several Validation Frameworks is how to return feedback on the validation for the developer, so he can in turn display it to the user. This subject will be dealt with in the WebForms Integration and MonoRail Integration parts of this document.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
3 - Fields State Control
&lt;/h2&gt;Enabling/Disabling and Showing/Hiding fields is a very complex task as of now in NMVP. You never know when to place this logic in the presenter or in the view, or even worse, in both. We learned the hard way that spreading this among both has a very ill effect. You get a lot of unexpected behavior because of the involved parts lifecycle (WebForms vs WinForms, ASP.Net's one, Unit testing frameworks, and so on). This way you disable a field, just to see it enabled in the UI, because in some later time somewhere in the view, the presenter or somewhere else the field got re-enabled. It's really painful to find out where this kind of thing happen.&lt;br /&gt; &lt;br /&gt;This seems to be a very trivial thing to pursue, but it's far from that. The most logical place for this kind of logic to be is in the view, but again this has some drawbacks when it comes to testability and a lot of non-trivial issues related to lifecycle, not to mention that some fields state is defined by some domain state, and as such should be defined by the presenter.&lt;br /&gt; &lt;br /&gt;Now if this logic is in the presenter, and it's very easy to get why the presenter should handle this, how can he be able to enable/disable/hide/show fields when he doesn't even know what fields are. The presenter is presentation-layer agnostic. He does not know whether the UI is in WebForms or Windows Forms. So how can he perform actions on unkown entities? Our first choice was by contract. So we defined a DisableFields() method in the contract or something like that, and just call it through the presenter if it's needed. The problem with this is that it kinda defeats the state-only contract approach that we favor. And besides, if the disabling logic is in the Presentation tier (the presenter just calls it) you would have a hard time mocking it.&lt;br /&gt; &lt;br /&gt;So right now where we stand? Well we still believe that the logic should be in the presenter, but the engine should manage somehow to make it easier on the developer to just disable fields. Something like: DisableFieldOfProperty(&amp;quot;CustomerName&amp;quot;), this would disable the field that represents the Contract CustomerName property in the view. The thing here is how would the NMVP engine have knowledge of the fields in the view.&lt;br /&gt; &lt;br /&gt;*This item is still under study, but MUST be solved by release 1.0.0.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
4 - MonoRail Integration
&lt;/h2&gt;We had a hard time in all our projects due to the WebForms life cycle. Plugging the NMVP Lifecycle (much smaller than WebForms') in the WebForms' one was really painful. Even worse, our developers made several mistakes due to how complex all the structure became. The customer wanted his forms to be full AJAX, so the picture became even uglier, since we decided at the time to go with Microsoft Ajax 1.0, which encourages several worst practices.&lt;br /&gt; &lt;br /&gt;After a lot of pain we decided that we had to look around for better solutions (or build one). We were very thrilled when we found out how advanced MonoRail was. I knew the &lt;a href="http://www.castleproject.org" class="externalLink"&gt;Castle Project&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; from way back, since NMVP is built on top of Windsor, but finding out about ActiveRecord and MonoRail was really a blessing.&lt;br /&gt; &lt;br /&gt;One of the best features of MonoRail for me is allowing the user to access a method in the controller (an action that renders a view) via it's URL. This is insanely useful on the AJAX scenario, as we really want our JavaScript code to call on the controller for any AJAX call (since the Controller is easily testable).&lt;br /&gt; &lt;br /&gt;Another great improvement is on the View Engines that make it a LOT easier to maintain pages. I wrote an entry on my blog about it &lt;a href="http://manicprogrammer.com/cs/blogs/heynemann/archive/2007/07/22/shortsighted-way-of-evaluating-your-options.aspx" class="externalLink"&gt;here&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;. The ViewComponents and Helpers are also a great addition to our toolbox.&lt;br /&gt; &lt;br /&gt;The only thing we missed in MonoRail is the contract-based approach enforced by NMVP. We learned with our teams that contract-based development really improved the way we build software in a way that we now can develop against a typed contract and not a ViewState or PropertyBag collection. I know that the web is stateless, and all you get from each Request is an HTTP message, but it's nice to have it all sorted out for me BEFORE reaching the UI logic. That's where NMVP will come on top of MonoRail.&lt;br /&gt; &lt;br /&gt;We're planning on having two special controllers: RegularController and CompositeController, responsible for, respectively, Model-View-Presenter support and Composite Model-View-Presenter Support (you can learn more about CMVP in this wiki or in my book - the draft is in my blog).&lt;br /&gt; &lt;br /&gt;We are planning some nice features for MonoRail integration:&lt;br /&gt;&lt;ol&gt;
&lt;li&gt;&amp;quot;Automagically&amp;quot; created client-side functions that hook on:&lt;/li&gt;&lt;ol&gt;
&lt;li&gt;NMVP Validation Engine&lt;/li&gt;&lt;li&gt;NMVP Security Context&lt;/li&gt;&lt;li&gt;NMVP Persistence Engine&lt;/li&gt;&lt;li&gt;NMVP Custom Plug-ins&lt;/li&gt;
&lt;/ol&gt;&lt;li&gt;Composeability of Views via CompositeController and Host.vm (view that will contain render views for all the children views).&lt;/li&gt;&lt;li&gt;Helpers for NMVP related tasks (still to be decided).&lt;/li&gt;&lt;li&gt;ViewComponents to help using NMVP container.&lt;/li&gt;
&lt;/ol&gt; &lt;br /&gt;The MonoRail integration is detailed in another vision statement for V1.0.0 - &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=monoRailv100Vision&amp;amp;referringTitle=v10Vision"&gt;MonoRail Integration Version 1.0.0 Vision Statement&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;Essentially we'll have to provide some work-around to be able to provide the same things (given the constraints) to WebForms. This integration is detailed in another vision statement for V1.0.0 - &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=webFormsv100Vision&amp;amp;referringTitle=v10Vision"&gt;WebForms Integration Version 1.0.0 Vision Statement&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Feedback
&lt;/h2&gt;We need your feedback to be able to provide a better solution to real problems. Help us help you! We're eager to hearing from you in the discussion forums.&lt;br /&gt;
&lt;/div&gt;</description><author>Heynemann</author><pubDate>Fri, 24 Aug 2007 19:16:58 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: v10Vision 20070824071658P</guid></item><item><title>UPDATED WIKI: v10Vision</title><link>http://www.codeplex.com/nmvp/Wiki/View.aspx?title=v10Vision&amp;version=25</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;&lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Features&amp;amp;referringTitle=v10Vision"&gt;Features&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Tutorial&amp;amp;referringTitle=v10Vision"&gt;Tutorial&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Documentation&amp;amp;referringTitle=v10Vision"&gt;Documentation&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Downloads&amp;amp;referringTitle=v10Vision"&gt;Downloads&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Links&amp;amp;referringTitle=v10Vision"&gt;Links&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=F.A.Q.&amp;amp;referringTitle=v10Vision"&gt;F.A.Q.&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Glossary&amp;amp;referringTitle=v10Vision"&gt;Glossary&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Current%20Release&amp;amp;referringTitle=v10Vision"&gt;Current Release&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;h1&gt;
Version 1.0.0 Vision Statement
&lt;/h1&gt; &lt;br /&gt;&lt;h2&gt;
Introduction
&lt;/h2&gt;After several production applications using NMVP we learned some invaluable experience. The most critical points being:&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Not every UI wants to SAVE, and still the presenter comes with the Save method bundled. Not every UI needs a HOST and HOST PRESENTER, but again, the presenter has them. This confuses the developers making them use the framework in incorrect ways or worst of all, don't use them for fear to be using incorrectly.&lt;/li&gt;&lt;li&gt;Validation is hard to be done as of today, since NMVP does not help one bit in this as of today. This was very bad since the developers spread the validation logic between the presenter, the view and the domain.&lt;/li&gt;&lt;li&gt;Enabling/Disabling and Showing/Hiding fields is not accomplished correctly with IsReadOnly attribute, since it can only cover the most simple scenarios.&lt;/li&gt;&lt;li&gt;The Web Forms lifecycle makes it HARD on developers to do some trivial tasks, like AJAX. It's been HELL using NMVP with the Microsoft Ajax 1.0 Framework. It came to the point where we had to rewrite some parts of the application just to eliminate MS Ajax, and replace it with a more lightweight approach. I'm not saying it does not work. But it encourages bad behavior.&lt;/li&gt;&lt;li&gt;Devs have a hard time today setting up the NMVP structure, since it still requires a lot of effort to get Contracts, Views, Presenters and Unit Tests off the ground.&lt;/li&gt;
&lt;/ul&gt;We'll approach each of these problems at a time.&lt;br /&gt; &lt;br /&gt;Other than these issues, there are some new features that we want to improve on:&lt;br /&gt;&lt;ol&gt;
&lt;li&gt;MonoRail integration. We are aware that MonoRail is MVC. Even so, we have a vision where both can peacefully coexist, and one from which you can take advantage of what's best in each. This integration will allow a great deal of client-side integration with the MVP lifecycle through AJAX calls.&lt;/li&gt;&lt;li&gt;WebForms &lt;b&gt;better&lt;/b&gt; integration. The new features will need to be integrated with web forms. Since NMVP was built essentially to cover up for WebForms flawed &lt;a href="http://en.wikipedia.org/wiki/Separation_of_concerns" class="externalLink"&gt;SOC&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; model.&lt;/li&gt;&lt;li&gt;Assure Easier Testability - We'll have to choose here to evolve the Testing Infrastructure present in NMVP or simply go with Rhino Mocks, the best Mocking framework around.&lt;/li&gt;&lt;li&gt;Improved Namespace Organization. The namespaces of the NMVP project will probably be reorganized in the sake of clarity.&lt;/li&gt;
&lt;/ol&gt; &lt;br /&gt;&lt;h2&gt;
Backwards Compatibility
&lt;/h2&gt;This is a major concern for current users of the framework that plan on upgrading to this version: &lt;b&gt;THIS VERSION WILL NOT BE BACKWARDS COMPATIBLE&lt;/b&gt;! &lt;br /&gt; &lt;br /&gt;After thorough consideration of the pros and cons of this matter, I (Bernardo Heynemann) decided that it's in the best interest of the community to have all projects under the same umbrella and not scattered around like they are.&lt;br /&gt; &lt;br /&gt;This means the birth of project Stormwind. NMVP will now be Stormwind.NMvp, Validation Everywhere will be Stormwind.ValEver, and so on... &lt;br /&gt; &lt;br /&gt;There will be an identity between the projects that now share the same parent project. &lt;br /&gt; &lt;br /&gt;This is a good point for current users of the framework, since you'll be able to keep both versions running in the same project, as they'll have different namespaces, assembly names, assembly versions, and so on.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Stormwind Community
&lt;/h2&gt;One of the pre-requisites of NMVP Version 1.0.0 is to deploy the Stormwind Community that will feature:&lt;br /&gt;&lt;ol&gt;
&lt;li&gt;SVN Server for all the projects&lt;/li&gt;&lt;li&gt;Build Server for all the projects&lt;/li&gt;&lt;li&gt;Wiki for the Community and for each project (Project Documentation)&lt;/li&gt;&lt;li&gt;Forum for the Community and for each project&lt;/li&gt;&lt;li&gt;Tracking of bugs and change requests&lt;/li&gt;&lt;li&gt;Allow contribution of patches from the community&lt;/li&gt;&lt;li&gt;Plugin Repository for NMVP. This will allow contribution of plug-ins from the community to be integrated in the NMVP Contrib project.&lt;/li&gt;
&lt;/ol&gt;Read more about it in &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Stormwind%20Community&amp;amp;referringTitle=v10Vision"&gt;Stormwind Community&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
1 - Presenters
&lt;/h2&gt;The presenter tree as it is today makes it hard for developers to know when to use each presenter feature. Developers usually get confused on things like:&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Why is there a method Save if I don't need to Save anything?&lt;/li&gt;&lt;li&gt;Why is there a Host and HostPresenter if I don't even know what Composite MVP is?&lt;/li&gt;&lt;li&gt;What is a SecurityContext? And a TransactionContext? And a ConfigurationContext?&lt;/li&gt;
&lt;/ul&gt;Those are all valid concerns and ones that will be addressed in the next version of NMVP. We'll be providing a more meaningful tree of presenters for this new release. One that leverages only the features that the user really needs.&lt;br /&gt;The definition for this issue will be in the document &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Presenter%20Hierarchy%20for%201.0.0%20Release&amp;amp;referringTitle=v10Vision"&gt;Presenter Hierarchy for 1.0.0 Release&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
2 - Validation
&lt;/h2&gt;Validation of user input is a certain part of EVERY UI, so if NMVP is an UI Framework (MVP is an UI Design Pattern), it's appropriate that it helps the user to deal with the Validation of views in a more straightforward way. There are two approaches here: Client-side Validation and Server-Side Validation. &lt;br /&gt; &lt;br /&gt;As of today in our production apps we have a hard time finding scenarios where client-side validation would be used alone, since we have an UI requirement of displaying ALL the validation messages to the user together (one message box only with all the messages, or one summary or whatever). I'm not saying this is a MUST have, but it's something, I as an user, like. I don't want to get a message saying that I missed several fields, only to fill them and get another message saying that the customer I'm filling ALL that data for is disabled for operations above USD10K (Server-Side validation).&lt;br /&gt; &lt;br /&gt;Even so, we have to catter for both scenarios in the framework, and I do believe that by doing the Server-Side validation correctly we already are, since there are GREAT tools out there to do client-side validation (ASP.Net Validators, MonoRail uses Prototype, JQuery, Ext just to name a few. For Windows Forms there are some good client-side ones, but if you are targeting windows forms as well as ASP.Net I'd go with Server side validation only, since it will make it easier on you to unit test validation logic, and it will get done in one place only). So we'll focus in Server side validation in this release.&lt;br /&gt; &lt;br /&gt;If there's one thing that's blurred today in NMVP usage is where do I put my validation logic? From experience developers tend to spread it among layers, so some bits go into the code-behind file, some into the Presenter, some into the Domain classes. The problem with that approach is that it's VERY hard to unit test validation logic if it's done like this. Even if you spread your validation logic between client and server, testing will be harder.&lt;br /&gt; &lt;br /&gt;So, our plans for validation is to have a ValidatingPresenter attribute, or a Validate presenter in the hierarchy that will allow validation to be performed. &lt;br /&gt; &lt;br /&gt;Server side validation will be present in two ways:&lt;br /&gt;&lt;ol&gt;
&lt;li&gt;Via attributes in the view Contract (provided by Validation Everywhere)&lt;/li&gt;&lt;li&gt;Via a Validate() method in the presenter, that will get called by the NMVP engine in the case of a validating scenario occur (more about this in the MonoRail and WebForms Integration part of the Vision Statement).&lt;/li&gt;
&lt;/ol&gt;By doing this we are concentrating the Validation of the view's data in one tier only: the MVP Tier. Neither the UI tier, nor the Domaing tier have to know about validations performed for the view.&lt;br /&gt; &lt;br /&gt;One aspect that is regularly overlooked in several Validation Frameworks is how to return feedback on the validation for the developer, so he can in turn display it to the user. This subject will be dealt with in the WebForms Integration and MonoRail Integration parts of this document.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
3 - Fields State Control
&lt;/h2&gt;Enabling/Disabling and Showing/Hiding fields is a very complex task as of now in NMVP. You never know when to place this logic in the presenter or in the view, or even worse, in both. We learned the hard way that spreading this among both has a very ill effect. You get a lot of unexpected behavior because of the involved parts lifecycle (WebForms vs WinForms, ASP.Net's one, Unit testing frameworks, and so on). This way you disable a field, just to see it enabled in the UI, because in some later time somewhere in the view, the presenter or somewhere else the field got re-enabled. It's really painful to find out where this kind of thing happen.&lt;br /&gt; &lt;br /&gt;This seems to be a very trivial thing to pursue, but it's far from that. The most logical place for this kind of logic to be is in the view, but again this has some drawbacks when it comes to testability and a lot of non-trivial issues related to lifecycle, not to mention that some fields state is defined by some domain state, and as such should be defined by the presenter.&lt;br /&gt; &lt;br /&gt;Now if this logic is in the presenter, and it's very easy to get why the presenter should handle this, how can he be able to enable/disable/hide/show fields when he doesn't even know what fields are. The presenter is presentation-layer agnostic. He does not know whether the UI is in WebForms or Windows Forms. So how can he perform actions on unkown entities? Our first choice was by contract. So we defined a DisableFields() method in the contract or something like that, and just call it through the presenter if it's needed. The problem with this is that it kinda defeats the state-only contract approach that we favor. And besides, if the disabling logic is in the Presentation tier (the presenter just calls it) you would have a hard time mocking it.&lt;br /&gt; &lt;br /&gt;So right now where we stand? Well we still believe that the logic should be in the presenter, but the engine should manage somehow to make it easier on the developer to just disable fields. Something like: DisableFieldOfProperty(&amp;quot;CustomerName&amp;quot;), this would disable the field that represents the Contract CustomerName property in the view. The thing here is how would the NMVP engine have knowledge of the fields in the view.&lt;br /&gt; &lt;br /&gt;*This item is still under study, but MUST be solved by release 1.0.0.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
4 - MonoRail Integration
&lt;/h2&gt;We had a hard time in all our projects due to the WebForms life cycle. Plugging the NMVP Lifecycle (much smaller than WebForms') in the WebForms' one was really painful. Even worse, our developers made several mistakes due to how complex all the structure became. The customer wanted his forms to be full AJAX, so the picture became even uglier, since we decided at the time to go with Microsoft Ajax 1.0, which encourages several worst practices.&lt;br /&gt; &lt;br /&gt;After a lot of pain we decided that we had to look around for better solutions (or build one). We were very thrilled when we found out how advanced MonoRail was. I knew the &lt;a href="http://www.castleproject.org" class="externalLink"&gt;Castle Project&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; from way back, since NMVP is built on top of Windsor, but finding out about ActiveRecord and MonoRail was really a blessing.&lt;br /&gt; &lt;br /&gt;One of the best features of MonoRail for me is allowing the user to access a method in the controller (an action that renders a view) via it's URL. This is insanely useful on the AJAX scenario, as we really want our JavaScript code to call on the controller for any AJAX call (since the Controller is easily testable).&lt;br /&gt; &lt;br /&gt;Another great improvement is on the View Engines that make it a LOT easier to maintain pages. I wrote an entry on my blog about it &lt;a href="http://manicprogrammer.com/cs/blogs/heynemann/archive/2007/07/22/shortsighted-way-of-evaluating-your-options.aspx" class="externalLink"&gt;here&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;. The ViewComponents and Helpers are also a great addition to our toolbox.&lt;br /&gt; &lt;br /&gt;The only thing we missed in MonoRail is the contract-based approach enforced by NMVP. We learned with our teams that contract-based development really improved the way we build software in a way that we now can develop against a typed contract and not a ViewState or PropertyBag collection. I know that the web is stateless, and all you get from each Request is an HTTP message, but it's nice to have it all sorted out for me BEFORE reaching the UI logic. That's where NMVP will come on top of MonoRail.&lt;br /&gt; &lt;br /&gt;We're planning on having two special controllers: RegularController and CompositeController, responsible for, respectively, Model-View-Presenter support and Composite Model-View-Presenter Support (you can learn more about CMVP in this wiki or in my book - the draft is in my blog).&lt;br /&gt; &lt;br /&gt;We are planning some nice features for MonoRail integration:&lt;br /&gt;&lt;ol&gt;
&lt;li&gt;&amp;quot;Automagically&amp;quot; created client-side functions that hook on:&lt;/li&gt;&lt;ol&gt;
&lt;li&gt;NMVP Validation Engine&lt;/li&gt;&lt;li&gt;NMVP Security Context&lt;/li&gt;&lt;li&gt;NMVP Persistence Engine&lt;/li&gt;&lt;li&gt;NMVP Custom Plug-ins&lt;/li&gt;
&lt;/ol&gt;&lt;li&gt;Composeability of Views via CompositeController and Host.vm (view that will contain render views for all the children views).&lt;/li&gt;&lt;li&gt;Helpers for NMVP related tasks (still to be decided).&lt;/li&gt;&lt;li&gt;ViewComponents to help using NMVP container.&lt;/li&gt;
&lt;/ol&gt; &lt;br /&gt;The MonoRail integration is detailed in another vision statement for V1.0.0 - &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=monoRailv100Vision&amp;amp;referringTitle=v10Vision"&gt;MonoRail Integration Version 1.0.0 Vision Statement&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;Essentially we'll have to provide some work-around to be able to provide the same things (given the constraints) to WebForms. This integration is detailed in another vision statement for V1.0.0 - &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=webFormsv100Vision&amp;amp;referringTitle=v10Vision"&gt;WebForms Integration Version 1.0.0 Vision Statement&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Feedback
&lt;/h2&gt;We need your feedback to be able to provide a better solution to real problems. Help us help you! We're eager to hearing from you in the discussion forums.&lt;br /&gt;
&lt;/div&gt;</description><author>Heynemann</author><pubDate>Fri, 24 Aug 2007 19:13:33 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: v10Vision 20070824071333P</guid></item><item><title>UPDATED WIKI: v10Vision</title><link>http://www.codeplex.com/nmvp/Wiki/View.aspx?title=v10Vision&amp;version=24</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;&lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Features&amp;amp;referringTitle=v10Vision"&gt;Features&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Tutorial&amp;amp;referringTitle=v10Vision"&gt;Tutorial&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Documentation&amp;amp;referringTitle=v10Vision"&gt;Documentation&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Downloads&amp;amp;referringTitle=v10Vision"&gt;Downloads&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Links&amp;amp;referringTitle=v10Vision"&gt;Links&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=F.A.Q.&amp;amp;referringTitle=v10Vision"&gt;F.A.Q.&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Glossary&amp;amp;referringTitle=v10Vision"&gt;Glossary&lt;/a&gt; | &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Current%20Release&amp;amp;referringTitle=v10Vision"&gt;Current Release&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;h1&gt;
Version 1.0.0 Vision Statement
&lt;/h1&gt; &lt;br /&gt;&lt;h2&gt;
Introduction
&lt;/h2&gt;After several production applications using NMVP we learned some invaluable experience. The most critical points being:&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Not every UI wants to SAVE, and still the presenter comes with the Save method bundled. Not every UI needs a HOST and HOST PRESENTER, but again, the presenter has them. This confuses the developers making them use the framework in incorrect ways or worst of all, don't use them for fear to be using incorrectly.&lt;/li&gt;&lt;li&gt;Validation is hard to be done as of today, since NMVP does not help one bit in this as of today. This was very bad since the developers spread the validation logic between the presenter, the view and the domain.&lt;/li&gt;&lt;li&gt;Enabling/Disabling and Showing/Hiding fields is not accomplished correctly with IsReadOnly attribute, since it can only cover the most simple scenarios.&lt;/li&gt;&lt;li&gt;The Web Forms lifecycle makes it HARD on developers to do some trivial tasks, like AJAX. It's been HELL using NMVP with the Microsoft Ajax 1.0 Framework. It came to the point where we had to rewrite some parts of the application just to eliminate MS Ajax, and replace it with a more lightweight approach. I'm not saying it does not work. But it encourages bad behavior.&lt;/li&gt;&lt;li&gt;Devs have a hard time today setting up the NMVP structure, since it still requires a lot of effort to get Contracts, Views, Presenters and Unit Tests off the ground.&lt;/li&gt;
&lt;/ul&gt;We'll approach each of these problems at a time.&lt;br /&gt; &lt;br /&gt;Other than these issues, there are some new features that we want to improve on:&lt;br /&gt;&lt;ol&gt;
&lt;li&gt;MonoRail integration. We are aware that MonoRail is MVC. Even so, we have a vision where both can peacefully coexist, and one from which you can take advantage of what's best in each. This integration will allow a great deal of client-side integration with the MVP lifecycle through AJAX calls.&lt;/li&gt;&lt;li&gt;WebForms &lt;b&gt;better&lt;/b&gt; integration. The new features will need to be integrated with web forms. Since NMVP was built essentially to cover up for WebForms flawed &lt;a href="http://en.wikipedia.org/wiki/Separation_of_concerns" class="externalLink"&gt;SOC&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; model.&lt;/li&gt;&lt;li&gt;Assure Easier Testability - We'll have to choose here to evolve the Testing Infrastructure present in NMVP or simply go with Rhino Mocks, the best Mocking framework around.&lt;/li&gt;&lt;li&gt;Improved Namespace Organization. The namespaces of the NMVP project will probably be reorganized in the sake of clarity.&lt;/li&gt;
&lt;/ol&gt; &lt;br /&gt;&lt;h2&gt;
Backwards Compatibility
&lt;/h2&gt;This is a major concern for current users of the framework that plan on upgrading to this version: &lt;b&gt;THIS VERSION WILL NOT BE BACKWARDS COMPATIBLE&lt;/b&gt;! &lt;br /&gt; &lt;br /&gt;After thorough consideration of the pros and cons of this matter, I (Bernardo Heynemann) decided that it's in the best interest of the community to have all projects under the same umbrella and not scattered around like they are.&lt;br /&gt; &lt;br /&gt;This means the birth of project Stormwind. NMVP will now be Stormwind.NMvp, Validation Everywhere will be Stormwind.ValEver, and so on... &lt;br /&gt; &lt;br /&gt;There will be an identity between the projects that now share the same parent project. &lt;br /&gt; &lt;br /&gt;This is a good point for current users of the framework, since you'll be able to keep both versions running in the same project, as they'll have different namespaces, assembly names, assembly versions, and so on.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
Stormwind Community
&lt;/h2&gt;One of the pre-requisites of NMVP Version 1.0.0 is to deploy the Stormwind Community that will feature:&lt;br /&gt;&lt;ol&gt;
&lt;li&gt;SVN Server for all the projects&lt;/li&gt;&lt;li&gt;Build Server for all the projects&lt;/li&gt;&lt;li&gt;Wiki for the Community and for each project (Project Documentation)&lt;/li&gt;&lt;li&gt;Forum for the Community and for each project&lt;/li&gt;&lt;li&gt;Tracking of bugs and change requests&lt;/li&gt;&lt;li&gt;Allow contribution of patches from the community&lt;/li&gt;&lt;li&gt;Plugin Repository for NMVP. This are will allow contribution of plug-ins from the community to be integrated in the NMVP Contrib project.&lt;/li&gt;
&lt;/ol&gt;Read more about it in &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Stormwind%20Community&amp;amp;referringTitle=v10Vision"&gt;Stormwind Community&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
1 - Presenters
&lt;/h2&gt;The presenter tree as it is today makes it hard for developers to know when to use each presenter feature. Developers usually get confused on things like:&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Why is there a method Save if I don't need to Save anything?&lt;/li&gt;&lt;li&gt;Why is there a Host and HostPresenter if I don't even know what Composite MVP is?&lt;/li&gt;&lt;li&gt;What is a SecurityContext? And a TransactionContext? And a ConfigurationContext?&lt;/li&gt;
&lt;/ul&gt;Those are all valid concerns and ones that will be addressed in the next version of NMVP. We'll be providing a more meaningful tree of presenters for this new release. One that leverages only the features that the user really needs.&lt;br /&gt;The definition for this issue will be in the document &lt;a href="http://www.codeplex.com/nmvp/Wiki/View.aspx?title=Presenter%20Hierarchy%20for%201.0.0%20Release&amp;amp;referringTitle=v10Vision"&gt;Presenter Hierarchy for 1.0.0 Release&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;h2&gt;
2 - Validation
&lt;/h2&gt;Validation of user input is a certain part of EVERY UI, so if NMVP is an UI Framework (MVP is an UI Design Pattern), it's appropriate that it helps the user to deal with the Validation of views in a more straightforward way. There are two approaches here: Client-side Validation and Server-Side Validation. &lt;br /&gt; &lt;br /&gt;As of today in our production apps we have a hard time finding scenarios where client-side validation would be used alone, since we have an UI requirement of displaying ALL the validation messages to the user together (one message box only with all the messages, or one summary or whatever). I'm not saying this is a MUST have, but it's something, I as an user, like. I don't want to get a message saying that I missed several fields, only to fill them and get another message saying that the customer I'm filling ALL that data for is disabled for operations above USD10K (Server-Side validation).&lt;br /&gt; &lt;br /&gt;Even so, we have to catter for both scenarios in the framework, and I do believe that by doing the Server-Side validation correctly we already are, since there are GREAT tools out there to do client-side validation (ASP.Net Validators, MonoRail uses Prototype, JQuery, Ext just to name a few. For Windows Forms there are some good client-side ones, but if you are targeting windows forms as well as ASP.Net I'd go with Server side validation only, since it will make it easier on you to unit test validation logic, and it will get done in one place only). So we'll focus in Server side validation in this release.&lt;br /&gt; &lt;br /&gt;If there's one thing that's blurred today in NMVP usage is where do I put my validation logic? From experience developers tend to spread it among layers, so some bits go into the code-behind file, some into the Presenter, some into the Domain classes. The problem with that approach is that it's VERY hard to unit test validation logic if it's done like this. Even if you spread your validation logic between client and server, testing will be harder.&lt;br /&gt; &lt;br /&gt;So, our plans for validation is to have a ValidatingPresenter attribute, or a Validate presenter in the hierarchy that will allow validation to be performed. &lt;br /&gt; &lt;br /&gt;Server side validation will be present in two ways:&lt;br /&gt;&lt;ol&gt;
&lt;li&gt;Via attributes in the view Contract (provided by Validation Everywhere)&lt;/li&gt;&lt;li&gt;Via a Validate() method in the presenter, that will get called by the NMVP engine in the case of a validating scenario occur (more about this in the MonoRail and WebForms Integration part of the Vision Statement).&lt;/li&gt;
&lt;/ol&gt;By doing this we are concentrating 