<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://ljusberg.se/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" 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/"><channel><title>Smöråkning</title><link>http://ljusberg.se/blogs/smorakning/default.aspx</link><description>Blogging about .NET development and architecture.</description><dc:language>en</dc:language><generator>CommunityServer 2008 SP1 (Build: 30619.63)</generator><item><title>Blog moving</title><link>http://ljusberg.se/blogs/smorakning/archive/2010/08/11/blog-moving.aspx</link><pubDate>Wed, 11 Aug 2010 20:23:24 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:6282</guid><dc:creator>anders</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;I’m moving and renaming this blog to &lt;a href="http://coding-insomnia.com"&gt;http://coding-insomnia.com&lt;/a&gt;. Will try to do some redirects eventually – but for now, please update any RSS-feeds and bookmarks to the new site!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=6282" width="1" height="1"&gt;</description><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Blogging/default.aspx">Blogging</category></item><item><title>Intressant på DevSum 2010</title><link>http://ljusberg.se/blogs/smorakning/archive/2010/04/19/intressant-pa-devsum-2010.aspx</link><pubDate>Mon, 19 Apr 2010 18:42:00 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:6274</guid><dc:creator>anders</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;Cornerstone har en konferens p&amp;aring; g&amp;aring;ng i sommar; &lt;a href="http://www.devsum.se/2010/Hem.html"&gt;Developer Summit 2010&lt;/a&gt; p&amp;aring; Nalen i Stockholm. Jag &amp;auml;r inbokad sedan ungef&amp;auml;r en vecka tillbaka!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.cornerstone.se/sv/Event/DevSum/2010/Seminarier/"&gt;M&amp;aring;nga seminarier&lt;/a&gt; blir det och jag har r&amp;auml;tt sv&amp;aring;rt att v&amp;auml;lja.. De k&amp;ouml;r ett antal olika teman (.Net/VS/TFS, Security, Metod, Webb, Mobile, Cloud och ett eget &amp;ldquo;sp&amp;aring;r&amp;rdquo; f&amp;ouml;r Patterns &amp;amp; Practices). T&amp;auml;nkte planera min personliga agenda h&amp;auml;r:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&lt;a href="http://www.cornerstone.se/sv/Event/DevSum/2010/Seminarier/Alla-sessioner/Agenda-dag-1/"&gt;Dag 1.&lt;/a&gt;&lt;/h4&gt;
&lt;table cellpadding="2" cellspacing="0"&gt;

