<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/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Code Insanity</title>
        <link>http://codeinsanity.com/Default.aspx</link>
        <description>A developer's journey...</description>
        <language>en-US</language>
        <copyright>Ritesh Rao</copyright>
        <generator>Subtext Version 2.5.0.3</generator>
        <image>
            <title>Code Insanity</title>
            <url>http://codeinsanity.com/images/RSS2Image.gif</url>
            <link>http://codeinsanity.com/Default.aspx</link>
            <width>77</width>
            <height>60</height>
        </image>
        <item>
            <title>NCommon 1.1 Beta on github</title>
            <link>http://codeinsanity.com/archive/2010/05/02/ncommon-1-1-beta-on-github.aspx</link>
            <description>&lt;p&gt;Just a quick note… After testing NCommon 1.1 for a couple of weeks I’ve made a beta build available on github. You can download versions for .net 3.5 and 4.0 from &lt;a href="http://github.com/riteshrao/ncommon/downloads"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Over the next couple of weeks I’ll be shifting focus on providing comprehensive documentation and reference samples.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2419179728496073507-5300009131581034492?l=www.codeinsanity.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://codeinsanity.com/aggbug/3.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ritesh Rao</dc:creator>
            <guid>http://codeinsanity.com/archive/2010/05/02/ncommon-1-1-beta-on-github.aspx</guid>
            <pubDate>Mon, 03 May 2010 03:30:42 GMT</pubDate>
            <comments>http://codeinsanity.com/archive/2010/05/02/ncommon-1-1-beta-on-github.aspx#feedback</comments>
            <slash:comments>8</slash:comments>
            <wfw:commentRss>http://codeinsanity.com/comments/commentRss/3.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Unit Of Work implementation in NCommon 1.1</title>
            <link>http://codeinsanity.com/archive/2010/04/05/unit-of-work-implementation-in-ncommon-1-1.aspx</link>
            <description>&lt;p&gt;Dislcaimer: This post is going to be long. &lt;/p&gt;  &lt;p&gt;The unit of work implementation in 1.0 worked, and worked quite well. There was no real need to refactor it for 1.1, or any major issues with how it worked. But that being said, while adding multi-database support, more on this later, I started to realize some code smells in there. Coupled that with the kind of questions I’ve gotten on clarifications on what UnitOfWork is and why or when to use a UnitOfWorkScope, I went back and took a long and hard look at the current implementation. &lt;/p&gt;  &lt;p&gt;Lets start with the questions first…&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Q1: How do I start a UnitOfWork?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Okay this should be a simple question to answer, but it isn’t. The reason being there are TWO ways to start a unit of work in NCommon. You can manually start a unit of work by using the static Start method on the UnitOfWork class:&lt;/p&gt;  &lt;div style="font-family: monaco; background: #2e2e2e; color: #c4b560; font-size: 9pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 104&lt;/span&gt;&amp;#160;&lt;span style="color: #eaeaac"&gt;using&lt;/span&gt;(&lt;span style="color: #eaeaac"&gt;var&lt;/span&gt; &lt;span style="color: #d3d8ed"&gt;uow&lt;/span&gt; = &lt;span style="color: #c2e87d"&gt;UnitOfWork&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Start&lt;/span&gt;())&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 105&lt;/span&gt;&amp;#160;&lt;span style="color: #eaeaac"&gt;using&lt;/span&gt; (&lt;span style="color: #eaeaac"&gt;var&lt;/span&gt; &lt;span style="color: #d3d8ed"&gt;uowTx&lt;/span&gt; = &lt;span style="color: #d3d8ed"&gt;uow&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;BeginTransaction&lt;/span&gt;())&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 106&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 107&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 108&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #81cf7e"&gt;//do something here&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 109&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;uow&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Flush&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 110&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;uowTx&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Commit&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 111&lt;/span&gt; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;So the Start method would return an implementation of IUnitOfWork instance, which you could then use to start a transaction and do the usual commit / rollback on. The second is to use the UnitOfWorkScope class:&lt;/p&gt;  &lt;div style="font-family: monaco; background: #2e2e2e; color: #c4b560; font-size: 9pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 104&lt;/span&gt;&amp;#160;&lt;span style="color: #eaeaac"&gt;using&lt;/span&gt; (&lt;span style="color: #eaeaac"&gt;var&lt;/span&gt; &lt;span style="color: #d3d8ed"&gt;scope&lt;/span&gt; = &lt;span style="color: #eaeaac"&gt;new&lt;/span&gt; &lt;span style="color: #c2e87d"&gt;UnitOfWorkScope&lt;/span&gt;())&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 105&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 106&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #81cf7e"&gt;//Do something here...&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 107&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;scope&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Commit&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 108&lt;/span&gt; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;So the next question that would always follow is…&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Q2: So whats a UnitOfWorkScope? How is it different from a UnitOfWork?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The raison d'etre of UnitOfWorkScope is to allow sharing of a single IUnitOfWork, and by extension the underlying ORM context (DataContext, ObjectContext, ISession, etc.) between different components and not have to pass around IUnitOfWork instances. &lt;/p&gt;  &lt;p&gt;The UnitOfWorkScope works along the same lines as a TransactionalScope. When you create a UnitOfWorkScope instance, if a compatible ambient UnitOfWorkScope instance already exists, it participates as a child of the ambient scope’s transaction. &lt;/p&gt;  &lt;p&gt;While technically you could achieve atomic transactions by wrapping all unit of work operations around a TransactionalScope, but sharing the same underlying IUnitOfWork context between different components would require you to pass around the IUnitOfWork instances. Naturally, the next question that arises is, why would I want to share IUnitOfWork contexts? Wouldn’t it be easier to let each component start UnitOfWork instances and do their operations, and then once everything is done complete the scope? &lt;/p&gt;  &lt;p&gt;Consider the following example:&lt;/p&gt;  &lt;div style="font-family: monaco; background: #2e2e2e; color: #c4b560; font-size: 9pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 103&lt;/span&gt;&amp;#160;&lt;span style="color: #eaeaac"&gt;public&lt;/span&gt; &lt;span style="color: #eaeaac"&gt;class&lt;/span&gt; &lt;span style="color: #c4c4c4"&gt;OrdersService&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 104&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 105&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eaeaac"&gt;private&lt;/span&gt; &lt;span style="color: #c2e87d"&gt;IRepository&lt;/span&gt;&amp;lt;&lt;span style="color: #c2e87d"&gt;Order&lt;/span&gt;&amp;gt; &lt;span style="color: #d3d8ed"&gt;_ordersRepository&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 106&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eaeaac"&gt;private&lt;/span&gt; &lt;span style="color: #c2e87d"&gt;InventoryService&lt;/span&gt; &lt;span style="color: #d3d8ed"&gt;_inventoryService&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 107&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 108&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eaeaac"&gt;public&lt;/span&gt; &lt;span style="color: #eaeaac"&gt;void&lt;/span&gt; &lt;span style="color: #c4c4c4"&gt;CreateOrder&lt;/span&gt;(&lt;span style="color: #c2e87d"&gt;ShoppingCart&lt;/span&gt; &lt;span style="color: #c4c4c4"&gt;cart&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 109&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 110&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eaeaac"&gt;using&lt;/span&gt; (&lt;span style="color: #eaeaac"&gt;var&lt;/span&gt; &lt;span style="color: #c4c4c4"&gt;scope&lt;/span&gt; = &lt;span style="color: #eaeaac"&gt;new&lt;/span&gt; &lt;span style="color: #c2e87d"&gt;TransactionScope&lt;/span&gt;())&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 111&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eaeaac"&gt;using&lt;/span&gt; (&lt;span style="color: #eaeaac"&gt;var&lt;/span&gt; &lt;span style="color: #d3d8ed"&gt;uow&lt;/span&gt; = &lt;span style="color: #c2e87d"&gt;UnitOfWork&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Start&lt;/span&gt;())&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 112&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 113&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eaeaac"&gt;var&lt;/span&gt; &lt;span style="color: #d3d8ed"&gt;order&lt;/span&gt; = &lt;span style="color: #eaeaac"&gt;new&lt;/span&gt; &lt;span style="color: #c2e87d"&gt;Order&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 114&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #81cf7e"&gt;//Code to create an order from the shopping cart&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 115&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;_ordersRepository&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Save&lt;/span&gt;(&lt;span style="color: #d3d8ed"&gt;order&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 116&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;_inventoryService&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;ReserveItems&lt;/span&gt;(&lt;span style="color: #d3d8ed"&gt;order&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 117&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;uow&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;TransactionalFlush&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 118&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 119&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 120&lt;/span&gt; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 121&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 122&lt;/span&gt;&amp;#160;&lt;span style="color: #eaeaac"&gt;public&lt;/span&gt; &lt;span style="color: #eaeaac"&gt;class&lt;/span&gt; &lt;span style="color: #c2e87d"&gt;InventoryService&lt;/span&gt; : &lt;span style="color: #c2e87d"&gt;IInventoryService&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 123&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 124&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eaeaac"&gt;private&lt;/span&gt; &lt;span style="color: #c2e87d"&gt;IRepository&lt;/span&gt;&amp;lt;&lt;span style="color: #c2e87d"&gt;OrderReservation&lt;/span&gt;&amp;gt; &lt;span style="color: #d3d8ed"&gt;_reservationRepository&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 125&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 126&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eaeaac"&gt;public&lt;/span&gt; &lt;span style="color: #eaeaac"&gt;void&lt;/span&gt; &lt;span style="color: #d3d8ed"&gt;ReserveItems&lt;/span&gt;(&lt;span style="color: #c2e87d"&gt;Order&lt;/span&gt; &lt;span style="color: #d3d8ed"&gt;order&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 127&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 128&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eaeaac"&gt;using&lt;/span&gt; (&lt;span style="color: #eaeaac"&gt;var&lt;/span&gt; &lt;span style="color: #d3d8ed"&gt;uow&lt;/span&gt; = &lt;span style="color: #c2e87d"&gt;UnitOfWork&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Start&lt;/span&gt;())&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 129&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 130&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #81cf7e"&gt;//Reserve stock from order items... OrderReservationEntry has an association to Order&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 131&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eaeaac"&gt;var&lt;/span&gt; &lt;span style="color: #d3d8ed"&gt;reservationEntry&lt;/span&gt; = &lt;span style="color: #eaeaac"&gt;new&lt;/span&gt; &lt;span style="color: #c2e87d"&gt;OrderReservation&lt;/span&gt;(&lt;span style="color: #d3d8ed"&gt;order&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 132&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;_reservationRepository&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Save&lt;/span&gt;(&lt;span style="color: #d3d8ed"&gt;reservationEntry&lt;/span&gt;); &lt;span style="color: #81cf7e"&gt;//THIS WILL THROW AN EXCEPTION.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 133&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;uow&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;TransactionalFlush&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 134&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 135&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 136&lt;/span&gt; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 137&lt;/span&gt;&amp;#160;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;The example above, the OrdersService basically creates an order, adds it to it’s order repository and then asks the InventoryService to reserve stock for the order. The InventoryService creates an reservation entry which has an association to an Order instance, which is then saved to an OrderReservation repository.&lt;/p&gt;  &lt;p&gt;When adding the reservation entry to the repository, an exception will be thrown. Why? Because the reservation service creates an new instance of IUnitOfWork by calling UnitOfWork.Start(), which internally creates an new context (ObjectContext / DataContext / ISession / whatever…) and the moment the OrderReservation instance is saved, the underlying context is going to puke an exception that the Order instance is already part of another context.&lt;/p&gt;  &lt;p&gt;So while using a TransactionScope does give transacitonal atomicity, it doesn’t solve the problem of being able to share the same UnitOfWork instance across multiple components.&lt;/p&gt;  &lt;h3&gt;Getting rid of confusion. One class to rule them all&lt;/h3&gt;  &lt;p&gt;So while working on 1.1, I decided to nuke UnitOfWork. There’s no reason why there should be two ways to start a unit of work, and UnitOfWorkScope is a simple API to do so. This means that if you are manually starting and flushing unit of works using UnitOfWork.Start(), when moving to 1.1 there will be a lot of broken code. &lt;strong&gt;This is a breaking change!.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This decision was not made lightly though. Deciding on introducing a breaking change is a tough one, and I believe at this stage it is required to reduce the confusion around the unit of work implementation in NCommon.&lt;/p&gt;  &lt;h3&gt;Multi database support&lt;/h3&gt;  &lt;p&gt;By far the number one request has been to add multi-db support in NCommon. Now technically there was a way you “could” simulate multi database support in 1.0. In 1.0, all IUnitOfWorkFactory implementations define a registration method that would take in a Func&amp;lt;T&amp;gt; to resolve instances of ISessionFactory (for NH) or ObjectContext (for EF) or DataContext (for L2S), and you could add some context specific code in the Func&amp;lt;T&amp;gt; implementation to return different instances based on context. A simple example below:&lt;/p&gt;  &lt;div style="font-family: monaco; background: #2e2e2e; color: #c4b560; font-size: 9pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 53&lt;/span&gt;&amp;#160;&lt;span style="color: #c2e87d"&gt;NHUnitOfWorkFactory&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;SetSessionProvider&lt;/span&gt;(() =&amp;gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 54&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 55&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eaeaac"&gt;if&lt;/span&gt; (&lt;span style="color: #c2e87d"&gt;DatabaseContext&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Current&lt;/span&gt; == &lt;span style="color: #c89191"&gt;&amp;quot;OrdersDatabase&amp;quot;&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 56&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eaeaac"&gt;return&lt;/span&gt; &lt;span style="color: #d3d8ed"&gt;Storage&lt;/span&gt;.&lt;span style="color: #c2e87d"&gt;AppStorage&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Application&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Get&lt;/span&gt;&amp;lt;&lt;span style="color: #c2e87d"&gt;ISessionFactory&lt;/span&gt;&amp;gt;(&lt;span style="color: #c89191"&gt;&amp;quot;ordersDB&amp;quot;&lt;/span&gt;).&lt;span style="color: #d3d8ed"&gt;OpenSession&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 57&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eaeaac"&gt;return&lt;/span&gt; &lt;span style="color: #d3d8ed"&gt;Storage&lt;/span&gt;.&lt;span style="color: #c2e87d"&gt;AppStorage&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Application&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Get&lt;/span&gt;&amp;lt;&lt;span style="color: #c2e87d"&gt;ISessionFactory&lt;/span&gt;&amp;gt;(&lt;span style="color: #c89191"&gt;&amp;quot;inventioryDB&amp;quot;&lt;/span&gt;).&lt;span style="color: #d3d8ed"&gt;OpenSession&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 58&lt;/span&gt; });&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;While this approach would work, it’s not ideal. One the features I wanted to have in NCommon is have the underlying database context be automatically resolved without having to specify which database the code is accessing. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Configuring NCommon for multiple database support:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;In 1.1, the new configuration class is used to configure the data providers for NCommon. The static SetXXX static methods are not exposed by IUnitOfWorkFactory implementations anymore. Instead you use the ConfigureData method exposed by the Configure class in NCommon:&lt;/p&gt;  &lt;div style="font-family: monaco; background: #2e2e2e; color: #c4b560; font-size: 9pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 63&lt;/span&gt;&amp;#160;&lt;span style="color: #c4c4c4"&gt;NCommon.&lt;/span&gt;&lt;span style="color: #c2e87d"&gt;Configure&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Using&lt;/span&gt;(&lt;span style="color: #d3d8ed"&gt;container&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 64&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .&lt;span style="color: #d3d8ed"&gt;ConfigureData&lt;/span&gt;&amp;lt;&lt;span style="color: #c2e87d"&gt;NHConfiguration&lt;/span&gt;&amp;gt;();&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;The above example uses NHConfiguration to configure the NHibernate data provider for NCommon. Similar configurations for Linq2Sql and EntityFramework exists. The configuration classes provided by each provider expose a single method that allows registering a Func&amp;lt;T&amp;gt; to resolve instances of ISession / DataContext / ObjectContext.&lt;/p&gt;  &lt;div style="font-family: monaco; background: #2e2e2e; color: #c4b560; font-size: 9pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 393&lt;/span&gt;&amp;#160;&lt;span style="color: #c4c4c4"&gt;NCommon.&lt;/span&gt;&lt;span style="color: #c2e87d"&gt;Configure&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Using&lt;/span&gt;(&lt;span style="color: #d3d8ed"&gt;container&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 394&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .&lt;span style="color: #d3d8ed"&gt;ConfigureData&lt;/span&gt;&amp;lt;&lt;span style="color: #c2e87d"&gt;NHConfiguration&lt;/span&gt;&amp;gt;(&lt;span style="color: #d3d8ed"&gt;x&lt;/span&gt; =&amp;gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 395&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;x&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;WithSessionFactory&lt;/span&gt;(() =&amp;gt; &lt;span style="color: #d3d8ed"&gt;OrdersDomainFactory&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 396&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; );&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;You can then register multiple factories / contexts for multiple databases like so:&lt;/p&gt;  &lt;div style="font-family: monaco; background: #2e2e2e; color: #c4b560; font-size: 9pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 393&lt;/span&gt;&amp;#160;&lt;span style="color: #c4c4c4"&gt;NCommon.&lt;/span&gt;&lt;span style="color: #c2e87d"&gt;Configure&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Using&lt;/span&gt;(&lt;span style="color: #d3d8ed"&gt;container&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 394&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .&lt;span style="color: #d3d8ed"&gt;ConfigureData&lt;/span&gt;&amp;lt;&lt;span style="color: #c2e87d"&gt;NHConfiguration&lt;/span&gt;&amp;gt;(&lt;span style="color: #d3d8ed"&gt;x&lt;/span&gt; =&amp;gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 395&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;x&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;WithSessionFactory&lt;/span&gt;(() =&amp;gt; &lt;span style="color: #d3d8ed"&gt;OrdersDomainFactory&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 396&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .&lt;span style="color: #d3d8ed"&gt;WithSessionFactory&lt;/span&gt;(() =&amp;gt; &lt;span style="color: #d3d8ed"&gt;HRDomainFactory&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 397&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; );&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;strong&gt;Querying multiple databases:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Once you’ve registered the factories / contexts querying multiple databases is super simple, a concept inspired by NHibernate Burrow.&lt;/p&gt;  &lt;div style="font-family: monaco; background: #2e2e2e; color: #c4b560; font-size: 9pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 343&lt;/span&gt;&amp;#160;&lt;span style="color: #eaeaac"&gt;using&lt;/span&gt; (&lt;span style="color: #eaeaac"&gt;var&lt;/span&gt; &lt;span style="color: #d3d8ed"&gt;scope&lt;/span&gt; = &lt;span style="color: #eaeaac"&gt;new&lt;/span&gt; &lt;span style="color: #c2e87d"&gt;UnitOfWorkScope&lt;/span&gt;())&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 344&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 345&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eaeaac"&gt;var&lt;/span&gt; &lt;span style="color: #d3d8ed"&gt;savedCustomer&lt;/span&gt; = &lt;span style="color: #eaeaac"&gt;new&lt;/span&gt; &lt;span style="color: #c2e87d"&gt;NHRepository&lt;/span&gt;&amp;lt;&lt;span style="color: #c2e87d"&gt;Customer&lt;/span&gt;&amp;gt;()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 346&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .&lt;span style="color: #d3d8ed"&gt;Where&lt;/span&gt;(&lt;span style="color: #d3d8ed"&gt;x&lt;/span&gt; =&amp;gt; &lt;span style="color: #d3d8ed"&gt;x&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;CustomerID&lt;/span&gt; == &lt;span style="color: #d3d8ed"&gt;customer&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;CustomerID&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 347&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .&lt;span style="color: #d3d8ed"&gt;First&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 348&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 349&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eaeaac"&gt;var&lt;/span&gt; &lt;span style="color: #d3d8ed"&gt;savedPerson&lt;/span&gt; = &lt;span style="color: #eaeaac"&gt;new&lt;/span&gt; &lt;span style="color: #c2e87d"&gt;NHRepository&lt;/span&gt;&amp;lt;&lt;span style="color: #c2e87d"&gt;SalesPerson&lt;/span&gt;&amp;gt;()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 350&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .&lt;span style="color: #d3d8ed"&gt;Where&lt;/span&gt;(&lt;span style="color: #d3d8ed"&gt;x&lt;/span&gt; =&amp;gt; &lt;span style="color: #d3d8ed"&gt;x&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Id&lt;/span&gt; == &lt;span style="color: #d3d8ed"&gt;salesPerson&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Id&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 351&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .&lt;span style="color: #d3d8ed"&gt;First&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 352&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 353&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #c2e87d"&gt;Assert&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;That&lt;/span&gt;(&lt;span style="color: #d3d8ed"&gt;savedCustomer&lt;/span&gt;, &lt;span style="color: #c2e87d"&gt;Is&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Not&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Null&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 354&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #c2e87d"&gt;Assert&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;That&lt;/span&gt;(&lt;span style="color: #d3d8ed"&gt;savedPerson&lt;/span&gt;, &lt;span style="color: #c2e87d"&gt;Is&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Not&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Null&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 355&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;scope&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Commit&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 356&lt;/span&gt; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;In the above example, Customer is part of the orders database, while SalesPerson is part of the HR database. The UnitOfWorkScope will automatically resolve the appropriate context that the repository should use. This will work for all three providers; NHibernate, EntityFramework and Linq2Sql.&lt;/p&gt;  &lt;h3&gt;Transaction Management in 1.1&lt;/h3&gt;  &lt;p&gt;In 1.0, the UnitOfWorkScope would create instances of IUnitOfWOrk behind the scenes and then call BeginTransaction and CommitTrasaction, or RollbackTransaction, on the instance directly. In the case of multiple databases, an instance of IUnitOfWork instance is created for each context and BeginTransaction and CommitTransaction/RollbackTransaction is called on each instance during the lifecycle of the UnitOfWorkScope instance.&lt;/p&gt;  &lt;p&gt;This is what I would call manual transaction management.&lt;/p&gt;  &lt;p&gt;In 1.1 manual transaction management is completely removed. In fact if you take a look at the IUnitOfWork interface now, there will be just one method:&lt;/p&gt;  &lt;div style="font-family: monaco; background: #2e2e2e; color: #c4b560; font-size: 9pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 27&lt;/span&gt;&amp;#160;&lt;span style="color: #eaeaac"&gt;public&lt;/span&gt; &lt;span style="color: #eaeaac"&gt;interface&lt;/span&gt; &lt;span style="color: #c2e87d"&gt;IUnitOfWork&lt;/span&gt; : &lt;span style="color: #c2e87d"&gt;IDisposable&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 28&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 29&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: #7a987a"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 30&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: #7a987a"&gt; Flushes the changes made in the unit of work to the data store.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 31&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: #7a987a"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 32&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eaeaac"&gt;void&lt;/span&gt; &lt;span style="color: #d3d8ed"&gt;Flush&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 33&lt;/span&gt; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;The reason of removing transactional management from IUnitOfWork is because there already exists a simple way of managing transactions in .Net, the TransactionScope. Using TransactionScope has been a hard decision actually, since it has the tendency to promote the transaction to a DTC transaction, and even though I loath the DTC, there’s no way around it.&lt;/p&gt;  &lt;p&gt;The primary reason is when using multiple databases in a UnitOfWorkScope, when using manual transaction management it doesn’t 100% ensure atomicity. Consider the scenario where, while comitting, the CommitTransaction is called on the first IUnitOfWork instance, which succeeds, and while calling Commit on the second IUnitOfWork instance something bad happens. There’s no way to rollback the first transaction as the underlying IDbTransaction has already comitted.&lt;/p&gt;  &lt;p&gt;So the solution would have to be to wrap the entire operation inside a TransactionScope instance. Instead of having an implicit expectation that a TransactionScope is wrapping the entire UnitOfWorkScope operation, the UnitOfWorkScope does the right thing and creates a TransactionScope internally and delegates transaction management to it.&lt;/p&gt;  &lt;p&gt;That being said, if an ambient transaction already exists, and it is compatible with the IsolationLevel of the UnitOfWorkScope, the TransactionScope instance it creates will participate in the ambient transaction.&lt;/p&gt;  &lt;p&gt;While using TransactionScope simplifies transaction management in NCommon, one thing you should be aware of is that transactions could be enlisted in DTC in certain scnearios. If you using NCommon with a single database, the transaction is enlisted with the LTM and it’s never promoted, unless an existing promoted ambient transaction has already started. If you are using multiple databases, chances are the transaction will be promoted to DTC. &lt;/p&gt;  &lt;h3&gt;Isolation levels and AutoCompleteScope in 1.1&lt;/h3&gt;  &lt;p&gt;NCommon 1.0 had constructor overloads for UnitOfWorkScope that would allow you to specify the isolation level that the scope should use. Now, I don’t know about anyone else, but I have never seen an application that uses different isolation levels at different places. So the in 1.1, these overloads are gone. &lt;/p&gt;  &lt;p&gt;Additionally, you could provide a UnitOfWorkScopeOptions enumeration to specify if UnitOfWorkScope instances should auto complete while disposing, allowing you to skip having to write the statement scope.Complete everywhere. This again is a global wide configuration in my opinion. &lt;/p&gt;  &lt;p&gt;To configure these global settings for UnitOfWorkScope instances, you can use the ConfigureUnitOfWork method exposes by the Configure class:&lt;/p&gt;  &lt;div style="font-family: monaco; background: #2e2e2e; color: #c4b560; font-size: 9pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 394&lt;/span&gt;&amp;#160;&lt;span style="color: #c4c4c4"&gt;NCommon.&lt;/span&gt;&lt;span style="color: #c2e87d"&gt;Configure&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Using&lt;/span&gt;(&lt;span style="color: #d3d8ed"&gt;container&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 395&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .&lt;span style="color: #d3d8ed"&gt;ConfigureData&lt;/span&gt;&amp;lt;&lt;span style="color: #c2e87d"&gt;NHConfiguration&lt;/span&gt;&amp;gt;(&lt;span style="color: #d3d8ed"&gt;x&lt;/span&gt; =&amp;gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 396&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;x&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;WithSessionFactory&lt;/span&gt;(() =&amp;gt; &lt;span style="color: #d3d8ed"&gt;OrdersDomainFactory&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 397&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .&lt;span style="color: #d3d8ed"&gt;WithSessionFactory&lt;/span&gt;(() =&amp;gt; &lt;span style="color: #d3d8ed"&gt;HRDomainFactory&lt;/span&gt;))&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 398&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .&lt;span style="color: #d3d8ed"&gt;ConfigureUnitOfWork&lt;/span&gt;&amp;lt;&lt;span style="color: #c2e87d"&gt;DefaultUnitOfWorkConfiguration&lt;/span&gt;&amp;gt;(&lt;span style="color: #d3d8ed"&gt;x&lt;/span&gt; =&amp;gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 399&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;x&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;WithDefaultIsolation&lt;/span&gt;(&lt;span style="color: #c2e87d"&gt;IsolationLevel&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;ReadCommitted&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 400&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .&lt;span style="color: #d3d8ed"&gt;AutoCompleteScope&lt;/span&gt;()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160; 401&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; );&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;In the code snippet above, the default isolation level is set to ReadComitted and scopes are set to auto complete.&lt;/p&gt;  &lt;p&gt;The only overload now exposed by the UnitOfWorkScope class is the option to not enlist the UnitOfWorkScope instance in an existing ambient transaction/unit of work and to start a new transaction/unit of work.&lt;/p&gt;  &lt;h3&gt;Final thoughts&lt;/h3&gt;  &lt;p&gt;The above changes should reduce some of the complexity around setting up and using NCommon. Check out these changes in the &lt;a href="http://github.com/riteshrao/ncommon/tree/v1.1"&gt;1.1 branch&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2419179728496073507-3943029965848713261?l=www.codeinsanity.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://codeinsanity.com/aggbug/4.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ritesh Rao</dc:creator>
            <guid>http://codeinsanity.com/archive/2010/04/05/unit-of-work-implementation-in-ncommon-1-1.aspx</guid>
            <pubDate>Tue, 06 Apr 2010 00:30:00 GMT</pubDate>
            <comments>http://codeinsanity.com/archive/2010/04/05/unit-of-work-implementation-in-ncommon-1-1.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://codeinsanity.com/comments/commentRss/4.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Refactoring Storage in NCommon 1.1</title>
            <link>http://codeinsanity.com/archive/2010/04/05/refactoring-storage-in-ncommon-1-1.aspx</link>
            <description>&lt;p&gt;After having used NCommon in a couple of production projects, the one area that I have disliked is the Storage class. The problem with the static Storage factory has been that if a component relies on one of the Storage classes, it becomes a little bit of a pain to write unit tests for such components. Such unit tests would have to know way too much about which storage implementation the component uses and how it uses it. Session storage was a bigger pain, there’s no ideal way to replace a Session storage implementation that relies on an actual HttpSession while testing.&lt;/p&gt;  &lt;p&gt;Eventually what I’d end up with is having wrappers around Storage that would be injected into components via the container. After having to write such plumbing code for the nth time, I figured it’s time for a change.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;What’s in a name: Storage or State&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The first round of refactoring was to get rid of the Storage naming pattern. While working on above said projects with other team members, I was asked countless number of times “So where does Storage &lt;strong&gt;store&lt;/strong&gt; the data?” or “Do I need a database for Storage to work?”. And that would ensure the slow painful process of explaining that Storage is not “&lt;strong&gt;really” &lt;/strong&gt;a persistent store, rather provides an way to maintain different &lt;strong&gt;states&lt;/strong&gt; of an application. State is the keyword here, and instantly light bulbs would light and questions were answered. &lt;/p&gt;  &lt;p&gt;Semantically, the name State is a better representation of what the original Storage class did in NCommon anyways. It provided a way to get access to an application’s state, or a sessions state or thread local state. So in 1.1 the root container of state is now called, wait for it… &lt;strong&gt;IState&lt;/strong&gt;&lt;/p&gt;  &lt;div style="font-family: monaco; background: #2e2e2e; color: #c4b560; font-size: 9pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 19&lt;/span&gt;&amp;#160;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: #7a987a"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 20&lt;/span&gt;&amp;#160;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: #7a987a"&gt; Base IState interface.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 21&lt;/span&gt;&amp;#160;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: #7a987a"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 22&lt;/span&gt;&amp;#160;&lt;span style="color: #eaeaac"&gt;public&lt;/span&gt; &lt;span style="color: #eaeaac"&gt;interface&lt;/span&gt; &lt;span style="color: #c2e87d"&gt;IState&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 23&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 24&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: #7a987a"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 25&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: #7a987a"&gt; Gets the application specific state.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 26&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: #7a987a"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 27&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;IApplicationState&lt;/span&gt; &lt;span style="color: #d3d8ed"&gt;Application&lt;/span&gt; { &lt;span style="color: #eaeaac"&gt;get&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 28&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: #7a987a"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 29&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: #7a987a"&gt; Gets the session specific state.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 30&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: #7a987a"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 31&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;ISessionState&lt;/span&gt; &lt;span style="color: #d3d8ed"&gt;Session&lt;/span&gt; { &lt;span style="color: #eaeaac"&gt;get&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 32&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: #7a987a"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 33&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: #7a987a"&gt; Gets the cache specific state.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 34&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: #7a987a"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 35&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;ICacheState&lt;/span&gt; &lt;span style="color: #d3d8ed"&gt;Cache&lt;/span&gt; { &lt;span style="color: #eaeaac"&gt;get&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 36&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: #7a987a"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 37&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: #7a987a"&gt; Gets the thread local / request local specific state.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 38&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: #7a987a"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 39&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;ILocalState&lt;/span&gt; &lt;span style="color: #d3d8ed"&gt;Local&lt;/span&gt; { &lt;span style="color: #eaeaac"&gt;get&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 40&lt;/span&gt; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;IState pretty much exposes the same set of state implementations as the original Storage class; Application, Session, Local and one additional Cache. Now components can have implementations of IState injected via the container, and tests become cleaner because we can easily create subs/mocks of IState.&lt;/p&gt;  &lt;p&gt;Each of the different state interfaces expose the same set of methods; Get, Put and Remove. ICacheState exposes additional overloads to Put to allow specifying expiration policies for cache entries.&lt;/p&gt;  &lt;p&gt;The default implementation of IApplicationState and ICacheState are quite straightforward. DefaultApplicationState uses the current AppDomain, same as before, while the DefaultCacheState uses the Http runtime cache.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Session State, Local State, WCF and ASP.Net&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Originally, NCommon Storage classes did not support WCF at all. Admittedly, I try to stay far away from WCF (topic for another time), so I had completely ignored the fact that there’d be users who would want to use NCommon in WCF services.&lt;/p&gt;  &lt;p&gt;1.1 now provides native support for both WCF and ASP.Net. It goes one step further, if the current host is a WCF host and has AspNetCompatabilityRequirements behavior is applied on the current service, and if it the requirement is set to Allowed or Required, then it will automatically switch from using WCF OperationContext / InstanceContext to HttpContext and HttpSession (that is if the ASP.Net pipeline is present).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Configuring state in NCommon:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;State in NCommon is pluggable, and that is intentional. I wanted to be able to replace state implementations based on project scenarios, one common one being replacing the default implementation of ICacheState that uses the http runtime cache to use memcached. &lt;/p&gt;  &lt;p&gt;You can use the new configuration fluent interface in NCommon, introduced in this post, by using the ConfigureState method exposed by the static Configure class in NCommon. The ConfigureState method expects a type that implements IStateConfiguration which exposes one single method Configure. A default implementation of IStateConfiguration, DefaultStateConfiguration, is provided. This class exposes four methods that you can use to override the default state implementations that NCommon should use:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;UseCustomCacheOf&amp;lt;T&amp;gt;()&lt;/p&gt;    &lt;p&gt;UseCustomSessionStateOf&amp;lt;T&amp;gt;()&lt;/p&gt;    &lt;p&gt;UseCustomLocalStateOf&amp;lt;T&amp;gt;()&lt;/p&gt;    &lt;p&gt;UseCustomApplicationStateOf&amp;lt;T&amp;gt;()&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Below is an example where the a custom Memcached cache state provider should be used by NCommon for cache state, rather than the default implemenation:&lt;/p&gt;  &lt;div style="font-family: monaco; background: #2e2e2e; color: #c4b560; font-size: 9pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 19&lt;/span&gt;&amp;#160;&lt;span style="color: #eaeaac"&gt;var&lt;/span&gt; &lt;span style="color: #d3d8ed"&gt;container&lt;/span&gt; = &lt;span style="color: #eaeaac"&gt;new&lt;/span&gt; &lt;span style="color: #c2e87d"&gt;WindsorContainer&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 20&lt;/span&gt;&amp;#160;&lt;span style="color: #eaeaac"&gt;var&lt;/span&gt; &lt;span style="color: #d3d8ed"&gt;containerAdapter&lt;/span&gt; = &lt;span style="color: #eaeaac"&gt;new&lt;/span&gt; &lt;span style="color: #c2e87d"&gt;WindsorContainerAdapter&lt;/span&gt;(&lt;span style="color: #d3d8ed"&gt;container&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 21&lt;/span&gt;&amp;#160;&lt;span style="color: #d3d8ed"&gt;NCommon&lt;/span&gt;.&lt;span style="color: #c2e87d"&gt;Configure&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Using&lt;/span&gt;(&lt;span style="color: #d3d8ed"&gt;containerAdapter&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 22&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .&lt;span style="color: #d3d8ed"&gt;ConfigureState&lt;/span&gt;&amp;lt;&lt;span style="color: #c2e87d"&gt;DefaultStateConfiguration&lt;/span&gt;&amp;gt;(&lt;span style="color: #d3d8ed"&gt;stateConfig&lt;/span&gt; =&amp;gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 23&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;stateConfig&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;UseCustomApplicationStateOf&lt;/span&gt;&amp;lt;&lt;span style="color: #c2e87d"&gt;ICustomAppState&lt;/span&gt;&amp;gt;()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 24&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .&lt;span style="color: #d3d8ed"&gt;UseCustomCacheOf&lt;/span&gt;&amp;lt;&lt;span style="color: #c2e87d"&gt;MemCachedState&lt;/span&gt;&amp;gt;());&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 25&lt;/span&gt;&amp;#160;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Breaking changes:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;In the 1.1 branch you won’t find the old Storage class anymore. This has been completely removed for now. So you might find that code that referenced Storage no longer compiles. I will add an implementation of Storage that used the new IState classes back, just for backwards compatibility, but I would strong suggest restructuring your components from using the static methods on Storage to have IState implementations injected via the container.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2419179728496073507-261536278564954173?l=www.codeinsanity.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://codeinsanity.com/aggbug/5.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ritesh Rao</dc:creator>
            <guid>http://codeinsanity.com/archive/2010/04/05/refactoring-storage-in-ncommon-1-1.aspx</guid>
            <pubDate>Mon, 05 Apr 2010 22:15:00 GMT</pubDate>
            <comments>http://codeinsanity.com/archive/2010/04/05/refactoring-storage-in-ncommon-1-1.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://codeinsanity.com/comments/commentRss/5.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Getting back on the horse</title>
            <link>http://codeinsanity.com/archive/2010/04/05/getting-back-on-the-horse.aspx</link>
            <description>&lt;p&gt;Well it’s been almost a year since my last post, and I guess it’s about time I get back to blogging. I had intended to take a short vacation, which ended up being a long hiatus. I wont go into reasons why, but lets just say I was dealing with some tough personal issues.&lt;/p&gt;  &lt;p&gt;Now that a sense of normalcy is back, it’s time to get back into it.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Updates on NCommon&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;First thing first, NCommon source has moved from Google code to Github. Although a mirror source of NCommon has been available on Github for a while, I’m officially moving the source to Github. There won’t be any more updates to the SVN repository in Google Code.&lt;/p&gt;  &lt;p&gt;You can check out the Github repository &lt;a href="http://github.com/riteshrao/ncommon"&gt;here&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Over the last couple of weeks I’ve been working on addressing some of the issues with NCommon and have been adding some much needed features. These changes are being made to the &lt;a href="http://github.com/riteshrao/ncommon/tree/v1.1"&gt;1.1 branch&lt;/a&gt;. I’ll go into some of the new features in upcoming posts. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2419179728496073507-2914572058183543182?l=www.codeinsanity.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://codeinsanity.com/aggbug/6.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ritesh Rao</dc:creator>
            <guid>http://codeinsanity.com/archive/2010/04/05/getting-back-on-the-horse.aspx</guid>
            <pubDate>Mon, 05 Apr 2010 05:31:00 GMT</pubDate>
            <comments>http://codeinsanity.com/archive/2010/04/05/getting-back-on-the-horse.aspx#feedback</comments>
            <slash:comments>48</slash:comments>
            <wfw:commentRss>http://codeinsanity.com/comments/commentRss/6.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Configuring NCommon in 1.1</title>
            <category>NCommon</category>
            <link>http://codeinsanity.com/archive/2010/04/05/configuring-ncommon-in-1-1.aspx</link>
            <description>&lt;p&gt;One of the changes I made to NCommon in 1.1 was to provide an easy way to configure NCommon’s various services. The approach taken was inspired by &lt;a href="http://code.google.com/p/masstransit/"&gt;MassTransit&lt;/a&gt;’s and &lt;a href="http://caliburn.codeplex.com/Wikipage"&gt;Caliburn&lt;/a&gt;’s configuration API.&lt;/p&gt;  &lt;p&gt;To configure NCommon you can use the static &lt;strong&gt;Configure&lt;/strong&gt; class:&lt;/p&gt;  &lt;div style="font-family: monaco; background: #2e2e2e; color: #c4b560; font-size: 9pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: #7a987a"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160;&amp;#160; 2&lt;/span&gt;&amp;#160;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: #7a987a"&gt; Static configuration class that allows configuration of NCommon services.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160;&amp;#160; 3&lt;/span&gt;&amp;#160;&lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: #7a987a"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160;&amp;#160; 4&lt;/span&gt;&amp;#160;&lt;span style="color: #eaeaac"&gt;public&lt;/span&gt; &lt;span style="color: #eaeaac"&gt;static&lt;/span&gt; &lt;span style="color: #eaeaac"&gt;class&lt;/span&gt; &lt;span style="color: #c2e87d"&gt;Configure&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160;&amp;#160; 5&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160;&amp;#160; 6&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: #7a987a"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160;&amp;#160; 7&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: #7a987a"&gt; Entry point to NCommon configuration.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160;&amp;#160; 8&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: #7a987a"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160;&amp;#160; 9&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: #7a987a"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;param name=&amp;quot;containerAdapter&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color: #7a987a"&gt;The &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;see cref=&amp;quot;IContainerAdapter&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span style="color: #7a987a"&gt; instance to use&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 10&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: #7a987a"&gt; for component registration.&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 11&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: #7a987a"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: #7a987a"&gt;An instance of &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;see cref=&amp;quot;INCommonConfig&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span style="color: #7a987a"&gt; that can be used to configure&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 12&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: #7a987a"&gt; NCommon configuration.&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #7a987a"&gt; &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 13&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eaeaac"&gt;public&lt;/span&gt; &lt;span style="color: #eaeaac"&gt;static&lt;/span&gt; &lt;span style="color: #c2e87d"&gt;INCommonConfig&lt;/span&gt; &lt;span style="color: #d3d8ed"&gt;Using&lt;/span&gt;(&lt;span style="color: #c2e87d"&gt;IContainerAdapter&lt;/span&gt; &lt;span style="color: #d3d8ed"&gt;containerAdapter&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 14&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 15&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #c2e87d"&gt;Guard&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Against&lt;/span&gt;&amp;lt;&lt;span style="color: #c2e87d"&gt;ArgumentNullException&lt;/span&gt;&amp;gt;(&lt;span style="color: #d3d8ed"&gt;containerAdapter&lt;/span&gt; == &lt;span style="color: #eaeaac"&gt;null&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 16&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #c89191"&gt;&amp;quot;Expected a non-null IContainerAdapter implementation.&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 17&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eaeaac"&gt;return&lt;/span&gt; &lt;span style="color: #eaeaac"&gt;new&lt;/span&gt; &lt;span style="color: #c2e87d"&gt;NCommonConfig&lt;/span&gt;(&lt;span style="color: #d3d8ed"&gt;containerAdapter&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 18&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 19&lt;/span&gt; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;The Using method of the Configure class expects an instance of IContainerAdapter . An implementation of IContainerAdapter is basically a IoC container wrapper that exposes a standard contract that NCommon can use to register components with the IoC container of your choice.&lt;/p&gt;  &lt;p&gt;Implementations of Castle Windsor, StructureMap, NInject, Unity are already provided. The interface is simple enough to implement for other containers. Below is an example of using Configure with castle windsor:&lt;/p&gt;  &lt;div style="font-family: monaco; background: #2e2e2e; color: #c4b560; font-size: 9pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 18&lt;/span&gt;&amp;#160;&lt;span style="color: #eaeaac"&gt;var&lt;/span&gt; &lt;span style="color: #d3d8ed"&gt;container&lt;/span&gt; = &lt;span style="color: #eaeaac"&gt;new&lt;/span&gt; &lt;span style="color: #c2e87d"&gt;WindsorContainer&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 19&lt;/span&gt;&amp;#160;&lt;span style="color: #eaeaac"&gt;var&lt;/span&gt; &lt;span style="color: #d3d8ed"&gt;containerAdapter&lt;/span&gt; = &lt;span style="color: #eaeaac"&gt;new&lt;/span&gt; &lt;span style="color: #c2e87d"&gt;WindsorContainerAdapter&lt;/span&gt;(&lt;span style="color: #d3d8ed"&gt;container&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 20&lt;/span&gt;&amp;#160;&lt;span style="color: #d3d8ed"&gt;NCommon&lt;/span&gt;.&lt;span style="color: #c2e87d"&gt;Configure&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Using&lt;/span&gt;(&lt;span style="color: #d3d8ed"&gt;containerAdapter&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 21&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .&lt;span style="color: #d3d8ed"&gt;ConfigureState&lt;/span&gt;&amp;lt;&lt;span style="color: #c2e87d"&gt;DefaultStateConfiguration&lt;/span&gt;&amp;gt;()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 22&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .&lt;span style="color: #d3d8ed"&gt;ConfigureData&lt;/span&gt;&amp;lt;&lt;span style="color: #c2e87d"&gt;NHConfiguration&lt;/span&gt;&amp;gt;(&lt;span style="color: #d3d8ed"&gt;nhConfiguration&lt;/span&gt; =&amp;gt; &lt;span style="color: #d3d8ed"&gt;nhConfiguration&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 23&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .&lt;span style="color: #d3d8ed"&gt;WithSessionFactory&lt;/span&gt;(() =&amp;gt; &lt;span style="color: #d3d8ed"&gt;nhFactory&lt;/span&gt;))&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 24&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .&lt;span style="color: #d3d8ed"&gt;ConfigureUnitOfWork&lt;/span&gt;&amp;lt;&lt;span style="color: #c2e87d"&gt;DefaultUnitOfWorkConfiguration&lt;/span&gt;&amp;gt;(&lt;span style="color: #d3d8ed"&gt;uowConfiguration&lt;/span&gt; =&amp;gt; &lt;span style="color: #d3d8ed"&gt;uowConfiguration&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 25&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .&lt;span style="color: #d3d8ed"&gt;AutoCompleteScope&lt;/span&gt;()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #85ac8d"&gt;&amp;#160;&amp;#160; 26&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .&lt;span style="color: #d3d8ed"&gt;WithDefaultIsolation&lt;/span&gt;(&lt;span style="color: #c2e87d"&gt;IsolationLevel&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;ReadCommitted&lt;/span&gt;));&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;In future posts I’ll go into details on the different configuration options of NCommon.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2419179728496073507-5973909535898091893?l=www.codeinsanity.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://codeinsanity.com/aggbug/7.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ritesh Rao</dc:creator>
            <guid>http://codeinsanity.com/archive/2010/04/05/configuring-ncommon-in-1-1.aspx</guid>
            <pubDate>Mon, 05 Apr 2010 05:30:00 GMT</pubDate>
            <comments>http://codeinsanity.com/archive/2010/04/05/configuring-ncommon-in-1-1.aspx#feedback</comments>
            <slash:comments>69</slash:comments>
            <wfw:commentRss>http://codeinsanity.com/comments/commentRss/7.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Visual Studio Theme</title>
            <category>Visual Studio</category>
            <link>http://codeinsanity.com/archive/2009/09/28/visual-studio-theme.aspx</link>
            <description>&lt;p&gt;I’ve been getting a lot of requests lately to share my Visual Studio theme. Instead of individually replying to everyone, I’m making it available here. Enjoy.&lt;/p&gt;&lt;iframe style="PADDING-BOTTOM: 0px; BACKGROUND-COLOR: #fcfcfc; PADDING-LEFT: 0px; WIDTH: 98px; PADDING-RIGHT: 0px; HEIGHT: 115px; PADDING-TOP: 0px" title="Preview" marginheight="0" src="http://cid-cd8b52ea69f51102.skydrive.live.com/embedicon.aspx/Shared/DarkTheme-Full.vssettings" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2419179728496073507-3436076454916389739?l=www.codeinsanity.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://codeinsanity.com/aggbug/18.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ritesh Rao</dc:creator>
            <guid>http://codeinsanity.com/archive/2009/09/28/visual-studio-theme.aspx</guid>
            <pubDate>Mon, 28 Sep 2009 11:03:04 GMT</pubDate>
            <comments>http://codeinsanity.com/archive/2009/09/28/visual-studio-theme.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://codeinsanity.com/comments/commentRss/18.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Domain Events pattern in NCommon</title>
            <category>Patterns</category>
            <link>http://codeinsanity.com/archive/2009/06/17/domain-events-pattern-in-ncommon.aspx</link>
            <description>&lt;p&gt;&lt;a href="http://blogger.forgottenskies.com/"&gt;Steve Gentile&lt;/a&gt; recently directed me to &lt;a href="http://www.udidahan.com/?blog=true"&gt;Udi Dahan’s&lt;/a&gt; recent &lt;a href="http://www.udidahan.com/2009/06/14/domain-events-salvation/"&gt;post&lt;/a&gt; his improvement on the Domain Event pattern, and after reading the post, digesting it and thinking about his approach I have decided to include it into NCommon. &lt;/p&gt;  &lt;p&gt;The Domain Event pattern aims to provide a solution for being able to create fully encapsulated domain models. The term fully encapsulated domain models refer to the approach where the entities in your domain model are not bound or depend on external services for any purpose or operation.&lt;/p&gt;  &lt;p&gt;A good example for this, although a beaten to death example, is the email sending or rather the notification example. Lets say when an order’s status has changed an email notification has to be sent out to the customer of the order informing them of this status change. My previous approach has been to use the Service Locator pattern to get a service instance of IOrderStatsNotifier and use the IOrderStatusNotifier instance to send out the emails.&lt;/p&gt;  &lt;p&gt;Semantically that has always bothered me because the domain entity really should not be informing the notifier that the order’s status has changed, rather it should be the other way around. The Notifier should automatically be able to handle order’s status change and do the necessary. With the Domain Events pattern this becomes ridiculously easy.&lt;/p&gt;  &lt;p&gt;If you haven’t read Udi’s post, I’d strongly recommend reading it. Anyways, the implementation of Domain Events pattern in NCommon is almost identical to that shown in Udi’s post. Below is a test from NCommon that shows how the Domain Event pattern can be used:&lt;/p&gt;  &lt;div style="font-family: consolas; background: #2e2e2e; color: #c4b560; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;[&lt;span style="color: #c2e87d"&gt;Test&lt;/span&gt;]&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #eaeaac; font-weight: bold"&gt;public&lt;/span&gt; &lt;span style="color: #eaeaac; font-weight: bold"&gt;void&lt;/span&gt; &lt;span style="color: #d3d8ed"&gt;registered_handlers_are_executed_when_event_is_raised&lt;/span&gt; ()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;{&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eaeaac; font-weight: bold"&gt;var&lt;/span&gt; &lt;span style="color: #d3d8ed"&gt;mockTest1Handler&lt;/span&gt; = &lt;span style="color: #c2e87d"&gt;MockRepository&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;GenerateMock&lt;/span&gt;&amp;lt;&lt;span style="color: #c2e87d"&gt;Handles&lt;/span&gt;&amp;lt;&lt;span style="color: #c2e87d"&gt;TestEvent1&lt;/span&gt;&amp;gt;&amp;gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eaeaac; font-weight: bold"&gt;var&lt;/span&gt; &lt;span style="color: #d3d8ed"&gt;mockTest2Handler&lt;/span&gt; = &lt;span style="color: #c2e87d"&gt;MockRepository&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;GenerateMock&lt;/span&gt;&amp;lt;&lt;span style="color: #c2e87d"&gt;Handles&lt;/span&gt;&amp;lt;&lt;span style="color: #c2e87d"&gt;TestEvent2&lt;/span&gt;&amp;gt;&amp;gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eaeaac; font-weight: bold"&gt;var&lt;/span&gt; &lt;span style="color: #d3d8ed"&gt;locator&lt;/span&gt; = &lt;span style="color: #c2e87d"&gt;MockRepository&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;GenerateStub&lt;/span&gt;&amp;lt;&lt;span style="color: #c2e87d"&gt;IServiceLocator&lt;/span&gt;&amp;gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;locator&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Expect&lt;/span&gt;(&lt;span style="color: #d3d8ed"&gt;x&lt;/span&gt; =&amp;gt; &lt;span style="color: #d3d8ed"&gt;x&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;GetAllInstances&lt;/span&gt;&amp;lt;&lt;span style="color: #c2e87d"&gt;Handles&lt;/span&gt;&amp;lt;&lt;span style="color: #c2e87d"&gt;TestEvent1&lt;/span&gt;&amp;gt;&amp;gt;())&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .&lt;span style="color: #d3d8ed"&gt;Return&lt;/span&gt;(&lt;span style="color: #eaeaac; font-weight: bold"&gt;new&lt;/span&gt;[]{&lt;span style="color: #d3d8ed"&gt;mockTest1Handler&lt;/span&gt;});&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #c2e87d"&gt;ServiceLocator&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;SetLocatorProvider&lt;/span&gt;(() =&amp;gt; &lt;span style="color: #d3d8ed"&gt;locator&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #c2e87d"&gt;DomainEvent&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Raise&lt;/span&gt;(&lt;span style="color: #eaeaac; font-weight: bold"&gt;new&lt;/span&gt; &lt;span style="color: #c2e87d"&gt;TestEvent1&lt;/span&gt;());&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;mockTest1Handler&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;AssertWasCalled&lt;/span&gt;(&lt;span style="color: #d3d8ed"&gt;x&lt;/span&gt; =&amp;gt; &lt;span style="color: #d3d8ed"&gt;x&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Handle&lt;/span&gt;(&lt;span style="color: #eaeaac; font-weight: bold"&gt;null&lt;/span&gt;), &lt;span style="color: #d3d8ed"&gt;options&lt;/span&gt; =&amp;gt; &lt;span style="color: #d3d8ed"&gt;options&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;IgnoreArguments&lt;/span&gt;());&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;mockTest2Handler&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;AssertWasNotCalled&lt;/span&gt;(&lt;span style="color: #d3d8ed"&gt;x&lt;/span&gt; =&amp;gt; &lt;span style="color: #d3d8ed"&gt;x&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Handle&lt;/span&gt;(&lt;span style="color: #eaeaac; font-weight: bold"&gt;null&lt;/span&gt;), &lt;span style="color: #d3d8ed"&gt;options&lt;/span&gt; =&amp;gt; &lt;span style="color: #d3d8ed"&gt;options&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;IgnoreArguments&lt;/span&gt;());&lt;/p&gt;    &lt;p style="margin: 0px"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;The implementation of Domain Events pattern is available in trunk.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2419179728496073507-2488472211256032057?l=www.codeinsanity.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://codeinsanity.com/aggbug/8.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ritesh Rao</dc:creator>
            <guid>http://codeinsanity.com/archive/2009/06/17/domain-events-pattern-in-ncommon.aspx</guid>
            <pubDate>Thu, 18 Jun 2009 02:48:44 GMT</pubDate>
            <comments>http://codeinsanity.com/archive/2009/06/17/domain-events-pattern-in-ncommon.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://codeinsanity.com/comments/commentRss/8.aspx</wfw:commentRss>
        </item>
        <item>
            <title>FluentNHibernate Mappings: Any</title>
            <category>NHibernate</category>
            <category>FluentNHibernate</category>
            <link>http://codeinsanity.com/archive/2009/05/15/fluentnhibernate-mappings-any.aspx</link>
            <description>&lt;p&gt;&lt;em&gt;Recently Oren (&lt;a href="http://www.ayende.com/blog"&gt;Ayende&lt;/a&gt;) had a serious of posts on NHibernate mappings and the various options you can configure using Xml mappings. This series of posts takes those examples and shows how you can use FluentNHibernate to configure the same mappings.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;This is a companion post for Oren’s post on the &amp;lt;any&amp;gt; mapping in NHibernate, &lt;a href="http://ayende.com/Blog/archive/2009/04/21/nhibernate-mapping-ltanygt.aspx"&gt;here&lt;/a&gt;. I recommend reading his post before venturing forward. &lt;/p&gt;  &lt;p&gt;In Fluent NHibernate you can use the ReferencesAny mapping method to output a &amp;lt;any&amp;gt; mapping:&lt;/p&gt;  &lt;div style="font-family: consolas; background: #2e2e2e; color: #c4b560; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #d3d8ed"&gt;ReferencesAny&lt;/span&gt;(&lt;span style="color: #d3d8ed"&gt;mapping&lt;/span&gt; =&amp;gt; &lt;span style="color: #d3d8ed"&gt;mapping&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Payment&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; .&lt;span style="color: #d3d8ed"&gt;EntityTypeColumn&lt;/span&gt;(&lt;span style="color: #c89191"&gt;&amp;quot;PaymentType&amp;quot;&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; .&lt;span style="color: #d3d8ed"&gt;EntityIdentifierColumn&lt;/span&gt;(&lt;span style="color: #c89191"&gt;&amp;quot;PaymentId&amp;quot;&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; .&lt;span style="color: #d3d8ed"&gt;AddMetaValue&lt;/span&gt;&amp;lt;&lt;span style="color: #c2e87d"&gt;CreditCardPayment&lt;/span&gt;&amp;gt;(&lt;span style="color: #c89191"&gt;&amp;quot;Credit&amp;quot;&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; .&lt;span style="color: #d3d8ed"&gt;AddMetaValue&lt;/span&gt;&amp;lt;&lt;span style="color: #c2e87d"&gt;CheckPayment&lt;/span&gt;&amp;gt;(&lt;span style="color: #c89191"&gt;&amp;quot;Check&amp;quot;&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; .&lt;span style="color: #d3d8ed"&gt;IdentityType&lt;/span&gt;(&lt;span style="color: #d3d8ed"&gt;identity&lt;/span&gt; =&amp;gt; &lt;span style="color: #eaeaac; font-weight: bold"&gt;typeof&lt;/span&gt;(&lt;span style="color: #eaeaac; font-weight: bold"&gt;int&lt;/span&gt;));&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;strong&gt;Note: &lt;/strong&gt;This mapping method at this time is generating the &amp;lt;any&amp;gt; mapping incorrectly. The mapping that is being generated contains &amp;lt;any&amp;gt; before the &amp;lt;Id&amp;gt; element causing NHibernate to complain. I've submitted a patch to fix this behavior, which you can get from here: &lt;a title="http://code.google.com/p/fluent-nhibernate/issues/detail?id=228" href="http://code.google.com/p/fluent-nhibernate/issues/detail?id=228"&gt;http://code.google.com/p/fluent-nhibernate/issues/detail?id=228&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Note2: &lt;/strong&gt;ReferencesAny is available in the latest trunk as support for it was added fairly recently. So if you can't seem to find it in the fluent-nhibernate.dll build you are using, get latest from trunk and build it.&lt;/p&gt;  &lt;p&gt;The ReferencesAny prety much matches the &amp;lt;any&amp;gt; element. You specify the meta values using the AddMetaValue method, the type column via EntityTypeColumn and the identity column using the EntityIdentifierColumn method.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2419179728496073507-315441659613893222?l=www.codeinsanity.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://codeinsanity.com/aggbug/9.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ritesh Rao</dc:creator>
            <guid>http://codeinsanity.com/archive/2009/05/15/fluentnhibernate-mappings-any.aspx</guid>
            <pubDate>Fri, 15 May 2009 10:00:00 GMT</pubDate>
            <comments>http://codeinsanity.com/archive/2009/05/15/fluentnhibernate-mappings-any.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://codeinsanity.com/comments/commentRss/9.aspx</wfw:commentRss>
        </item>
        <item>
            <title>FluentNHibernate Mappings: Join</title>
            <category>NHibernate</category>
            <category>FluentNHibernate</category>
            <link>http://codeinsanity.com/archive/2009/05/14/fluentnhibernate-mappings-join.aspx</link>
            <description>&lt;p&gt;&lt;em&gt;Recently Oren (&lt;a href="http://www.ayende.com/blog"&gt;Ayende&lt;/a&gt;) had a serious of posts on NHibernate mappings and the various options you can configure using Xml mappings. This series of posts takes those examples and shows how you can use FluentNHibernate to configure the same mappings.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;This is a companion post for Oren’s post on the &amp;lt;join&amp;gt; mapping in NHibernate, &lt;a href="http://ayende.com/Blog/archive/2009/04/20/nhibernate-mapping-ltjoingt.aspx"&gt;here&lt;/a&gt;. I recommend reading his post before venturing forward. &lt;/p&gt;  &lt;p&gt;To create a joined table mapping using FluentNHibernate you need to use the WithTable mapping function and specify the JoinedPart definition:&lt;/p&gt;  &lt;div style="font-family: consolas; background: #2e2e2e; color: #c4b560; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #d3d8ed"&gt;WithTable&lt;/span&gt;(&lt;span style="color: #c89191"&gt;&amp;quot;Addresses&amp;quot;&lt;/span&gt;, &lt;span style="color: #d3d8ed"&gt;join&lt;/span&gt; =&amp;gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;join&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Map&lt;/span&gt;(&lt;span style="color: #d3d8ed"&gt;prop&lt;/span&gt; =&amp;gt; &lt;span style="color: #d3d8ed"&gt;prop&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;StreetAddress1&lt;/span&gt;, &lt;span style="color: #c89191"&gt;&amp;quot;StreetAddress1&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;join&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Map&lt;/span&gt;(&lt;span style="color: #d3d8ed"&gt;prop&lt;/span&gt; =&amp;gt; &lt;span style="color: #d3d8ed"&gt;prop&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;StreetAddress2&lt;/span&gt;, &lt;span style="color: #c89191"&gt;&amp;quot;StreetAddress2&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;join&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Map&lt;/span&gt;(&lt;span style="color: #d3d8ed"&gt;prop&lt;/span&gt; =&amp;gt; &lt;span style="color: #d3d8ed"&gt;prop&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;City&lt;/span&gt;, &lt;span style="color: #c89191"&gt;&amp;quot;City&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;join&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Map&lt;/span&gt;(&lt;span style="color: #d3d8ed"&gt;prop&lt;/span&gt; =&amp;gt; &lt;span style="color: #d3d8ed"&gt;prop&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;State&lt;/span&gt;, &lt;span style="color: #c89191"&gt;&amp;quot;State&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;join&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Map&lt;/span&gt;(&lt;span style="color: #d3d8ed"&gt;prop&lt;/span&gt; =&amp;gt; &lt;span style="color: #d3d8ed"&gt;prop&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;ZipCode&lt;/span&gt;, &lt;span style="color: #c89191"&gt;&amp;quot;ZipCode&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;join&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;WithKeyColumn&lt;/span&gt;(&lt;span style="color: #c89191"&gt;&amp;quot;PersonId&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;The WithTable mapping function has two overloads, one just taking in a string parameter and another that takes in a string parameter as well as a action that allows you to configure a JoinPart. The first overload instructs fluent nhibernate to output the table name of the class being mapped, for e.g WithTable(&amp;quot;Persons&amp;quot;) will generate a mapping: &amp;lt;class name=&amp;quot;Person&amp;quot; table=&amp;quot;Persons&amp;quot;&amp;gt; element.&lt;/p&gt;  &lt;p&gt;The second overload outputs the &amp;lt;join&amp;gt; element in the mapping. Just like mapping a component, the JoinPart allows you to map properties in the class as belonging to another table. The only thing to be aware of here is that you are specifying the column names in the join table for your properties manually.&lt;/p&gt;  &lt;p&gt;Now to define the join table as optional, you again need to use the SetAttribute method to output the &amp;quot;optional&amp;quot; attribute since there's no inbuilt way to specify that in the JoinPart. Below is the full mapping:&lt;/p&gt;  &lt;div style="font-family: consolas; background: #2e2e2e; color: #c4b560; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #d3d8ed"&gt;WithTable&lt;/span&gt;(&lt;span style="color: #c89191"&gt;&amp;quot;Addresses&amp;quot;&lt;/span&gt;, &lt;span style="color: #d3d8ed"&gt;join&lt;/span&gt; =&amp;gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;join&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Map&lt;/span&gt;(&lt;span style="color: #d3d8ed"&gt;prop&lt;/span&gt; =&amp;gt; &lt;span style="color: #d3d8ed"&gt;prop&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;StreetAddress1&lt;/span&gt;, &lt;span style="color: #c89191"&gt;&amp;quot;StreetAddress1&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;join&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Map&lt;/span&gt;(&lt;span style="color: #d3d8ed"&gt;prop&lt;/span&gt; =&amp;gt; &lt;span style="color: #d3d8ed"&gt;prop&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;StreetAddress2&lt;/span&gt;, &lt;span style="color: #c89191"&gt;&amp;quot;StreetAddress2&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;join&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Map&lt;/span&gt;(&lt;span style="color: #d3d8ed"&gt;prop&lt;/span&gt; =&amp;gt; &lt;span style="color: #d3d8ed"&gt;prop&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;City&lt;/span&gt;, &lt;span style="color: #c89191"&gt;&amp;quot;City&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;join&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Map&lt;/span&gt;(&lt;span style="color: #d3d8ed"&gt;prop&lt;/span&gt; =&amp;gt; &lt;span style="color: #d3d8ed"&gt;prop&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;State&lt;/span&gt;, &lt;span style="color: #c89191"&gt;&amp;quot;State&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;join&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Map&lt;/span&gt;(&lt;span style="color: #d3d8ed"&gt;prop&lt;/span&gt; =&amp;gt; &lt;span style="color: #d3d8ed"&gt;prop&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;ZipCode&lt;/span&gt;, &lt;span style="color: #c89191"&gt;&amp;quot;ZipCode&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;join&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;WithKeyColumn&lt;/span&gt;(&lt;span style="color: #c89191"&gt;&amp;quot;PersonId&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;join&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;SetAttribute&lt;/span&gt;(&lt;span style="color: #c89191"&gt;&amp;quot;optional&amp;quot;&lt;/span&gt;, &lt;span style="color: #c89191"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });&lt;/p&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2419179728496073507-4904923611486199400?l=www.codeinsanity.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://codeinsanity.com/aggbug/10.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ritesh Rao</dc:creator>
            <guid>http://codeinsanity.com/archive/2009/05/14/fluentnhibernate-mappings-join.aspx</guid>
            <pubDate>Fri, 15 May 2009 00:00:00 GMT</pubDate>
            <comments>http://codeinsanity.com/archive/2009/05/14/fluentnhibernate-mappings-join.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://codeinsanity.com/comments/commentRss/10.aspx</wfw:commentRss>
        </item>
        <item>
            <title>FluentNHibernate Mappings: One-To-One</title>
            <category>NHibernate</category>
            <category>FluentNHibernate</category>
            <link>http://codeinsanity.com/archive/2009/05/14/fluentnhibernate-mappings-one-to-one.aspx</link>
            <description>&lt;p&gt;&lt;em&gt;Recently Oren (&lt;a href="http://www.ayende.com/blog"&gt;Ayende&lt;/a&gt;) had a serious of posts on NHibernate mappings and the various options you can configure using Xml mappings. This series of posts takes those examples and shows how you can use FluentNHibernate to configure the same mappings.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;This is a companion post for Oren’s post on the &amp;lt;one-to-one&amp;gt; mapping in NHibernate, &lt;a href="http://ayende.com/Blog/archive/2009/04/19/nhibernate-mapping-ltone-to-onegt.aspx"&gt;here&lt;/a&gt;. I recommend reading his post before venturing forward. &lt;/p&gt;  &lt;p&gt;In FluentNHibernate one-to-one mappings are achieved by using the HasOne mapping method on the parent and the References method on the child. Below is the mapping for the Person entity that has a one-to-one relationship with an Employee entity:&lt;/p&gt;  &lt;div style="font-family: consolas; background: #2e2e2e; color: #c4b560; font-size: 10pt"&gt;   &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;HasOne&lt;/span&gt;(&lt;span style="color: #d3d8ed"&gt;prop&lt;/span&gt; =&amp;gt; &lt;span style="color: #d3d8ed"&gt;prop&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Employee&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .&lt;span style="color: #d3d8ed"&gt;PropertyRef&lt;/span&gt;(&lt;span style="color: #d3d8ed"&gt;prop&lt;/span&gt; =&amp;gt; &lt;span style="color: #d3d8ed"&gt;prop&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Person&lt;/span&gt;);&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;You can also specify the actual property that HasOne uses to specify the foreign key relationship using the PropertyRef method. The above statement basically creates a mapping instruction that reads “Person has a one-to-one relationship with Employee on the Person property of the Employee entity”.&lt;/p&gt;

&lt;p&gt;Similarly, the Employee mappings use the References mapping method to specify the bi-directional part of the relationship. Here’s the full class mapping for Employee:&lt;/p&gt;

&lt;div style="font-family: consolas; background: #2e2e2e; color: #c4b560; font-size: 10pt"&gt;
  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eaeaac; font-weight: bold"&gt;public&lt;/span&gt; &lt;span style="color: #eaeaac; font-weight: bold"&gt;class&lt;/span&gt; &lt;span style="color: #c2e87d"&gt;EmployeeMap&lt;/span&gt; : &lt;span style="color: #c2e87d"&gt;ClassMap&lt;/span&gt;&amp;lt;&lt;span style="color: #c2e87d"&gt;Employee&lt;/span&gt;&amp;gt;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eaeaac; font-weight: bold"&gt;public&lt;/span&gt; &lt;span style="color: #d3d8ed"&gt;EmployeeMap&lt;/span&gt;()&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;WithTable&lt;/span&gt;(&lt;span style="color: #c89191"&gt;&amp;quot;Employees&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;Id&lt;/span&gt;(&lt;span style="color: #d3d8ed"&gt;prop&lt;/span&gt; =&amp;gt; &lt;span style="color: #d3d8ed"&gt;prop&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Id&lt;/span&gt;).&lt;span style="color: #d3d8ed"&gt;GeneratedBy&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Native&lt;/span&gt;();&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;Map&lt;/span&gt;(&lt;span style="color: #d3d8ed"&gt;prop&lt;/span&gt; =&amp;gt; &lt;span style="color: #d3d8ed"&gt;prop&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Role&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d3d8ed"&gt;References&lt;/span&gt;(&lt;span style="color: #d3d8ed"&gt;prop&lt;/span&gt; =&amp;gt; &lt;span style="color: #d3d8ed"&gt;prop&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Person&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .&lt;span style="color: #d3d8ed"&gt;ColumnName&lt;/span&gt;(&lt;span style="color: #c89191"&gt;&amp;quot;PersonId&amp;quot;&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .&lt;span style="color: #d3d8ed"&gt;FetchType&lt;/span&gt;.&lt;span style="color: #d3d8ed"&gt;Select&lt;/span&gt;()&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .&lt;span style="color: #d3d8ed"&gt;LazyLoad&lt;/span&gt;()&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .&lt;span style="color: #d3d8ed"&gt;Unique&lt;/span&gt;();&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;The References mapping method in EmployeeMap generates a many-to-one mapping to the Person entity. You must add the Unique mapping modifier to instruct that the many-to-one mapping maps to a unique Person instance making it effectively a one-to-one mapping. You’ll also notice that I’ve set the FetchType to Select, this is done so that associated Person instances are lazy loaded when needed.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2419179728496073507-698940885836299065?l=www.codeinsanity.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://codeinsanity.com/aggbug/11.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ritesh Rao</dc:creator>
            <guid>http://codeinsanity.com/archive/2009/05/14/fluentnhibernate-mappings-one-to-one.aspx</guid>
            <pubDate>Thu, 14 May 2009 10:00:00 GMT</pubDate>
            <comments>http://codeinsanity.com/archive/2009/05/14/fluentnhibernate-mappings-one-to-one.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://codeinsanity.com/comments/commentRss/11.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>
