<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" version="2.0"><channel><title>Mike Nichols - Son Of Nun Technology</title><link>http://devlicio.us/blogs/mike_nichols/default.aspx</link><description /><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/MikeNichols" type="application/rss+xml" /><item><title>SQL Quickie - Fix case</title><link>http://devlicio.us/blogs/mike_nichols/archive/2009/03/27/sql-quickie-fix-case.aspx</link><pubDate>Fri, 27 Mar 2009 17:07:11 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:45168</guid><dc:creator>Michael Nichols</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://devlicio.us/blogs/mike_nichols/rsscomments.aspx?PostID=45168</wfw:commentRss><comments>http://devlicio.us/blogs/mike_nichols/archive/2009/03/27/sql-quickie-fix-case.aspx#comments</comments><description>&lt;p&gt;I needed to quickly (and dirtily) transform rows which were all upper case into pascal cased, so &amp;#39;I AM OPIE&amp;#39; become &amp;#39;I Am Opie&amp;#39;. &lt;/p&gt;  &lt;p&gt;Here&amp;#39;s something I found and ported to a sql function:    &lt;br /&gt;&lt;/p&gt;  &lt;div class="code"&gt;&lt;font color="#0000ff"&gt;CREATE&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;FUNCTION&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;[dbo].[Casing]&lt;/font&gt;&lt;font color="#808080"&gt;      &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;(@instring&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;VARCHAR&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#800000"&gt;255&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160; &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;RETURNS&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;varchar&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#800000"&gt;1000&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;AS&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160; &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;BEGIN&lt;/font&gt;&lt;font color="#808080"&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#006400"&gt;--usage: SELECT dbo.Casing(&amp;#39;I AM A DOG&amp;#39;)      &lt;br /&gt;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;DECLARE&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;@strptr&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;INT&lt;/font&gt;&lt;font color="#808080"&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;DECLARE&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;@strChar&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;char&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#800000"&gt;1&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#808080"&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;DECLARE&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;@outstring&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;varchar&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#800000"&gt;1000&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#808080"&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;SET&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;@outstring&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt; &amp;#39;&amp;#39;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;SET&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;@strptr&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#800000"&gt;0&lt;/font&gt;&lt;font color="#808080"&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;WHILE&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;@strPtr&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;len&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#0000ff"&gt;RTRIM&lt;/font&gt;&lt;font color="#000000"&gt;(@instring))&lt;/font&gt;&lt;font color="#808080"&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;BEGIN&lt;/font&gt;&lt;font color="#808080"&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;SET&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;@strptr&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;@strptr&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;+&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#800000"&gt;1&lt;/font&gt;&lt;font color="#808080"&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;SET&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;@strchar&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;SUBSTRING&lt;/font&gt;&lt;font color="#000000"&gt;(@instring,@strptr,&lt;/font&gt;&lt;font color="#800000"&gt;1&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#808080"&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;IF&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;@strptr&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#800000"&gt;1&lt;/font&gt;&lt;font color="#808080"&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;SET&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;@outstring&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;UPPER&lt;/font&gt;&lt;font color="#000000"&gt;(@strchar)&lt;/font&gt;&lt;font color="#808080"&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;ELSE&lt;/font&gt;&lt;font color="#808080"&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;IF&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;SUBSTRING&lt;/font&gt;&lt;font color="#000000"&gt;(@instring,(@strptr&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;-&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#800000"&gt;1&lt;/font&gt;&lt;font color="#000000"&gt;),&lt;/font&gt;&lt;font color="#800000"&gt;1&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt; &amp;#39; &amp;#39;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;or&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;SUBSTRING&lt;/font&gt;&lt;font color="#000000"&gt;(@instring,(@strptr&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;-&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#800000"&gt;1&lt;/font&gt;&lt;font color="#000000"&gt;),&lt;/font&gt;&lt;font color="#800000"&gt;1&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt; &amp;#39;&amp;#39;&amp;#39;&amp;#39;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;SET&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;@outstring&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;SUBSTRING&lt;/font&gt;&lt;font color="#000000"&gt;(@outstring,&lt;/font&gt;&lt;font color="#800000"&gt;1&lt;/font&gt;&lt;font color="#000000"&gt;,@strptr)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;+&lt;/font&gt;&lt;font color="#808080"&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;UPPER&lt;/font&gt;&lt;font color="#000000"&gt;(@strchar)&lt;/font&gt;&lt;font color="#808080"&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;ELSE&lt;/font&gt;&lt;font color="#808080"&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;SET&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;@outstring&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;SUBSTRING&lt;/font&gt;&lt;font color="#000000"&gt;(@outstring,&lt;/font&gt;&lt;font color="#800000"&gt;1&lt;/font&gt;&lt;font color="#000000"&gt;,@strptr)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;+&lt;/font&gt;&lt;font color="#808080"&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;LOWER&lt;/font&gt;&lt;font color="#000000"&gt;(@strchar)&lt;/font&gt;&lt;font color="#808080"&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;END&lt;/font&gt;&lt;font color="#808080"&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;RETURN&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;@outstring&lt;/font&gt;&lt;font color="#808080"&gt;      &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;END&lt;/font&gt; &lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=45168" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MikeNichols/~4/-7CjzyEtw3U" height="1" width="1"/&gt;</description><category domain="http://devlicio.us/blogs/mike_nichols/archive/tags/SQL/default.aspx">SQL</category></item><item><title>Is Excessive Mapping Of DTOs/ViewObjects to Entities A Code Smell</title><link>http://devlicio.us/blogs/mike_nichols/archive/2009/03/04/is-excessive-mapping-of-dtos-viewobjects-to-entities-a-code-smell.aspx</link><pubDate>Thu, 05 Mar 2009 07:15:06 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:44807</guid><dc:creator>Michael Nichols</dc:creator><slash:comments>8</slash:comments><wfw:commentRss>http://devlicio.us/blogs/mike_nichols/rsscomments.aspx?PostID=44807</wfw:commentRss><comments>http://devlicio.us/blogs/mike_nichols/archive/2009/03/04/is-excessive-mapping-of-dtos-viewobjects-to-entities-a-code-smell.aspx#comments</comments><description>&lt;p&gt;A recent paradigm shift I have been trying to make is to using messaging patterns in my project. One impact of this shift has been a more granular approach to various commands against the domain which somehow changes its state. While I do my best to stick to DDD (Domain Driven Design) modeling patterns and concepts I confess I slide into a CRUD based approach to various actions in the system - lots of data in, lots of data out. This is partly due to the nature of the requirements and partly due to lack of creative thinking regarding what business rules should be enforced on the domain.&lt;/p&gt;  &lt;p&gt;As I started to examine where my weak points were in my application I realized I was doing an awful lot of mapping between view objects and domain entities within the Application Service layer which was being called by my Controllers in the web app. This is fine for simple cases but collections of value objects or cross-aggregate references can soon result in too much conditional or procedural code. Then I came across this post by &lt;a href="http://www.udidahan.com"&gt;Udi Dahan&lt;/a&gt; about &lt;a href="http://www.udidahan.com/2008/02/15/from-crud-to-domain-driven-fluency/"&gt;getting away from CRUD mentality&lt;/a&gt; into a more DDD approach. I had read this before but I didn&amp;#39;t &amp;quot;get&amp;quot; it so much. Particularly revealing to me was in the &lt;a href="http://www.udidahan.com/2008/02/15/from-crud-to-domain-driven-fluency/#comment-19915"&gt;comments&lt;/a&gt; where Udi explains a method which is returning a interface that feels &amp;#39;fluent&amp;#39;. &lt;/p&gt;  &lt;p&gt;When I looked over the stinkier parts of my application service code, I recognized I could be more creative in the API for creating the variant objects within my aggregate roots while simultaneously enforcing object creation rules in the domain where they belong. An example would serve to illustrate better. &lt;/p&gt;  &lt;p&gt;Consider how I might set the &amp;quot;SomeOptionalValueObject&amp;quot; property on the aggregate root below. Also, let&amp;#39;s introduce a Specification that the implementation of the value object which may be assigned is subject to the &amp;#39;SomeState&amp;#39; of the aggregate (the aptly named &amp;quot;SomeStateHasToBeSatisfiedSpecification&amp;quot;).&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;AggRoot&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160; &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;ValueObjectBase&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;SomeOptionalValueObject&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#0000ff"&gt;get;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;SomeState&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;SomeState{&lt;/font&gt;&lt;font color="#0000ff"&gt;get;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;SetSomeOptionalValueObject(SomeOptionalValueObject&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;obj){&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#006400"&gt;//some stuff     &lt;br /&gt;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;SomeValueObject&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;obj&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160; &lt;/font&gt; &lt;/p&gt;  &lt;div class="code"&gt;One of the &amp;#39;rules&amp;#39; of a Value Object in Domain Driven Design is that only transient references to variant objects may be held. That is, we should treat our aggregate root as the entry point and surface to work on for its state and values contributing that state (ie, &amp;#39;SomeOptionalValueObject&amp;#39; or &amp;#39;SomeState&amp;#39; above). This simple discipline acts as a funnel for the rules and integrity for the determined roots in our domain and prevents insanity. :)&lt;/div&gt;  &lt;div class="code"&gt;&amp;#160;&lt;/div&gt;  &lt;div class="code"&gt;So how do we perform this simple act of assigning SomeOptionalValueObject to the root which satisfies our SomeStateHasToBeSatisfiedSpecification?&lt;/div&gt;  &lt;div class="code"&gt;&amp;#160;&lt;/div&gt;  &lt;div class="code"&gt;First we might simply put a factory method on the root to create the value object determined by its state and then pass that into our Setter method above:&lt;/div&gt;  &lt;div class="code"&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;AggRoot&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#006400"&gt;//snip     &lt;br /&gt;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;ValueObjectBase&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;CreateSomeValueObject(&lt;/font&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;count,&lt;/font&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;name,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;long&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;expectation,&lt;/font&gt;&lt;font color="#2b91af"&gt;TimeSpan&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;duration,&lt;/font&gt;&lt;font color="#006400"&gt;/*loads more params*/&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#006400"&gt;//some creation logic     &lt;br /&gt;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;valueObj&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt; &lt;/div&gt;  &lt;div class="code"&gt;Or perhaps create the value object from the arguments and set it in the same method.&lt;/div&gt;  &lt;div class="code"&gt;&amp;#160;&lt;/div&gt;  &lt;div class="code"&gt;This works if the value object have a variety of implementations, but gets out of hand if we have even a handful of value objects that require different parameters and types. &lt;/div&gt;  &lt;div class="code"&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;ValueObjectImpl1&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;:&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;ValueObjectBase&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160; &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;ValueObjectImpl1(&lt;/font&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;count,&lt;/font&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;name,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;double&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;amount){}&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;ValueObjectImpl2&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;:&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;ValueObjectBase&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160; &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;ValueObjectImpl2(&lt;/font&gt;&lt;font color="#2b91af"&gt;TimeSpan&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;duration,&lt;/font&gt;&lt;font color="#0000ff"&gt;long&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;expectation){}&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;ValueObjectImpl3&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;:&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;ValueObjectBase&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160; &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;ValueObjectImpl3(&lt;/font&gt;&lt;font color="#0000ff"&gt;bool&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;isCoarse,&lt;/font&gt;&lt;font color="#2b91af"&gt;TimeSpan&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;duration,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;double&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;amount){}&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&amp;#160; &lt;/font&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;If there is only &lt;strong&gt;one &lt;/strong&gt;of these value objects I need to build and add to my aggregate root I might create an interface for a builder that is handed to the client to set the value. The implementation of the builder can enforace the SomeStateHasToBeSatisfiedSpecification for our aggregate root. Additionally this will enforce the signatures of the different value object implementations:&lt;/p&gt;  &lt;div class="code"&gt;&lt;font color="#0000ff"&gt;interface&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;IValueObjectBuilder&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;AddImpl1(&lt;/font&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;count,&lt;/font&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;name,&lt;/font&gt;&lt;font color="#0000ff"&gt;double&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;amount)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;AddImpl2(&lt;/font&gt;&lt;font color="#2b91af"&gt;TimeSpan&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;duration,&lt;/font&gt;&lt;font color="#0000ff"&gt;long&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;expectation)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;AddImpl3(&lt;/font&gt;&lt;font color="#0000ff"&gt;bool&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;isCoarse,&lt;/font&gt;&lt;font color="#2b91af"&gt;TimeSpan&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;duration,&lt;/font&gt;&lt;font color="#0000ff"&gt;double&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;amount)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt; &lt;/div&gt;  &lt;div class="code"&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;AggRoot&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;IValueObjectBuilder&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;ForOptionalValueObject(){&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#006400"&gt;//some conditional logic for determining which builder to return     &lt;br /&gt;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;builderImplementation&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;This simple fluency has replaced any property mapping requirement from a client dto =&amp;gt; value object and might look now like this:&lt;/p&gt;  &lt;div class="code"&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;AddSomeValue(&lt;/font&gt;&lt;font color="#0000ff"&gt;object&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;id,ValueObjectImpl1DTO&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;dto)&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;aggRoot&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;repository.Get(id)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;aggRoot.ForOptionalValueObject()&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;.AddImpl1(&lt;/font&gt;&lt;font color="#800000"&gt;2&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;mike&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#800000"&gt;40&lt;/font&gt;&lt;font color="#000000"&gt;.&lt;/font&gt;&lt;font color="#800000"&gt;32&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;repository.Update(aggRoot)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt; &lt;/div&gt;  &lt;div class="code"&gt;&amp;#160;&lt;/div&gt;  &lt;div class="code"&gt;I think this is intention-revealing but I could see also that the method chain might be confusing while browsing the AggRoot. To improve this I might change this to:&lt;/div&gt;  &lt;div class="code"&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;AggRoot&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;SetValueObject(Action&amp;lt;IValueObjectBuilder&amp;gt;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;with){&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;builder&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;GetBuilderBasedOnState()&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;with(builder)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;SomeOptionalValueObject&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;builder.Build()&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Now I only have one method to deal with an I get the bonus of removing the need for the client to call the &amp;#39;Build&amp;#39; method without resorting to some explicit operator voodoo. Plus I can pass this builder around to do other work internally before pulling the trigger on the build creation method.&lt;/p&gt;  &lt;p&gt;This might seem like alot of work but where this starts to shine (I think) is when collections of value objects which all might require different signatures are expected to be added to an aggregate root in one-shot since they are immutable and the collection itself is immutable.&lt;/p&gt;  &lt;p&gt;To do this I simply have to create an ISomeValueObjectCollectionBuilder and change the signature on my Set method:&lt;/p&gt;  &lt;div class="code"&gt;&lt;font color="#0000ff"&gt;interface&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;ISomeValueObjectCollectionBuilder&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;Add(Action&amp;lt;IValueObjectBuilder&amp;gt;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;with)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;AggRoot&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#006400"&gt;//snip     &lt;br /&gt;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;SetValueObject(Action&amp;lt;ISomeValueObjectCollectionBuilder&amp;gt;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;with)&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;builder&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;SomeValueoBjectCollectionBuilder(&lt;/font&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;with(builder)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;foreach&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;item&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;in&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;builder.Items)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;font color="#000000"&gt;.items.Add(item)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt; &lt;/div&gt;  &lt;div class="code"&gt;&amp;#160;&lt;/div&gt;  &lt;div class="code"&gt;Now my client can navigate this API:&lt;/div&gt;  &lt;div class="code"&gt;&amp;#160;&lt;/div&gt;  &lt;div class="code"&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;AddSomeValueObjects(Impl1ValueObjectDTO[]&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;dtos)&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#006400"&gt;//get root     &lt;br /&gt;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;aggRoot.SetValueObjects(collection&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;foreach&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;dto&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;in&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;dtos)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;collection.Add(item&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;item.AddImpl1(&lt;/font&gt;&lt;font color="#006400"&gt;/*params from dto*/&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;collection.Add(item&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;item.AddImpl1(&lt;/font&gt;&lt;font color="#006400"&gt;/*params from dto*/&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;collection.Add(item&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;item.AddImpl1(&lt;/font&gt;&lt;font color="#006400"&gt;/*params from dto*/&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;collection.Add(item&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;item.AddImpl1(&lt;/font&gt;&lt;font color="#006400"&gt;/*params from dto*/&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt; &lt;/div&gt;  &lt;p&gt;This simple fluency, along with smarter root factory methods, completely eliminated my need for mappers from DTO objects to their domain variants. Also I found it much simpler to apply specifications on the incoming data AND made creation of these value objects easier to test since it wasn&amp;#39;t based on some conditional logic in the service layer. Furthermore, it seems to succeed in meeting the goal of limiting the clients to holding references to the Aggregate Root.&lt;/p&gt;  &lt;p&gt;This is of course just one way of enforcing integrity in the domain while translating data from some client in our Application Services using an API that is understandable. A Visitor pattern might be employed to map data based on the IBuilder interface returned by the aggregate root as well without violating separation...but that is another day.&lt;/p&gt;  &lt;p&gt;If there are objections to this or perhaps other approaches I&amp;#39;d love to hear them in the comments. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=44807" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MikeNichols/~4/0Ca5-7fH_nE" height="1" width="1"/&gt;</description><category domain="http://devlicio.us/blogs/mike_nichols/archive/tags/Domain+Driven+Design+_2800_DDD_2900_/default.aspx">Domain Driven Design (DDD)</category></item><item><title>MonoRail 404 Woes</title><link>http://devlicio.us/blogs/mike_nichols/archive/2008/12/20/monorail-404-woes.aspx</link><pubDate>Sun, 21 Dec 2008 05:37:51 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:43468</guid><dc:creator>Michael Nichols</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://devlicio.us/blogs/mike_nichols/rsscomments.aspx?PostID=43468</wfw:commentRss><comments>http://devlicio.us/blogs/mike_nichols/archive/2008/12/20/monorail-404-woes.aspx#comments</comments><description>&lt;p&gt;Dear Mike In The Future,&lt;/p&gt;  &lt;p&gt;If it&amp;#39;s been a while since setting up a MonoRail app from ground up, please remember to reference the following assemblies in your web project or at least include them in the /lib folder:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Castle.Components.Common.EmailSender&lt;/li&gt;    &lt;li&gt;Castle.Components.Common.TemplateEngine&lt;/li&gt;    &lt;li&gt;Castle.Components.Common.Validator&lt;/li&gt;    &lt;li&gt;Castle.Components.Common.Binder&lt;/li&gt;    &lt;li&gt;Castle.Components.Common.WindsorExtension&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Otherwise, you might get a 404 and be confused and consider kicking the nearest small mammal. &lt;/p&gt;  &lt;p&gt;Thanks, have a great night.&lt;/p&gt;  &lt;p&gt;Mike&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=43468" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MikeNichols/~4/uIg7HkoSXt8" height="1" width="1"/&gt;</description><category domain="http://devlicio.us/blogs/mike_nichols/archive/tags/Castle+Project/default.aspx">Castle Project</category><category domain="http://devlicio.us/blogs/mike_nichols/archive/tags/Monorail/default.aspx">Monorail</category></item><item><title>Ordering Form Collection Parameters For MonoRail using jQuery</title><link>http://devlicio.us/blogs/mike_nichols/archive/2008/11/25/ordering-form-collection-parameters-for-monorail-using-jquery.aspx</link><pubDate>Wed, 26 Nov 2008 06:37:42 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:43235</guid><dc:creator>Michael Nichols</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://devlicio.us/blogs/mike_nichols/rsscomments.aspx?PostID=43235</wfw:commentRss><comments>http://devlicio.us/blogs/mike_nichols/archive/2008/11/25/ordering-form-collection-parameters-for-monorail-using-jquery.aspx#comments</comments><description>&lt;p&gt;On my current app we are using ajax heavily for updating forms, often with the response getting injected into an &lt;strong&gt;table &lt;/strong&gt;or &lt;strong&gt;unordered list&lt;/strong&gt;. The entire form is then posted for the action which will actually change state in the domain. &lt;/p&gt;  &lt;p&gt;For example, say we have a &amp;#39;NewItem&amp;#39; form (and have several properties):&lt;/p&gt;  &lt;div class="code"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;form&lt;/font&gt;&lt;font color="#ff0000"&gt; action&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;myaction.castle&amp;quot;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;label&lt;/font&gt;&lt;font color="#ff0000"&gt; for&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;newItem_Name&amp;quot;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;Name&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;label&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;input&lt;/font&gt;&lt;font color="#ff0000"&gt; type&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;text&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt; name&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;newItem.Name&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt; id&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;newItem_Name&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;label&lt;/font&gt;&lt;font color="#ff0000"&gt; for&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;newItem_Phone&amp;quot;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;Name&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;label&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;input&lt;/font&gt;&lt;font color="#ff0000"&gt; type&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;text&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt; name&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;newItem.Phone&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt; id&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;newItem_Phone&amp;quot;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#006400"&gt;&amp;lt;!--10 other properties--&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;input&lt;/font&gt;&lt;font color="#ff0000"&gt; type&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;submit&amp;quot;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;Save&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;input&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;form&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;/font&gt; &lt;/div&gt;  &lt;div class="code"&gt;&amp;#160;&lt;/div&gt;  &lt;div class="code"&gt;With the action on the controller:&lt;/div&gt;  &lt;div class="code"&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;myaction([DataBind(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;newItem&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;)]&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;ItemDTO&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;item)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160; &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;PropertyBag[&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;item&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;]&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;item&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;RenderView(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;ViewWithSophisticatedFormattingForItems&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt; &lt;/div&gt;  &lt;div class="code"&gt;&amp;#160;&lt;/div&gt;  &lt;div class="code"&gt;This simply pushes back an item using the data provided and jquery appends the table with:&lt;/div&gt;  &lt;div class="code"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;tr&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;td&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&lt;span style="background-color:#ffff99;"&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;%&lt;/font&gt;&lt;font color="#ff0000"&gt; output item.Name %&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;td&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;tr&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;tr&lt;/font&gt;&lt;font color="#ff0000"&gt; style&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;#39;display:none;&amp;#39;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;td&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&lt;span style="background-color:#ffff99;"&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;%&lt;/font&gt;&lt;font color="#ff0000"&gt; output Form.TextField(&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;quot;item.Name&amp;quot;)&lt;/font&gt;&lt;font color="#ff0000"&gt; %&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;td&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;tr&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;/font&gt; &lt;/div&gt;  &lt;div class="code"&gt;&amp;#160;&lt;/div&gt;  &lt;div class="code"&gt;The client will toggle between &amp;#39;readonly&amp;#39; and &amp;#39;edit&amp;#39; modes to change data inline. &lt;/div&gt;  &lt;div class="code"&gt;&amp;#160;&lt;/div&gt;  &lt;div class="code"&gt;So this would result in multiple rows of &amp;#39;item.Name&amp;#39; and &amp;#39;item.Phone&amp;#39;, etc. and the DataBinder will choke if you try this:&lt;/div&gt;  &lt;div class="code"&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;UpdateToDomain([DataBind(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;item&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;)]&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#2b91af"&gt;List&lt;/font&gt;&lt;font color="#000000"&gt;&amp;lt;ItemDTO&amp;gt;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;items)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160; &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#006400"&gt;//do stuff in domain     &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt; &lt;/div&gt;  &lt;p&gt;As magical as MonoRail and her SmartDispatcherController is, she has to know which value belongs to which item in a collection. The lack of indices in the params will therefore cause arrays of &amp;#39;Value&amp;#39;s for a single ItemDTO instance.&lt;/p&gt;  &lt;p&gt;My first thought was to do a custom implementation of IParameterBinder + DataBinder combo that parses out the params and tries to split them into multiple instances. This is too difficult though since not all fields may be present for an instance.&lt;/p&gt;  &lt;p&gt;So to keep the items in a collection (like table rows or unordered lists) nicely indexed, I created a plugin that handles all the form elements for me. After ajax calls that load data into a table or ul, I can just call the plugin on the rows and all forms elements remain in their appropriate order. Similarly I can &lt;strong&gt;un&lt;/strong&gt;index forms for posting in the format the action expects. I can similarly just reorder indexes.&amp;#160; &lt;/p&gt;  &lt;p&gt;This just preserves the &lt;strong&gt;id &lt;/strong&gt;and &lt;strong&gt;name &lt;/strong&gt;convention used throughout monorail (with &amp;quot;_&amp;quot; and &amp;quot;[index]&amp;quot;&amp;#160; delimiters respectively). It also changes the &amp;#39;for&amp;#39; attribute on the &lt;strong&gt;label &lt;/strong&gt;elements for fun.&lt;/p&gt;  &lt;p&gt;This &lt;em&gt;is &lt;/em&gt;chainable.&lt;/p&gt;  &lt;p&gt;To use: &lt;/p&gt;  &lt;div class="code"&gt;&lt;font color="#000000"&gt;$(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;table.specimens &amp;gt; tbody tr.edit&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;).indices(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;on&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#006400"&gt;//index all rows with class &amp;#39;edit&amp;#39;&amp;#160; &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;$(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;table.specimens &amp;gt; tbody tr.edit&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;).indices(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;off&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#006400"&gt;//remove index on all rows with class &amp;#39;.edit&amp;#39;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;$(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;table.specimens &amp;gt; tbody tr.edit&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;).indices(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;ordered&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#006400"&gt;//ordered existing indices     &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;$(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;table.specimens &amp;gt; tbody tr.edit&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;).indices()&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#006400"&gt;//toggle indexed/nonindexed mode     &lt;br /&gt;//specify the parameterName prefix if you are indexing on a nested collection      &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;$(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;table.specimens &amp;gt; tbody tr.edit&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;).indices(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;on&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,{parameterName:&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#39;mainclass.nestedObjects&amp;#39;&lt;/font&gt;&lt;font color="#000000"&gt;})&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#006400"&gt;//customize whether a new row should increment the index (default is to skip increments on items with class &amp;#39;repeat-index&amp;#39;)     &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;$(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;table.specimens &amp;gt; tbody tr.edit&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;).indices(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;on&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,{isRepeatedIndex:&lt;/font&gt;&lt;font color="#0000ff"&gt;function&lt;/font&gt;&lt;font color="#000000"&gt;(){...})&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;And the plugin:&lt;/p&gt;  &lt;div class="code"&gt;&lt;font color="#006400"&gt;/***indices plugin for ordering form elements in a group     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; @mode (String) :&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;on&amp;quot; (index elements if not already indexed),&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;off&amp;quot; (unindex elements if already indexed),&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;toggle&amp;quot; (toggle between &amp;quot;on&amp;quot; and &amp;quot;off&amp;quot; modes),      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;ordered&amp;quot; (reorder indices of indexed items, or )      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; @options (hash) :      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; @parameterName (String) : the parameter name to index; if empty, uses the &amp;#39;name&amp;#39; attribute up to the first &amp;#39;.&amp;#39;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; @isRepeatedIndex (predicate[current item]) : return &amp;#39;true&amp;#39; to repeat the index (for things like hidden rows, etc); default is a class name &amp;#39;repeat-index&amp;#39;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;***/&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#0000ff"&gt;function&lt;/font&gt;&lt;font color="#000000"&gt;($)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;$.fn.indices&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;function&lt;/font&gt;&lt;font color="#000000"&gt;(mode,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;options)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;mode&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;mode&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;||&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;toggle&amp;quot;&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;defaults&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;parameterName:&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;[a-zA-Z0-9]+&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;isRepeatedIndex:&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;function&lt;/font&gt;&lt;font color="#000000"&gt;(item)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;$(item).is(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;.repeat-index&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;opt&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;$.extend(defaults,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;options)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;reIndexedName&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;RegExp&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;^(&amp;quot; &lt;/font&gt;&lt;font color="#000000"&gt;+&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;opt.parameterName&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;+&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;)\\[(\\d+)\\]\\.&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;gi&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;reIndexedId&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;RegExp&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;^(&amp;quot; &lt;/font&gt;&lt;font color="#000000"&gt;+&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;opt.parameterName.replace(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;.&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;_&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;+&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;)_\\d+\\_&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;gi&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;reNonIndexedName&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;RegExp&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;^(&amp;quot; &lt;/font&gt;&lt;font color="#000000"&gt;+&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;opt.parameterName&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;+&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;)\\.&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;gi&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;reNonIndexedId&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;RegExp&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;^(&amp;quot; &lt;/font&gt;&lt;font color="#000000"&gt;+&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;opt.parameterName.replace(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;.&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;_&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;+&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;)_&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;gi&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;changeStrategy&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;null;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;ndx&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;-&lt;/font&gt;&lt;font color="#800000"&gt;1&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;unindexElement&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;function&lt;/font&gt;&lt;font color="#000000"&gt;(el,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;ndx)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;(el.name)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;$(el).attr(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;name&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;el.name.replace(reIndexedName,&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;$1.&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;(el.id)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;$(el).attr(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;id&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;el.id.replace(reIndexedId,&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;$1_&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;($(el).attr(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;for&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;$(el).attr(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;for&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;$(el).attr(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;for&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;).replace(reIndexedId,&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;$1_&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;indexElement&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;function&lt;/font&gt;&lt;font color="#000000"&gt;(el,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;ndx)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;(el.name)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;$(el).attr(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;name&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;el.name.replace(reNonIndexedName,&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;$1[&amp;quot; &lt;/font&gt;&lt;font color="#000000"&gt;+&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;ndx&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;+&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;].&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;(el.id)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;$(el).attr(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;id&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;el.id.replace(reNonIndexedId,&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;$1_&amp;quot; &lt;/font&gt;&lt;font color="#000000"&gt;+&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;ndx&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;+&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;_&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;($(el).attr(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;for&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;$(el).attr(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;for&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;$(el).attr(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;for&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;).replace(reNonIndexedId,&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;$1_&amp;quot; &lt;/font&gt;&lt;font color="#000000"&gt;+&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;ndx&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;+&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;_&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;reindexElement&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;function&lt;/font&gt;&lt;font color="#000000"&gt;(el,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;ndx)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;(el.name)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;$(el).attr(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;name&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;el.name.replace(reIndexedName,&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;$1[&amp;quot; &lt;/font&gt;&lt;font color="#000000"&gt;+&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;ndx&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;+&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;].&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;(el.id)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;$(el).attr(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;id&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;el.id.replace(reIndexedId,&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;$1_&amp;quot; &lt;/font&gt;&lt;font color="#000000"&gt;+&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;ndx&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;+&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;_&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;($(el).attr(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;for&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;$(el).attr(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;for&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;$(el).attr(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;for&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;).replace(reIndexedId,&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;$1_&amp;quot; &lt;/font&gt;&lt;font color="#000000"&gt;+&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;ndx&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;+&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;_&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;))&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;font color="#000000"&gt;.each(&lt;/font&gt;&lt;font color="#0000ff"&gt;function&lt;/font&gt;&lt;font color="#000000"&gt;(idx,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;item)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;(!opt.isRepeatedIndex(item))&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;ndx++&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;$(&lt;/font&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;font color="#000000"&gt;).find(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;:input,label&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;).each(&lt;/font&gt;&lt;font color="#0000ff"&gt;function&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;(!changeStrategy)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#006400"&gt;//evaluate only once per collection     &lt;br /&gt;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;(!&lt;/font&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;font color="#000000"&gt;.name&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;amp;&amp;amp;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;!&lt;/font&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;font color="#000000"&gt;.id)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#006400"&gt;//nothing to do here     &lt;br /&gt;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;return;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;changeStrategy&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;function&lt;/font&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#006400"&gt;//default empty function     &lt;br /&gt;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;isIndexed&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;font color="#000000"&gt;.name&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;?&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;reIndexedName.test(&lt;/font&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;font color="#000000"&gt;.name)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;:&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;font color="#000000"&gt;.id&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;?&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;reIndexedId.test(&lt;/font&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;font color="#000000"&gt;.id)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;:&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;false;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;(mode&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;==&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;ordered&amp;quot; &lt;/font&gt;&lt;font color="#000000"&gt;&amp;amp;&amp;amp;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;!isIndexed)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;mode&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;on&amp;quot;&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#006400"&gt;//we already do ordered indexing so just use the &amp;#39;on&amp;#39; mode     &lt;br /&gt;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;(isIndexed)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;(mode&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;==&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;off&amp;quot; &lt;/font&gt;&lt;font color="#000000"&gt;||&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;mode&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;==&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;toggle&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;changeStrategy&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;unindexElement&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;else&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;(mode&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;==&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;ordered&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;changeStrategy&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;reindexElement&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;else&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;(mode&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;==&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;on&amp;quot; &lt;/font&gt;&lt;font color="#000000"&gt;||&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;mode&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;==&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;toggle&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;changeStrategy&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;indexElement&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;changeStrategy(&lt;/font&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;ndx)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#006400"&gt;//fire     &lt;br /&gt;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;})&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;})&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;I don&amp;#39;t like having to scrub the data like this on the client side, but I really can&amp;#39;t think of a way to keep parameters being sent valid while still updating data in small chunks without passing indexes back and forth. Any other approaches would be great to hear!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=43235" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MikeNichols/~4/aohUkiSl37c" height="1" width="1"/&gt;</description><category domain="http://devlicio.us/blogs/mike_nichols/archive/tags/Monorail/default.aspx">Monorail</category><category domain="http://devlicio.us/blogs/mike_nichols/archive/tags/jQuery/default.aspx">jQuery</category></item><item><title>Considerations For Using PostSharp</title><link>http://devlicio.us/blogs/mike_nichols/archive/2008/11/23/considerations-for-using-postsharp.aspx</link><pubDate>Mon, 24 Nov 2008 07:19:06 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:43198</guid><dc:creator>Michael Nichols</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://devlicio.us/blogs/mike_nichols/rsscomments.aspx?PostID=43198</wfw:commentRss><comments>http://devlicio.us/blogs/mike_nichols/archive/2008/11/23/considerations-for-using-postsharp.aspx#comments</comments><description>&lt;p&gt;I recently started using PostSharp for implementing AOP into my current project. It&amp;#39;s a great project and really simplifies some specifications we have that could have been cumbersome. Introducing this into an environment that is using NAnt and development using TDD took some exploration for me so I thought I&amp;#39;d log some things I had to overcome. &lt;/p&gt;  &lt;h3&gt;Building from NAnt&lt;/h3&gt;  &lt;p&gt;I saw that there was an NAnt task created for PostSharp but I either couldn&amp;#39;t get it going, or I couldn&amp;#39;t find it ( I can&amp;#39;t remember). I ended up just using the command line app included with PostSharp, so I have an NAnt target that invokes the utility from within my project &lt;strong&gt;default.build &lt;/strong&gt;file:&lt;/p&gt;  &lt;div class="code"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;target&lt;/font&gt;&lt;font color="#ff0000"&gt; name&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;postsharp&amp;quot;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;copy&lt;/font&gt;&lt;font color="#ff0000"&gt; file&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;${build.dir}/${project::get-name()}.dll&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt; tofile&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;${build.dir}/Pre.${project::get-name()}.dll&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt; overwrite&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;true&amp;quot;/&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;exec&lt;/font&gt;&lt;font color="#ff0000"&gt; program&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;${build.dir}/PostSharp.exe&amp;quot;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;arg&lt;/font&gt;&lt;font color="#ff0000"&gt; value&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;${build.dir}/Default.psproj&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;arg&lt;/font&gt;&lt;font color="#ff0000"&gt; value&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;${build.dir}/Pre.${project::get-name()}.dll&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;arg&lt;/font&gt;&lt;font color="#ff0000"&gt; value&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;/P:Output=${build.dir}/Post.${project::get-name()}.dll&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;arg&lt;/font&gt;&lt;font color="#ff0000"&gt; value&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;/P:ReferenceDirectory=${build.dir}&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;arg&lt;/font&gt;&lt;font color="#ff0000"&gt; value&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;/P:SearchPath=${build.dir}&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;arg&lt;/font&gt;&lt;font color="#ff0000"&gt; value&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;/P:IntermediateDirectory=${build.dir}&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;arg&lt;/font&gt;&lt;font color="#ff0000"&gt; value&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;/P:CleanIntermediate=False&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;arg&lt;/font&gt;&lt;font color="#ff0000"&gt; value&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;/P:MSBuildProjectFullPath=D:\path\to\src\app\Cei.MaterialsTesting\${project::get-name()}.csproj&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;arg&lt;/font&gt;&lt;font color="#ff0000"&gt; value&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;/P:SignAssembly=True&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;arg&lt;/font&gt;&lt;font color="#ff0000"&gt; value&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;/P:PrivateKeyLocation=${root.dir}/my.snk&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;exec&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;/font&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;A few things to note here. I had to first make a copy of the assembly I am manipulating and rename it with an &amp;#39;Pre.&lt;em&gt;assemblyname&lt;/em&gt;&amp;#39; prefix (or whatever). The dll was getting locked during the build so PostSharp would complain.&amp;#160; The output of PostSharp is &amp;#39;Post.&lt;em&gt;&amp;lt;assemblyname&amp;gt;&lt;/em&gt;&amp;#39; and then I copy that after the utility runs. I think I had the same locking issue that forced me to do this.&lt;/p&gt;  &lt;p&gt;Notice I am doing everything in my build directory so I had previously copied over all required PostSharp files to do that when I copy all other dependencies:&lt;/p&gt;  &lt;div class="code"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;copy&lt;/font&gt;&lt;font color="#ff0000"&gt; todir&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;${build.dir}&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;fileset&lt;/font&gt;&lt;font color="#ff0000"&gt; basedir&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;${tools.dir}/PostSharp&amp;quot;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;include&lt;/font&gt;&lt;font color="#ff0000"&gt; name&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;*.dll&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;include&lt;/font&gt;&lt;font color="#ff0000"&gt; name&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;*.exe&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;include&lt;/font&gt;&lt;font color="#ff0000"&gt; name&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;*.targets&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;include&lt;/font&gt;&lt;font color="#ff0000"&gt; name&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;*.psproj&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;include&lt;/font&gt;&lt;font color="#ff0000"&gt; name&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;*.config&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;include&lt;/font&gt;&lt;font color="#ff0000"&gt; name&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;*.psplugin&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;include&lt;/font&gt;&lt;font color="#ff0000"&gt; name&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;*.version&amp;quot;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;fileset&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;copy&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;/font&gt; &lt;/div&gt;  &lt;div class="code"&gt;&amp;#160;&lt;/div&gt;  &lt;h3&gt;&lt;/h3&gt;  &lt;h3&gt;TDD Becomes Heavy&lt;/h3&gt;  &lt;p&gt;The compilation times are considerably larger due to the post-compilation magic. When you are used to almost instant feedback in the IDE this starts out as being an irritation then begins to affect how I write my tests - not good. I will probably pull my aspect related tests into their own test assembly and then target assemblies that are actually used in the app will require some kind of environment condition on the PostSharp targets setup in the .csproj files. I haven&amp;#39;t resolved the better approach to take to get around this.&amp;#160; I know my own tendency toward impatience will cause me to write bad tests, or not at all, if I have to wait for each rebuild to take so long so I need to keep it quick.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=43198" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MikeNichols/~4/1_D0psb_Gzo" height="1" width="1"/&gt;</description><category domain="http://devlicio.us/blogs/mike_nichols/archive/tags/AOP/default.aspx">AOP</category><category domain="http://devlicio.us/blogs/mike_nichols/archive/tags/PostSharp/default.aspx">PostSharp</category></item><item><title>Sorry I am so immature</title><link>http://devlicio.us/blogs/mike_nichols/archive/2008/11/23/sorry-i-am-so-immature.aspx</link><pubDate>Sun, 23 Nov 2008 08:12:47 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:43197</guid><dc:creator>Michael Nichols</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://devlicio.us/blogs/mike_nichols/rsscomments.aspx?PostID=43197</wfw:commentRss><comments>http://devlicio.us/blogs/mike_nichols/archive/2008/11/23/sorry-i-am-so-immature.aspx#comments</comments><description>&lt;p&gt;From NH user group:&lt;/p&gt; &lt;a href="http://tinypic.com" target="_blank"&gt;&lt;img alt="Image and video hosting by TinyPic" src="http://i37.tinypic.com/344zapv.jpg" border="0" /&gt;&lt;/a&gt;&amp;quot;I have a &amp;quot;pepe&amp;quot; and I know it is not a proxy&amp;quot;   &lt;p&gt;If this doesn&amp;#39;t belong in a software developer&amp;#39;s adaptation of&amp;#160; Napoleon Dynamite, I don&amp;#39;t know what would.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=43197" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MikeNichols/~4/aIQupQNxm6g" height="1" width="1"/&gt;</description></item><item><title>Enabling auto-detection of response type in jQuery</title><link>http://devlicio.us/blogs/mike_nichols/archive/2008/10/14/enabling-auto-detection-of-response-type-in-jquery.aspx</link><pubDate>Wed, 15 Oct 2008 03:40:39 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:42676</guid><dc:creator>Michael Nichols</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://devlicio.us/blogs/mike_nichols/rsscomments.aspx?PostID=42676</wfw:commentRss><comments>http://devlicio.us/blogs/mike_nichols/archive/2008/10/14/enabling-auto-detection-of-response-type-in-jquery.aspx#comments</comments><description>&lt;p&gt;Sometimes you don&amp;#39;t know what type of document the server is going to return, so it would be nice to have the ajax handler deal with the response as the server is directing it to. &lt;/p&gt;  &lt;p&gt;JQuery doesn&amp;#39;t have this baked in (I have had a ticket for ages there to implement it), but a workaround is to roll your own handler. The data filter that was introduced in the latest round of jquery is useless since you don&amp;#39;t have access to the response object (and thus the header) and doing hacky string parsing was brittle. To replace the current handler, just roll your own &lt;strong&gt;httpData&lt;/strong&gt; function that replaces the native function in jquery.&lt;/p&gt;  &lt;p&gt;Using jquery 1.2.6 +&amp;#160; here is a patch you can add &lt;em&gt;after &lt;/em&gt;the jquery reference on your page:&lt;/p&gt;  &lt;div class="code"&gt;&lt;font color="#000000"&gt;*&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;patch&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;for&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;dynamic&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;evaluation&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;of&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;xhr&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;responseType&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;to&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;set&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;the&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;dataType&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;on&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;jQuery&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;*/&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;jQuery.extend({&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;httpData:&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;function&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;xhr,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;type,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;s&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;ct&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;xhr.getResponseHeader(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;content-type&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;),&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;xml&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;type&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;==&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;xml&amp;quot; &lt;/font&gt;&lt;font color="#000000"&gt;||&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;!type&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;amp;&amp;amp;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;ct&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;amp;&amp;amp;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;ct.indexOf(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;xml&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#800000"&gt;0&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;script&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;type&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;==&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;script&amp;quot; &lt;/font&gt;&lt;font color="#000000"&gt;||&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;!type&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;amp;&amp;amp;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;ct&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;amp;&amp;amp;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;ct.indexOf(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;script&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#800000"&gt;0&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;json&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;type&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;==&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;json&amp;quot; &lt;/font&gt;&lt;font color="#000000"&gt;||&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;!type&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;amp;&amp;amp;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;ct&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;amp;&amp;amp;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;ct.indexOf(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;json&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#800000"&gt;0&lt;/font&gt;&lt;font color="#000000"&gt;,&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;data&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;xml&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;?&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;xhr.responseXML&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;:&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;xhr.responseText&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;xml&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;amp;&amp;amp;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;data.documentElement.tagName&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;==&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;parsererror&amp;quot; &lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;throw&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;parsererror&amp;quot;&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#006400"&gt;// Allow a pre-filtering function to sanitize the response     &lt;br /&gt;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#006400"&gt;// s != null is checked to keep backwards compatibility     &lt;br /&gt;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;s&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;&amp;amp;&amp;amp;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;s.dataFilter&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;data&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;s.dataFilter(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;data,&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;type&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#006400"&gt;// If the type is &amp;quot;script&amp;quot;, eval it in global context     &lt;br /&gt;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;script&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;jQuery.globalEval(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;data&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#006400"&gt;// Get the JavaScript object, if JSON is used.     &lt;br /&gt;&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;json&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;data&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#0000ff"&gt;eval&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#808080"&gt;&amp;quot;(&amp;quot; &lt;/font&gt;&lt;font color="#000000"&gt;+&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;data&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;+&lt;/font&gt;&lt;font color="#808080"&gt; &amp;quot;)&amp;quot;&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;font color="#808080"&gt;&amp;#160;&lt;/font&gt;&lt;font color="#000000"&gt;data&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;font color="#808080"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;})&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;/font&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;All this is doing is what it already does with xml response types...it sniffs the response header and handles appropriately. Now I can let my server determine whether I am generating just some javascript snippet that should get evaluated or some markup that should be pushed into the page without requiring my client ajax method to state it explicitly.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=42676" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MikeNichols/~4/pMrdPTzyIc8" height="1" width="1"/&gt;</description><category domain="http://devlicio.us/blogs/mike_nichols/archive/tags/jQuery/default.aspx">jQuery</category></item><item><title>SVN revision number discrepancy</title><link>http://devlicio.us/blogs/mike_nichols/archive/2008/09/07/svn-revision-number-discrepancy.aspx</link><pubDate>Sun, 07 Sep 2008 21:38:04 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:42235</guid><dc:creator>Michael Nichols</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://devlicio.us/blogs/mike_nichols/rsscomments.aspx?PostID=42235</wfw:commentRss><comments>http://devlicio.us/blogs/mike_nichols/archive/2008/09/07/svn-revision-number-discrepancy.aspx#comments</comments><description>&lt;p&gt;I use &lt;a href="http://visualsvn.com/" target="_blank"&gt;VisualSVN&lt;/a&gt; for IDE integration of VS.NET and TortoiseSVN. While working on my build script I noticed that while fetching my svn revision number it was different than what was getting reported after a commit within the ide.&lt;/p&gt;  &lt;p&gt;I am hardly source control guru so I wasn&amp;#39;t sure what to do to track this down.&lt;/p&gt;  &lt;p&gt;Turns out I needed to do an &lt;strong&gt;svn up&lt;/strong&gt; at the root directory to bring the revision numbers back in alignment as I found in &lt;a href="http://cbbp.thep.lu.se/~jari/documents/subversion_guidelines/subversion_guidelines.pdf" target="_blank"&gt;this&lt;/a&gt; (PDF) doc. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=42235" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MikeNichols/~4/3eTJIlZ-Vx4" height="1" width="1"/&gt;</description></item><item><title>When Flushing Goes Bad: Assigned IDs in NHibernate</title><link>http://devlicio.us/blogs/mike_nichols/archive/2008/07/29/when-flushing-goes-bad-assigned-ids-in-nhibernate.aspx</link><pubDate>Wed, 30 Jul 2008 02:24:16 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:41553</guid><dc:creator>Michael Nichols</dc:creator><slash:comments>10</slash:comments><wfw:commentRss>http://devlicio.us/blogs/mike_nichols/rsscomments.aspx?PostID=41553</wfw:commentRss><comments>http://devlicio.us/blogs/mike_nichols/archive/2008/07/29/when-flushing-goes-bad-assigned-ids-in-nhibernate.aspx#comments</comments><description>&lt;p&gt;I have an aggregate root that creates another persistent entity and places it in a collection. &lt;/p&gt;  &lt;p&gt;Typically, I try to avoid letting the internal id used within an aggregate boundary seep outside, but for the purpose of mapping the relevant instance to the ui data being sent, I needed to get the id and pass it back to the ui.&lt;/p&gt;  &lt;p&gt;Using this mapping on the newly created entity:&lt;/p&gt;  &lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;   &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;class&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;AggregateRoot&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;table&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;RootsButNotTheBook&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:#008000;"&gt;&amp;lt;!--snip--&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;set&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;ChildEntities&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;class&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;ChildEntity&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;cascade&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;all&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#008000;"&gt;&amp;lt;!--more--&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;class&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;class&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;ChildEntity&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;table&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;ChildEntities&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;id&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Id&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Guid&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;generator&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;class&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;assigned&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;id&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
        
    &lt;span style="color:#008000;"&gt;&amp;lt;!--more mapping--&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;and trying this code:&lt;/p&gt;