&lt;tr&gt;
&lt;td&gt;9.00&lt;/td&gt;
&lt;td&gt;Inledning och Keynote. &lt;/td&gt;
&lt;td&gt;Keynotet &amp;auml;r ju givet, och det ska bli v&amp;auml;ldigt sp&amp;auml;nnande att h&amp;ouml;ra P&amp;amp;P-teamets framtidsplaner.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10.10&lt;/td&gt;
&lt;td&gt;Application Architecture Guide - P&amp;amp;P&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11.10&lt;/td&gt;
&lt;td&gt;Distributed .NET in Action - Christian Weyer&lt;/td&gt;
&lt;td&gt;Ska bli kul att se Christian. Han dyker ju upp lite h&amp;auml;r och var (senast jag h&amp;ouml;rde honom var nog i ett &lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=536"&gt;dotnetrocks om MonoTouch&lt;/a&gt;).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13.00&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;TFS, Agile hos P&amp;amp;P eller Windows Identity Foundation. Det jag egentligen k&amp;auml;nner mest f&amp;ouml;r d&amp;auml;r &amp;auml;r nog WIF, men fr&amp;aring;gan &amp;auml;r om man inte borde g&amp;aring;tt p&amp;aring; seminariet med WIF-introduktion f&amp;ouml;rst d&amp;aring;.. &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14.00&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;Aaarrghh! H&amp;auml;r krockar det. Antingen Troubleshooting performance i VS 2010, eller P&amp;amp;P - Patterns for Cloud. Sv&amp;aring;rt..! Kunde inte P&amp;amp;P byta plats p&amp;aring; denna och Agile-seminariet kanske?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15.10&lt;/td&gt;
&lt;td&gt;Andreas &amp;Ouml;hlund - Building enterprise applications with NServiceBus&lt;/td&gt;
&lt;td&gt;Ojd&amp;aring;, tv&amp;aring; Prism-seminarier samtidigt.. Fast om jag g&amp;aring;r Silverlight-workshoppen p&amp;aring; onsdagen s&amp;aring; f&amp;aring;r jag nog tillr&amp;auml;ckligt med MVVM osv &amp;auml;nd&amp;aring;.. S&amp;aring; det blir NServiceBus!&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16.10&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;Lite taskigt att l&amp;aring;ta stackars Patrik och Daniel konkurrera med en P&amp;amp;P-panel. Den kunde v&amp;auml;l n&amp;auml;stan ha varit sist ist&amp;auml;llet? N&amp;aring;ja, f&amp;aring;r se hur det blir h&amp;auml;r. WCF Patterns l&amp;aring;ter ju inte s&amp;aring; dumt det heller.&lt;/td&gt;
&lt;/tr&gt;

&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&lt;a href="http://www.cornerstone.se/sv/Event/DevSum/2010/Seminarier/Alla-sessioner/Agenda-dag-2/"&gt;Dag 2.&lt;/a&gt;&lt;/h4&gt;
&lt;table cellpadding="2" cellspacing="0"&gt;

&lt;tr&gt;
&lt;td&gt;9.00&lt;/td&gt;
&lt;td&gt;Keynote med P&amp;aring;l Ross&lt;/td&gt;
&lt;td&gt;Kul med en riktig arkitekt!&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10.10&lt;/td&gt;
&lt;td&gt;Reactive, Asynchronous, och Concurrent Programming med F# - Hans Sterby&lt;/td&gt;
&lt;td&gt;F# har jag &amp;auml;gnat p&amp;aring; tok f&amp;ouml;r lite tid &amp;aring;t. Jag &amp;auml;r ju egentligen en stor fan av funktionell programmering men sen man b&amp;ouml;rjade jobba har det inte blivit s&amp;aring; mycket tr&amp;auml;ning d&amp;auml;r..&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11.10&lt;/td&gt;
&lt;td&gt;Introduktion till F# &amp;ndash; Hans Sterby&lt;/td&gt;
&lt;td&gt;Ser lite konstigt ut att ha introduktion till F# som steg tv&amp;aring; i F#-sp&amp;aring;ret..? &lt;br /&gt;&lt;br /&gt;Funderar iofs lite p&amp;aring; Pomodoro med Staffan N&amp;ouml;teberg ist&amp;auml;llet. Fast jag &amp;auml;r skeptisk.. Verkligen fokusera i 25 minuter? Jag gillar ju att avbryta mig sj&amp;auml;lv hela tiden..!&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13.00&lt;/td&gt;
&lt;td&gt;Professional Source Code Management &amp;ndash; Fredrik Haglund&lt;/td&gt;
&lt;td&gt;Kan nog vara klart intressant att se hur andra jobbar med TFS:en. &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14.00&lt;/td&gt;
&lt;td&gt;Prototyping in SketchFlow - Danwei Tran&lt;/td&gt;
&lt;td&gt;Jag har redan lekt lite med RX och det verkar helt klart ganska coolt. Fr&amp;aring;gan &amp;auml;r om jag l&amp;auml;r mig s&amp;aring; mycket mer p&amp;aring; 50 minuter. Nej, jag kollar nog p&amp;aring; SketchFlow med Danwei ist&amp;auml;llet, f&amp;ouml;r Blend har jag fortfarande inte riktigt lyckats greppa hur man jobbar med.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15.10&lt;/td&gt;
&lt;td&gt;Asynchronous Pages and Parallel Extensions - Tiberiu Covaci&lt;/td&gt;
&lt;td&gt;Egentligen s&amp;aring; lockar ju ReSharper-seminariet ocks&amp;aring;, men jag har sv&amp;aring;rt nog att komma ih&amp;aring;g de mest grundl&amp;auml;ggande kortkommandona s&amp;aring;.. Parallel FX l&amp;auml;r jag dock har r&amp;auml;tt ordentlig med anv&amp;auml;ndning f&amp;ouml;r..&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16.10&lt;/td&gt;
&lt;td&gt;Windows Azure in the real world - Bj&amp;ouml;rn Eriksen&lt;/td&gt;
&lt;td&gt;Det &amp;auml;r ju iofs tyv&amp;auml;rr s&amp;auml;llan som seminarier som grundar sig i ett real-world exempel blir s&amp;aring; intressanta. Det &amp;auml;r helt enkelt v&amp;auml;ldigt sv&amp;aring;rt att sammanfatta ett stort projekt p&amp;aring; 50 minuter utan att det bara blir &amp;ouml;versiktligt och fluffigt. Men.. jag h&amp;aring;ller tummarna f&amp;ouml;r att Bj&amp;ouml;rn f&amp;ouml;rv&amp;aring;nar! &lt;/td&gt;
&lt;/tr&gt;

&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&lt;a href="http://www.cornerstone.se/sv/Event/DevSum/2010/"&gt;Dag 3. Workshops&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Egentligen ingen tvekan h&amp;auml;r; det blir &lt;a href="http://www.cornerstone.se/sv/Event/DevSum/2010/Agenda/Silverlight-meets-REST-in-Azure/"&gt;Silverlight meets REST in Azure&lt;/a&gt;. Nu anv&amp;auml;nder vi f&amp;ouml;rvisso inte Silverlight (&amp;auml;nnu), men det &amp;auml;r helt klart det omr&amp;aring;de d&amp;auml;r jag har sv&amp;aring;rast att bli insatt i &amp;auml;mnet utan lite hj&amp;auml;lp, och detsamma g&amp;auml;ller Azure.&lt;/p&gt;
&lt;p&gt;Men visst.. Skulle man g&amp;aring; p&amp;aring; vad jag f&amp;ouml;rmodligen skulle f&amp;aring; mest nytta av omedelbart s&amp;aring; &amp;auml;r det ju &lt;a href="http://www.cornerstone.se/sv/Event/DevSum/2010/Agenda/Hosting-WCF-and-WF-Services-using-Windows-Server-AppFabric/"&gt;Hosting WCF and WF Services using Windows Server AppFabric&lt;/a&gt; som g&amp;auml;ller. Men det struntar jag i! S&amp;auml;g inget till chefen bara..&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Sist men inte minst. Att jag har v&amp;auml;ckt upp den h&amp;auml;r bloggen med ett inl&amp;auml;gg om DevSum 2010 har naturligtvis INGENTING att g&amp;ouml;ra med att de k&amp;ouml;r en t&amp;auml;vling d&amp;auml;r man kan vinna &amp;auml;ra (och en iPad)..&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=6274" width="1" height="1"&gt;</description><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/.NET/default.aspx">.NET</category><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/DevSum/default.aspx">DevSum</category></item><item><title>Unity interception performance</title><link>http://ljusberg.se/blogs/smorakning/archive/2009/10/06/unity-interception-performance.aspx</link><pubDate>Tue, 06 Oct 2009 15:06:25 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:6230</guid><dc:creator>anders</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;The past two years or so I’ve been working with a rather large team of developers on the latest incarnation of our bespoke web site platform here at Thomas Cook NE. We decided early on to use Unity and the Interception Extension at pretty much all layers across the entire site. One page view will trigger tens or even hundreds of object buildups. I never gave the process much thought, but when the load test told us that the front page of our beta site (now live at &lt;a href="http://beta.ving.se"&gt;http://beta.ving.se&lt;/a&gt;) peaked at 4-5 requests per second with 100% CPU usage, I got worried.&lt;/p&gt;  &lt;p&gt;Looking a little bit closer at the Unity documentation, the first thing I did was to replace the TransparentProxyInterceptor with a combination of the InterfaceInterceptor and the VirtualMethodInterceptor. Unfortunately, that wasn’t such an easy task since only the TransparentProxyInterceptor handles events and delegates properly and the same goes for ref/out parameters. After a bit of refactoring though, everything was working again. But the performance was still not very satisfactory.&lt;/p&gt;  &lt;p&gt;I had to dig myself quite deep into the mysteries of Unity until I found what I was looking for. Now, Unity is designed primarily to be flexible and extensible. It turns out that this flexibility was the big problem. The interception mechanism allows you to add, remove or change policies at runtime which means that the build up phase in the interception extension needs to check all policies and matching rules each time an object is built. That means that for every object that is create, all interceptable methods needs to be checked against all matching rules. On top of that, most of the matching rules make heavy use of reflection (looking for custom attributes, method signatures, etc).&lt;/p&gt;  &lt;p&gt;Now, we use the interception mechanism quite extensively for tracing, error handling, logging and most importantly for caching but we don’t really have any use for that much flexibility. All our interception configuration happens in a config file that is read on application startup so we are quite fine with having to restart the application in order to change a matching rule or add a new call handler. Luckily, the source code for Unity and Enterprise Library is easily downloaded from CodePlex, so I decided to try to change the behavior to fit our needs.&lt;/p&gt;  &lt;p&gt;So, what did I do? Well, I simply added a Dictionary to hold a HandlerPipeline for each MethodImplementationInfo that the interceptor tries to intercept. The snippet below is from the TypeInterceptionStrategy class and should give you an idea. The InstanceInterceptionStrategy got pretty much the same treatment.&lt;/p&gt;  &lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; TypeInterceptionStrategy : BuilderStrategy&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt;     [...]&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; Dictionary&amp;lt;MethodImplementationInfo, HandlerPipeline&amp;gt; _pipelineCache = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Dictionary&amp;lt;MethodImplementationInfo, HandlerPipeline&amp;gt;();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt;     [...]&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt;     &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; PostBuildUp(IBuilderContext context)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt;         Guard.ArgumentNotNull(context, &lt;span style="color:#006080;"&gt;&amp;quot;context&amp;quot;&lt;/span&gt;);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;     &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum11"&gt;  11:&lt;/span&gt;         IInterceptingProxy proxy = context.Existing &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; IInterceptingProxy;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum12"&gt;  12:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;(proxy == &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;) &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum13"&gt;  13:&lt;/span&gt;     &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum14"&gt;  14:&lt;/span&gt;         ITypeInterceptionPolicy interceptionPolicy = GetInterceptionPolicy(context);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum15"&gt;  15:&lt;/span&gt;     &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum16"&gt;  16:&lt;/span&gt;         Type typeToIntercept = BuildKey.GetType(context.BuildKey);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum17"&gt;  17:&lt;/span&gt;         PolicySet interceptionPolicies = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; PolicySet(BuilderContext.NewBuildUp&amp;lt;InjectionPolicy[]&amp;gt;(context));&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum18"&gt;  18:&lt;/span&gt;         IUnityContainer currentContainer = BuilderContext.NewBuildUp&amp;lt;IUnityContainer&amp;gt;(context);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum19"&gt;  19:&lt;/span&gt;     &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum20"&gt;  20:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (MethodImplementationInfo item &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; interceptionPolicy.Interceptor.GetInterceptableMethods(typeToIntercept, typeToIntercept))&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum21"&gt;  21:&lt;/span&gt;         {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum22"&gt;  22:&lt;/span&gt;                 HandlerPipeline pipeline;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum23"&gt;  23:&lt;/span&gt;                 &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (!_pipelineCache.TryGetValue(item, &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; pipeline))&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum24"&gt;  24:&lt;/span&gt;                 {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum25"&gt;  25:&lt;/span&gt;                     pipeline = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; HandlerPipeline(&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum26"&gt;  26:&lt;/span&gt;                 interceptionPolicies.GetHandlersFor(item, currentContainer));&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum27"&gt;  27:&lt;/span&gt;                     _pipelineCache[item] = pipeline;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum28"&gt;  28:&lt;/span&gt;                 }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum29"&gt;  29:&lt;/span&gt;             proxy.SetPipeline(interceptionPolicy.Interceptor.MethodInfoForPipeline(item), pipeline);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum30"&gt;  30:&lt;/span&gt;         }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum31"&gt;  31:&lt;/span&gt;     }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum32"&gt;  32:&lt;/span&gt;  &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum33"&gt;  33:&lt;/span&gt;     [...]   &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum34"&gt;  34:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;This, of course, is only a rather ugly quick-fix. I tried to find a way to easily incorporate something similar without having to recompile Unity, but I wasn’t successful. I thought about implementing my own Interception Strategies, but the Interception Extension is pretty wired to using only the ones that are found “in the box”, and building my own Interception Extension meant also building my own configuration classes and.. well, I don’t think it would have been worth it. But I might be missing something obvious; if you have a better idea on how to make sure that Unity doesn’t go through unnecessary work on each buildup I would be very happy to see it! &lt;/p&gt;

&lt;p&gt;Anyway, what about the results? Well, with my new Unity build applied, the bandwidth of the load test rig got exhausted at 80 page views per second with the CPU at a comfortable 80%; I call that a pretty decent improvement. :-)&lt;/p&gt;

