<?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"?><!--Generated by Squarespace V5 Site Server v5.13.161 (http://www.squarespace.com) on Sun, 02 Jun 2013 23:57:41 GMT--><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>Weston Binford</title><link>http://trason.net/journal/</link><description>Notes along my journey</description><lastBuildDate>Sat, 31 Oct 2009 23:08:54 +0000</lastBuildDate><copyright>Copyright 2009 Weston M. Binford III</copyright><language>en-US</language><generator>Squarespace V5 Site Server v5.13.161 (http://www.squarespace.com)</generator><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/wbinford" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="wbinford" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><title>Monospace Open Space Thursday Schedule</title><dc:creator>Weston M. Binford III</dc:creator><pubDate>Sat, 31 Oct 2009 23:08:54 +0000</pubDate><link>http://trason.net/journal/2009/10/31/monospace-open-space-thursday-schedule.html</link><guid isPermaLink="false">342899:3630310:5666592</guid><description>&lt;p&gt;There seemed to be some interest in the Monospace Open Space Friday Schedule that I published earlier this week.&amp;#160; No doubt, the majority of the interest was from people at the conference, but I thought others might be interested in what was discussed on Thursday as well.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;1:00 – 2:15pm&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;Room 18B – &lt;a href="http://monotouch.net/"&gt;MonoTouch&lt;/a&gt; Testability and Architecture – &lt;a href="http://www.persistall.com/"&gt;Brian Donahue&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Room 18C – Starting an Open Source Project or Contributing to an existing one and the best way to go about it – &lt;a href="http://www.lostechies.com/blogs/rssvihla/"&gt;Ryan Svihla&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Room 18D – Moving to &lt;a href="http://mono-project.com/Main_Page"&gt;Mono&lt;/a&gt;: Why? How? – &lt;a href="http://lessmayhemmoresoftware.blogspot.com/"&gt;Michael Maham&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;2:15 – 3:30pm&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;Room 18B – &lt;a href="http://www.codeplex.org/"&gt;Codeplex Foundation&lt;/a&gt; – &lt;a href="http://samus.typepad.com/"&gt;Sam Ramji&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Room 18C – Integrating open source into corporate software – &lt;a href="http://twitter.com/msheldon83"&gt;Mike Sheldon&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Room 18D – Distributing on Linux (deb, rpm, huh??) – &lt;a href="http://public.kgi.edu/~fbergman/"&gt;Frank Bergmann&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://feeds.feedburner.com/~r/wbinford/~4/T0EiwYlTNiA" height="1" width="1"/&gt;</description><wfw:commentRss>http://trason.net/journal/rss-comments-entry-5666592.xml</wfw:commentRss></item><item><title>Monospace Open Space Friday Schedule</title><dc:creator>Weston M. Binford III</dc:creator><pubDate>Fri, 30 Oct 2009 04:49:41 +0000</pubDate><link>http://trason.net/journal/2009/10/29/monospace-open-space-friday-schedule.html</link><guid isPermaLink="false">342899:3630310:5654014</guid><description>&lt;p&gt;I expect that this schedule will be available on the Monospace web site &lt;a href="http://monospace.us/schedule"&gt;here&lt;/a&gt; at any time.&amp;#160; Until then, here it is:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;9:00 – 10:15am&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;Room 18B - &lt;a href="http://monodevelop.com/"&gt;MonoDevelop&lt;/a&gt; vs &lt;a href="http://msdn.microsoft.com/en-us/vstudio/default.aspx"&gt;Visual Studio&lt;/a&gt; + &lt;a href="http://www.jetbrains.com/resharper/index.html"&gt;Resharper&lt;/a&gt; (what do we need to add) – &lt;a href="http://www.lostechies.com/blogs/joshuaflanagan/"&gt;Josh Flanagan&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Room 18C – &lt;a href="http://silverlight.net/"&gt;Silverlight&lt;/a&gt; and &lt;a href="http://windowsclient.net/wpf/"&gt;Windows Presentation Foundation (WPF)&lt;/a&gt; Best Practices – &lt;a href="http://blogs.silverlight.net/blogs/justinangel/"&gt;Justin Angel&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Room 18D – 0 to 60 on Linux for Noobs&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;10:15 – 11:30am&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;Room 18B – Jazz Band Management (with &lt;a href="http://tirania.org/blog/"&gt;Miguel de Icaza&lt;/a&gt;) – &lt;a href="http://geekswithblogs.net/kirstinj/Default.aspx"&gt;Kirstin Juhl&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Room 18C – Build Your First &lt;a href="http://www.linode.com/"&gt;Linode&lt;/a&gt; for Running ASP.NET – &lt;a href="http://www.lostechies.com/blogs/hex/"&gt;Eric Hexter&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Room 18D – Adding Scripting To Your Applications (and making them cross-platform)&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;1:00 – 2:15pm&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;Room 18B – &lt;a href="http://monotouch.net/"&gt;MonoTouch&lt;/a&gt; Pairing – Kirsten Juhl&lt;/p&gt;    &lt;p&gt;Room 18C – &lt;a href="http://www.mono-project.com/Mono.Addins"&gt;Mono.AddIns&lt;/a&gt;, &lt;a href="http://www.codeplex.com/MEF"&gt;Managed Extensibility Framework (MEF)&lt;/a&gt;, and/or Inversion of Control – Josh Flanagan&lt;/p&gt;    &lt;p&gt;Room 18D – Using &lt;a href="http://nhforge.org"&gt;NHibernate&lt;/a&gt; in High Transaction Applications – &lt;a href="http://twitter.com/msheldon83"&gt;Mike Sheldon&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;2:15 – 3:30pm&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;Room 18B – Lessons Learned by Reading Open Source Software (Architecture, etc.) – &lt;a href="http://twitter.com/praeclarum"&gt;Frank Krueger&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Room 18C – Legal Issues in Technology (Independent Contractors, Open Source Software, Intellectual Property (Copyright vs. Trademarks vs. Patents) – &lt;a href="http://johnvpetersen.com/"&gt;John Petersen&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Room 18D – Automated Build with &lt;a href="http://rake.rubyforge.org/"&gt;Rake&lt;/a&gt; – &lt;a href="http://blog.scottbellware.com/"&gt;Scott Bellware&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://feeds.feedburner.com/~r/wbinford/~4/AmIzEfDdVJw" height="1" width="1"/&gt;</description><wfw:commentRss>http://trason.net/journal/rss-comments-entry-5654014.xml</wfw:commentRss></item><item><title>NHibernate Transactional Boundaries</title><dc:creator>Weston M. Binford III</dc:creator><pubDate>Wed, 14 Oct 2009 13:29:00 +0000</pubDate><link>http://trason.net/journal/2009/10/14/nhibernate-transactional-boundaries.html</link><guid isPermaLink="false">342899:3630310:5458300</guid><description>&lt;p&gt;In &lt;a href="http://trason.net/journal/2009/10/7/bootstrapping-nhibernate-with-structuremap.html"&gt;NHibernate Bootstrapping with StructureMap&lt;/a&gt;, I did not address the issue of transactional boundaries. The example had very simple controller actions that managed their own commits. However, this &lt;a href="http://stackoverflow.com/questions/1041632/controlling-nhibernate-itransaction-with-structuremap"&gt;question&lt;/a&gt; on StackOverflow left me wondering who should be responsible for the commit?&lt;/p&gt;  &lt;h3&gt;Sharp Architecture’s Approach&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://sharparchitecture.net/"&gt;Sharp Architecture&lt;/a&gt; is an excellent “architectural foundation for building maintainable web applications with ASP.NET MVC”. It has an Action Filter called &lt;a href="http://github.com/codai/Sharp-Architecture/blob/master/src/SharpArch/SharpArch.Web/NHibernate/TransactionAttribute.cs"&gt;Transaction&lt;/a&gt; that starts a transaction in the OnActionExecuting event, and then commits if no exception occurred. Otherwise, it explicitly rolls the transaction back. In fact, the &lt;a href="http://groups.google.com/group/sharp-architecture/browse_thread/thread/950dc4377eee90eb#"&gt;Implicit transactions&lt;/a&gt; thread in the Sharp Architecture Google group discusses the Transaction attribute and some of the issues using it. The Transaction attribute provides the functionality that I want, but it requires the developer to decorate each Action method with an attribute. Why not make the HttpModule that creates and disposes of the Unit of Work handle the commit?&lt;/p&gt;  &lt;h3&gt;Modified Bootstrapping Example&lt;/h3&gt;  &lt;p&gt;I have modified the &lt;a href="http://trason.net/journal/2009/10/7/bootstrapping-nhibernate-with-structuremap.html"&gt;Bootstrapping NHibernate with StructureMap&lt;/a&gt; example from my previous post to do just that. Now, the NHibernateModule is responsible for calling Commit() on the UnitOfWork. Here is the NHibernateModule’s new Dispose method:&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;public void Dispose()
{
    _unitOfWork.Commit();
    _unitOfWork.Dispose();
}&lt;/pre&gt;