&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;aggregateRoot.CreateChildEntityAndAddToCollection();
session.Update(aggregateRoot);
session.Flush();&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Will get me this NHibernate exception:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;NHibernate.StaleStateException: Unexpected row count: 0; expected: 1&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Why? Well, inside my ChildEntity creation logic, I am generating an id for the entity so NHibernate thinks that it is a previously persisted entity ... but of course it isn&amp;#39;t.&lt;/p&gt;

&lt;p&gt;To make this work I change my child entity mapping to :&lt;/p&gt;

&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;class&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;ChildEntity&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;table&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;ChildEntities&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;id&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Id&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Guid&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;generator&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;class&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;assigned&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;id&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;version&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;LastModifiedOn&amp;quot;&lt;/span&gt; 
                &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;timestamp&amp;quot;&lt;/span&gt; 
                &lt;span style="color:#ff0000;"&gt;column&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;LastModifiedOn&amp;quot;&lt;/span&gt; 
                &lt;span style="color:#ff0000;"&gt;access&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;nosetter.camelcase&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span style="color:#008000;"&gt;&amp;lt;!--more mapping--&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Adding the Versioning element to my entity now lets NHibernate know how to deal with the entity as it should and the code now works swimmingly.&lt;/p&gt;

&lt;p&gt;The Hibernate documentation &lt;a href="http://www.hibernate.org/hib_docs/v3/reference/en/html_single/#mapping-declaration-version" target="_blank"&gt;states&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;A version or timestamp property should never be null for a detached instance, so Hibernate will detact any instance with a null version or timestamp as transient, no matter what other unsaved-value strategies are specified. &lt;em&gt;Declaring a nullable version or timestamp property is an easy way to avoid any problems with transitive reattachment in Hibernate, especially useful for people using assigned identifiers or composite keys!&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Therefore I actually used a nullable DateTime on my ChildEntity class, but things seemed to work even when I used a non-nullable DateTime, so I am not sure what I am missing there. Let me know if there are any errors in anything I present here...&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=41553" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MikeNichols/~4/dYFtNMhsvqs" height="1" width="1"/&gt;</description></item><item><title>jQuery.cascade : Cascading values from forms</title><link>http://devlicio.us/blogs/mike_nichols/archive/2008/05/25/jquery-cascade-cascading-values-from-forms.aspx</link><pubDate>Sun, 25 May 2008 09:46:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:40744</guid><dc:creator>Michael Nichols</dc:creator><slash:comments>48</slash:comments><wfw:commentRss>http://devlicio.us/blogs/mike_nichols/rsscomments.aspx?PostID=40744</wfw:commentRss><comments>http://devlicio.us/blogs/mike_nichols/archive/2008/05/25/jquery-cascade-cascading-values-from-forms.aspx#comments</comments><description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;First, get it &lt;a href="http://plugins.jquery.com/project/cascade" target="_blank"&gt;here&lt;/a&gt; ...&lt;/p&gt;&lt;p&gt;Please leave commments/questions on jquery google group at : http://groups.google.com/group/jquery-en. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;font color="#008000"&gt;UPDATE: Fixed bug in &lt;b&gt;ajax &lt;/b&gt;extension whereby it was holding a reference to previous data params. Also updated to work with jquery 1.2.6 in demo pack.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#008000"&gt;UPDATE 06-09-2008 : Breaking change: I inverted dependency from child==&amp;gt;parent to allow unique data sources for each target of a cascade. See distribution for details. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;A common task is quickly fetching data to respond to changes on web forms. The canonical example is cascading &lt;b&gt;select &lt;/b&gt;forms that provide options based on previous selections. However, there are numerous variants of this simple scenario that could be simplified using jquery&amp;#39;s plugin pattern. Really, the goal is simple...when something happens on my page, get some data from somewhere and put in something else, with each item looking like I specify.&lt;/p&gt;  &lt;p&gt;Being inspired by the awesome autocomplete plugin &lt;a href="http://reinh.com/2008/02/21/new-jquery-autocomplete-plugin.html" target="_blank"&gt;here&lt;/a&gt;, I adapted their compact code and event delegation pattern to create a simple but powerful plugin for cascading form results into their targets.&lt;/p&gt;  &lt;p&gt;While the initial goal was simply cascading select lists and being able to chain them together, the event delegation made so simple in jquery quickly expanded the potential.&lt;/p&gt;  &lt;p&gt;You can cascade from any kind of element into any other kind of element (for the most part). You can also provide extensions to the plugin easily enough to handle just about anything and it just weighs in at around 100 lines of code. Packed, it&amp;#39;s 1.3 kB.&lt;/p&gt;  &lt;h2&gt;Events&lt;/h2&gt;  &lt;p&gt;There are only two events, &lt;b&gt;loading.cascade&lt;/b&gt; and &lt;b&gt;loaded.cascade &lt;/b&gt;triggered. You may specify what event will fire the cascade on the parent element. To bind to the cascade events, use the chained binding syntax common in jquery...this lets the control scale without munging up the options. For a great discussion of this technique see &lt;a href="http://yehudakatz.com/2008/02/01/modularity-in-jquery/" target="_blank"&gt;here&lt;/a&gt; and &lt;a href="http://yehudakatz.com/2008/02/05/modularity-in-jquery-part-ii/" target="_blank"&gt;here&lt;/a&gt; .&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;h2&gt;Usage&lt;/h2&gt;  &lt;p&gt;Here are some examples on how to use it:&lt;/p&gt;  &lt;p&gt;With all data being json, using the following structure:&lt;/p&gt;  &lt;div&gt;   &lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;"&gt;{&lt;span&gt;&amp;#39;when&amp;#39;&lt;/span&gt;:&lt;span&gt;&amp;#39;selectedValue&amp;#39;&lt;/span&gt;,&lt;span&gt;&amp;#39;value&amp;#39;&lt;/span&gt;:&lt;span&gt;&amp;#39;itemValue&amp;#39;&lt;/span&gt;,&lt;span&gt;&amp;#39;text&amp;#39;&lt;/span&gt;:&lt;span&gt;&amp;#39;itemText&amp;#39;&lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
  &lt;br /&gt;&lt;/p&gt;