&lt;p&gt;For me, the big question now is whether or not there is support for my scenario in Unity 2.0 (which I believe is well under development). If anyone has information about this, please let me know!&amp;#160; &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=6230" width="1" height="1"&gt;</description><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/.NET/default.aspx">.NET</category><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Enterprise+Library/default.aspx">Enterprise Library</category><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Unity/default.aspx">Unity</category></item><item><title>Windows Server 2008 as development platform</title><link>http://ljusberg.se/blogs/smorakning/archive/2008/06/23/windows-server-2008-as-development-platform.aspx</link><pubDate>Mon, 23 Jun 2008 15:40:30 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:6080</guid><dc:creator>anders</dc:creator><slash:comments>0</slash:comments><description>&lt;p style="margin-left:19pt;"&gt;Well, this is going to be interesting. I&amp;#39;ve spent the day installing Windows Server 2008 on my brand new laptop at work. I was inspired by &lt;a href="http://blog.deurell.net/2008/04/min-nya-utvecklarplattform-eller-att.html"&gt;&lt;span style="color:blue;text-decoration:underline;"&gt;Mikael Deurell&amp;#39;s post about using Hyper-V&lt;/span&gt;&lt;/a&gt; etc. 
&lt;/p&gt;&lt;p style="margin-left:19pt;"&gt;So far it&amp;#39;s been much easier than I expected. Pretty much all device drivers for my Compaq 8510w installed without any problems even though I&amp;#39;m using a 64-bit system.
&lt;/p&gt;&lt;p style="margin-left:19pt;"&gt; 
 &lt;/p&gt;&lt;p style="margin-left:19pt;"&gt;I also found two great blog posts that describe how to make the Windows Server 2008 experience a little more &amp;quot;Desktoppy&amp;quot;. Check out:
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/vijaysk/archive/2008/02/11/using-windows-server-2008-as-a-super-desktop-os.aspx"&gt;&lt;span style="color:blue;text-decoration:underline;"&gt;Using Windows Server 2008 as a super desktop OS&lt;/span&gt;&lt;/a&gt;
		&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/vijaysk/archive/2008/02/20/using-windows-server-2008-as-a-super-workstation-os-cont-d.aspx"&gt;&lt;span style="color:blue;text-decoration:underline;"&gt;Using Windows Server 2008 as a super desktop OS Continued&lt;/span&gt;&lt;/a&gt;
		&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;Also, this is an attempt at posting using Word 2007.. Let&amp;#39;s see how that works out..!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=6080" width="1" height="1"&gt;</description></item><item><title>Scrum Dashboard</title><link>http://ljusberg.se/blogs/smorakning/archive/2008/02/28/scrum-dashboard.aspx</link><pubDate>Thu, 28 Feb 2008 22:16:00 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:6074</guid><dc:creator>anders</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;If you&amp;#39;re a fan of Scrum and Team Foundation Server you&amp;#39;ll probably want to have a look at the &lt;a class="" href="http://www.codeplex.com/scrumdashboard"&gt;Scrum Dashboard&lt;/a&gt; recently published on CodePlex by &lt;a class="" href="http://www.episerver.com/"&gt;EPiServer&lt;/a&gt;. It looks very cool but unfortunately for us it uses the &lt;a class="" href="http://www.scrumforteamsystem.com/en/default.aspx"&gt;Scrum for Team System&lt;/a&gt; templates by Conchango instead of the &amp;quot;vanilla&amp;quot; MSF Agile templates that we&amp;#39;re using. Too bad for us, but I applaud EPiServer for making this thing available to the community. Thank&amp;#39;s guys!&lt;/p&gt;