&lt;p&gt;The only addition is the call to the _unitOfWork.Commit(). However, now that the NHibernateModule is responsible for the commit, the developer can not abort an existing transaction. So, I added a Rollback() method to the IUnitOfWork class. The concrete implementation, UnitOfWork, calls _transaction.Rollback().&lt;/p&gt;

&lt;p&gt;One final change to the UnitOfWork prevents it from throwing an exception if the developer explicitly calls commit by checking the ITransaction’s IsActive property before attempting to commit. Here is the UnitOfWork’s new Commit method:&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;public void Commit()
{
    if (_transaction.IsActive)
        _transaction.Commit();
}&lt;/pre&gt;

&lt;h3&gt;Multi-Transaction Unit of Work&lt;/h3&gt;

&lt;p&gt;There is still one issue nagging at me. Once the developer commits the unit of work, the transaction is closed. The FubuTasks example in the &lt;a href="http://code.google.com/p/fubumvc-contrib/"&gt;fubumvc-contrib&lt;/a&gt; project solves this problem by starting a new transaction once the existing transaction is committed. &lt;a href="http://code.google.com/p/fubumvc-contrib/source/browse/trunk/samples/FubuTask/src/Framework.NHibernate/NHibernateUnitOfWork.cs?r=51"&gt;Here&lt;/a&gt; is the source for FubuTask’s NHibernateUnitOfWork. I have talked to &lt;a href="http://www.lostechies.com/blogs/chad_myers/default.aspx"&gt;Chad Myers&lt;/a&gt; about this implementation and he has moved away from the idea of handling rollback in general. In any event, I don’t like the idea of starting a new transaction because I don’t think there should be one transaction per request. At the same time, I am preventing the developer from using my unit of work for more than one transaction. At least for now, opening a new transaction is a &lt;a href="http://en.wikipedia.org/wiki/You_ain%27t_gonna_need_it"&gt;YAGNI&lt;/a&gt; for me. What do you think?&lt;/p&gt;