&lt;h3&gt;&amp;nbsp;&amp;nbsp; with static list on page:&lt;/h3&gt;

&lt;div style="border:1px solid gray;margin:20px 0px 10px;padding:4px;overflow:auto;font-size:8pt;width:97.5%;cursor:text;max-height:200px;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;"&gt;
  &lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;"&gt;$(&lt;span&gt;&amp;#39;#myChildSelect&amp;#39;&lt;/span&gt;).cascade(&lt;span&gt;&amp;#39;#myParentSelect&amp;#39;&lt;/span&gt;, {&lt;br /&gt;list: [{&lt;span&gt;&amp;#39;when&amp;#39;&lt;/span&gt;:&lt;span&gt;&amp;#39;A&amp;#39;&lt;/span&gt;,&lt;span&gt;&amp;#39;value&amp;#39;&lt;/span&gt;:&lt;span&gt;&amp;#39;A1&amp;#39;&lt;/span&gt;,&lt;span&gt;&amp;#39;text&amp;#39;&lt;/span&gt;:&lt;span&gt;&amp;#39;A1&amp;#39;&lt;/span&gt;},{&lt;span&gt;&amp;#39;when&amp;#39;&lt;/span&gt;:&lt;span&gt;&amp;#39;B&amp;#39;&lt;/span&gt;,&lt;span&gt;&amp;#39;value&amp;#39;&lt;/span&gt;:&lt;span&gt;&amp;#39;B1&amp;#39;&lt;/span&gt;,&lt;span&gt;&amp;#39;text&amp;#39;&lt;/span&gt;:&lt;span&gt;&amp;#39;B1&amp;#39;&lt;/span&gt;}],&lt;br /&gt;template: &lt;span&gt;function&lt;/span&gt;(item) { &lt;span&gt;return&lt;/span&gt; &lt;span&gt;&amp;quot;&amp;lt;option value=&amp;#39;&amp;quot;&lt;/span&gt; + item.value + &lt;span&gt;&amp;quot;&amp;#39;&amp;gt;&amp;quot;&lt;/span&gt; + item.text + &lt;span&gt;&amp;quot;&amp;lt;/option&amp;gt;&amp;quot;&lt;/span&gt;; },&lt;br /&gt;match: &lt;span&gt;function&lt;/span&gt;(selectedValue) { &lt;span&gt;return&lt;/span&gt; &lt;span&gt;this&lt;/span&gt;.when == selectedValue; }&lt;br /&gt;});&lt;/pre&gt;