&lt;p&gt;BTW, I actually met the guy listed as Coordinator&amp;nbsp;of the project (&lt;a class="" href="http://labs.episerver.com/en/Blogs/Per/Archive/2008/2/Scrum-Dashboard/"&gt;Per Bjurström&lt;/a&gt;) on my &lt;a class="" href="http://ljusberg.se/blogs/smorakning/archive/2007/10/17/going-to-redmond.aspx"&gt;trip to Redmond&lt;/a&gt; last October - that has to be a good sign, right?&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=6074" width="1" height="1"&gt;</description><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/TFS/default.aspx">TFS</category><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Scrum/default.aspx">Scrum</category></item><item><title>What's up?</title><link>http://ljusberg.se/blogs/smorakning/archive/2008/02/27/what-s-up.aspx</link><pubDate>Wed, 27 Feb 2008 16:20:00 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:6071</guid><dc:creator>anders</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;I know, I know.. I&amp;#39;ve been extremely lazy lately, at least when it comes to sharing knowledge with you guys. I guess the main reason for that is that I&amp;#39;m currently on parental leave which means that my days are not really spent researching, architecting and developing as much as they are spent entertaining &lt;a href="http://ljusberg.se/photos/miranda"&gt;Miranda&lt;/a&gt;...&lt;/p&gt;
&lt;p&gt;Anyway, as you may have realized by my &lt;a title="Caching Dynamic Controls" href="http://ljusberg.se/blogs/smorakning/archive/2007/09/10/caching-dynamic-controls-in-asp-net.aspx"&gt;previous&lt;/a&gt; &lt;a title="Caching Dynamic Controls - Solution" href="http://ljusberg.se/blogs/smorakning/archive/2007/10/17/caching-dynamic-controls-in-asp-net-solution.aspx"&gt;posts&lt;/a&gt; on the subject, I&amp;#39;ve been diving into the big swamp of ASP.NET once again. Somtime mid-last year I was tasked with creating a new plattform for the web sites at Thomas Cook Northern Europe (like &lt;a href="http://ving.se/"&gt;ving.se&lt;/a&gt;, &lt;a href="http://spies.dk/"&gt;spies.dk&lt;/a&gt;, &lt;a href="http://tjaereborg.dk/"&gt;tjaereborg.dk&lt;/a&gt; and &lt;a href="http://ving.no/"&gt;ving.no&lt;/a&gt;). The platform that is currently running all our sites is quite powerful but was designed with .NET Framework 1.1 in mind which makes it a bit clumsier than it has to be. &lt;/p&gt;
&lt;p&gt;At the time, the only web site framework on offer from Microsoft was the &lt;a href="http://msdn.microsoft.com/webclientfactory"&gt;Web Client Software Factory&lt;/a&gt;. I really liked the ideas and patterns that drive the architecture of the WCSF (in pattern-talk I guess you would describe it as Model-View-Presenter combined with Application Controllers). However, it simply wasn&amp;#39;t enough for our needs. The major problem was that the Views/Presenters are to coarse. They are designed with entire pages in mind instead of being designed for User Controls (which is what we need). I also didn&amp;#39;t like the fact that the flow engine they used couldn&amp;#39;t handle multiple flows and states per session/user. A quite common scenario for us is that a user opens up several browser windows to compare different alternative trips - something that often leads to corrupt state.&lt;/p&gt;
&lt;p&gt;In the end I decided to create a framework from scratch with much of the ideas from the WCSF intact, but extended to fit our needs. Some notable features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Based on the Model-View-Presenter and Application Controller patterns.&lt;/li&gt;
&lt;li&gt;Independent modules for each area of the web site which makes it possible to develop and deploy parts of the web site without affecting the other parts.&lt;/li&gt;
&lt;li&gt;No .aspx files - pages are built up dynamically.&lt;/li&gt;
&lt;li&gt;Multiple flows per user&lt;/li&gt;
&lt;li&gt;Fully integrated URL Rewriting&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Well, if you&amp;#39;re interested I&amp;#39;ll blog some more about this. But at least now I&amp;#39;ve given you an update on what I&amp;#39;m doing..&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Update (2008-02-28)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Funny, the day after I wrote this entry, Microsoft Sweden published a &amp;quot;&lt;a class="" title="Thomas Cook" href="http://buzzfrog.blogs.com/zabrak/2008/02/thomas-cook---i.html"&gt;success story&lt;/a&gt;&amp;quot; about the project (although the story focuses more on the way we are using TFS and VS 2008 rather than the framework itself). I had no idea this article was being written, but I guess that&amp;#39;s what happens when you&amp;#39;re on parental leave.. :-)&lt;/p&gt;
&lt;p&gt;Also, you might be asking yourself &amp;quot;How on earth do you make sure that things are going in the right direction if your not in the office?&amp;quot;. Well, luckily I&amp;#39;ve been able to hand over the framework in the very good hands of my colleague Håkan (who&amp;nbsp;also gave me a lot of great advice during the first stages of the project). If you&amp;#39;ve read this far, you&amp;#39;ll certainly find his blog even more interesting, and as a bonus it&amp;#39;s available in &lt;a class="" title="Hocke" href="http://hocke.blogspot.com/"&gt;English&lt;/a&gt;&amp;nbsp;and &lt;a class="" title="Hocke" href="http://hockeswe.blogspot.com/"&gt;Swedish&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=6071" width="1" height="1"&gt;</description><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/.NET/default.aspx">.NET</category><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item><item><title>How cool is this?</title><link>http://ljusberg.se/blogs/smorakning/archive/2007/10/27/how-cool-is-this.aspx</link><pubDate>Fri, 26 Oct 2007 23:44:00 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:5906</guid><dc:creator>anders</dc:creator><slash:comments>0</slash:comments><description>I&amp;#39;m currently writing this post on the express bus to Redmond using my iPod touch and the free WiFi provided on the bus. In my book it doesn&amp;#39;t get much cooler than that!&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=5906" width="1" height="1"&gt;</description><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Fun/default.aspx">Fun</category></item><item><title>T4 editor available</title><link>http://ljusberg.se/blogs/smorakning/archive/2007/10/26/t4-editor-available.aspx</link><pubDate>Fri, 26 Oct 2007 18:05:00 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:5905</guid><dc:creator>anders</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;It seems &lt;a class="" title="Clarius Consulting" href="http://www.clariusconsulting.net/"&gt;Clarius Consulting&lt;/a&gt; have released a beta version of a pretty nice addition to Visual Studio, at least if you&amp;#39;re working with the Guidance Automation Toolkit. The &lt;a class="" title="T4 Editor" href="http://www.t4editor.net/"&gt;T4 Editor&lt;/a&gt; will give you IntelliSense, nice&amp;nbsp;colorization etc when working with your T4 templates.&lt;/p&gt;
&lt;p&gt;I&amp;#39;m now just waiting for them to release a version of the &lt;a class="" title="Software Factories Toolkit" href="http://www.softwarefactoriestoolkit.net/"&gt;Software Factories Toolkit&lt;/a&gt; that works with VS2008 Beta 2..!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=5905" width="1" height="1"&gt;</description><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/GAT/default.aspx">GAT</category></item><item><title>VS2008 RTM any day now?</title><link>http://ljusberg.se/blogs/smorakning/archive/2007/10/23/vs2008-rtm-any-day-now.aspx</link><pubDate>Tue, 23 Oct 2007 04:13:00 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:5903</guid><dc:creator>anders</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;According to the Microsoft guys in building 20, the RTM of Visual Studio 2008 and .NET Framework 3.5 is coming &amp;quot;very, Very, VERY soon&amp;quot; - whatever that means... &lt;br /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=5903" width="1" height="1"&gt;</description><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/.NET/default.aspx">.NET</category><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Visual+Studio/default.aspx">Visual Studio</category></item><item><title>Going to Redmond!</title><link>http://ljusberg.se/blogs/smorakning/archive/2007/10/17/going-to-redmond.aspx</link><pubDate>Wed, 17 Oct 2007 14:16:00 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:5899</guid><dc:creator>anders</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;Well, in a couple of days I&amp;#39;m off to the Microsoft Campus in Redmond! I&amp;#39;m attending an Orcas Adoption Workshop next week which will take me through all the new stuff in Visual Studio 2008 and .NET Framework 3.5. So far, I haven&amp;#39;t got the agenda so I have more or less no idea who
I&amp;#39;ll meet and what kind of workshops to expect but I&amp;#39;m sure it&amp;#39;ll be
great.&lt;/p&gt;&lt;p&gt;I&amp;#39;m really, really looking forward to it. Actually visiting the Campus is something I&amp;#39;ve been dreaming about for quite some time (yes, I know.. maybe I should try to reprioritize my dreams... but still!)&amp;nbsp;&lt;/p&gt;&lt;p&gt;So, is anyone else going to be in the Redmond area next week? &lt;br /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=5899" width="1" height="1"&gt;</description><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Personal/default.aspx">Personal</category><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/.NET/default.aspx">.NET</category><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Visual+Studio/default.aspx">Visual Studio</category></item><item><title>Caching dynamic controls in ASP.NET - solution</title><link>http://ljusberg.se/blogs/smorakning/archive/2007/10/17/caching-dynamic-controls-in-asp-net-solution.aspx</link><pubDate>Wed, 17 Oct 2007 07:39:00 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:5896</guid><dc:creator>anders</dc:creator><slash:comments>6</slash:comments><description>&lt;p&gt;In my &lt;a href="http://ljusberg.se/blogs/smorakning/archive/2007/09/10/caching-dynamic-controls-in-asp-net.aspx"&gt;last post&lt;/a&gt;, I asked for help with a problem we&amp;#39;ve been having with caching of dynamic controls - and I got some from &lt;a title="Infinites Loop" href="http://weblogs.asp.net/infinitiesloop/default.aspx" target="_blank"&gt;Dave Reed&lt;/a&gt;. Dave works for the ASP.NET team and if his blog isn&amp;#39;t on your roll yet, add it ASAP - it&amp;#39;s simply brilliant. &lt;/p&gt;  &lt;p&gt;Dave explained the problem:&lt;/p&gt;  &lt;hr /&gt;  &lt;div&gt;Apparently, the stack trace involved with loading the control is taken into account when deciding how to cache the controls output. So for example, if you load the control twice like so: &lt;/div&gt;  &lt;pre&gt;LoadControl(&amp;quot;&lt;span style="color:#8b0000;"&gt;foo.ascx&lt;/span&gt;&amp;quot;); &lt;span style="color:#008000;"&gt;// once &lt;/span&gt;
LoadControl(&amp;quot;&lt;span style="color:#8b0000;"&gt;foo.ascx&lt;/span&gt;&amp;quot;); &lt;span style="color:#008000;"&gt;// twice&lt;/span&gt;&lt;/pre&gt;