&lt;p&gt;The full source code with these changes are available in the &lt;a href="http://code.google.com/p/mvbalaw-commons/"&gt;mvbalaw-commons&lt;/a&gt; project &lt;a href="http://code.google.com/p/mvbalaw-commons/source/checkout"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Tags: &lt;a href="http://technorati.com/tag/NHibernate" rel="tag"&gt;NHibernate&lt;/a&gt;&lt;/p&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2ftrason.net%2fjournal%2f2009%2f10%2f14%2fnhibernate-transactional-boundaries.html"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2ftrason.net%2fjournal%2f2009%2f10%2f14%2fnhibernate-transactional-boundaries.html" /&gt;&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/wbinford/~4/v_Yhftuen3g" height="1" width="1"/&gt;</description><wfw:commentRss>http://trason.net/journal/rss-comments-entry-5458300.xml</wfw:commentRss></item><item><title>Bootstrapping NHibernate with StructureMap</title><dc:creator>Weston M. Binford III</dc:creator><pubDate>Wed, 07 Oct 2009 18:04:00 +0000</pubDate><link>http://trason.net/journal/2009/10/7/bootstrapping-nhibernate-with-structuremap.html</link><guid isPermaLink="false">342899:3630310:5416001</guid><description>&lt;p&gt;&lt;a href="http://codebetter.com/blogs/jeremy.miller/default.aspx"&gt;Jeremy Miller&lt;/a&gt; asked me to help him create a canonical example of bootstrapping &lt;a href="http://nhforge.org/"&gt;NHibernate&lt;/a&gt; using &lt;a href="http://structuremap.sourceforge.net/Default.htm"&gt;StructureMap&lt;/a&gt;. &lt;strong&gt;This is not that example.&lt;/strong&gt; Hopefully, it will provide a starting point of discussion and, with your feedback, we will be able to create that example together.&lt;/p&gt;  &lt;p&gt;Many examples on configuring NHibernate depend on some library such as &lt;a href="http://fluentnhibernate.org/"&gt;FluentNHibernate&lt;/a&gt; or include additional concepts such as Repositories. While we use FluentNHibernate and Repositories to interface with the database, I did not want to complicate the example with these concerns. I did not want to preclude their addition, either.&lt;/p&gt;  &lt;h3&gt;NHibernate Registry&lt;/h3&gt;  &lt;p&gt;I have encapsulated the NHibernate configuration in a StructureMap Registry. It makes the following available:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;NHibernate.Configuration&lt;/strong&gt; as a Singleton &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;ISessionFactory&lt;/strong&gt; as a Singleton &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;ISession&lt;/strong&gt; scoped to Hybrid (HttpContext, if available, falling back to Thread) &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;IUnitOfWork&lt;/strong&gt; scoped to Hybrid, a light-weight container for ISession (more on this later) &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;IDatabaseBuilder&lt;/strong&gt;, a utility class to create the database using SchemaExport and populate it with initial data. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;That’s it. If you want to create your own ISession (for example, to use in an integration test), then you request the ISessionFactory and call the OpenSession() method.&lt;/p&gt;  &lt;p&gt;Here is the NHibernateRegistry class that provides the Configuration, ISessionFactory, ISession, and IUnitOfWork:&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;using NHibernate;
using NHibernate.ByteCode.Castle;
using NHibernate.Cfg;
using NHibernate.Dialect;
using NHibernate.Driver;
using NHibernateBootstrap.Core.Domain;
using StructureMap.Attributes;
using StructureMap.Configuration.DSL;
using Environment=NHibernate.Cfg.Environment;

namespace NHibernateBootstrap.Core.Persistence
{
    public class NHibernateRegistry : Registry
    {
        public NHibernateRegistry()
        {
            var cfg = new Configuration()
                .SetProperty(Environment.ReleaseConnections, &amp;quot;on_close&amp;quot;)
                .SetProperty(Environment.Dialect, typeof(SQLiteDialect).AssemblyQualifiedName)
                .SetProperty(Environment.ConnectionDriver, typeof(SQLite20Driver).AssemblyQualifiedName)
                .SetProperty(Environment.ConnectionString, &amp;quot;data source=bootstrap.sqlite;Version=3&amp;quot;)
                .SetProperty(Environment.ProxyFactoryFactoryClass, typeof(ProxyFactoryFactory).AssemblyQualifiedName)
                .AddAssembly(typeof(Blog).Assembly);

            var sessionFactory = cfg.BuildSessionFactory();

            ForRequestedType&amp;lt;Configuration&amp;gt;().AsSingletons().TheDefault.IsThis(cfg);

            ForRequestedType&amp;lt;ISessionFactory&amp;gt;().AsSingletons()
                .TheDefault.IsThis(sessionFactory);

            ForRequestedType&amp;lt;ISession&amp;gt;().CacheBy(InstanceScope.Hybrid)
                .TheDefault.Is.ConstructedBy(ctx =&amp;gt; ctx.GetInstance&amp;lt;ISessionFactory&amp;gt;().OpenSession());

            ForRequestedType&amp;lt;IUnitOfWork&amp;gt;().CacheBy(InstanceScope.Hybrid)
                .TheDefaultIsConcreteType&amp;lt;UnitOfWork&amp;gt;();

                ForRequestedType&amp;lt;IDatabaseBuilder&amp;gt;().TheDefaultIsConcreteType&amp;lt;DatabaseBuilder&amp;gt;();
        }
    }
}&lt;/pre&gt;

&lt;h3&gt;Unit Of Work&lt;/h3&gt;

&lt;p&gt;Recently, I have been in several discussions regarding what the Unit of Work’s (single) responsibility is. Per Martin Fowler’s &lt;a href="http://martinfowler.com/eaaCatalog/unitOfWork.html"&gt;definition&lt;/a&gt;, a Unit of Work “&lt;i&gt;maintains a list of objects affected by a business transaction and coordinates the writing out of changes and the resolution of concurrency problems.&lt;/i&gt;” In practice, NHibernate’s ISession is a Unit of Work.&lt;/p&gt;