&lt;/div&gt;

&lt;h3&gt;with ajax call (using .ext ):&lt;/h3&gt;

&lt;div style="border:1px solid gray;margin:20px 0px 10px;padding:4px;overflow:auto;font-size:8pt;width:97.5%;cursor:text;max-height:200px;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;"&gt;
  &lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;"&gt;$(&lt;span&gt;&amp;#39;#myChildSelect&amp;#39;&lt;/span&gt;).cascade(&lt;span&gt;&amp;#39;#myParentSelect&amp;#39;&lt;/span&gt;, {&lt;br /&gt;    ajax: &lt;span&gt;&amp;#39;/my/url/action&amp;#39;&lt;/span&gt;,    &lt;br /&gt;    template: &lt;span&gt;function&lt;/span&gt;(item) { &lt;span&gt;return&lt;/span&gt; &lt;span&gt;&amp;quot;&amp;lt;option value=&amp;#39;&amp;quot;&lt;/span&gt; + item.value + &lt;span&gt;&amp;quot;&amp;#39;&amp;gt;&amp;quot;&lt;/span&gt; + item.text + &lt;span&gt;&amp;quot;&amp;lt;/option&amp;gt;&amp;quot;&lt;/span&gt;; },&lt;br /&gt;    match: &lt;span&gt;function&lt;/span&gt;(selectedValue) { &lt;span&gt;return&lt;/span&gt; &lt;span&gt;this&lt;/span&gt;.when == selectedValue; }&lt;br /&gt;    });   &lt;/pre&gt;