&lt;div&gt;Then they will be cached separately. But if you load them like this:&lt;/div&gt;

&lt;pre&gt;MethodThatLoadsFoo(); &lt;span style="color:#008000;"&gt;// once &lt;/span&gt;
MethodThatLoadsFoo(); &lt;span style="color:#008000;"&gt;// twice&lt;/span&gt;&lt;/pre&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;div&gt;Where MethodThatLoadsFoo contains:&lt;/div&gt;

&lt;pre&gt;LoadControl(&amp;quot;&lt;span style="color:#8b0000;"&gt;foo.ascx&lt;/span&gt;&amp;quot;); &lt;/pre&gt;

&lt;div&gt;They are cached together because it will appear that they were loaded via the same code line.&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;div&gt;Since you are loading them dynamically based on data you probably have a single method that loads whatever control it is to be. But depending on the details of your implementation perhaps you can find a way to have a different LoadControl reference load each one? 
  &lt;br /&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;hr /&gt;

&lt;p&gt;Ok.. So where does that leave us? Remember, the implementation that calls LoadControl in my last example looks like this:&lt;/p&gt;

&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (ControlInfo controlInfo &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; controlList)
{
   &lt;span style="color:#008000;"&gt;// Load the control and add it to the page&lt;/span&gt;
   HttpContext.Current.Items[&amp;quot;&lt;span style="color:#8b0000;"&gt;uniqueId&lt;/span&gt;&amp;quot;] = controlInfo.UniqueControlId;
   Control ctrl = LoadControl(controlInfo.ControlUrl);
   PlaceHolder1.Controls.Add(ctrl);
}&lt;/pre&gt;