&lt;p&gt;When I first created my example, I used the ISession directly, but I found myself writing the following code over and over again:&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;    var product = new Product {Name = &amp;quot;Apple&amp;quot;, Category = &amp;quot;Fruits&amp;quot;};
    using (var session = _sessionFactory.OpenSession())
    using (var transaction = _session.BeginTransaction())
    {
        session.Save(product);
        transaction.Commit();
    }&lt;/pre&gt;

&lt;p&gt;When I really wanted to write this:&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;    var product = new Product {Name = &amp;quot;Apple&amp;quot;, Category = &amp;quot;Fruits&amp;quot;};
    using (var unitOfWork = new UnitOfWork(_sessionFactory))
    {
        unitOfWork.CurrentSession.Save(product);
        unitOfWork.Commit();
    }&lt;/pre&gt;
So, my Unit of Work is a simple wrapper that combines the ISession and ITransaction together. 

&lt;pre class="brush: csharp;"&gt;using System;
using NHibernate;

namespace NHibernateBootstrap.Core.Persistence
{
    public interface IUnitOfWork : IDisposable
    {
        ISession CurrentSession { get; }
        void Commit();  
    }
}&lt;/pre&gt;

&lt;pre class="brush: csharp;"&gt;using NHibernate;

namespace NHibernateBootstrap.Core.Persistence
{
    public class UnitOfWork : IUnitOfWork
    {
        private readonly ISessionFactory _sessionFactory;
        private readonly ITransaction _transaction;

        public UnitOfWork(ISessionFactory sessionFactory)
        {
            _sessionFactory = sessionFactory;
            CurrentSession = _sessionFactory.OpenSession();
            _transaction = CurrentSession.BeginTransaction();
        }

        public ISession CurrentSession { get; private set;}

        public void Dispose()
        {
            CurrentSession.Close();
            CurrentSession = null;
        }

        public void Commit()
        {
            _transaction.Commit();
        }
    }
}&lt;/pre&gt;

&lt;p&gt;I have heard the argument that this is not a real Unit of Work because it does not track the changes per Martin Fowler's definition. While I agree, I also believe that ISession is not &lt;em&gt;just&lt;/em&gt; a Unit of Work either because it includes Get methods that have nothing to do with the Unit of Work. Also, &lt;a href="http://nhprof.com/Learn/Alert?name=DoNotUseImplicitTransactions"&gt;best practices&lt;/a&gt; dictate that NHibernate not use implicit transactions. ISession can not be a Unit of Work without requiring the developer to interact with ITransaction. So, my compromise is to create a simple interface that melds NHibernate’s ISession with its ITransaction. I have heard other names for this class such as TransactionBoundary, but that doesn’t sound right to me. I am open to other suggestions. However, please don’t get caught up in the naming or I’ll be forced to change it to an unpronounceable symbol called &lt;a href="http://en.wikipedia.org/wiki/Prince_%28musician%29"&gt;“The class formerly known as Unit of Work”&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;NHibernateModule&lt;/h3&gt;

&lt;p&gt;Finally, in order to manage the Unit of Work for web applications, I created an HttpModule called NHibernateModule that creates a Unit of Work in the Begin_Request event handler and disposes of it in the End_Request event handler.&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;using System;
using System.Web;
using NHibernateBootstrap.Core.Persistence;
using StructureMap;

namespace NHibernateBootstrap.Web
{
    public class NHibernateModule : IHttpModule
    {
        private IUnitOfWork _unitOfWork;

        public void Init(HttpApplication context)
        {
            context.BeginRequest += ContextBeginRequest;
            context.EndRequest += ContextEndRequest;
        }

        private void ContextBeginRequest(object sender, EventArgs e)
        {
            _unitOfWork = ObjectFactory.GetInstance&amp;lt;IUnitOfWork&amp;gt;();

        }

        private void ContextEndRequest(object sender, EventArgs e)
        {
            Dispose();
        }

        public void Dispose()
        {
            _unitOfWork.Dispose();
        }
    }
}&lt;/pre&gt;

&lt;h3&gt;NHibernateBootstrap Source Code and Tests&lt;/h3&gt;

&lt;p&gt;I have created a Google Code project called &lt;a href="http://code.google.com/p/mvbalaw-commons/"&gt;mvbalaw-commons&lt;/a&gt; with the code for NHibernateBootstrap among other things. You can browse the code &lt;a href="http://code.google.com/p/mvbalaw-commons/source/browse/#svn/trunk/NHibernateBootstrap"&gt;here&lt;/a&gt; or check it out from &lt;a href="http://code.google.com/p/mvbalaw-commons/source/checkout"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The sample application uses &lt;a href="http://www.sqlite.org/"&gt;SQLite&lt;/a&gt;. So, the only external requirement is that you have installed ASP.NET MVC in order to run the web application. You will need &lt;a href="http://www.ruby-lang.org/en/downloads/"&gt;Ruby&lt;/a&gt; and &lt;a href="http://rake.rubyforge.org/"&gt;Rake&lt;/a&gt; to run the build file. See the &lt;a href="http://code.google.com/p/mvbalaw-commons/source/browse/trunk/NHibernateBootstrap/README.txt"&gt;README.TXT&lt;/a&gt; in the root of the NHibernateBootstrap file for more information getting it up and running.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note: This example requires a build of StructureMap 2.5.4 after revision 262 which changes “the concrete class behavior so that it can still build a concrete class that is not specified, but it doesn’t get into the GetAllInstances()” per the check-in comment. Hopefully, there will be a new release of StructureMap soon. Until then, feel free to use the StructureMap dll in this project which was built from trunk (revision 263).&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;NHibernateBootstrap includes four projects:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;NHibernateBootstrap.Core&lt;/strong&gt; – fully functional domain and persistence classes to demonstrate NHibernate. &lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;NHibernateBootstrap.Tests&lt;/strong&gt; – integration tests around CRUD operations for a Product class. &lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;NHibernateBootstrap.Tests.Environment&lt;/strong&gt; – a single test that calls ObjectFactory.AssertConfigurationIsValid() to ensure that StructureMap is configured correctly. &lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;NHibernateBootstrap.Web&lt;/strong&gt; – an ASP.NET MVC 1.0 application with a Product CRUD controller. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The sample application bootstraps NHibernate, tests a ProductController, and provides full CRUD operations for a Product through an ASP.NET MVC web application.&lt;/p&gt;