&lt;/div&gt;

&lt;h3&gt;&amp;nbsp;&amp;nbsp; &lt;/h3&gt;

&lt;h3&gt;with chained cascading:&lt;/h3&gt;

&lt;div style="border:1px solid gray;margin:20px 0px 10px;padding:4px;overflow:auto;font-size:8pt;width:97.5%;cursor:text;max-height:200px;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;"&gt;
  &lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;"&gt;$(&lt;span&gt;&amp;#39;#myFirstChildSelect&amp;#39;&lt;/span&gt;).cascade(&lt;span&gt;&amp;#39;#myParentSelect&amp;#39;&lt;/span&gt;, {&lt;br /&gt;ajax: {url: &lt;span&gt;&amp;#39;/my/url/action&amp;#39;&lt;/span&gt; },    &lt;br /&gt;template: &lt;span&gt;function&lt;/span&gt;(item) { &lt;span&gt;return&lt;/span&gt; &lt;span&gt;&amp;quot;&amp;lt;option value=&amp;#39;&amp;quot;&lt;/span&gt; + item.value + &lt;span&gt;&amp;quot;&amp;#39;&amp;gt;&amp;quot;&lt;/span&gt; + item.text + &lt;span&gt;&amp;quot;&amp;lt;/option&amp;gt;&amp;quot;&lt;/span&gt;; },&lt;br /&gt;match: &lt;span&gt;function&lt;/span&gt;(selectedValue) { &lt;span&gt;return&lt;/span&gt; &lt;span&gt;this&lt;/span&gt;.when == selectedValue; }&lt;br /&gt;});   &lt;br /&gt;&lt;br /&gt;$(&lt;span&gt;&amp;#39;#mySecondChildSelect&amp;#39;&lt;/span&gt;).cascade(&lt;span&gt;&amp;#39;#myFirstChildSelect&amp;#39;&lt;/span&gt;, {&lt;br /&gt;ajax: {url: &lt;span&gt;&amp;#39;/my/url/action&amp;#39;&lt;/span&gt; },    &lt;br /&gt;template: &lt;span&gt;function&lt;/span&gt;(item) { &lt;span&gt;return&lt;/span&gt; &lt;span&gt;&amp;quot;&amp;lt;option value=&amp;#39;&amp;quot;&lt;/span&gt; + item.value + &lt;span&gt;&amp;quot;&amp;#39;&amp;gt;&amp;quot;&lt;/span&gt; + item.text + &lt;span&gt;&amp;quot;&amp;lt;/option&amp;gt;&amp;quot;&lt;/span&gt;; },&lt;br /&gt;match: &lt;span&gt;function&lt;/span&gt;(selectedValue) { &lt;span&gt;return&lt;/span&gt; &lt;span&gt;this&lt;/span&gt;.when == selectedValue; }&lt;br /&gt;});  &lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&amp;nbsp; &lt;/p&gt;

&lt;h3&gt;add a firstOption for optional lists using the loaded.cascade event:&amp;nbsp;&amp;nbsp; &lt;/h3&gt;