&lt;p&gt;It is the same physical line of code that loads all controls, which makes the caching mechanism believe that it is the very same control that is being loaded. In order for it to cache multiple versions, I&amp;#39;d need to add a new LoadControl line for each control. So I guess I could &amp;quot;unwrap&amp;quot; the foreach-loop and do something like:&lt;/p&gt;

&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (controlList.Count &amp;gt; 0)
{
   HttpContext.Current.Items[&amp;quot;&lt;span style="color:#8b0000;"&gt;uniqueId&lt;/span&gt;&amp;quot;] = controlList[0].UniqueControlId;
   PlaceHolder1.Controls.Add(LoadControl(controlList[0].ControlUrl));
}
&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (controlList.Count &amp;gt; 1)
{
   HttpContext.Current.Items[&amp;quot;&lt;span style="color:#8b0000;"&gt;uniqueId&lt;/span&gt;&amp;quot;] = controlList[1].UniqueControlId;
   PlaceHolder1.Controls.Add(LoadControl(controlList[1].ControlUrl));
}
&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (controlList.Count &amp;gt; 2)
{
   HttpContext.Current.Items[&amp;quot;&lt;span style="color:#8b0000;"&gt;uniqueId&lt;/span&gt;&amp;quot;] = controlList[2].UniqueControlId;
   PlaceHolder1.Controls.Add(LoadControl(controlList[2].ControlUrl));
}&lt;/pre&gt;

&lt;p&gt;Ehh.. Nope.. Not gonna happen...&lt;/p&gt;

&lt;p&gt;The only other alternative I could think of was to dynamically generate and compile the code that is used to render a page. This is (a crude version of) what I came up with:&lt;/p&gt;