&lt;p&gt;In order to improve accessibility, I based my sample application on the one in the &lt;a href="http://nhforge.org/wikis/howtonh/your-first-nhibernate-based-application.aspx"&gt;Getting Started Guide&lt;/a&gt; on &lt;a href="http://nhforge.org/"&gt;NHibernate Forge&lt;/a&gt; which originally came from &lt;a href="http://www.lostechies.com/blogs/gabrielschenker/default.aspx"&gt;Gabriel Schenker&lt;/a&gt;’s excellent &lt;a href="http://blogs.hibernatingrhinos.com/nhibernate/Default.aspx"&gt;NHibernateFAQ&lt;/a&gt; series of blog posts.&lt;/p&gt;

&lt;p&gt;Also, I started with &lt;a href="http://ayende.com/"&gt;Ayende&lt;/a&gt;’s &lt;a href="http://ayende.com/Blog/archive/2009/04/28/nhibernate-unit-testing.aspx"&gt;NHibernate Unit Testing&lt;/a&gt; example to get familiar with interacting with &lt;a href="http://www.sqlite.org/"&gt;SQLite&lt;/a&gt;. I left his example in the &lt;a href="http://code.google.com/p/mvbalaw-commons/source/browse/trunk/NHibernateBootstrap/src/NHibernateBootstrap.Tests/BlogTestFixture.cs"&gt;BlogTestFixture&lt;/a&gt; class in the NHibernateBootstrap.Tests project.&lt;/p&gt;

&lt;p&gt;So what do you think? You can leave comments here or it might be better to move the discussion over to a discussion &lt;a href="http://groups.google.com/group/structuremap-users/browse_thread/thread/aaeee2092d94254b"&gt;thread&lt;/a&gt; that I started in the &lt;a href="http://groups.google.com/group/structuremap-users/"&gt;StructureMap Google group&lt;/a&gt; to get more people involved.&lt;/p&gt;

&lt;p&gt;Tags: &lt;a href="http://technorati.com/tag/NHibernate" rel="tag"&gt;NHibernate&lt;/a&gt;, &lt;a href="http://technorati.com/tag/structuremap" rel="tag"&gt;StructureMap&lt;/a&gt;&lt;/p&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2ftrason.net%2fjournal%2f2009%2f10%2f7%2fbootstrapping-nhibernate-with-structuremap.html"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2ftrason.net%2fjournal%2f2009%2f10%2f7%2fbootstrapping-nhibernate-with-structuremap.html" /&gt;&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/wbinford/~4/8qudBAZ5VtM" height="1" width="1"/&gt;</description><wfw:commentRss>http://trason.net/journal/rss-comments-entry-5416001.xml</wfw:commentRss></item><item><title>Code Snippets Using SyntaxHighlighter on SquareSpace</title><dc:creator>Weston M. Binford III</dc:creator><pubDate>Tue, 06 Oct 2009 23:56:40 +0000</pubDate><link>http://trason.net/journal/2009/10/6/code-snippets-using-syntaxhighlighter-on-squarespace.html</link><guid isPermaLink="false">342899:3630310:5417608</guid><description>&lt;p&gt;So, I didn’t expect to return to blogging with such a cliche, but I couldn’t find this information anywhere else. So, here’s how to set up SyntaxHighlighting for a blog on SquareSpace.&lt;/p&gt;  &lt;p&gt;Here is an example code snippet created using Alex Gorbatchev’s &lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter"&gt;Syntax Highlighter&lt;/a&gt; tool:&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;
namespace StarterProject.Core
{
    public class HelloWorld
    {
        public string Speak()
        {
            return &amp;quot;Hello, World!&amp;quot;;
        }
    } 
}&lt;/pre&gt;

&lt;p&gt;It uses a series of javascript libraries and CSS styles to render code blocks in modern browsers.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.hanselman.com/blog/"&gt;Scott Hanselman&lt;/a&gt;’s blog post, &lt;a href="http://www.hanselman.com/blog/BestCodeSyntaxHighlighterForSnippetsInYourBlog.aspx"&gt;Best Code Syntax Highlighter for Snippets in your Blog&lt;/a&gt;. explains how Syntax Highlighter works.&amp;#160; He even explains how to use it with &lt;a href="http://www.codeplex.com/precode"&gt;PreCode&lt;/a&gt;, a LiveWriter plug-in.&lt;/p&gt;

&lt;p&gt;I host my blog at SquareSpace, but could not find information on using Syntax Highlighter with it.&amp;#160; There is documentation on &lt;a href="http://manual.squarespace.com/advanced-customization/can-i-add-flash-or-javascript-to-my-website.html"&gt;adding your own javascript&lt;/a&gt; and &lt;a href="http://manual.squarespace.com/search-engines-promotion/where-can-i-insert-my-google-analytics-or-other-tracking-jav.html"&gt;how to use Google Analytics&lt;/a&gt;.&amp;#160; Between these two pages, I was able to add the configuration necessary to integrate Syntax Highlighter with my blog.&lt;/p&gt;