&lt;div style="border:1px solid gray;margin:20px 0px 10px;padding:4px;overflow:auto;font-size:8pt;width:97.5%;cursor:text;max-height:200px;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;"&gt;
  &lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;"&gt;jQuery(&lt;span&gt;&amp;quot;#myChildSelect&amp;quot;&lt;/span&gt;).cascade(&lt;span&gt;&amp;quot;#myParentSelect&amp;quot;&lt;/span&gt;,{    &lt;br /&gt;        timeout: 100,        &lt;br /&gt;        list:  myDataSource,            &lt;br /&gt;        template: &lt;span&gt;function&lt;/span&gt;(item) { &lt;span&gt;return&lt;/span&gt; &lt;span&gt;&amp;quot;&amp;lt;option value=&amp;#39;&amp;quot;&lt;/span&gt; + item.Value + &lt;span&gt;&amp;quot;&amp;#39;&amp;gt;&amp;quot;&lt;/span&gt; + item.Text + &lt;span&gt;&amp;quot;&amp;lt;/option&amp;gt;&amp;quot;&lt;/span&gt;; },&lt;br /&gt;        match: &lt;span&gt;function&lt;/span&gt;(selectedValue) { &lt;span&gt;return&lt;/span&gt; &lt;span&gt;this&lt;/span&gt;.When == selectedValue; }         &lt;br /&gt;    })&lt;br /&gt;    .bind(&lt;span&gt;&amp;quot;loaded.cascade&amp;quot;&lt;/span&gt;,&lt;span&gt;function&lt;/span&gt;(e,parent) { jQuery(&lt;span&gt;this&lt;/span&gt;).prepend(&lt;span&gt;&amp;quot;&amp;lt;option value=&amp;#39;empty&amp;#39; selected=&amp;#39;true&amp;#39;&amp;gt;--Select--&amp;lt;/option&amp;gt;&amp;quot;&lt;/span&gt;);});    &lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;The download has a sample page with lots of different setups and usages. Please let me know if you find any bugs or questions. This is my first plugin for jquery so I may be missing some hidden jquery goodness to make the code more elegant.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;I will try to get a working demo up soon.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=40744" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MikeNichols/~4/Tvs5DWiENfE" height="1" width="1"/&gt;</description></item><item><title>Third Party Libraries Organization</title><link>http://devlicio.us/blogs/mike_nichols/archive/2008/05/09/third-party-libraries-organization.aspx</link><pubDate>Sat, 10 May 2008 04:46:57 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:40428</guid><dc:creator>Michael Nichols</dc:creator><slash:comments>4</slash:comments><wfw:commentRss>http://devlicio.us/blogs/mike_nichols/rsscomments.aspx?PostID=40428</wfw:commentRss><comments>http://devlicio.us/blogs/mike_nichols/archive/2008/05/09/third-party-libraries-organization.aspx#comments</comments><description>&lt;p&gt;I finally have my CI environment and am wondering what the heck took me so long to take time to get it set up. This has had me looking again at how I set my project folders up. Typically I am using the libraries from Castle/Nhib/Rhino stack and build them all at the same time quite frequently since the Rhino build process simply ROCKS. However I notice everyone putting all their dependencies in separate folders like this:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;/lib/Castle&lt;/li&gt;    &lt;li&gt;/lib/NHibernate&lt;/li&gt;    &lt;li&gt;/lib/Rhino&lt;/li&gt;    &lt;li&gt;/lib/...&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Personally, I have just thrown all my dependencies in a single /lib folder and haven&amp;#39;t come across issues with this. I still keep tools like mbunit or nant in a separate /tools directory.&lt;/p&gt;  &lt;p&gt;My /lib directory isn&amp;#39;t as pretty organized looking but like I said most of my dependencies are getting rebuilt at the same time anyways. So what advantage am I missing out on by just throwing everything into a single folder? It has made it much simpler for copying assemblies from other builds (I know I could automate that too).&amp;#160; Am I being overly simplistic? &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=40428" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MikeNichols/~4/LYepGC6eMzo" height="1" width="1"/&gt;</description><category domain="http://devlicio.us/blogs/mike_nichols/archive/tags/Project+Structure/default.aspx">Project Structure</category><category domain="http://devlicio.us/blogs/mike_nichols/archive/tags/Builds/default.aspx">Builds</category></item><item><title>Configuring IIS 6.0 to send mail via SMTP for asp.net applications</title><link>http://devlicio.us/blogs/mike_nichols/archive/2008/05/07/configuring-iis-6-0-to-send-mail-via-smtp-for-asp-net-applications.aspx</link><pubDate>Thu, 08 May 2008 05:29:21 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:40371</guid><dc:creator>Michael Nichols</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://devlicio.us/blogs/mike_nichols/rsscomments.aspx?PostID=40371</wfw:commentRss><comments>http://devlicio.us/blogs/mike_nichols/archive/2008/05/07/configuring-iis-6-0-to-send-mail-via-smtp-for-asp-net-applications.aspx#comments</comments><description>&lt;p&gt;Enabling smtp services for IIS is well documented, but configuring in my environment was more difficult than I would have thought it would be... So this post is partly a note for me as we will be changing out gear soon.&lt;/p&gt;  &lt;p&gt;Our environment is not very exotic...a box acting as an web server, and another box acting as an exchange server. Both are running Win2003. &lt;/p&gt;  &lt;p&gt;First, smtp services must obviously be enabled/running. &lt;a href="http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/e4cf06f5-9a36-474b-ba78-3f287a2b88f2.mspx?mfr=true" target="_blank"&gt;Here is how&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Next, in IIS, select the new SMTP Virtual server node and right-click/Properties/Access/Relay. Be sure &amp;#39;Only the list below&amp;#39; is selected and add &amp;#39;127.0.0.1&amp;#39; (localhost) to your Computers Access list . Finally, deselect &amp;#39;Allow all computers which successfully authenticate...&amp;#39;. Be very careful not to turn your server into a relay server unless you like being blacklisted .&lt;/p&gt;  &lt;p&gt;Now, at this point I was able to get my mail sent to domains outside my own. So if my webserver was webbox.mydomain.com and it sent mail to mygmail@gmail.com then all worked just fine. But I was unable to send mail internally to other mail accounts (mydomain.com). &lt;/p&gt;  &lt;p&gt;What I failed to do was set up a SMART HOST to route mail to my exchange box.&lt;/p&gt;  &lt;p&gt;To do that, right-click the smtp node in iis/Properties/Delivery/Advanced. Enter the name of the server hosting exchange and deselect &amp;#39;attempt direct delivery before sending to smart host&amp;#39;. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=40371" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MikeNichols/~4/heUfvtUnxZs" height="1" width="1"/&gt;</description><category domain="http://devlicio.us/blogs/mike_nichols/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://devlicio.us/blogs/mike_nichols/archive/tags/IIS/default.aspx">IIS</category><category domain="http://devlicio.us/blogs/mike_nichols/archive/tags/Email/default.aspx">Email</category></item><item><title>Unobtrusive Growl Messaging Using Monorail Filter</title><link>http://devlicio.us/blogs/mike_nichols/archive/2008/05/01/unobtrusive-growl-messaging-using-monorail-filter.aspx</link><pubDate>Thu, 01 May 2008 07:51:35 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:40284</guid><dc:creator>Michael Nichols</dc:creator><slash:comments>7</slash:comments><wfw:commentRss>http://devlicio.us/blogs/mike_nichols/rsscomments.aspx?PostID=40284</wfw:commentRss><comments>http://devlicio.us/blogs/mike_nichols/archive/2008/05/01/unobtrusive-growl-messaging-using-monorail-filter.aspx#comments</comments><description>&lt;p&gt;A clever &lt;a href="http://stanlemon.net/projects/jgrowl.html" target="_blank"&gt;plugin&lt;/a&gt; for jquery recently was released which is an impression of Mac&amp;#39;s Growl. It simply displays messages for a period of time or makes them &amp;#39;sticky&amp;#39;. It also manages multiple messages at a time very nicely and all the styling is external so a real snap to customize. The best part is how simply it is implemented. You simply call &lt;/p&gt;  &lt;p&gt;jQuery.jGrowl(\&amp;quot;My Message Should Appear\&amp;quot;, options );&lt;/p&gt;  &lt;p&gt;and you get a popup that gradually fades. Fire off two in quick succession and &lt;strong&gt;jgrowl&lt;/strong&gt; is smart enough to fade them appropriately and provide a global &amp;#39;close&amp;#39; bar to clear all messages.&lt;/p&gt;  &lt;p&gt;On all projects it seems like the most messages I need to communicate to my users lump into similar categories; &amp;#39;errors&amp;#39;,&amp;#39;warnings&amp;#39;,&amp;#39;messages&amp;#39;,&amp;#39;success&amp;#39;,&amp;#39;failure&amp;#39;, and so on. Typically these are thrown in either a Flash or PropertyBag collection for consumption by the view. &lt;/p&gt;  &lt;p&gt;I wanted to simplify how I am passing messages to my users regardless of the request type (Ajax/Non) and regardless of whether I use JS Generation to render some view , so I narrowed down to requiring some filter which would handle all calls and inspect specific collections that I can configure that may or may not be populated with messages during the action. This will either append the messages to our http response directly, or using an &lt;strong&gt;TransformFilter&lt;/strong&gt; implementation (an &lt;strong&gt;HttpFilter&lt;/strong&gt;) - more on that later. Using a filter this way let&amp;#39;s me avoid having to drop anything on my layout or require any kind of view code. I simply attach this filter to my controller base and it just works.&lt;/p&gt;  &lt;p&gt;First, let&amp;#39;s determine what our notifications are:&lt;/p&gt;  &lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;   &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; GrowlNotification 
    { 
        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;readonly&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; key = &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Empty; 
        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; IDictionary options; 

        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; GrowlNotification(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; key) 
            : &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;(key, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; HybridDictionary()) 
        { 
        } 

        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; GrowlNotification(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; key, IDictionary options) 
        { 
            &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.key = key; 
            &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.options = options; 
        } 

        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Key 
        { 
            get { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; key; } 
        } 

        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; IDictionary Options 
        { 
            get 
            { 
                options = options ?? &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; HybridDictionary(); 
                HybridDictionary defaultOptions = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; HybridDictionary(); 
                defaultOptions.Add(&lt;span style="color:#006080;"&gt;&amp;quot;sticky&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;false&amp;quot;&lt;/span&gt;); 
                defaultOptions.Add(&lt;span style="color:#006080;"&gt;&amp;quot;theme&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;\&amp;quot;&amp;quot;&lt;/span&gt;+GetTheme()+&lt;span style="color:#006080;"&gt;&amp;quot;\&amp;quot;&amp;quot;&lt;/span&gt;); 
                defaultOptions.Add(&lt;span style="color:#006080;"&gt;&amp;quot;speed&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;\&amp;quot;slow\&amp;quot;&amp;quot;&lt;/span&gt;); 
                CommonUtils.MergeOptions(options, defaultOptions); 
                &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; options; 

            } 
        } 
        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; GetTheme() 
        { 
            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.IsNullOrEmpty(key)) 
            { 
                &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#006080;"&gt;&amp;quot;default&amp;quot;&lt;/span&gt;; 
            } 
            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; key; 
        } 

    }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#39;Key&amp;#39; is simply a corresponding value with the key of the Flash/PropertyBag being inspected by the Filter after the action. jGrowl lets us pass a &amp;#39;theme&amp;#39; to attach an additional class name to the message container on the client side so it is real easy to modify how each message appears using simple css. This will correspond with the &amp;#39;Key&amp;#39; name.&lt;/p&gt;

&lt;p&gt;Options are obviously the js options jgrowl supports. Each message type can have its own options. So you can, for example,make &amp;#39;errors&amp;#39; sticky and all other message types fade out after a bit.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Now, let&amp;#39;s encapsulate the configuration and make it accessible on the container but provide an sensible default configuration. This configuration will create the GrowlNotifications for the IGrowlGenerator at runtime:&lt;/p&gt;

&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;interface&lt;/span&gt; IGrowlConfiguration 
{ 
    &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt; &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// Gets the notifications to inject. &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt; &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt; &lt;/span&gt;
    IEnumerable&amp;lt;GrowlNotification&amp;gt; GetNotifications(); 
    &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt; &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// Determines whether this the current request is an xhr. &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt; &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// &amp;lt;returns&amp;gt; &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;///     &amp;lt;c&amp;gt;true&amp;lt;/c&amp;gt; if this instance is ajax; otherwise, &amp;lt;c&amp;gt;false&amp;lt;/c&amp;gt;. &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// &amp;lt;/returns&amp;gt; &lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; IsAjax(); 
} &lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#39;IsAjax()&amp;#39;&amp;#160; simply informs the filter of the request type so that it can handle the response message(s) appropriately. This can be simply sniffing the headers, or using a more elaborate extension I wrote but is outside the scope here.&lt;/p&gt;

&lt;p&gt;Now it&amp;#39;s default implementation:&lt;/p&gt;

