<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>Smart Client</title><link>http://www.agileprogrammer.com/dotnetguy/category/114.aspx</link><description>Smart Client</description><managingEditor>Brad Wilson</managingEditor><dc:language>en-US</dc:language><generator>.Text Version 0.95.2005.109</generator><item><dc:creator>Brad Wilson</dc:creator><title>CAB is dead! Long live CAB!</title><link>http://www.agileprogrammer.com/dotnetguy/archive/2007/06/06/22858.aspx</link><pubDate>Wed, 06 Jun 2007 09:50:00 GMT</pubDate><guid>http://www.agileprogrammer.com/dotnetguy/archive/2007/06/06/22858.aspx</guid><description>&lt;p&gt;When I left p&amp;amp;p, one of the teams I was considering was the &lt;a href="http://windowsclient.net/Acropolis/Default.aspx"&gt;Acropolis&lt;/a&gt; team. It would've been an opportunity to go do CAB as a fully supported development environment enabled thing, rather than just a raw framework from a few people. I'm glad they've announced it now, so people can see the direction that Microsoft is headed in. Glenn Block from p&amp;amp;p has a post about the &lt;a href="http://blogs.msdn.com/gblock/archive/2007/06/06/acropolis-the-future-of-smart-client.aspx"&gt;future of the smart client p&amp;amp;p deliverables&lt;/a&gt; in light of this announcement, too.&lt;/p&gt; &lt;p&gt;I wonder if there's someone on the net who thinks he can re-implement Acropolis in 15 minutes? ;)&lt;/p&gt;&lt;img src ="http://www.agileprogrammer.com/dotnetguy/aggbug/22858.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Brad Wilson</dc:creator><title>Frameworks vs. Libraries</title><link>http://www.agileprogrammer.com/dotnetguy/archive/2007/05/30/22819.aspx</link><pubDate>Wed, 30 May 2007 00:03:00 GMT</pubDate><guid>http://www.agileprogrammer.com/dotnetguy/archive/2007/05/30/22819.aspx</guid><description>&lt;P&gt;There's a bit of heat about CAB and p&amp;amp;p going on right now, and I haven't decided if I want to jump in yet.&lt;/P&gt;
&lt;P&gt;I do, though, want to address &lt;A href="http://codebetter.com/blogs/jeremy.miller/archive/2007/05/28/a-train-of-thought-may-21-28-2007-edition.aspx"&gt;a point by Jeremy Miller&lt;/A&gt;:&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;Tools that amount to "just something that you use" like NHibernate, or log4net (but I'm not letting them off the hook for the versioning and breaking API hell a couple years ago) are not intrusive.&amp;nbsp; You just use them when you need the service that they provide.&amp;nbsp; Tools and frameworks that are intrusive into your code, or even worse, require you to wrap your application around their opinionated structure are a different story altogether.&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;A href="http://www.peterprovost.org/"&gt;Peter&lt;/A&gt; describes the former (log4net, etc.) and libraries and the latter (CAB) as frameworks.&lt;/P&gt;
&lt;P&gt;I can take an existing application and add logging with log4net, because it makes very few demands on me. I basically make calls to it. Using CAB in an application is a commitment, because it describes the way you should build your application. It's a framework, and in most cases, it's calling me rather than me calling it. Peter's "easy test" to tell a framework from a library is the Hollywood principal: if the thing is always saying "Don't call me, I'll call you", then it's a framework.&lt;/P&gt;
&lt;P&gt;There's no question that the investment required to use a framework is significantly larger than the investment required to use a library.&lt;/P&gt;
&lt;P&gt;And, my 2c, is if there is any single failing of Enterprise Library, it is where it tries to behave like a framework where it should instead be acting like a library. Baking the configuration system into EntLib and making it hard to use without it is the most obvious example of this behavior. &lt;A href="http://www.agileprogrammer.com/scottden/"&gt;Scott&lt;/A&gt; and I (and others) have had many discussions about this in the past (read &lt;A href="http://www.agileprogrammer.com/scottden/archive/2007/05/23/22721.aspx"&gt;his latest blog post&lt;/A&gt; for some in-depth thinking about it).&lt;/P&gt;&lt;img src ="http://www.agileprogrammer.com/dotnetguy/aggbug/22819.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Brad Wilson</dc:creator><title>What's Right About Lambdas and LINQ</title><link>http://www.agileprogrammer.com/dotnetguy/archive/2007/04/21/22624.aspx</link><pubDate>Sat, 21 Apr 2007 07:55:00 GMT</pubDate><guid>http://www.agileprogrammer.com/dotnetguy/archive/2007/04/21/22624.aspx</guid><description>&lt;p&gt;Two features coming in C# 3.0 are pretty exciting, even though I may have initially (incorrectly) dismissed them a gimmicky.&lt;/p&gt; &lt;p&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2007/04/08/new-orcas-language-feature-lambda-expressions.aspx"&gt;Lambda Expressions&lt;/a&gt; are nice because they are syntactically simpler anonymous delegates, and hands down, anonymous delegates were the best feature of C# 2.0. Generics might've saved us some casts, but anonymous delegates saved us from making whole methods or types, and because they're closures, they eliminate the need for nasty things like passing opaque objects through callbacks. Lambda Expressions make anonymous delegates compact and readable. This was a no-brainer for me.&lt;/p&gt; &lt;p&gt;I was less sure about LINQ. With LINQ Expressions, you can write vaguely SQLish code:&lt;/p&gt;&lt;pre&gt;IEnumerable&amp;lt;Person&amp;gt; results = from p in people
                              where p.LastName.StartsWith("G")
                              orderby p.FirstName
                              select p;&lt;/pre&gt;
&lt;p&gt;or the more explicit:&lt;/p&gt;&lt;pre&gt;IEnumerable&amp;lt;Person&amp;gt; results = people.Where(p=&amp;gt;p.LastName.StartsWith("G"))
                                    .OrderBy(p=&amp;gt;p.FirstName);&lt;/pre&gt;
&lt;p&gt;There are&amp;nbsp;obvious reasons to like this: no chance for SQL injection bugs, don't need to switch your brain from C# mode to SQL mode and back, hiding the simpler differences between database engines, etc.&lt;/p&gt;
&lt;p&gt;There's a bigger bang for the buck hiding here, though: it's very likely to make database refactoring dramatically simpler. I like being able to think about all of my database operations in terms of my native development language. Rails does this today with Migrations, and C# 3.0 could benefit from a similar system.&lt;/p&gt;
&lt;p&gt;It will really hit the 85% problem well, and then we can build intelligent database refactoring systems that understand how to build migrations as well as modify the query code, without ever having to touch SQL in the process. We can also use static analysis tools to find simple performance issues (missing indices on things that are used in where clauses, for example). The wealth of value that opens up here is almost staggering.&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:2185aacc-5491-4174-9c0f-c7a87b0e18ad" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;i&gt;Technorati tags: &lt;a href="http://technorati.com/tags/C#%203.0" rel="tag"&gt;C# 3.0&lt;/a&gt;, &lt;a href="http://technorati.com/tags/Lambda%20Expression" rel="tag"&gt;Lambda Expression&lt;/a&gt;, &lt;a href="http://technorati.com/tags/LINQ" rel="tag"&gt;LINQ&lt;/a&gt;, &lt;a href="http://technorati.com/tags/refactoring" rel="tag"&gt;refactoring&lt;/a&gt;, &lt;a href="http://technorati.com/tags/agile" rel="tag"&gt;agile&lt;/a&gt;, &lt;a href="http://technorati.com/tags/database" rel="tag"&gt;database&lt;/a&gt;, &lt;a href="http://technorati.com/tags/SQL" rel="tag"&gt;SQL&lt;/a&gt;&lt;/i&gt;&lt;/div&gt;&lt;img src ="http://www.agileprogrammer.com/dotnetguy/aggbug/22624.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Brad Wilson</dc:creator><title>Whose Thread Is This, Anyway?</title><link>http://www.agileprogrammer.com/dotnetguy/archive/2006/11/22/21274.aspx</link><pubDate>Wed, 22 Nov 2006 09:38:00 GMT</pubDate><guid>http://www.agileprogrammer.com/dotnetguy/archive/2006/11/22/21274.aspx</guid><description>&lt;p&gt;Being involved a lot with smart client applications and platforms, I get asked a lot about dealing with background threads, especially as it pertains to things like &lt;a href="http://www.martinfowler.com/eaaDev/ModelViewPresenter.html"&gt;Model-View-Presenter&lt;/a&gt;. One&amp;nbsp;very common question is: "When work is being done on a background thread, whose responsibility is it to get back to the UI thread when it's time to do UI work?"&lt;/p&gt; &lt;p&gt;Although we gave help for this in CAB's event broker, this always felt a little odd to me (not the least of which because it was only available to event handlers). I actually believe that this behavior belongs in the view. There is a temptating to want to put this logic in the presenter, because MVP encourages you to keep your views to be as dumb as possible.&lt;/p&gt; &lt;p&gt;While I appreciate that sentinment, if you think about isolating details of your architecture, it makes sense to put this into the view. Should your presenter to be aware of the type of view that it's being used in, and the details of which thread is appropriate to be called back on? Aside from the "typical" WinForms rules, how does the presenter know which thread is the right one?&lt;/p&gt; &lt;p&gt;In the end, only the view has the appropriate information to make that judgment call about which thread is appropriate and when. When using WinForms, this means using InvokeRequired/BeginInvoke/EndInvoke. Keeping this in the view means that the presenters remain agnostic to the view technology, and it makes it simpler to migrate to some new presentation technology without changing the presenters.&lt;/p&gt; &lt;p&gt;The code to do the work is relatively simple. Here is a fully formed example.&lt;/p&gt;&lt;pre&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Threading;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Windows.Forms;

&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; WindowsApplication1
{
    &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Program {
        [STAThread] &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Main() {
            Application.Run(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Form1());
        }
    }

    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; partial &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Form1 : Form {
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Form1() {
            InitializeComponent();
        }

        &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; OnLoad(EventArgs e) {
            &lt;span style="color: #0000ff"&gt;base&lt;/span&gt;.OnLoad(e);
            &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Thread(&lt;span style="color: #0000ff"&gt;delegate&lt;/span&gt;() {
                Thread.Sleep(1000);
                Console.WriteLine("&lt;span style="color: #8b0000"&gt;The result is: {0}&lt;/span&gt;", MyMethod(10, 4.2));
            }).Start();
        }

        &lt;span style="color: #0000ff"&gt;delegate&lt;/span&gt; &lt;span style="color: #0000ff"&gt;double&lt;/span&gt; MyMethodDelegate(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; x, &lt;span style="color: #0000ff"&gt;double&lt;/span&gt; y);

        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;double&lt;/span&gt; MyMethod(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; x, &lt;span style="color: #0000ff"&gt;double&lt;/span&gt; y) {
            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (InvokeRequired)
                &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;double&lt;/span&gt;)EndInvoke(BeginInvoke(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; MyMethodDelegate(MyMethod), x, y));

            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; y * x;
        }
    }
}&lt;/pre&gt;
&lt;p&gt;If you've used the Smart Client Software Factory, you can see that we use this pattern in our sample applications. The debates in the room landed us on this pattern, and I think we were all pretty happy with it in the end.&lt;/p&gt;
&lt;p&gt;In an ideal world, ObjectBuilder would offer AOP facilities; then, you could write a strategy that watched the creation of any class that derives from Control, and wrap public methods and properties with this boilerplate code, either automatically or on the basis of some metadata like an attribute.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Now playing:&lt;/strong&gt; Kyle Quit the Band - Tenacious D&lt;/em&gt;&lt;/p&gt;&lt;img src ="http://www.agileprogrammer.com/dotnetguy/aggbug/21274.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Brad Wilson</dc:creator><title>Smart Client Software Factory Ships</title><link>http://www.agileprogrammer.com/dotnetguy/archive/2006/07/01/16561.aspx</link><pubDate>Sat, 01 Jul 2006 11:59:00 GMT</pubDate><guid>http://www.agileprogrammer.com/dotnetguy/archive/2006/07/01/16561.aspx</guid><description>&lt;P&gt;The last project I worked on at p&amp;amp;p was the &lt;A href="http://codegallery.gotdotnet.com/scbat"&gt;Smart Client Software Factory&lt;/A&gt; (previously known as Smart Client Baseline Architecture Toolkit, or SC-BAT).&lt;/P&gt;
&lt;P&gt;I just got the notice that &lt;A href="http://msdn.microsoft.com/smartclientfactory"&gt;they shipped to MSDN&lt;/A&gt; yesterday. Congratulations to the team!&lt;/P&gt;&lt;img src ="http://www.agileprogrammer.com/dotnetguy/aggbug/16561.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Brad Wilson</dc:creator><title>My Parting Gift to the CAB Community</title><link>http://www.agileprogrammer.com/dotnetguy/archive/2006/05/12/14643.aspx</link><pubDate>Fri, 12 May 2006 14:23:00 GMT</pubDate><guid>http://www.agileprogrammer.com/dotnetguy/archive/2006/05/12/14643.aspx</guid><description>&lt;p&gt;Today is my last day with patterns &amp;amp; practices.&lt;/p&gt;
&lt;p&gt;I joined p&amp;amp;p 14 months ago as my first stop in Microsoft. In my time here, I got to work with some great people. I can't name them all, because it wouldn't be fair to forget someone, but it almost goes without saying that people like &lt;a href="http://www.peterprovost.org/"&gt;Peter Provost&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/scottdensmore"&gt;Scott Densmore&lt;/a&gt;, &lt;a href="http://www.agileprogrammer.com/oneagilecoder/"&gt;Brian Button&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/edjez"&gt;Ed Jezierski&lt;/a&gt;, and &lt;a href="http://c2.com/"&gt;Ward Cunningham&lt;/a&gt; had tremendous impact on my time here. Three of them have already moved on, and now it's my turn. Another post on another day will talk about what I&amp;rsquo;m doing next.&lt;/p&gt;
&lt;p&gt;Peter got tired of my Short-Timer&amp;rsquo;s Syndrome, so he sent me to pinch-hit on the &lt;a href="http://codegallery.gotdotnet.com/scbat"&gt;Smart Client Software Factory&lt;/a&gt; project (a team I&amp;rsquo;d left about a month ago). At the iteration planning meeting last Friday, we decided to tackle one of the issues people have with CAB: the module loader. Specifically, we wanted to address two things with this code update: 1. Fix a bug regarding the order of WorkItemExtension registration, and 2. Move the dependency information out into the XML file and make it richer, to enable scenarios like grouping modules together into sections for layout, services, and applications.&lt;/p&gt;
&lt;p&gt;The code for the new module loader will be in the SCSF community drop on Monday. &lt;a href="http://www.agileprogrammer.com/dotnetguy/articles/NewModuleLoaderForCAB.aspx"&gt;I've written an article which describes the new module loader and supporting classes in detail&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Now playing:&lt;/strong&gt; &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?artistTerm=Joe Satriani"&gt;Joe Satriani&lt;/a&gt; - &lt;a href="http://phobos.apple.com/WebObjects/MZSearch.woa/wa/advancedSearchResults?songTerm=Redshift Riders&amp;amp;artistTerm=Joe Satriani"&gt;Redshift Riders&lt;/a&gt;&lt;/p&gt;&lt;img src ="http://www.agileprogrammer.com/dotnetguy/aggbug/14643.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Brad Wilson</dc:creator><title>Speaking at p&amp;p Summit Boston</title><link>http://www.agileprogrammer.com/dotnetguy/archive/2006/03/11/12139.aspx</link><pubDate>Sat, 11 Mar 2006 00:01:00 GMT</pubDate><guid>http://www.agileprogrammer.com/dotnetguy/archive/2006/03/11/12139.aspx</guid><description>&lt;p&gt;I found out today that I'll be speaking at the &lt;a href="http://www.pnpsummit.com/east2006.aspx"&gt;patterns &amp;amp; practices summit in Boston in two weeks&lt;/a&gt;. I'm still negotiating what my talks will be, but undoubtedly there will be some coverage of Smart Client stuff (&lt;a href="http://msdn.microsoft.com/smartclient/default.aspx?pull=/library/en-us/dnpag2/html/cab.asp"&gt;CAB&lt;/a&gt; and/or &lt;a href="http://codegallery.gotdotnet.com/scbat"&gt;SC-BAT&lt;/a&gt;) as well as agile topics.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I got my list of scheduled topics.&lt;/p&gt;
&lt;p&gt;On Wednesday morning I'll be talking about Smart Client Baseline Architecture Toolkit (SC-BAT), which will offer an overview of what the project is and how architects can use our toolkit to create their own baseline architectures.&lt;/p&gt;
&lt;p&gt;On Thursday morning I'll be talking about &lt;a href="http://codegallery.gotdotnet.com/objectbuilder/"&gt;ObjectBuilder&lt;/a&gt;, our framework for building dependency injection systems. This is the first time we'll be talking about ObjectBuilder publicly, and probably the only time this talk will be given at a Summit. It will be quite different from the &lt;a href="http://www.peterprovost.org/archive/2005/10/24/8942.aspx"&gt;DI talk that Peter and I did at Seattle Code Camp&lt;/a&gt;; instead of talking about dependency injection in the abstract and showing an OB wrapper, I'll be talking about what OB is, where we've used it in p&amp;amp;p,&amp;nbsp;and how you can use it to create your own customized &lt;a href="http://en.wikipedia.org/wiki/Dependency_Injection"&gt;Dependency Injection&lt;/a&gt; framework.&lt;/p&gt;&lt;img src ="http://www.agileprogrammer.com/dotnetguy/aggbug/12139.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Brad Wilson</dc:creator><title>CAB Hands on Labs available (C#)</title><link>http://www.agileprogrammer.com/dotnetguy/archive/2005/12/29/10429.aspx</link><pubDate>Thu, 29 Dec 2005 12:33:00 GMT</pubDate><guid>http://www.agileprogrammer.com/dotnetguy/archive/2005/12/29/10429.aspx</guid><description>We shipped the C# version of the Hands on Labs last night to GotDotNet. You can download them &lt;a href="http://www.gotdotnet.com/codegallery/releases/viewuploads.aspx?id=22f72167-af95-44ce-a6ca-f2eafbf2653c"&gt;here&lt;/a&gt;. Note that these versions of the labs require the December 2005 C# version of CAB.&lt;img src ="http://www.agileprogrammer.com/dotnetguy/aggbug/10429.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Brad Wilson</dc:creator><title>p&amp;p Live Webcast: Lessons Learned from the Warroom</title><link>http://www.agileprogrammer.com/dotnetguy/archive/2005/12/11/10105.aspx</link><pubDate>Sun, 11 Dec 2005 14:48:00 GMT</pubDate><guid>http://www.agileprogrammer.com/dotnetguy/archive/2005/12/11/10105.aspx</guid><description>&lt;p&gt;It seems like I'm last to the party here. :)&lt;/p&gt;
&lt;p&gt;On December 1, we (&lt;a href="http://www.peterprovost.org/"&gt;Peter&lt;/a&gt;, &lt;a href="http://www.agileprogrammer.com/oneagilecoder/"&gt;Brian&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/darrellsnow/"&gt;Darrell&lt;/a&gt; and myself) did a webcast talking about our lessons learned from the patterns &amp;amp; practices warroom, especially as it relates to agile development. Get some insight into the way we work, and the successes and challenges we've had doing agile development inside of Microsoft.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032286000&amp;amp;EventCategory=5&amp;amp;culture=en-US&amp;amp;CountryCode=US"&gt;Enjoy&lt;/a&gt;!&lt;/p&gt;&lt;img src ="http://www.agileprogrammer.com/dotnetguy/aggbug/10105.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Brad Wilson</dc:creator><title>CAB Released to MSDN, Visualization Sample Released to GotDotNet</title><link>http://www.agileprogrammer.com/dotnetguy/archive/2005/12/07/9998.aspx</link><pubDate>Wed, 07 Dec 2005 11:54:00 GMT</pubDate><guid>http://www.agileprogrammer.com/dotnetguy/archive/2005/12/07/9998.aspx</guid><description>&lt;p&gt;Yesterday the &lt;a href="http://msdn.microsoft.com/library/en-us/dnpag2/html/cab.asp"&gt;MSDN page for CAB went live with the final bits for both C# and Visual Basic .NET&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We did not intend to change the C# code from the November release. However, we coded ourselves into a bit of a corner, and the VB port caused us to make some small but necessary API changes (stuff that hardly anybody would notice). We thought that API compatibility was of the utmost importance between C# and VB, so we decided to re-release C#.&lt;/p&gt;
&lt;p&gt;Being typical developers,&amp;nbsp;we seized the re-release opportunity to fix a few bugs from the community in both the C# and VB release. If you've previously&amp;nbsp;downloaded the November release, it's worth downloading the December one and using that instead. We released &lt;a href="http://www.gotdotnet.com/codegallery/messageboard/thread.aspx?id=22f72167-af95-44ce-a6ca-f2eafbf2653c&amp;amp;mbid=c09776ca-f94c-4c83-a80c-75d381cabdd6&amp;amp;threadid=8dcaca25-fa1c-4261-a2fc-6e943ddb45d1"&gt;a list of things we changed and fixed between November and December&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We also released our first &lt;a href="http://www.gotdotnet.com/codegallery/releases/viewuploads.aspx?id=22f72167-af95-44ce-a6ca-f2eafbf2653c"&gt;Sample Visualizations package&lt;/a&gt;&amp;nbsp;to the GotDotNet community. Right now it only includes a single simple visualization which can show the WorkItem hierarchy of a running CAB application. Just as important, it includes some preliminary documentation on how the visualizer system works in CAB and what is required to write your own visualizations. Hopefully we'll be able to release new sample visualizations on a regular basis that provide additional debugging assistance for CAB developers and administrators.&lt;/p&gt;
&lt;p&gt;Next up: sample code on using &lt;a href="http://codegallery.gotdotnet.com/objectbuilder/"&gt;ObjectBuilder&lt;/a&gt; as a true dependency injection container.&lt;/p&gt;&lt;img src ="http://www.agileprogrammer.com/dotnetguy/aggbug/9998.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>