&lt;p&gt;First, login to your SquareSpace website.&amp;#160; Then, under the Website Management menu, there is a menu called Data &amp;amp; Media.&amp;#160; Select the File Storage submenu.&amp;#160; Create a folder called scripts and another one called styles.&amp;#160; These folders will be available to your web pages as /storage/scripts and /storage/styles, respectively.&amp;#160; &lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter:Download"&gt;Download&lt;/a&gt; and unzip the Syntax Highlighter folder.&amp;#160; Use the Upload Files button on the File Storage page to upload the contents of the scripts and styles folders to the new folders you just created at SquareSpace.&lt;/p&gt;

&lt;p&gt;Under the Website Management menu, there is another menu called Structure.&amp;#160; Select the Website Settings submenu item.&amp;#160; On the Website Settings page, there is another menu bar.&amp;#160; Select the Code Injection menu item which brings up a drop-down menu for the Injection Region and a textarea for the HTML code.&amp;#160; Add the following code (you can cut and paste it from here) to the Extra Head Code (within &amp;lt;head&amp;gt; Tag) injection region:&lt;/p&gt;

&lt;pre class="brush: xml;"&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;storage/scripts/shCore.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;storage/scripts/shBrushBash.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;storage/scripts/shBrushCpp.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;storage/scripts/shBrushCSharp.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;storage/scripts/shBrushCss.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;storage/scripts/shBrushDelphi.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;storage/scripts/shBrushDiff.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;storage/scripts/shBrushGroovy.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;storage/scripts/shBrushJava.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;storage/scripts/shBrushJScript.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;storage/scripts/shBrushPhp.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;storage/scripts/shBrushPlain.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;storage/scripts/shBrushPython.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;storage/scripts/shBrushRuby.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;storage/scripts/shBrushScala.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;storage/scripts/shBrushSql.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;storage/scripts/shBrushVb.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;storage/scripts/shBrushXml.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;link type=&amp;quot;text/css&amp;quot; rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;storage/styles/shCore.css&amp;quot;/&amp;gt;
&amp;lt;link type=&amp;quot;text/css&amp;quot; rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;storage/styles/shThemeDefault.css&amp;quot;/&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
    SyntaxHighlighter.config.clipboardSwf = 'storage/scripts/clipboard.swf';
    SyntaxHighlighter.all();
&amp;lt;/script&amp;gt;&lt;/pre&gt;

&lt;p&gt;I noticed some issues with preview in LiveWriter and even previewing the blog posts before publishing them, but it looked right for me once I published the blog entries.&amp;#160; For reference, I installed Syntax Highlighter version 2.0.320 and PreCode version 5.0.1.&lt;/p&gt;