&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt; &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// Default configuration for keys &amp;lt;see cref=&amp;quot;GrowlFilter&amp;quot;/&amp;gt; will  sniff to inject. It assumes &amp;#39;errors&amp;#39; and &amp;#39;success&amp;#39; &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// are intended message keys. &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt; &lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; DefaultGrowlConfiguration : IGrowlConfiguration 
    { 
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;virtual&lt;/span&gt; IEnumerable&amp;lt;GrowlNotification&amp;gt; GetNotifications() 
        { 
            HybridDictionary errorOptions = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; HybridDictionary(); 
            errorOptions.Add(&lt;span style="color:#006080;"&gt;&amp;quot;sticky&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;); 

            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; GrowlNotification[] 
                { 
                    &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; GrowlNotification(&lt;span style="color:#006080;"&gt;&amp;quot;errors&amp;quot;&lt;/span&gt;, errorOptions), 
                    &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; GrowlNotification(&lt;span style="color:#006080;"&gt;&amp;quot;success&amp;quot;&lt;/span&gt;), 
                    &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; GrowlNotification(&lt;span style="color:#006080;"&gt;&amp;quot;failure&amp;quot;&lt;/span&gt;,errorOptions), 
                    &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; GrowlNotification(&lt;span style="color:#006080;"&gt;&amp;quot;message&amp;quot;&lt;/span&gt;), 
                }; 
        } 

        &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt; &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// Determines whether this the current request is an xhr.  This assumes the &amp;lt;see cref=&amp;quot;AjaxRequestExtension&amp;quot;/&amp;gt; is being &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// used for request evaluation at runtime. &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt; &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;returns&amp;gt; &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;///     &amp;lt;c&amp;gt;true&amp;lt;/c&amp;gt; if this instance is ajax; otherwise, &amp;lt;c&amp;gt;false&amp;lt;/c&amp;gt;. &lt;/span&gt;
        &lt;span style="color:#008000;"&gt;/// &amp;lt;/returns&amp;gt; &lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;virtual&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; IsAjax() 
        { 
            &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; isAjax = MonoRailHttpHandlerFactory.CurrentEngineContext.Flash[AjaxRequestExtension.IsAjaxKey]; 
            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (isAjax != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;) 
            { 
                &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt;) isAjax; 
            } 
            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;; 
        } 
    }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Next, we&amp;#39;ll separate out how the jgrowl is generated and provide a default implementation. This will be delegated to within the Filter to write the actual javascript using the configuration: &lt;/p&gt;

&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;interface&lt;/span&gt; IGrowlGenerator 
{ 
    &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; GenerateFrom(IEngineContext context, IController controller, IControllerContext controllerContext); 
} 
&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; DefaultGrowlGenerator : IGrowlGenerator 
{ 
    &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;readonly&lt;/span&gt; IGrowlConfiguration growlConfiguration; 

    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; DefaultGrowlGenerator(IGrowlConfiguration growlConfiguration) 
    { 
        &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.growlConfiguration = growlConfiguration; 
    } 

    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; GenerateFrom(IEngineContext context, IController controller, IControllerContext controllerContext) 
    { 
        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;( growlConfiguration == &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt; ) 
        { 
            &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ArgumentNullException(&lt;span style="color:#006080;"&gt;&amp;quot;growlConfiguration&amp;quot;&lt;/span&gt;); 
        } 
        StringBuilder scriptContents = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; StringBuilder(); 
        &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; hasContent = &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;; 
        IEnumerable&amp;lt;GrowlNotification&amp;gt; notifications = growlConfiguration.GetNotifications(); 
        &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (GrowlNotification item &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; notifications ?? &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; GrowlNotification[0]) 
        { 
            &lt;span style="color:#008000;"&gt;//look in property bag first for message &lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; propBagMsg = controllerContext.PropertyBag[item.Key]; 
            &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; flashMsg = context.Flash[item.Key]; 
            &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; msg = &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Empty; 
            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (propBagMsg != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;) 
            { 
                msg = msg + propBagMsg ?? &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Empty; 
            } 
            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (flashMsg != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;) 
            { 
                msg = msg + flashMsg ?? &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Empty; 
            } 

            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (!&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.IsNullOrEmpty(msg)) 
            { 
                hasContent = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;; 
                &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; options = AbstractHelper.JavascriptOptions(item.Options); 
                scriptContents.AppendFormat(&lt;span style="color:#006080;"&gt;&amp;quot;jQuery.jGrowl(\&amp;quot;{0}\&amp;quot;, {1} );&amp;quot;&lt;/span&gt;, msg, options); 
            } 
        } 
        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (hasContent) 
        { 
            &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; inner = JSUtils.WrapWithTryCatch(scriptContents.ToString()); 
            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#006080;"&gt;&amp;quot;jQuery(document).ready(function() { &amp;quot;&lt;/span&gt; + inner + &lt;span style="color:#006080;"&gt;&amp;quot;});&amp;quot;&lt;/span&gt;; 
        } 
        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Empty; 
    } 

}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;It&amp;#39;s worth noting here that this assumes you are expecting the dataType of &amp;#39;script&amp;#39; in your jquery ajax calls. I set a global using &lt;/p&gt;

&lt;pre&gt;$.ajaxSetup({ dataType:&lt;span style="color:maroon;"&gt;&amp;quot;script&amp;quot;&lt;/span&gt; });&lt;span style="color:green;"&gt;//all calls are returned as js to evaluate&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;We can finally implement an &lt;a href="http://www.castleproject.org/monorail/"&gt;Monorail&lt;/a&gt; filter that will consume all these services and write the appropriate javascript to our response for jgrowl to handle. Here&amp;#39;s the filter:&lt;/p&gt;

&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; GrowlFilter : Filter 
{ 
    &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; prependToBodyCloseTag = &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;; 
    &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; growl = &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Empty; 
    &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; IGrowlConfiguration growlConfiguration = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DefaultGrowlConfiguration(); 
    &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; IGrowlGenerator growlGenerator; 
    &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; ModifyResponse responseModifier; 

    &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt; &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// Gets or sets the growl configuration. &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt; &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// &amp;lt;value&amp;gt;The growl configuration.&amp;lt;/value&amp;gt; &lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;virtual&lt;/span&gt; IGrowlConfiguration GrowlConfiguration 
    { 
        get { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; growlConfiguration; } 
        set { growlConfiguration = &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;; } 
    } 


    &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt; &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// Gets or sets the response modifier. &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt; &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// &amp;lt;value&amp;gt;The response modifier.&amp;lt;/value&amp;gt; &lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;virtual&lt;/span&gt; ModifyResponse ResponseModifier 
    { 
        get 
        { 
            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;(responseModifier==&lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;) 
            { 
                responseModifier = DoPrependBodyCloseTag; 
            } 
            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; responseModifier; 
        } 
        set { responseModifier = &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;; } 
    } 

    &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt; &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// Gets or sets the growl generator. &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt; &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// &amp;lt;value&amp;gt;The growl generator.&amp;lt;/value&amp;gt; &lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; IGrowlGenerator GrowlGenerator 
    { 
        get 
        { 
            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;(growlGenerator==&lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;) 
            { 
                &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;(growlConfiguration==&lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;) 
                { 
                    &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ArgumentNullException(&lt;span style="color:#006080;"&gt;&amp;quot;growlConfiguration&amp;quot;&lt;/span&gt;,&lt;span style="color:#006080;"&gt;&amp;quot;GrowlConfiguration must assigned before creating the DefaultGrowlGenerator. &amp;quot;&lt;/span&gt;); 
                } 
                growlGenerator = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DefaultGrowlGenerator(growlConfiguration); 
            } 
            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; growlGenerator; 
        } 
        set { growlGenerator = &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;; } 
    } 


    &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt; &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// Gets a value indicating whether to prepend to body close tag, as in the case of a standard request. &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt; &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// &amp;lt;value&amp;gt; &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;///     &amp;lt;c&amp;gt;true&amp;lt;/c&amp;gt; if [prepend to body close tag]; otherwise, &amp;lt;c&amp;gt;false&amp;lt;/c&amp;gt;. &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// &amp;lt;/value&amp;gt; &lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;virtual&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; PrependToBodyCloseTag 
    { 
        get { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; prependToBodyCloseTag; } 
    } 

    &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt; &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// Override this method if the filter was set to &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// handle &amp;lt;see cref=&amp;quot;F:Castle.MonoRail.Framework.ExecuteWhen.AfterAction&amp;quot;/&amp;gt; &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt; &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;context&amp;quot;&amp;gt;The MonoRail request context&amp;lt;/param&amp;gt; &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;controller&amp;quot;&amp;gt;The controller instance&amp;lt;/param&amp;gt; &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;controllerContext&amp;quot;&amp;gt;The controller context.&amp;lt;/param&amp;gt; &lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; OnAfterAction(IEngineContext context, IController controller, 
                                          IControllerContext controllerContext) 
    { 
        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (growlConfiguration == &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;) 
        { 
            &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ArgumentNullException(&lt;span style="color:#006080;"&gt;&amp;quot;growlConfiguration&amp;quot;&lt;/span&gt;, 
                                            &lt;span style="color:#006080;"&gt;&amp;quot;Growl requires either an implementation of IGrowlConfiguration in the container, or using the DefaultGrowlConfiguration without any registration.&amp;quot;&lt;/span&gt;); 
        } 
        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;( GrowlGenerator == &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;) 
        { 
            &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ArgumentNullException(&lt;span style="color:#006080;"&gt;&amp;quot;growlGenerator&amp;quot;&lt;/span&gt;); 
        } 
        growl = GrowlGenerator.GenerateFrom(context, controller, controllerContext); 

        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (growlConfiguration.IsAjax()) 
        { 
            &lt;span style="color:#008000;"&gt;//this is an xhr so assume jquery.ajax is expecting dataType:&amp;#39;script&amp;#39; and write javascript to stream &lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (controllerContext.SelectedViewName !=&lt;span style="color:#0000ff;"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; !controllerContext.SelectedViewName.EndsWith(&lt;span style="color:#006080;"&gt;&amp;quot;js&amp;quot;&lt;/span&gt;)) 
            { 
                controllerContext.SelectedViewName = &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;; 
            } 
            context.Response.Output.Write(growl); 
        } 
        &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt; 
        { 
            prependToBodyCloseTag = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;; 
        } 
         
    } 
    &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt; &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// Does the prepending to the body close tag. &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt; &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;responseText&amp;quot;&amp;gt;The response text.&amp;lt;/param&amp;gt; &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt; &lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;virtual&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; DoPrependBodyCloseTag(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; responseText) 
    { 
        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; responseText.Replace(&lt;span style="color:#006080;"&gt;&amp;quot;&amp;lt;/body&amp;gt;&amp;quot;&lt;/span&gt;, AbstractHelper.ScriptBlock(growl) + &lt;span style="color:#006080;"&gt;&amp;quot;&amp;lt;/body&amp;gt;&amp;quot;&lt;/span&gt;); 
    } 
    &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt; &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// Override this method if the filter was set to &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// handle &amp;lt;see cref=&amp;quot;F:Castle.MonoRail.Framework.ExecuteWhen.AfterRendering&amp;quot;/&amp;gt; &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt; &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;context&amp;quot;&amp;gt;The MonoRail request context&amp;lt;/param&amp;gt; &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;controller&amp;quot;&amp;gt;The controller instance&amp;lt;/param&amp;gt; &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;controllerContext&amp;quot;&amp;gt;The controller context.&amp;lt;/param&amp;gt; &lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; OnAfterRendering(IEngineContext context, IController controller, 
                                             IControllerContext controllerContext) 
    { 
        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (prependToBodyCloseTag) 
        { 
            context.UnderlyingContext.Response.Filter = 
                &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ModifyResponseFilter( context.UnderlyingContext.Response.Filter,ResponseModifier); 
        } 
    } 
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;After the action, this filter determines whether to write the javascript directy to the response in the event of an ajax call, or whether to use an HttpFilter to prepend the javascript to the &lt;strong&gt;&amp;lt;/body&amp;gt;. &lt;/strong&gt;Here&amp;#39;s the httpfilter being used to modify response output.It accepts an delegate that I can override in my filter if I want the javascript to appear somewhere else on my page:&lt;/p&gt;