&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; CompileAndInitializePage(Page page, List controlList)
{
  Assembly compiledAssembly;

  &lt;span style="color:#008000;"&gt;// Has this page been built before? If so, there should already be an existing assembly&lt;/span&gt;
  &lt;span style="color:#008000;"&gt;// compiled for it.&lt;/span&gt;
  &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (compiledAssemblies.ContainsKey(page.AppRelativeVirtualPath))
  {
    compiledAssembly = compiledAssemblies[page.AppRelativeVirtualPath];
  }
  &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;
  {
    &lt;span style="color:#008000;"&gt;// If not, compile a new one.&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; mainHeader =
      &amp;quot;&lt;span style="color:#8b0000;"&gt;using System.Web;\n&lt;/span&gt;&amp;quot; +
      &amp;quot;&lt;span style="color:#8b0000;"&gt;using System.Web.UI;\n&lt;/span&gt;&amp;quot; +

      &amp;quot;&lt;span style="color:#8b0000;"&gt;namespace DynamicCacheTest\n&lt;/span&gt;&amp;quot; +
      &amp;quot;&lt;span style="color:#8b0000;"&gt;{\n&lt;/span&gt;&amp;quot; +
      &amp;quot;&lt;span style="color:#8b0000;"&gt; public class TempPageBuilder\n&lt;/span&gt;&amp;quot; +
      &amp;quot;&lt;span style="color:#8b0000;"&gt; {\n&lt;/span&gt;&amp;quot; +
      &amp;quot;&lt;span style="color:#8b0000;"&gt; public void BuildPage(Page page)\n&lt;/span&gt;&amp;quot; +
      &amp;quot;&lt;span style="color:#8b0000;"&gt; {\n&lt;/span&gt;&amp;quot; +
      &amp;quot;&lt;span style="color:#8b0000;"&gt; Control holder;\n&lt;/span&gt;&amp;quot; +
      &amp;quot;&lt;span style="color:#8b0000;"&gt; holder = page.FindControl(\&amp;quot;PlaceHolder1\&amp;quot;);\n&lt;/span&gt;&amp;quot;;

    &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; mainFooter =
      &amp;quot;&lt;span style="color:#8b0000;"&gt; }\n&lt;/span&gt;&amp;quot; +
      &amp;quot;&lt;span style="color:#8b0000;"&gt; }\n&lt;/span&gt;&amp;quot; +
      &amp;quot;&lt;span style="color:#8b0000;"&gt;}\n&lt;/span&gt;&amp;quot;;
    StringBuilder sb = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; StringBuilder(mainHeader);
    &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (ControlInfo ctrl &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; controlList)
    {
      sb.AppendFormat(&amp;quot;&lt;span style="color:#8b0000;"&gt;HttpContext.Current.Items[\&amp;quot;uniqueId\&amp;quot;] = {0};\n&lt;/span&gt;&amp;quot;, ctrl.UniqueControlId);
      sb.AppendFormat(&amp;quot;&lt;span style="color:#8b0000;"&gt;holder.Controls.Add(page.LoadControl(\&amp;quot;{0}\&amp;quot;));\n&lt;/span&gt;&amp;quot;, ctrl.ControlUrl);
    }
    sb.Append(mainFooter);

    ICodeCompiler compiler = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; CSharpCodeProvider().CreateCompiler();

    CompilerParameters parameters = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; CompilerParameters(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;[] { &amp;quot;&lt;span style="color:#8b0000;"&gt;System.dll&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color:#8b0000;"&gt;System.Web.dll&lt;/span&gt;&amp;quot; });
    CompilerResults res = compiler.CompileAssemblyFromSource(parameters, sb.ToString());
    compiledAssembly = res.CompiledAssembly;
    compiledAssemblies[page.AppRelativeVirtualPath] = compiledAssembly;
  }

  &lt;span style="color:#008000;"&gt;// Build the page builder object&lt;/span&gt;
  &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; builder = Activator.CreateInstance(compiledAssembly.GetType(&amp;quot;&lt;span style="color:#8b0000;"&gt;DynamicCacheTest.TempPageBuilder&lt;/span&gt;&amp;quot;));

  &lt;span style="color:#008000;"&gt;// Invoke the BuildPage method&lt;/span&gt;
  builder.GetType().InvokeMember(&amp;quot;&lt;span style="color:#8b0000;"&gt;BuildPage&lt;/span&gt;&amp;quot;, BindingFlags.InvokeMethod, &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;, builder, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;[] { &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt; });
}&lt;/pre&gt;

&lt;p&gt;And it works beautifully! I&amp;#39;m not too worried about performance since I&amp;#39;m only compiling the page once, and running the compiled code shouldn&amp;#39;t be slower than the foreach-loop is today. The only thing I&amp;#39;m thinking is that with many pages on a site I&amp;#39;d have a lot of very small assemblies loaded. Probably it would be a better idea to precompile all pages on startup and put them in a single assembly.&lt;/p&gt;

&lt;p&gt;Anyway, in the end we&amp;#39;ve decided that we won&amp;#39;t actually put this in production since the problem probably is better worked around by educating our webmasters, but it was nice to finally find a solution.&lt;/p&gt;

&lt;p&gt;Update: I&amp;#39;ve attached the updated source code to this post. &lt;/p&gt;

&lt;p&gt;Update 2: And now I&amp;#39;m trying out a Live Writer Plugin to format the source code&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=5896" width="1" height="1"&gt;</description><enclosure url="http://ljusberg.se/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.00.58.96/DynamicCacheTest.zip" length="9377" type="application/zip" /><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/.NET/default.aspx">.NET</category><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item><item><title>Caching dynamic controls in ASP.NET</title><link>http://ljusberg.se/blogs/smorakning/archive/2007/09/10/caching-dynamic-controls-in-asp-net.aspx</link><pubDate>Mon, 10 Sep 2007 14:05:00 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:5891</guid><dc:creator>anders</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;Since the invention of partial caching in ASP.NET, we have been trying our best to implement it on our web pages. But without much luck. This post is a request, or I guess you could call it a &amp;quot;cry&amp;quot;, for help!&lt;/p&gt;&lt;p&gt;The problem is that we create all our controls dynamically, and each page can contain more than one instance of the same control (.ascx) but with different content.&lt;/p&gt;&lt;p&gt;Simply put, a page load is currently done like this:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Retrieve a list of which controls to put on the page and the unique id of the content each control should display.&lt;/li&gt;&lt;li&gt;For each control that should be created, call LoadControl and let the control know its unique id.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Each control retrieves its data by using the unique id&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Now, when trying to add partial caching to this control, the problem is that the controls are cached according to which page they&amp;#39;re on (or the query string used to get the page) and I just cannot figure out a way of caching two different instances of the same control. I mean, at the time of creation (LoadControl) I know which one I want, so it really should be theoretically possible, but I simply cannot find support for it in the API. &lt;/p&gt;&lt;p&gt;I&amp;#39;ve attached a simple test project that illustrates the problem. If you can find a nice solution, please, PLEASE let me know. I&amp;#39;d be in your debt!&lt;br /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=5891" width="1" height="1"&gt;</description><enclosure url="http://ljusberg.se/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.00.58.91/DynamicCacheTest.zip" length="7977" type="application/x-zip-compressed" /><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Help+needed/default.aspx">Help needed</category></item><item><title>The new SOA</title><link>http://ljusberg.se/blogs/smorakning/archive/2007/05/30/the-new-soa.aspx</link><pubDate>Wed, 30 May 2007 08:15:00 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:5876</guid><dc:creator>anders</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;This is going to be confusing for me.. There&amp;#39;s a new SOA in town: &lt;a href="http://www.lotro.com/" title="LOTRO SoA" target="_blank"&gt;Lord of the Rings Online: Shadows of Angmar&lt;/a&gt; (or SoA). Let&amp;#39;s just hope they&amp;#39;ll continue to use the abbreviation &lt;a href="http://www.lotro.com/" title="Lord of the Rings Online" target="_blank"&gt;LOTRO&lt;/a&gt; instead..&lt;br /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=5876" width="1" height="1"&gt;</description><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Fun/default.aspx">Fun</category><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Gaming/default.aspx">Gaming</category></item><item><title>Online course from 2xSundblad</title><link>http://ljusberg.se/blogs/smorakning/archive/2007/05/30/online-course-from-2xsundblad.aspx</link><pubDate>Wed, 30 May 2007 07:58:00 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:5875</guid><dc:creator>anders</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;I&amp;#39;ve just looked through a part of the preview of the coming online course from &lt;a href="http://www.2xsundblad.com/" title="2xSundblad" target="_blank"&gt;2xSundblad&lt;/a&gt; called Architecting Service Oriented Systems – Overview. It&amp;#39;s Flash-based with a mix of video, audio and slides. Looks very promising and it will be available for a very reasonable $399 (if you register your interest early you&amp;#39;ll even get a 25% discount). &lt;/p&gt;&lt;p&gt;I guess you&amp;#39;ll have to get used to the Swedish accent of Sten and Per, but knowing them I can promise you it&amp;#39;ll be worth it!&lt;/p&gt;&lt;p&gt;Three other courses will be available within the next year or so:&lt;/p&gt;&lt;ul&gt;&lt;font&gt;&lt;li&gt;The Infrastructure of Shareable Information Pattern – Planning, 
Architecting, Designing, and Implementing. 
&lt;/li&gt;&lt;li&gt;The Entity Services and User Application Pattern – Planning, Architecting, 
Designing, and Implementing. 
&lt;/li&gt;&lt;li&gt;The Business Process and Use Case Services Pattern – Planning, Architecting, 
Designing, and Implementing.&lt;/li&gt;&lt;/font&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;I&amp;#39;ll post a link to the free preview once I get an OK from Sten or Per to do so!&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;i&gt;Update&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;Here&amp;#39;s the link to the &lt;a href="http://www.2xsundblad.com/archtraining/archsosystems" title="2xSundblad"&gt;preview of 2xSundblad&amp;#39;s new online course&lt;/a&gt;.&lt;/i&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=5875" width="1" height="1"&gt;</description><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/SOA/default.aspx">SOA</category><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Architecture/default.aspx">Architecture</category></item><item><title>The Agile pyramid</title><link>http://ljusberg.se/blogs/smorakning/archive/2007/05/25/the-agile-pyramid.aspx</link><pubDate>Fri, 25 May 2007 07:25:00 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:5874</guid><dc:creator>anders</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;One of my favorite developer sites, &lt;a href="http://worsethanfailure.com" target="_blank"&gt;Worse Than Failure&lt;/a&gt; (used to be called The Daily WTF), just published an article about &lt;a href="http://worsethanfailure.com/Articles/The-Great-Pyramid-of-Agile.aspx" target="_blank"&gt;Agile methodologies&lt;/a&gt; and why they suck. While I don&amp;#39;t agree with Alex it&amp;#39;s always fun when an analogy is turned upside down... The problem here is that the Pyramid analogy is flawed in the first place since an extremely important part of agile methodologies, Refactoring, is missing. Instead, building a pyramid using agile methodologies would rather be done this way:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Get some initial input from the Pharaoh. It will be something like &amp;quot;I&amp;#39;d like it to look like all the other pyramids, only bigger and better&amp;quot;.&lt;/li&gt;&lt;li&gt;Start building something that may or may not look much like a pyramid.&lt;/li&gt;&lt;li&gt;Find some flaws in your design. Show the Pharaoh and ask him what he thinks of it so far.&lt;/li&gt;&lt;li&gt;Tear down everything you or the Pharaoh don&amp;#39;t like.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Add some more components to the pyramid.&lt;/li&gt;&lt;li&gt;Realize that the foundation of the pyramid isn&amp;#39;t solid enough.&lt;/li&gt;&lt;li&gt;Rebuild the foundation&lt;/li&gt;&lt;li&gt;Repeat steps 3, 4 and maybe 5 and 6 until you and the Pharaoh are happy with the result.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;And this is why agile methodologies are better suited for software development than for construction work...&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=5874" width="1" height="1"&gt;</description><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Architecture/default.aspx">Architecture</category></item></channel></rss>