&lt;p&gt;You may also want to adjust the width of your content column to accommodate wider code snippets.&amp;#160; If so, I recommend this page, &lt;a href="http://manual.squarespace.com/website-structure/adjusting-column-widths.html"&gt;Adjusting Column Widths&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/wbinford/~4/uLli3ecCEIg" height="1" width="1"/&gt;</description><wfw:commentRss>http://trason.net/journal/rss-comments-entry-5417608.xml</wfw:commentRss></item><item><title>AltNetSeattle: Why We Stopped Using AutoMockingContainer</title><dc:creator>Weston M. Binford III</dc:creator><pubDate>Sat, 18 Apr 2009 13:35:09 +0000</pubDate><link>http://trason.net/journal/2009/4/18/altnetseattle-why-we-stopped-using-automockingcontainer.html</link><guid isPermaLink="false">342899:3630310:3669384</guid><description>&lt;div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:05077efc-2ba8-417b-8f3c-639755078b2e" class="wlWriterEditableSmartContent" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a rel="tag" href="http://technorati.com/tags/alt.net"&gt;alt.net&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tags/altnetseattle"&gt;altnetseattle&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tags/mockobjects"&gt;mockobjects&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tags/mspec"&gt;mspec&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;At the &lt;a href="http://altnetseattle.pbwiki.com/"&gt;AltNetSeattle Open Spaces&lt;/a&gt; conference at the end of February, &lt;a href="http://codebetter.com/blogs/aaron.jensen/"&gt;Aaron Jensen&lt;/a&gt; convened a session on how the AutoMockingContainer that they created is not working for them and where to go from here. I went into the session expecting an overview of Machine.Container, but it turned out to be more of a discussion of the issues that people are having using mock objects in Test Driven Development.&lt;/p&gt;
&lt;p&gt;Basically, the problem is that refactoring break tests because they are brittle or because the tests are no longer relevant after the refactoring.&amp;nbsp; So, you spend your time maintaining tests, not maintaining code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AutoMockingContainer&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Aaron described the evolution of their process as starting with manual mocking in fine-grained unit tests, but found that they were creating a lot of mocks.&amp;nbsp; In response, they came up with the AutoMockingContainer.&amp;nbsp; It worked great, but mocking entities was not as useful because they were persistent ignorant anyway.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fluent Builders&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This led to a move towards fluent fixtures or what some people call fluent builders (e.g. new Student(&amp;ldquo;Bob&amp;rdquo;).EnrolledIn(new Course(&amp;ldquo;101&amp;rdquo;)) ).&amp;nbsp; The goal of fluent builders is to make it easy to create object graphs, but not necessarily specify the business behavior.&amp;nbsp; However, even this process has problems because refactoring or decomposing a service breaks the tests because they are no longer relevant.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Introducing a Container&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://jimmybogard.lostechies.com/"&gt;Jimmy Bogard&lt;/a&gt; asked about introducing an Inversion of Control (IoC) container.&amp;nbsp; Aaron said that the problem with containers is that registration time is slow and they can get in the way of testing.&amp;nbsp; For example, a container would cache an object, but you might want more control than a traditional container allows you to have.&amp;nbsp; For testing, you need a container that does fast registration, gives you the ability to override with mocks, and allows for lifetime reset.&amp;nbsp; &lt;a href="http://codebetter.com/blogs/aaron.jensen/archive/tags/machine/default.aspx"&gt;Machine&lt;/a&gt; addresses some of these issues, but he did not go into detail on it.&amp;nbsp; Instead, the session became more of a discussion about how different people deal with the brittleness.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;No real answers, yet&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Aaron went through a couple of examples of starting with the controller and adding checkpoints as you flesh out the implementation.&amp;nbsp; Also, he brought up the idea of having tests that fail (warning tests?), but don&amp;rsquo;t stop the rest of the tests.&amp;nbsp; &lt;a href="http://codebetter.com/blogs/ian_cooper/"&gt;Ian Cooper&lt;/a&gt; mentioned their use of Fitnesse tests. (Read more about the session in Ian&amp;rsquo;s blog &lt;a href="http://codebetter.com/blogs/ian_cooper/archive/2009/03/02/alt-net-seattle-2009-some-impressions.aspx"&gt;post&lt;/a&gt; about AltNetSeattle.)&amp;nbsp; Aaron also mentioned the &lt;a href="http://synthesis.rubyforge.org/"&gt;Ruby Synthesis&lt;/a&gt; project which I would like to investigate further.&lt;/p&gt;
&lt;p&gt;I came away from the session with a lot of new ideas, but no real answers, yet.&amp;nbsp; However, it is nice to have the opportunity to listen to people that are further down the path than I am.&amp;nbsp; Thanks to all who participated.&lt;/p&gt;
&lt;p&gt;You can watch the video here:&lt;/p&gt;
&lt;div id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:ccaed5e0-7540-4d25-a72e-71dae0538783" class="wlWriterEditableSmartContent" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;
&lt;div&gt;&lt;object width="400" height="225"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=4173087&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=4173087&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="225"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/4173087"&gt;AltNetSeattle: Why We Stopped Using the AutoMockingContainer&lt;/a&gt; from &lt;a href="http://vimeo.com/user1385004"&gt;Weston M. Binford III&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Here are my &lt;a href="http://altnetseattle.pbwiki.com/Why+We+Stopped+Using+the+Auto-Mocking+Container+and+What%27s+Next"&gt;Session Notes&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/wbinford/~4/his4ELR1ejM" height="1" width="1"/&gt;</description><wfw:commentRss>http://trason.net/journal/rss-comments-entry-3669384.xml</wfw:commentRss></item><item><title>AltNetHouston: FubuMVC session</title><category>altnethouston</category><category>fubumvc</category><dc:creator>Weston M. Binford III</dc:creator><pubDate>Sun, 12 Apr 2009 19:04:00 +0000</pubDate><link>http://trason.net/journal/2009/4/12/altnethouston-fubumvc-session.html</link><guid isPermaLink="false">342899:3630310:3621339</guid><description>&lt;div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:66de7a13-3723-4829-be10-872c4e032e5b" class="wlWriterEditableSmartContent" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a rel="tag" href="http://technorati.com/tags/alt.net"&gt;alt.net&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tags/fubumvc"&gt;fubumvc&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tags/altnethouston"&gt;altnethouston&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;
&lt;p&gt;At the &lt;a href="http://houston.altnetconf.com/home"&gt;AltNetHouston Open Spaces&lt;/a&gt; conference last weekend, I convened a session on &lt;a href="http://fubumvc.pbwiki.com"&gt;FubuMVC&lt;/a&gt;.&amp;nbsp; Selfishly, I wanted to get &lt;a href="http://www.lostechies.com/blogs/chad_myers/"&gt;Chad Myers&lt;/a&gt; and &lt;a href="http://codebetter.com/blogs/jeremy.miller/"&gt;Jeremy Miller&lt;/a&gt; to talk more about their alternative MVC stack.&lt;/p&gt;
&lt;p&gt;FubuMVC is an MVC framework built on .NET.&amp;nbsp; It is often looked at as an alternative to Microsoft&amp;rsquo;s &lt;a href="http://www.asp.net/mvc/"&gt;ASP.NET MVC&lt;/a&gt;. framework that shipped last month.&amp;nbsp; FubuMVC is a framework that grew organically out of work that Jeremy and Chad were doing at &lt;a href="http://www.dovetailsoftware.com/"&gt;Dovetail Software&lt;/a&gt;.&amp;nbsp; The Fubu in FubuMVC is short for For Us By Us.&lt;/p&gt;
&lt;p&gt;At &lt;a href="http://kaizenconf.pbwiki.com/"&gt;Kaizenconf&lt;/a&gt;, they gave a workshop called &lt;a href="http://kaizenconf.pbwiki.com/Using+and+Abusing+ASPNET+MVC+for+Fun+and+Profit"&gt;Using and Abusing ASPNET MVC for Fun and Profit&lt;/a&gt;.&amp;nbsp; Based on the interest from that workshop, Chad looked to recreate the framework that they were using at Dovetail as an open-source project.&amp;nbsp; Over the Christmas break, he coded the core of framework (available on Google Code &lt;a href="http://code.google.com/p/fubumvc/"&gt;here&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Unfortunately, my laptop died during the AltNetHouston conference and I was unable to keep my MinoHD camera charged.&amp;nbsp; So, I was only able to record the first half hour of the hour and ten minute session.&amp;nbsp; There was another video recording.&amp;nbsp; I will try and track that down and post a link here if and when it is available.&lt;/p&gt;
&lt;p&gt;In the meantime, here is the first half hour:&lt;/p&gt;
&lt;p&gt;&lt;object width="400" height="230"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=4113404&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=4113404&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="230"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/4113404"&gt;AltNetHouston: FubuMVC&lt;/a&gt; from &lt;a href="http://vimeo.com/user1385004"&gt;Weston M. Binford III&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;br /&gt;&lt;a href="http://vimeo.com/4113404"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Also, here are the &lt;a href="http://houstonaltnet.pbwiki.com/Fubu-MVC"&gt;Session Notes&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/wbinford/~4/V-KesKTais4" height="1" width="1"/&gt;</description><wfw:commentRss>http://trason.net/journal/rss-comments-entry-3621339.xml</wfw:commentRss></item><item><title>AltNetHouston: Opening Circle Video</title><category>alt.net</category><category>altnethouston</category><category>openspaces</category><dc:creator>Weston M. Binford III</dc:creator><pubDate>Sun, 12 Apr 2009 16:55:34 +0000</pubDate><link>http://trason.net/journal/2009/4/12/altnethouston-opening-circle-video.html</link><guid isPermaLink="false">342899:3630310:3622938</guid><description>&lt;div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:92fbe263-8d11-43c5-994b-8c1afa091d8f" class="wlWriterEditableSmartContent" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a rel="tag" href="http://technorati.com/tags/altnethouston"&gt;altnethouston&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/openspaces"&gt;openspaces&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Last weekend, I attended the &lt;a href="http://houston.altnetconf.com"&gt;AltNetHouston Open Spaces&lt;/a&gt; conference.&amp;nbsp; Thanks to &lt;a href="http://flux88.com/"&gt;Ben Scheirman&lt;/a&gt;, &lt;a href="http://claudiolassala.spaces.live.com/"&gt;Claudio Lassala&lt;/a&gt;, and &lt;a href="http://blog.microsoft-j.net/"&gt;J Sawyer&lt;/a&gt; for organizing the event and to &lt;a href="http://stevenlist.com/"&gt;Steven &amp;ldquo;Doc&amp;rdquo; List&lt;/a&gt; for facilitating.&amp;nbsp; I especially enjoyed the sessions on &lt;a href="http://houstonaltnet.pbwiki.com/Fubu-MVC%C2%A0"&gt;FubuMVC&lt;/a&gt; and &lt;a href="http://houstonaltnet.pbwiki.com/Why-Blog-and-Open-Source%C2%A0"&gt;Why Blog and Open Source&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As with previous conferences, there were a number of people videoing the proceedings.&amp;nbsp; I had my MinoHD camera, but had battery charging issues after my laptop died.&amp;nbsp; I did record the Opening Circle Friday night and part of the FubuMVC session on Saturday.&lt;/p&gt;
&lt;p&gt;If you are not familiar with Open Spaces conferences, the participants get together at the beginning of the conference and create the agenda as a group.&amp;nbsp; Doc is an excellent facilitator.&amp;nbsp; Ben opened the conference and then turned it over to Doc to explain how Open Spaces work.&amp;nbsp; Finally, the attendants proposed sessions for the weekend.&lt;/p&gt;
&lt;p&gt;Here is the Opening Circle video:&lt;/p&gt;
&lt;p&gt;&lt;object width="400" height="230"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=4111810&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=4111810&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="230"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/4111810"&gt;AltNetHouston: Opening Circle&lt;/a&gt; from &lt;a href="http://vimeo.com/user1385004"&gt;Weston M. Binford III&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can see other videos and session notes for most of the sessions on the &lt;a href="http://houstonaltnet.pbwiki.com/Houston-ALTDOTNET-Sessions"&gt;HoustonAltNet wiki&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/wbinford/~4/QR3eXWNrimQ" height="1" width="1"/&gt;</description><wfw:commentRss>http://trason.net/journal/rss-comments-entry-3622938.xml</wfw:commentRss></item><item><title>"The perfect is the enemy of the good"</title><category>blogging</category><category>cliche</category><dc:creator>Weston M. Binford III</dc:creator><pubDate>Sat, 11 Apr 2009 00:51:18 +0000</pubDate><link>http://trason.net/journal/2009/4/11/the-perfect-is-the-enemy-of-the-good.html</link><guid isPermaLink="false">342899:3630310:3614897</guid><description>&lt;p&gt;So, at the risk of joining the revolution after it is already over, I have decided to start blogging.&lt;/p&gt;
&lt;p&gt;This is something that I have planned to do for almost five years, but never started because I was afraid of starting and then not sticking to it, picking the wrong platform, or just not having enough to say.&amp;nbsp; However, the &lt;a href="http://houstonaltnet.pbwiki.com/Why-Blog-and-Open-Source%C2%A0"&gt;Why Blog and Open Source&lt;/a&gt; session at the &lt;a href="http://houston.altnetconf.com/home"&gt;ALT.NET Houston Open Spaces&lt;/a&gt; conference last weekend gave me the kick that I needed to get started.&lt;/p&gt;
&lt;p&gt;Instead of trying to get it perfect.&amp;nbsp; I'm just going to start.&amp;nbsp; Hopefully, there will be something here worth reading someday, but I know that I will never get it right if I don't start somewhere.&amp;nbsp; So here goes.&amp;nbsp; I take solace in the fact that nobody is probably reading.&amp;nbsp; If you are, please bear with me as I find my voice.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/wbinford/~4/tONxeRinNqY" height="1" width="1"/&gt;</description><wfw:commentRss>http://trason.net/journal/rss-comments-entry-3614897.xml</wfw:commentRss></item></channel></rss>