&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt; &lt;/span&gt;
&lt;span style="color:#008000;"&gt;/// Delegate for modifying the contents of the response. Passes in the current response text for manipulation and &lt;/span&gt;
&lt;span style="color:#008000;"&gt;/// requires the final response to be write back into the stream. &lt;/span&gt;
&lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt; &lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;delegate&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; ModifyResponse(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; responseText); 
&lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt; &lt;/span&gt;
&lt;span style="color:#008000;"&gt;/// For intercepting the response and manipulating it with the &amp;lt;see cref=&amp;quot;ModifyResponse&amp;quot;/&amp;gt; passed in. &lt;/span&gt;
&lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt; &lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; ModifyResponseFilter : TransformFilter 
{ 
    &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;readonly&lt;/span&gt; ModifyResponse responseModifier; 

    &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt; &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// Initializes a new instance of the &amp;lt;see cref=&amp;quot;ModifyResponseFilter&amp;quot;/&amp;gt; class. &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt; &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;baseStream&amp;quot;&amp;gt;The base stream.&amp;lt;/param&amp;gt; &lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;responseModifier&amp;quot;&amp;gt;The response modifier.&amp;lt;/param&amp;gt; &lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; ModifyResponseFilter( Stream baseStream, ModifyResponse responseModifier):&lt;span style="color:#0000ff;"&gt;base&lt;/span&gt;(baseStream) 
    { 
        &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.responseModifier = responseModifier; 
    } 

    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Write(&lt;span style="color:#0000ff;"&gt;byte&lt;/span&gt;[] buffer, &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; offset, &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; count) 
    { 
        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (Closed) &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ObjectDisposedException(&lt;span style="color:#006080;"&gt;&amp;quot;ModifyResponseFilter&amp;quot;&lt;/span&gt;); 
        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;(responseModifier== &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;) 
        { 
            &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ArgumentNullException(&lt;span style="color:#006080;"&gt;&amp;quot;responseModifier&amp;quot;&lt;/span&gt;); 
        } 
        &lt;span style="color:#008000;"&gt;//Get a string version of the buffer &lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; content = responseModifier(Encoding.Default.GetString(buffer, offset, count)); 

        &lt;span style="color:#0000ff;"&gt;byte&lt;/span&gt;[] newOutput = Encoding.Default.GetBytes(content); 
        BaseStream.Write(newOutput, 0, newOutput.Length); 
    } 
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Finally here&amp;#39;s a screenshot of it in action after an ajax call. During the call I had placed a message in Flash[&amp;quot;success&amp;quot;] and now it is displaying (in the gray box) that message to my user without me having to handle anything on the client side or write any view code. Simple.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://devlicio.us/blogs/mike_nichols/WindowsLiveWriter/UnobtrusiveGrowlMessagingUsingMonorailFi_14FE6/growl_6.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="71" alt="growl" src="http://devlicio.us/blogs/mike_nichols/WindowsLiveWriter/UnobtrusiveGrowlMessagingUsingMonorailFi_14FE6/growl_thumb_2.png" width="504" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Hopefully this provides some&amp;#160; ideas on how to communicate with users about actions they perform.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=40284" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MikeNichols/~4/KVpapEuIG_E" height="1" width="1"/&gt;</description></item><item><title>Solo A Pensoso</title><link>http://devlicio.us/blogs/mike_nichols/archive/2008/04/23/solo-a-pensoso.aspx</link><pubDate>Thu, 24 Apr 2008 06:52:53 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:40189</guid><dc:creator>Michael Nichols</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://devlicio.us/blogs/mike_nichols/rsscomments.aspx?PostID=40189</wfw:commentRss><comments>http://devlicio.us/blogs/mike_nichols/archive/2008/04/23/solo-a-pensoso.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://devlicio.us/blogs/mike_nichols/WindowsLiveWriter/SoloAPensoso_9CF3/andrew_wyeth_2.jpg"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="186" alt="andrew_wyeth" src="http://devlicio.us/blogs/mike_nichols/WindowsLiveWriter/SoloAPensoso_9CF3/andrew_wyeth_thumb.jpg" width="244" align="right" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Jimmy Bogard has a &lt;a href="http://www.lostechies.com/blogs/jimmy_bogard/archive/2008/04/22/should-you-tdd-when-flying-solo.aspx" target="_blank"&gt;post&lt;/a&gt; that hits the nail on the head with being a lonely programmer yet still applying TDD. I have been asked by two separate people recently what resources they should consider looking into for starting out in programming. Even though I am hardly an authority, I inevitably encourage folks just now getting into it to start learning how to apply TDD. Here are a few other benefits which I see TDD bringing to the solo developer.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Refactoring is encouraged instead of rewriting &lt;/strong&gt;. Having the freedom to do with the code what I want would usually leave the door of rewriting open to me. This not only stunts my growth as a developer who needs to learn to write code that is malleable, but also costs lots of money. But without tests in place, the paranoia would sometimes drive me to do a rewrite since the old code just didn&amp;#39;t look perfect.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;BUFD (Big Up Front Design) has a greater chance to be suppressed&lt;/strong&gt;. One of the problems with working alone is the freedom to think big about all the neat things I &lt;em&gt;could &lt;/em&gt;do rather than solving how to execute the project requirements. Since there isn&amp;#39;t someone sitting their making a face because you are off-topic on a requirement, the humble [Test] acts as that face that isn&amp;#39;t impressed by my gold-plated code.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Programming remains fun because it is doing stuff. &lt;/strong&gt;Since there aren&amp;#39;t the interesting discussions with peers or a sense of teamwork, the neat feeling we get when we see the computer doing our bidding serves to maintain some inspiration for the task-at-hand. If you are having to run the debugger and fight your way through a million NullRef exceptions or other misteaks to get to the point where you see something happening it is easy to get sidetracked or stop having fun. The feedback loop is more important for my sanity than the projects&amp;#39; success.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;I am still learning. &lt;/strong&gt;Working in small chunks seems to promote experimentation in me more than a big empty project template. If there are things I need to play around with I feel like it is easier and okay to do that within a test fixture...I realize this isn&amp;#39;t &amp;#39;TDD&amp;#39; in the sense of driving out my design using tests, but it nonetheless gives me the impression that I am free play around with something before I head the design that way.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Parameters are liberating. &lt;/strong&gt;Stravinsky once said &amp;#39;The more constraints one imposes, the more one frees one&amp;#39;s self. And the arbitrariness of the constraint serves only to obtain precision of execution.&amp;#39; I have found the simple constraint of getting a test to pass drives me to improvise more in making it do so, usually making me think more creatively.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;All I know is that I wasn&amp;#39;t delivering features to my clients with as much confidence or timeliness before I started applying the principles the people who advocate TDD do. It isn&amp;#39;t simply a matter of being disciplined, because I was quite disciplined, but I needed to focus that discipline into an paradigm that fed me as much as I feed it. For this solo pilot, TDD has scratched that itch.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=40189" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MikeNichols/~4/xwwnTh2tVU4" height="1" width="1"/&gt;</description><category domain="http://devlicio.us/blogs/mike_nichols/archive/tags/featured/default.aspx">featured</category><category domain="http://devlicio.us/blogs/mike_nichols/archive/tags/Test+Driven+Design+_2800_TDD_2900_/default.aspx">Test Driven Design (TDD)</category></item><item><title>MonoRail on IIS7 Redux : Configuration And Routing</title><link>http://devlicio.us/blogs/mike_nichols/archive/2008/04/02/monorail-on-iis7-redux-configuration-and-routing.aspx</link><pubDate>Thu, 03 Apr 2008 06:25:02 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:39909</guid><dc:creator>Michael Nichols</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://devlicio.us/blogs/mike_nichols/rsscomments.aspx?PostID=39909</wfw:commentRss><comments>http://devlicio.us/blogs/mike_nichols/archive/2008/04/02/monorail-on-iis7-redux-configuration-and-routing.aspx#comments</comments><description>&lt;p&gt;A while ago I &lt;a href="http://devlicio.us/blogs/mike_nichols/archive/2007/11/21/monorail-on-iis-7.aspx" target="_blank"&gt;posted&lt;/a&gt; on the very basics about using &lt;a href="http://www.castleproject.org/monorail/"&gt;Monorail&lt;/a&gt; on IIS7. Implementing the routing module requires a bit more tuning though so I wanted to quickly post my configuration and some things to look for if you are having difficulty getting routing going on &lt;a href="http://www.castleproject.org/monorail/"&gt;Monorail&lt;/a&gt;. This is mostly to help those googling and to put all this stuff in one place.&lt;/p&gt;  &lt;p&gt;First, the configuration which &lt;a href="http://abombss.com/" target="_blank"&gt;Adam Tybor&lt;/a&gt; was gracious enough to help me with:&lt;/p&gt;  &lt;div&gt;   &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;configuration&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:#008000;"&gt;&amp;lt;!--...--&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;system.webServer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;modules&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;add&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;routingEx&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Castle.MonoRail.Framework.Routing.RoutingModuleEx,Castle.MonoRail.Framework&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;preCondition&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;managedHandler&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;add&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;PerRequestLifestyle&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleModule,Castle.MicroKernel&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;preCondition&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;managedHandler&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;            
        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;modules&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;handlers&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;accessPolicy&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Script, Execute, Read&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;clear&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;add&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;ASPX&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;path&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;*.aspx&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;verb&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;*&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;System.Web.UI.PageHandlerFactory&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;resourceType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Unspecified&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;preCondition&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;integratedMode&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;            
            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;add&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Block-Boo&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;path&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;*.boo&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;verb&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;*&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;System.Web.HttpForbiddenHandler, System.Web&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;modules&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;ManagedPipelineHandler&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;scriptProcessor&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;resourceType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Unspecified&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;requireAccess&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Script&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;preCondition&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;integratedMode,runtimeVersionv2.0&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;add&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Block-Brail-JS&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;path&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;*.brailjs&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;verb&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;*&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;System.Web.HttpForbiddenHandler, System.Web&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;modules&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;ManagedPipelineHandler&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;scriptProcessor&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;resourceType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Unspecified&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;requireAccess&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Script&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;preCondition&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;integratedMode,runtimeVersionv2.0&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;add&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Block-Brail&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;path&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;*.brail&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;verb&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;*&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;System.Web.HttpForbiddenHandler, System.Web&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;modules&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;ManagedPipelineHandler&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;scriptProcessor&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;resourceType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Unspecified&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;requireAccess&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Script&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;preCondition&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;integratedMode,runtimeVersionv2.0&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;add&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Monorail-All&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;path&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;*&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;verb&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;*&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Castle.MonoRail.Framework.MonoRailHttpHandlerFactory, Castle.MonoRail.Framework&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;modules&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;ManagedPipelineHandler&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;scriptProcessor&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;resourceType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Unspecified&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;requireAccess&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Script&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;preCondition&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
            
            
        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;handlers&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;validation&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;validateIntegratedModeConfiguration&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;system.webServer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;configuration&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;If the &amp;#39;system.webServer&amp;#39; node doesn&amp;#39;t look familiar to you, go read the previous post to get up to speed on how IIS7 looks at your config files. &lt;/p&gt;

&lt;p&gt;It is important to note that this configuration &amp;lt;clear/&amp;gt;s all the handler mappings from IIS7 and only implements what is required. Not doing so will prevent the routing module from doing it magic...I am still not sure why even after removing my StaticFile handler I was unable to get my routing module to work, but I looked through all the IIS7 trace logs and it appeared one of the many modules mapped by default was preventing RoutingEx from handling the request.&lt;/p&gt;

&lt;p&gt;Another important thing to note is that this configuration would pass &lt;em&gt;all &lt;/em&gt;requests through the monorail module which obviously will be less-than-optimal for static content. You can read more about implementing a best practice to handle this &lt;a href="http://www.castleproject.org/monorail/documentation/trunk/advanced/routing.html#anotherapproach" target="_blank"&gt;here&lt;/a&gt; .&amp;#160; Basically, you are just setting up another website with stripped down handler mappings either on IIS or some faster server to deliver static content. I have loved separating this kind of stuff out of my web projects as it lets me centralize all the common scripts/images AND speed up my sites.&lt;/p&gt;

&lt;p&gt;A minor note, too, is that I am passing *.aspx calls to the PageHandlerFactory. This is simply to use some server controls on an aspx page or two I need to use that require normal webforms handling (with ViewState darkness and Event Model Labyrinths ). I&amp;#39;ll be posting more on that setup later...&lt;/p&gt;

&lt;p&gt;Other Resources:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://hammett.castleproject.org/?p=216" target="_blank"&gt;Hammett&amp;#39;s post on routing&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://hammett.castleproject.org/?p=231" target="_blank"&gt;Hammett&amp;#39;s post on IIS7 issues&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://www.galcho.com/Blog/PermaLink.aspx?guid=490f3c31-1815-40fc-a871-5d6899fa35e0" target="_blank"&gt;Caching static content on IIS7&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://devlicio.us/blogs/mike_nichols/archive/2007/11/21/monorail-on-iis-7.aspx" target="_blank"&gt;Basics on setting up IIS7 for monorail&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=39909" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/MikeNichols/~4/46vePpx1Y9Q" height="1" width="1"/&gt;</description><category domain="http://devlicio.us/blogs/mike_nichols/archive/tags/Castle+Project/default.aspx">Castle Project</category><category domain="http://devlicio.us/blogs/mike_nichols/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://devlicio.us/blogs/mike_nichols/archive/tags/Monorail/default.aspx">Monorail</category><category domain="http://devlicio.us/blogs/mike_nichols/archive/tags/IIS/default.aspx">IIS</category></item></channel></rss>
