


      <rss version="2.0">
         <channel>
            <title><![CDATA[Vinay Rao | .NET]]></title>
            <link>http://www.simplyvinay.com/</link>
            <description>My Personal Website</description>
            <copyright>Copyright 2005 by Vinay Rao</copyright>
   
      <item>
         <title><![CDATA[MPBlog Implementation. Part 5]]></title>
         <author><![CDATA[vinay]]></author>
         <description><![CDATA[<p><u><em></em></u></p>  <p><em><font size="3">Setting up StructureMap and The Unit Of Work ActionFilter</font></em></p>  <p><u><em>UnitOfWork ActionFilter</em></u></p>  <p>In my previous <a href="http://www.simplyvinay.com/Post/50/MPBlog-Implementation.-Part-4.aspx" target="_blank">post</a> I had created the repository implementations along with unit of work. But how do we use this unit of work in our application. ASP.NET MVC has a concept of ActionFilters. These could be applied to an action or a controller in general. The two main methods that concern us are <em>OnActionExecuting</em> and the <em>OnActionExecuted</em>. As seen in the code below we call the initialize method of the unit of work which would create a new transaction for us and this is held until the action is complete after which we commit the transaction. We are getting a new instance of _unitOfWork through an IoC container which I will talk about in a bit.</p>  <pre class="ncode"><div style="font-weight: bold; font-size: 10pt; background: #1e1e1e; color: silver; font-family: consolas"><p style="margin: 0px"><span style="color: #cc7832">namespace</span> MPBlog.Web.UI.ActionFilters</p><p style="margin: 0px">{</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> System;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> System.Web.Mvc;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> Core.BaseClasses;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> StructureMap;</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">public</span> <span style="color: #cc7832">class</span> <span style="color: #ffc66d">UseUnitOfWOrkAttribute</span> : <span style="color: #ffc66d">ActionFilterAttribute</span></p><p style="margin: 0px">&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">private</span> <span style="color: #cc7832">readonly</span> <span style="color: #6897bb">IUnitOfWork</span> _unitOfWork;</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">public</span> UseUnitOfWOrkAttribute()</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _unitOfWork = <span style="color: #ffc66d">ObjectFactory</span><span style="font-weight: normal">.GetInstance&lt;</span><span style="color: #6897bb">IUnitOfWork</span><span style="font-weight: normal">&gt;();</span></p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">public</span> UseUnitOfWOrkAttribute( <span style="color: #6897bb">IUnitOfWork</span> unitOfWork )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _unitOfWork = unitOfWork;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">public</span> <span style="color: #cc7832">override</span> <span style="color: #cc7832">void</span> OnActionExecuting( <span style="color: #ffc66d">ActionExecutingContext</span> filterContext )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _unitOfWork.Initialize();</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">public</span> <span style="color: #cc7832">override</span> <span style="color: #cc7832">void</span> OnActionExecuted( <span style="color: #ffc66d">ActionExecutedContext</span> filterContext )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">try</span></p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _unitOfWork.Commit();</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">catch</span>( <span style="color: #ffc66d">Exception</span> )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _unitOfWork.Rollback();</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">throw</span>;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">finally</span></p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _unitOfWork.Dispose();</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p style="margin: 0px">&#160;&#160;&#160; }</p><p style="margin: 0px">}</p></div></pre>

<p>We use this action filter either by decoration individual action with the attribute or if we want all actions to use the unit of work, then we can decorate the class itself with the attribute. In the following code I am using the <em>UseUnitOfWork</em> filter on the Index action.</p>

<pre class="ncode"><div style="font-weight: bold; font-size: 10pt; background: #1e1e1e; color: silver; font-family: consolas"><p style="margin: 0px"><span style="color: #cc7832">namespace</span> MPBlog.Web.UI.Controllers</p><p style="margin: 0px">{</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> System.Web.Mvc;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> ActionFilters;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> Core.Services;</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160; [<span style="color: #ffc66d">HandleError</span>]</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">public</span> <span style="color: #cc7832">class</span> <span style="color: #ffc66d">HomeController</span> : <span style="color: #ffc66d">Controller</span></p><p style="margin: 0px">&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">private</span> <span style="color: #cc7832">readonly</span> <span style="color: #6897bb">IBlogService</span> _blogService;</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">public</span> HomeController(<span style="color: #6897bb">IBlogService</span> blogService)</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _blogService = blogService;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; [<span style="color: #ffc66d">UseUnitOfWOrk</span>]</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">public</span> <span style="color: #ffc66d">ActionResult</span> Index()</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">var</span> posts = _blogService.GetAllPosts();</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">return</span> View(posts);</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p style="margin: 0px">&#160;&#160;&#160; }</p><p style="margin: 0px">}</p></div></pre>

<p>Attributes may look a bit intrusive (atleast for me). I like how <a href="http://code.google.com/p/fubumvc/" target="_blank">FubuMVC</a> handles this. In <a href="http://code.google.com/p/fubumvc/" target="_blank">FubuMVC</a>, we have something called behaviors and this can be configured in the application start. So if we want <strong>all</strong> our actions to use the unit of work, then we can set the behavior as shown below and that's it, no more attributes on the action or controller. In the following code the <em>access_the_database_through_a_unit_of_work </em>has the same implementation as the filter we created.</p>

<pre class="ncode"><div style="font-weight: bold; font-size: 10pt; background: #1e1e1e; color: silver; font-family: consolas"><p style="margin: 0px"><span style="color: #ffc66d">ControllerConfig</span><span style="font-weight: normal">.Configure = x =&gt;</span></p><p style="margin: 0px">{</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #5eaeae">// Default Behaviors for all actions -- ordered as they're executed</span></p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #5eaeae">/////////////////////////////////////////////////</span></p><p style="margin: 0px">&#160;&#160;&#160; x.ByDefault.EveryControllerAction(d =&gt; d</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; .Will&lt;<span style="color: #ffc66d">access_the_database_through_a_unit_of_work</span><span style="font-weight: normal">&gt;()</span></p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; );</p><p style="margin: 0px">};</p></div></pre>

<p><u><em>Services</em></u></p>

<p>Instead of accessing the repository directly from the controllers, I have created a separate service which delegates the work to the repository to the operations related. Following is an example of a blog service. I have kept the methods to be minimal for brevity.</p>

<pre class="ncode"><div style="font-weight: bold; font-size: 10pt; background: #1e1e1e; color: silver; font-family: consolas"><p style="margin: 0px"><span style="color: #cc7832">namespace</span> MPBlog.Core.Services</p><p style="margin: 0px">{</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> System.Collections.Generic;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> Domain;</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">public</span> <span style="color: #cc7832">interface</span> <span style="color: #6897bb">IBlogService</span></p><p style="margin: 0px">&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #6897bb">IEnumerable</span><span style="font-weight: normal">&lt;</span><span style="color: #ffc66d">Post</span><span style="font-weight: normal">&gt; GetAllPosts();</span></p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #6897bb">IEnumerable</span><span style="font-weight: normal">&lt;</span><span style="color: #ffc66d">Post</span><span style="font-weight: normal">&gt; GetPostsByTag(</span><span style="color: #cc7832">string</span> tag);</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #ffc66d">Post</span> GetPostById( <span style="color: #cc7832">int</span> postID );</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #ffc66d">Post</span> GetPostBySlug( <span style="color: #cc7832">string</span> slug );</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">void</span> SavePost( <span style="color: #ffc66d">Post</span> post );</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">void</span> UpdatePost( <span style="color: #ffc66d">Post</span> post );</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">void</span> DeletePost( <span style="color: #ffc66d">Post</span> post );</p><p style="margin: 0px">&#160;&#160;&#160; }</p><p style="margin: 0px">}</p></div></pre>

<pre class="ncode"><div style="font-weight: bold; font-size: 10pt; background: #1e1e1e; color: silver; font-family: consolas"><p style="margin: 0px"><span style="color: #cc7832">namespace</span> MPBlog.Core.Services</p><p style="margin: 0px">{</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> System.Collections.Generic;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> System.Linq;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> BaseClasses;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> Domain;</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">public</span> <span style="color: #cc7832">class</span> <span style="color: #ffc66d">BlogService</span> : <span style="color: #6897bb">IBlogService</span></p><p style="margin: 0px">&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">private</span> <span style="color: #cc7832">readonly</span> <span style="color: #6897bb">IRepository</span> _repository;</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">public</span> BlogService( <span style="color: #6897bb">IRepository</span> repository )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _repository = repository;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">public</span> <span style="color: #6897bb">IEnumerable</span><span style="font-weight: normal">&lt;</span><span style="color: #ffc66d">Post</span><span style="font-weight: normal">&gt; GetAllPosts()</span></p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">return</span> _repository.Query&lt;<span style="color: #ffc66d">Post</span><span style="font-weight: normal">&gt;().AsEnumerable();</span></p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">public</span> <span style="color: #6897bb">IEnumerable</span><span style="font-weight: normal">&lt;</span><span style="color: #ffc66d">Post</span><span style="font-weight: normal">&gt; GetPostsByTag( </span><span style="color: #cc7832">string</span> tag )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">return</span></p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _repository.Query&lt;<span style="color: #ffc66d">Tag</span><span style="font-weight: normal">&gt;( t =&gt; t.Description.Equals( tag ) ).</span></p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; SingleOrDefault().Posts;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">public</span> <span style="color: #ffc66d">Post</span> GetPostById( <span style="color: #cc7832">int</span> postId )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">return</span> _repository.Load&lt;<span style="color: #ffc66d">Post</span><span style="font-weight: normal">&gt;( postId );</span></p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">public</span> <span style="color: #ffc66d">Post</span> GetPostBySlug( <span style="color: #cc7832">string</span> slug )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">return</span> _repository.Query&lt;<span style="color: #ffc66d">Post</span><span style="font-weight: normal">&gt;( p =&gt; p.PostSlug.Equals( slug ) ).SingleOrDefault();</span></p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">public</span> <span style="color: #cc7832">void</span> SavePost( <span style="color: #ffc66d">Post</span> post )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _repository.Save( post );</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">public</span> <span style="color: #cc7832">void</span> UpdatePost( <span style="color: #ffc66d">Post</span> post )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _repository.Save( post );</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">public</span> <span style="color: #cc7832">void</span> DeletePost( <span style="color: #ffc66d">Post</span> post )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _repository.Delete( post );</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p style="margin: 0px">&#160;&#160;&#160; }</p><p style="margin: 0px">}</p></div></pre>

<p><u><em>Dependency Injection using StructureMap</em></u></p>

<p>If we look at the all the code that has been shown till now, we see that, there is almost always an interface declared and we can nowhere see a direct instantiation of the object that is required. So how do we get a new instance of an object. This is where an Inversion Of Control (IoC/DI)&#160; container comes into play. Basically what it does is to give you a concrete objects whenever we require.</p>

<p>I have used constructor injection where ever possible. How it works is, by defining our own ControllerFactory and create the controller ourselves instead of ASP.NET MVC doing it for us. In the below code I have a StrucutreMapControllerFactory from where I am getting an instance of the controller. This factory inherits from the DefaultControllerFactory for ASP.NET MVC and we override the controller building method.</p>

<pre class="ncode"><div style="font-weight: bold; font-size: 10pt; background: #1e1e1e; color: silver; font-family: consolas"><p style="margin: 0px"><span style="color: #cc7832">namespace</span> MPBlog.Web.UI.Controllers</p><p style="margin: 0px">{</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> System;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> System.Web.Mvc;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> StructureMap;</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">public</span> <span style="color: #cc7832">class</span> <span style="color: #ffc66d">StructureMapControllerFactory</span> : <span style="color: #ffc66d">DefaultControllerFactory</span></p><p style="margin: 0px">&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">protected</span> <span style="color: #cc7832">override</span> <span style="color: #6897bb">IController</span> GetControllerInstance(<span style="color: #ffc66d">Type</span> controllerType)</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #6897bb">IController</span> result = <span style="color: #cc7832">null</span>;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">if</span> (controllerType != <span style="color: #cc7832">null</span>)</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">try</span></p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; result = <span style="color: #ffc66d">ObjectFactory</span><span style="font-weight: normal">.GetInstance(controllerType) </span><span style="color: #cc7832">as</span> <span style="color: #ffc66d">Controller</span>;</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">catch</span> (<span style="color: #ffc66d">StructureMapException</span>)</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.Diagnostics.<span style="color: #ffc66d">Debug</span><span style="font-weight: normal">.WriteLine(</span><span style="color: #ffc66d">ObjectFactory</span><span style="font-weight: normal">.WhatDoIHave());</span></p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">throw</span>;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">return</span> result;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p style="margin: 0px">&#160;&#160;&#160; }</p><p style="margin: 0px">}</p></div></pre>

<p>We set this controller factory in our Application_Start method in the global.asax file like so. </p>

<pre class="ncode"><div style="font-weight: bold; font-size: 10pt; background: #1e1e1e; color: silver; font-family: consolas"><p style="margin: 0px">RegisterRoutes( <span style="color: #ffc66d">RouteTable</span><span style="font-weight: normal">.Routes );</span></p><p style="margin: 0px"><span style="color: #ffc66d">Bootstrapper</span><span style="font-weight: normal">.Bootstrap();</span></p><p style="margin: 0px"><span style="color: #ffc66d">ControllerBuilder</span><span style="font-weight: normal">.Current.SetControllerFactory(</span></p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">new</span> <span style="color: #ffc66d">StructureMapControllerFactory</span>());</p></div></pre>
Now that we have controllerfactory ready, we can configure our dependencies. The way to configure our dependency is through a registry which provides a fluent interface. The following code shows all the dependencies being loaded into the container through the MPBlogRegistry.&#160; <pre class="ncode"><div style="font-weight: bold; font-size: 10pt; background: #1e1e1e; color: silver; font-family: consolas"><p style="margin: 0px"><span style="color: #cc7832">namespace</span> MPBlog.Web.UI</p><p style="margin: 0px">{</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> StructureMap;</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">public</span> <span style="color: #cc7832">class</span> <span style="color: #ffc66d">Bootstrapper</span> : <span style="color: #6897bb">IBootstrapper</span></p><p style="margin: 0px">&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">public</span> <span style="color: #cc7832">void</span> BootstrapStructureMap()</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #ffc66d">ObjectFactory</span><span style="font-weight: normal">.Initialize( x =&gt; x.AddRegistry( </span><span style="color: #cc7832">new</span> <span style="color: #ffc66d">MPBlogRegistry</span>() ));</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">public</span> <span style="color: #cc7832">static</span> <span style="color: #cc7832">void</span> Bootstrap()</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">new</span> <span style="color: #ffc66d">Bootstrapper</span>().BootstrapStructureMap();</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p style="margin: 0px">&#160;&#160;&#160; }</p><p style="margin: 0px">}</p></div></pre>

<pre class="ncode"><div style="font-weight: bold; font-size: 10pt; background: #1e1e1e; color: silver; font-family: consolas"><p style="margin: 0px"><span style="color: #cc7832">using</span> System.Configuration;</p><p style="margin: 0px">&#160;</p><p style="margin: 0px"><span style="color: #cc7832">namespace</span> MPBlog.Web.UI</p><p style="margin: 0px">{</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> Core.BaseClasses;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> Core.Services;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> FluentNHibernate;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> Persistence;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> Persistence.Config;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> Persistence.RepositoryImpl;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> Persistence.UnitOfWork;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> StructureMap.Attributes;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> StructureMap.Configuration.DSL;</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">public</span> <span style="color: #cc7832">class</span> <span style="color: #ffc66d">MPBlogRegistry</span> : <span style="color: #ffc66d">Registry</span></p><p style="margin: 0px">&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">public</span> MPBlogRegistry()</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ForRequestedType&lt;<span style="color: #6897bb">ISessionSource</span><span style="font-weight: normal">&gt;().AsSingletons()</span></p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .TheDefault.Is.ConstructedBy( context =&gt;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; context.GetInstance&lt;<span style="color: #6897bb">ISessionSourceConfiguration</span><span style="font-weight: normal">&gt;()</span></p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .CreateSessionSource( <span style="color: #cc7832">new</span> <span style="color: #ffc66d">MPBlogPersistenceModel</span>() ) );</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ForRequestedType&lt;<span style="color: #6897bb">ISessionSourceConfiguration</span><span style="font-weight: normal">&gt;().AsSingletons()</span></p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .TheDefault.Is.OfConcreteType&lt;<span style="color: #ffc66d">SQLSessionSourceConfiguration</span><span style="font-weight: normal">&gt;()</span></p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .WithCtorArg( <span style="color: #a5c25c">&quot;connectionString&quot;</span> )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .EqualTo( <span style="color: #ffc66d">ConfigurationManager</span><span style="font-weight: normal">.ConnectionStrings[</span><span style="color: #a5c25c">&quot;MPBlog&quot;</span>].ConnectionString )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .WithCtorArg( <span style="color: #a5c25c">&quot;resetDb&quot;</span> )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .EqualToAppSetting( <span style="color: #a5c25c">&quot;reset&quot;</span> );</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ForRequestedType&lt;<span style="color: #6897bb">IUnitOfWork</span><span style="font-weight: normal">&gt;()</span></p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .TheDefault.Is.ConstructedBy( context =&gt; context.GetInstance&lt;<span style="color: #6897bb">INHibernateUnitOfWork</span><span style="font-weight: normal">&gt;() );</span></p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ForRequestedType&lt;<span style="color: #6897bb">INHibernateUnitOfWork</span><span style="font-weight: normal">&gt;().CacheBy( </span><span style="color: #6897bb">InstanceScope</span><span style="font-weight: normal">.Hybrid )</span></p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .TheDefault.Is.OfConcreteType&lt;<span style="color: #ffc66d">NHibernateUnitOfWork</span><span style="font-weight: normal">&gt;();</span></p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ForRequestedType&lt;<span style="color: #6897bb">IRepository</span><span style="font-weight: normal">&gt;().AsSingletons()</span></p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .TheDefault.Is.OfConcreteType&lt;<span style="color: #ffc66d">NHRepository</span><span style="font-weight: normal">&gt;();</span></p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ForRequestedType&lt;<span style="color: #6897bb">IBlogService</span><span style="font-weight: normal">&gt;().AsSingletons()</span></p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .TheDefault.Is.OfConcreteType&lt;<span style="color: #ffc66d">BlogService</span><span style="font-weight: normal">&gt;();</span></p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p style="margin: 0px">&#160;&#160;&#160; }</p><p style="margin: 0px">}</p></div></pre>

<p>Once this is done whenever we ask for a instance of an object, the IoC toll will lookup and give us the concerned concrete object.</p>

<p>Thats it for now.</p>]]></description>
         <link><![CDATA[http://www.simplyvinay.com/Post/51/MPBlog-Implementation.-Part-5.aspx]]></link>
         <pubDate>Tue, 23 Jun 2009 13:57:00 GMT</pubDate>
      </item>
   
      <item>
         <title><![CDATA[MPBlog Implementation. Part 4]]></title>
         <author><![CDATA[vinay]]></author>
         <description><![CDATA[<p><em><font size="3">NHibernate </font></em><em><font size="3">Repository and Unit Of Work</font></em></p>  <p>In my previous <a href="/Post/49/MPBlog-Implementation.-Part-3.aspx" target="_blank">post</a> we looked at the domain model and the class maps associated with it. In this post lets look at the Repository and Unit Of Work implementations.</p>  <p><em>Note:</em> The following is based on the FubuMVC contrib <a href="http://code.google.com/p/fubumvc-contrib/">project</a>.</p>  <p><u><em>IRepository</em></u></p>  <p>A repository is an abstraction layer which gives your application an in memory domain object collection. This layer helps in making you application agnostic about where the data is coming from or where it is persisted into. It could well be a flat file or any other RDBMS. Preferably each of your domain object would have its own repository. But for the sake of keeping it simple, I am using a generic repository in the following code.</p>  <pre class="ncode"><div style="background: rgb(30, 30, 30) none repeat scroll 0% 0%; font-weight: bold; font-size: 10pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: silver; font-family: consolas;"><p style="margin: 0px;"><span style="color: rgb(204, 120, 50);">namespace</span> MPBlog.Core.BaseClasses</p><p style="margin: 0px;">{</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">using</span> System;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">using</span> System.Linq;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">using</span> System.Linq.Expressions;</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">public</span> <span style="color: rgb(204, 120, 50);">interface</span> <span style="color: rgb(104, 151, 187);">IRepository</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; T Load&lt;T&gt;( <span style="color: rgb(204, 120, 50);">int</span> id ) <span style="color: rgb(204, 120, 50);">where</span> T : <span style="color: rgb(255, 198, 109);">Entity</span><span style="font-weight: normal;">&lt;T&gt;;</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">void</span> Delete&lt;T&gt;( T target );</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">void</span> Save&lt;T&gt;( T target );</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(104, 151, 187);">IQueryable</span><span style="font-weight: normal;">&lt;T&gt; Query&lt;T&gt;() </span><span style="color: rgb(204, 120, 50);">where</span> T : <span style="color: rgb(255, 198, 109);">Entity</span><span style="font-weight: normal;">&lt;T&gt;;</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(104, 151, 187);">IQueryable</span><span style="font-weight: normal;">&lt;T&gt; Query&lt;T&gt;( </span><span style="color: rgb(255, 198, 109);">Expression</span><span style="font-weight: normal;">&lt;</span><span style="color: rgb(104, 151, 187);">Func</span><span style="font-weight: normal;">&lt;T, </span><span style="color: rgb(204, 120, 50);">bool</span><span style="font-weight: normal;">&gt;&gt; whereQuery ) </span><span style="color: rgb(204, 120, 50);">where</span> T : <span style="color: rgb(255, 198, 109);">Entity</span><span style="font-weight: normal;">&lt;T&gt;;</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">}</p></div></pre>

<p>The Query methods here will be implemented using <a href="http://sourceforge.net/projects/nhcontrib/" target="_blank">Linq to NHibernate</a>. Now that we have the interface, lets look at the implementation.</p>

<p><u><em>NHRepository</em></u></p>

<pre class="ncode"><div style="background: rgb(30, 30, 30) none repeat scroll 0% 0%; font-weight: bold; font-size: 10pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: silver; font-family: consolas;"><p style="margin: 0px;"><span style="color: rgb(204, 120, 50);">namespace</span> MPBlog.Persistence.RepositoryImpl</p><p style="margin: 0px;">{</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">using</span> System;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">using</span> System.Linq;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">using</span> System.Linq.Expressions;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">using</span> Core.BaseClasses;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">using</span> NHibernate.Linq;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">using</span> UnitOfWork;</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">public</span> <span style="color: rgb(204, 120, 50);">class</span> <span style="color: rgb(255, 198, 109);">NHRepository</span> : <span style="color: rgb(104, 151, 187);">IRepository</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">private</span> <span style="color: rgb(104, 151, 187);">INHibernateUnitOfWork</span> _unitOfWork;</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">public</span> NHRepository( <span style="color: rgb(104, 151, 187);">INHibernateUnitOfWork</span> unitOfWork )</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _unitOfWork = unitOfWork;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">public</span> T Load&lt;T&gt;( <span style="color: rgb(204, 120, 50);">int</span> id ) <span style="color: rgb(204, 120, 50);">where</span> T : <span style="color: rgb(255, 198, 109);">Entity</span><span style="font-weight: normal;">&lt;T&gt;</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">return</span> _unitOfWork.Session.Load&lt;T&gt;( id );</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">public</span> <span style="color: rgb(204, 120, 50);">void</span> Delete&lt;T&gt;(T target)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _unitOfWork.Session.Delete( target );</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">public</span> <span style="color: rgb(204, 120, 50);">void</span> Save&lt;T&gt;(T target)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _unitOfWork.Session.Save( target );</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">public</span> <span style="color: rgb(104, 151, 187);">IQueryable</span><span style="font-weight: normal;">&lt;T&gt; Query&lt;T&gt;() </span><span style="color: rgb(204, 120, 50);">where</span> T : <span style="color: rgb(255, 198, 109);">Entity</span><span style="font-weight: normal;">&lt;T&gt;</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">return</span> _unitOfWork.Session.Linq&lt;T&gt;();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">public</span> <span style="color: rgb(104, 151, 187);">IQueryable</span><span style="font-weight: normal;">&lt;T&gt; Query&lt;T&gt;(</span><span style="color: rgb(255, 198, 109);">Expression</span><span style="font-weight: normal;">&lt;</span><span style="color: rgb(104, 151, 187);">Func</span><span style="font-weight: normal;">&lt;T, </span><span style="color: rgb(204, 120, 50);">bool</span><span style="font-weight: normal;">&gt;&gt; whereQuery) </span><span style="color: rgb(204, 120, 50);">where</span> T : <span style="color: rgb(255, 198, 109);">Entity</span><span style="font-weight: normal;">&lt;T&gt;</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">return</span> _unitOfWork.Session.Linq&lt;T&gt;().Where( whereQuery );</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">}</p></div></pre>

<p>If you notice the above code, we are accessing the <em>session </em>through the unitofwork. A unit of work helps in keeping track of all the objects that are affect by a business transaction. Following is the implementation of the UnitOfWork.</p>

<p><u><em>IUnitOfWork and INHibernateUnitOfWork</em></u></p>

<pre class="ncode"><div style="background: rgb(30, 30, 30) none repeat scroll 0% 0%; font-weight: bold; font-size: 10pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: silver; font-family: consolas;"><p style="margin: 0px;"><span style="color: rgb(204, 120, 50);">namespace</span> MPBlog.Core.BaseClasses</p><p style="margin: 0px;">{</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">using</span> System;</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">public</span> <span style="color: rgb(204, 120, 50);">interface</span> <span style="color: rgb(104, 151, 187);">IUnitOfWork</span> : <span style="color: rgb(104, 151, 187);">IDisposable</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">void</span> Initialize();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">void</span> Commit();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">void</span> Rollback();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">}</p></div></pre>

<pre class="ncode"><div style="background: rgb(30, 30, 30) none repeat scroll 0% 0%; font-weight: bold; font-size: 10pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: silver; font-family: consolas;"><p style="margin: 0px;"><span style="color: rgb(204, 120, 50);">namespace</span> MPBlog.Persistence.UnitOfWork</p><p style="margin: 0px;">{</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">using</span> Core.BaseClasses;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">using</span> NHibernate;</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">public</span> <span style="color: rgb(204, 120, 50);">interface</span> <span style="color: rgb(104, 151, 187);">INHibernateUnitOfWork</span> : <span style="color: rgb(104, 151, 187);">IUnitOfWork</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(104, 151, 187);">ISession</span> Session { <span style="color: rgb(204, 120, 50);">get</span>; }</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">}</p></div></pre>

<p><u><em>NHibernateUnitOfWork</em></u></p>

<pre class="ncode"><div style="background: rgb(30, 30, 30) none repeat scroll 0% 0%; font-weight: bold; font-size: 10pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: silver; font-family: consolas;"><p style="margin: 0px;"><span style="color: rgb(204, 120, 50);">namespace</span> MPBlog.Persistence.UnitOfWork</p><p style="margin: 0px;">{</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">using</span> System;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">using</span> FluentNHibernate;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">using</span> NHibernate;</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">public</span> <span style="color: rgb(204, 120, 50);">class</span> <span style="color: rgb(255, 198, 109);">NHibernateUnitOfWork</span> : <span style="color: rgb(104, 151, 187);">INHibernateUnitOfWork</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">private</span> <span style="color: rgb(104, 151, 187);">ITransaction</span> _transaction;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">private</span> <span style="color: rgb(204, 120, 50);">readonly</span> <span style="color: rgb(104, 151, 187);">ISessionSource</span> _source;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">private</span> <span style="color: rgb(204, 120, 50);">bool</span> _isDisposed;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">private</span> <span style="color: rgb(204, 120, 50);">bool</span> _isInitialized;</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">public</span> <span style="color: rgb(104, 151, 187);">ISession</span> Session { <span style="color: rgb(204, 120, 50);">get</span>; <span style="color: rgb(204, 120, 50);">private</span> <span style="color: rgb(204, 120, 50);">set</span>; }</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">public</span> NHibernateUnitOfWork( <span style="color: rgb(104, 151, 187);">ISessionSource</span> source )</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _source = source;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">public</span> <span style="color: rgb(204, 120, 50);">void</span> Initialize()</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CheckUoWSanity();</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Session = _source.CreateSession();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StartNewTransaction();</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _isInitialized = <span style="color: rgb(204, 120, 50);">true</span>;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">public</span> <span style="color: rgb(204, 120, 50);">void</span> Commit()</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CheckUoWSanity();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CheckUoWInitialization();</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _transaction.Commit();</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StartNewTransaction();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">public</span> <span style="color: rgb(204, 120, 50);">void</span> Rollback()</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CheckUoWSanity();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CheckUoWInitialization();</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _transaction.Rollback();</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StartNewTransaction();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">public</span> <span style="color: rgb(204, 120, 50);">void</span> Dispose()</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">if</span>( _isDisposed || !_isInitialized )</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">return</span>;</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _transaction.Dispose();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Session.Dispose();</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _isDisposed = <span style="color: rgb(204, 120, 50);">true</span>;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">private</span> <span style="color: rgb(204, 120, 50);">void</span> CheckUoWSanity()</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">if</span>( _isDisposed )</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">throw</span> <span style="color: rgb(204, 120, 50);">new</span> <span style="color: rgb(255, 198, 109);">ObjectDisposedException</span>( <span style="color: rgb(165, 194, 92);">"Trying to use disposed object"</span> );</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">private</span> <span style="color: rgb(204, 120, 50);">void</span> CheckUoWInitialization()</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">if</span>( !_isInitialized )</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">throw</span> <span style="color: rgb(204, 120, 50);">new</span> <span style="color: rgb(255, 198, 109);">InvalidOperationException</span>( <span style="color: rgb(165, 194, 92);">"NHibernateUnitOfWork is not initialized"</span> );</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">private</span> <span style="color: rgb(204, 120, 50);">void</span> StartNewTransaction()</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">if</span>( _transaction != <span style="color: rgb(204, 120, 50);">null</span> )</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _transaction.Dispose();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _transaction = Session.BeginTransaction();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">}</p></div></pre>

<p><u><em>Tests</em></u></p>

<p>Following are the test that were written for both the repository and unitofwork. I am using <a href="http://code.google.com/p/moq/" target="_blank">MoQ</a> as my mocking framework so that I don't have to connect to the actual database when testing.</p>

<pre class="ncode"><div style="background: rgb(30, 30, 30) none repeat scroll 0% 0%; font-weight: bold; font-size: 10pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: silver; font-family: consolas;"><p style="margin: 0px;"><span style="color: rgb(204, 120, 50);">namespace</span> MPBlog.Tests.Persistence.Tests</p><p style="margin: 0px;">{</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">using</span> System.Linq;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">using</span> Core.Domain;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">using</span> Moq;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">using</span> MPBlog.Persistence.RepositoryImpl;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">using</span> MPBlog.Persistence.UnitOfWork;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">using</span> NHibernate;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">using</span> Xunit;</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">public</span> <span style="color: rgb(204, 120, 50);">class</span> <span style="color: rgb(255, 198, 109);">RepositoryTests</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">private</span> <span style="color: rgb(255, 198, 109);">Mock</span><span style="font-weight: normal;">&lt;</span><span style="color: rgb(104, 151, 187);">ISession</span><span style="font-weight: normal;">&gt; _session;</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">private</span> <span style="color: rgb(255, 198, 109);">Mock</span><span style="font-weight: normal;">&lt;</span><span style="color: rgb(104, 151, 187);">INHibernateUnitOfWork</span><span style="font-weight: normal;">&gt; _uow;</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">private</span> <span style="color: rgb(255, 198, 109);">Mock</span><span style="font-weight: normal;">&lt;</span><span style="color: rgb(255, 198, 109);">NHRepository</span><span style="font-weight: normal;">&gt; _repo;</span></p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">public</span> RepositoryTests()</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _session = <span style="color: rgb(204, 120, 50);">new</span> <span style="color: rgb(255, 198, 109);">Mock</span><span style="font-weight: normal;">&lt;</span><span style="color: rgb(104, 151, 187);">ISession</span><span style="font-weight: normal;">&gt;();</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _uow = <span style="color: rgb(204, 120, 50);">new</span> <span style="color: rgb(255, 198, 109);">Mock</span><span style="font-weight: normal;">&lt;</span><span style="color: rgb(104, 151, 187);">INHibernateUnitOfWork</span><span style="font-weight: normal;">&gt;();</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _uow.Setup( u =&gt; u.Session ).Returns( _session.Object );</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _repo = <span style="color: rgb(204, 120, 50);">new</span> <span style="color: rgb(255, 198, 109);">Mock</span><span style="font-weight: normal;">&lt;</span><span style="color: rgb(255, 198, 109);">NHRepository</span><span style="font-weight: normal;">&gt;( _uow.Object );</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [<span style="color: rgb(255, 198, 109);">Fact</span>]</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">public</span> <span style="color: rgb(204, 120, 50);">void</span> Call_to_load_should_load_object_from_the_session()</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">var</span> postId = <span style="color: rgb(104, 151, 187);">1</span>;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _repo.Object.Load&lt;<span style="color: rgb(255, 198, 109);">Post</span><span style="font-weight: normal;">&gt;( postId );</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _session.Verify( s =&gt; s.Load&lt;<span style="color: rgb(255, 198, 109);">Post</span><span style="font-weight: normal;">&gt;( postId ), </span><span style="color: rgb(255, 198, 109);">Times</span><span style="font-weight: normal;">.AtLeastOnce() );</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [<span style="color: rgb(255, 198, 109);">Fact</span>]</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">public</span> <span style="color: rgb(204, 120, 50);">void</span> Call_to_save_should_save_object_on_the_session()</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">var</span> post = <span style="color: rgb(204, 120, 50);">new</span> <span style="color: rgb(255, 198, 109);">Post</span>();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _repo.Object.Save( post );</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _session.Verify( s =&gt; s.SaveOrUpdate( post ), <span style="color: rgb(255, 198, 109);">Times</span><span style="font-weight: normal;">.AtLeastOnce() );</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [<span style="color: rgb(255, 198, 109);">Fact</span>]</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">public</span> <span style="color: rgb(204, 120, 50);">void</span> Call_to_delete_should_delete_object_from_the_session()</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">var</span> post = <span style="color: rgb(204, 120, 50);">new</span> <span style="color: rgb(255, 198, 109);">Post</span>();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _repo.Object.Delete( post );</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _session.Verify( s =&gt; s.Delete( post ), <span style="color: rgb(255, 198, 109);">Times</span><span style="font-weight: normal;">.AtLeastOnce() );</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [<span style="color: rgb(255, 198, 109);">Fact</span>]</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">public</span> <span style="color: rgb(204, 120, 50);">void</span> Call_to_query_on_session_should_return_an_IQueryable_object()</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(255, 198, 109);">Assert</span><span style="font-weight: normal;">.IsAssignableFrom( </span><span style="color: rgb(204, 120, 50);">typeof</span>( <span style="color: rgb(104, 151, 187);">IQueryable</span><span style="font-weight: normal;">&lt;</span><span style="color: rgb(255, 198, 109);">Post</span><span style="font-weight: normal;">&gt; ), _repo.Object.Query&lt;</span><span style="color: rgb(255, 198, 109);">Post</span><span style="font-weight: normal;">&gt;() );</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">}</p></div></pre>

<pre class="ncode"><div style="background: rgb(30, 30, 30) none repeat scroll 0% 0%; font-weight: bold; font-size: 10pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: silver; font-family: consolas;"><p style="margin: 0px;"><span style="color: rgb(204, 120, 50);">namespace</span> MPBlog.Tests.Persistence.Tests</p><p style="margin: 0px;">{</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">using</span> FluentNHibernate;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">using</span> Moq;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">using</span> MPBlog.Persistence.UnitOfWork;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">using</span> NHibernate;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">using</span> Xunit;</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">public</span> <span style="color: rgb(204, 120, 50);">class</span> <span style="color: rgb(255, 198, 109);">UnitOfWorkTests</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">protected</span> <span style="color: rgb(255, 198, 109);">Mock</span><span style="font-weight: normal;">&lt;</span><span style="color: rgb(104, 151, 187);">ISession</span><span style="font-weight: normal;">&gt; _session;</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">protected</span> <span style="color: rgb(255, 198, 109);">Mock</span><span style="font-weight: normal;">&lt;</span><span style="color: rgb(104, 151, 187);">ITransaction</span><span style="font-weight: normal;">&gt; _transaction;</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">protected</span> <span style="color: rgb(255, 198, 109);">Mock</span><span style="font-weight: normal;">&lt;</span><span style="color: rgb(104, 151, 187);">ISessionSource</span><span style="font-weight: normal;">&gt; _sessionSource;</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">protected</span> <span style="color: rgb(255, 198, 109);">Mock</span><span style="font-weight: normal;">&lt;</span><span style="color: rgb(255, 198, 109);">NHibernateUnitOfWork</span><span style="font-weight: normal;">&gt; _uow;</span></p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">public</span> UnitOfWorkTests()</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _session = <span style="color: rgb(204, 120, 50);">new</span> <span style="color: rgb(255, 198, 109);">Mock</span><span style="font-weight: normal;">&lt;</span><span style="color: rgb(104, 151, 187);">ISession</span><span style="font-weight: normal;">&gt;();</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _transaction = <span style="color: rgb(204, 120, 50);">new</span> <span style="color: rgb(255, 198, 109);">Mock</span><span style="font-weight: normal;">&lt;</span><span style="color: rgb(104, 151, 187);">ITransaction</span><span style="font-weight: normal;">&gt;();</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _sessionSource = <span style="color: rgb(204, 120, 50);">new</span> <span style="color: rgb(255, 198, 109);">Mock</span><span style="font-weight: normal;">&lt;</span><span style="color: rgb(104, 151, 187);">ISessionSource</span><span style="font-weight: normal;">&gt;();</span></p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _sessionSource.Setup( s =&gt; s.CreateSession() ).Returns( _session.Object );</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _session.Setup( s =&gt; s.BeginTransaction() ).Returns( _transaction.Object );</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _uow = <span style="color: rgb(204, 120, 50);">new</span> <span style="color: rgb(255, 198, 109);">Mock</span><span style="font-weight: normal;">&lt;</span><span style="color: rgb(255, 198, 109);">NHibernateUnitOfWork</span><span style="font-weight: normal;">&gt;( _sessionSource.Object );</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _uow.Object.Initialize();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [<span style="color: rgb(255, 198, 109);">Fact</span>]</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">public</span> <span style="color: rgb(204, 120, 50);">void</span> Can_create_new_transaction()</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _session.Verify( s =&gt; s.BeginTransaction(), <span style="color: rgb(255, 198, 109);">Times</span><span style="font-weight: normal;">.AtLeastOnce() );</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [<span style="color: rgb(255, 198, 109);">Fact</span>]</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">public</span> <span style="color: rgb(204, 120, 50);">void</span> Can_dispose_the_transaction()</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _uow.Object.Dispose();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _transaction.Verify( s =&gt; s.Dispose(), <span style="color: rgb(255, 198, 109);">Times</span><span style="font-weight: normal;">.Exactly( </span><span style="color: rgb(104, 151, 187);">1</span> ) );</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [<span style="color: rgb(255, 198, 109);">Fact</span>]</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">public</span> <span style="color: rgb(204, 120, 50);">void</span> Can_dispose_the_session()</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _uow.Object.Dispose();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _session.Verify( s =&gt; s.Dispose(), <span style="color: rgb(255, 198, 109);">Times</span><span style="font-weight: normal;">.Exactly( </span><span style="color: rgb(104, 151, 187);">1</span> ) );</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [<span style="color: rgb(255, 198, 109);">Fact</span>]</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">public</span> <span style="color: rgb(204, 120, 50);">void</span> Call_to_commit_should_commit_the_transaction()</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _uow.Object.Commit();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _transaction.Verify( t =&gt; t.Commit(), <span style="color: rgb(255, 198, 109);">Times</span><span style="font-weight: normal;">.AtLeastOnce() );</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [<span style="color: rgb(255, 198, 109);">Fact</span>]</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">public</span> <span style="color: rgb(204, 120, 50);">void</span> Call_to_commit_should_dispose_the_transaction_and_start_a_new_transaction()</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _uow.Object.Commit();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _transaction.Verify( t =&gt; t.Dispose(), <span style="color: rgb(255, 198, 109);">Times</span><span style="font-weight: normal;">.Exactly( </span><span style="color: rgb(104, 151, 187);">1</span> ) );</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _session.Verify( s =&gt; s.BeginTransaction(), <span style="color: rgb(255, 198, 109);">Times</span><span style="font-weight: normal;">.Exactly( </span><span style="color: rgb(104, 151, 187);">2</span> ) );</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [<span style="color: rgb(255, 198, 109);">Fact</span>]</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">public</span> <span style="color: rgb(204, 120, 50);">void</span> Call_to_rollback_should_rollback_the_transaction()</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _uow.Object.Rollback();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _transaction.Verify( t =&gt; t.Rollback(), <span style="color: rgb(255, 198, 109);">Times</span><span style="font-weight: normal;">.AtLeastOnce() );</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [<span style="color: rgb(255, 198, 109);">Fact</span>]</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 120, 50);">public</span> <span style="color: rgb(204, 120, 50);">void</span> Call_to_rollback_should_dispose_the_transaction_and_start_a_new_transaction()</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _uow.Object.Rollback();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _transaction.Verify( t =&gt; t.Dispose(), <span style="color: rgb(255, 198, 109);">Times</span><span style="font-weight: normal;">.Exactly( </span><span style="color: rgb(104, 151, 187);">1</span> ) );</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _session.Verify( s =&gt; s.BeginTransaction(), <span style="color: rgb(255, 198, 109);">Times</span><span style="font-weight: normal;">.Exactly( </span><span style="color: rgb(104, 151, 187);">2</span> ) );</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">}</p></div></pre>]]></description>
         <link><![CDATA[http://www.simplyvinay.com/Post/50/MPBlog-Implementation.-Part-4.aspx]]></link>
         <pubDate>Mon, 18 May 2009 00:00:00 GMT</pubDate>
      </item>
   
      <item>
         <title><![CDATA[MPBlog Implementation. Part 3]]></title>
         <author><![CDATA[vinay]]></author>
         <description><![CDATA[<p><em><font size="3">Mapping The Classes And Session Source Configuration</font></em></p>  <p>As mentioned in my previous <a href="http://www.simplyvinay.com/Post/48/A-Brief-Intermission.aspx" target="_blank">post</a>, this series will no longer be a talk about DDD as a blog app is too trivial to show ( learn ) the power of it. I will be using some of the patterns of DDD though. So I have changed the name of the app I am building. It will be called MyPersonalBlog ( MPBlog ) henceforth.</p>  <p>The project structure has changed a bit from what I had shown <a href="http://www.simplyvinay.com/Post/46/DDDBlog-Implementation.-Part-1.aspx" target="_blank">here</a>. There is no longer separate layers for infrastructure and domain. I have clubbed these 2 layers into a single Core layer. The other layers are just the same. </p>  <p>Lets get started by creating our domain objects.</p>  <p><u><em>The domain objects</em></u></p>  <p>So far we have created a entity base class from which all our domain ( models ) will inherit from. In a blog application, we’ll have posts, tags and comments. So lets create classes for each of these. I have created these classes as shown in the class diagram below.</p>  <p><a href="http://www.simplyvinay.com/images/blogimages/MPBlogImplementation.Part3_8497/ClassDiagram.png"><img title="ClassDiagram" style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" height="332" alt="ClassDiagram" src="http://www.simplyvinay.com/images/blogimages/MPBlogImplementation.Part3_8497/ClassDiagram_thumb.png" width="450" border="0" /></a></p>  <p>From the diagram you can see that there is a many-to-many relation between Tag and Post class..</p>  <p><u><em>Domain mappings</em></u></p>  <p>I am using <a href="http://fluentnhibernate.org/" target="_blank">Fluent NHibernate</a> to configure the mappings of these classes to the database. Although you can map all the classes using the <a href="http://wiki.fluentnhibernate.org/show/AutoMapping" target="_blank">automapping</a> feature which has a convention based API, I will use the mapping per class feature. Lets look at the mappings.</p>  <p><u><em>PostMap</em></u></p>  <pre class="ncode"><div style="font-weight: bold; font-size: 10pt; background: #1e1e1e; color: silver; font-family: consolas"><p style="margin: 0px"><span style="color: #cc7832">namespace</span> MPBlog.Persistence.DomainMap</p><p style="margin: 0px">{</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> Core.Domain;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> FluentNHibernate.Mapping;</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">public</span> <span style="color: #cc7832">class</span> <span style="color: #ffc66d">PostMap</span> : <span style="color: #ffc66d">ClassMap</span><span style="font-weight: normal">&lt;</span><span style="color: #ffc66d">Post</span><span style="font-weight: normal">&gt;</span></p><p style="margin: 0px">&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">public</span> PostMap()</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; WithTable( <span style="color: #a5c25c">&quot;Posts&quot;</span> );</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Id( p =&gt; p.Id, <span style="color: #a5c25c">&quot;PostId&quot;</span> )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .WithUnsavedValue( <span style="color: #6897bb">0</span> )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .Access.AsReadOnlyPropertyThroughCamelCaseField()</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .GeneratedBy.Identity();</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Map( p =&gt; p.PostTitle ).Not.Nullable();</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #5eaeae">//will be created as nvarchar(max)</span></p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Map( p =&gt; p.PostText ).Not.Nullable()</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .WithLengthOf( <span style="color: #6897bb">4001</span> );</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Map( p =&gt; p.ExcerptText ).Not.Nullable()</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .WithLengthOf( <span style="color: #6897bb">1000</span> );</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Map( p =&gt; p.PostSlug ).Unique();</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Map( p =&gt; p.AddedBy ).Not.Nullable();</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Map( p =&gt; p.PublishDate );</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #5eaeae">// Many to many with an intermediate table ( PostsToTags )</span></p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; HasManyToMany( p =&gt; p.Tags )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .WithTableName( <span style="color: #a5c25c">&quot;PostsToTags&quot;</span> )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .Cascade.SaveUpdate();</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; HasMany( p =&gt; p.Comments )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .WithTableName( <span style="color: #a5c25c">&quot;Comments&quot;</span> )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .Cascade.All().Inverse();</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p style="margin: 0px">&#160;&#160;&#160; }</p><p style="margin: 0px">}</p></div></pre>

<p>We create a PostMap class which inherits from the ClassMap&lt;T&gt;. The constructor of this PostMap class is where all out mappings go. As can be seen, first we specify the table name for our Posts, Then we specify the Id property which is mapped to the PostId column in our database. The Id in our case is the id that we had declared in the Entity base class ( I have renamed the Key property to Id ). If you recall from my previous <a href="http://www.simplyvinay.com/Post/47/DDDBlog-Implementation.-Part-2.aspx" target="_blank">post</a>, it had only the getter property. The value is assigned by NHibernate. We specify a many to many relation between posts and tags through an intermediate table PostToTags. We have also specified that a post has many comments thought the Comments table The other mappings are self explanatory.</p>

<p>Out Tag and Comment mapping classes look similar to the one above. Following are the two mapping files for these.</p>

<p><u><em>TagMap</em></u></p>

<pre class="ncode"><div style="font-weight: bold; font-size: 10pt; background: #1e1e1e; color: silver; font-family: consolas"><p style="margin: 0px"><span style="color: #cc7832">namespace</span> MPBlog.Persistence.DomainMap</p><p style="margin: 0px">{</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> Core.Domain;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> FluentNHibernate.Mapping;</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">public</span> <span style="color: #cc7832">class</span> <span style="color: #ffc66d">TagMap</span> : <span style="color: #ffc66d">ClassMap</span><span style="font-weight: normal">&lt;</span><span style="color: #ffc66d">Tag</span><span style="font-weight: normal">&gt;</span></p><p style="margin: 0px">&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">public</span> TagMap()</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; WithTable( <span style="color: #a5c25c">&quot;Tags&quot;</span> );</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Id( t =&gt; t.Id, <span style="color: #a5c25c">&quot;TagId&quot;</span> )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .WithUnsavedValue( <span style="color: #6897bb">0</span> )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .Access.AsReadOnlyPropertyThroughCamelCaseField()</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .GeneratedBy.Identity();</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Map( t =&gt; t.Description ).Not.Nullable();</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Map( t =&gt; t.CreatedDate );</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; HasManyToMany( t =&gt; t.Posts )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .WithTableName( <span style="color: #a5c25c">&quot;PostsToTags&quot;</span> )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .Cascade.SaveUpdate();</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p style="margin: 0px">&#160;&#160;&#160; }</p><p style="margin: 0px">}</p></div></pre>

<p><u><em>CommentMap</em></u></p>

<pre class="ncode"><div style="font-weight: bold; font-size: 10pt; background: #1e1e1e; color: silver; font-family: consolas"><p style="margin: 0px"><span style="color: #cc7832">namespace</span> MPBlog.Persistence.DomainMap</p><p style="margin: 0px">{</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> Core.Domain;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> FluentNHibernate.Mapping;</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">public</span> <span style="color: #cc7832">class</span> <span style="color: #ffc66d">CommentMap</span> : <span style="color: #ffc66d">ClassMap</span><span style="font-weight: normal">&lt;</span><span style="color: #ffc66d">Comment</span><span style="font-weight: normal">&gt;</span></p><p style="margin: 0px">&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">public</span> CommentMap()</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; WithTable( <span style="color: #a5c25c">&quot;Comments&quot;</span> );</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Id( c =&gt; c.Id )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .WithUnsavedValue( <span style="color: #6897bb">0</span> )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .Access.AsReadOnlyPropertyThroughCamelCaseField()</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .GeneratedBy.Identity();</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Map( c =&gt; c.Body ).Not.Nullable();</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Map( c =&gt; c.AuthorName ).Not.Nullable();</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Map( c =&gt; c.AuthorIP ).Not.Nullable();</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Map( c =&gt; c.AuthorEmail ).Not.Nullable();</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Map( c =&gt; c.AuthorUrl ).Not.Nullable();</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Map( c =&gt; c.AddedDate ).Not.Nullable();</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; References( c =&gt; c.Post )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .Not.Nullable()</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .Cascade.All();</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p style="margin: 0px">&#160;&#160;&#160; }</p><p style="margin: 0px">}</p></div></pre>

<p>Now that our mappings are done, lets create a SessionSource to access the NHibernate Session.</p>

<p>We can create a session through the ISessionSource interface in Fluent NHibernate. Lets create an interface for the SessionSourceConfiguration.</p>

<p><em>Note:</em> The following is based on the FubuMVC contrib <a href="http://code.google.com/p/fubumvc-contrib/" target="_blank">project</a>.</p>

<p><u><em>ISessionSourceConfiguration and <u><em>SessionSourceConfiguration</em></u></em></u></p>

<pre class="ncode"><div style="font-weight: bold; font-size: 10pt; background: #1e1e1e; color: silver; font-family: consolas"><p style="margin: 0px"><span style="color: #cc7832">namespace</span> MPBlog.Persistence.Config</p><p style="margin: 0px">{</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> FluentNHibernate;</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">public</span> <span style="color: #cc7832">interface</span> <span style="color: #6897bb">ISessionSourceConfiguration</span></p><p style="margin: 0px">&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">bool</span> ResetDatabase { <span style="color: #cc7832">get</span>; }</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #6897bb">ISessionSource</span> CreateSessionSource( <span style="color: #ffc66d">PersistenceModel</span> model );</p><p style="margin: 0px">&#160;&#160;&#160; }</p><p style="margin: 0px">}</p></div></pre>

<pre class="ncode"><div style="font-weight: bold; font-size: 10pt; background: #1e1e1e; color: silver; font-family: consolas"><p style="margin: 0px"><span style="color: #cc7832">namespace</span> MPBlog.Persistence.Config</p><p style="margin: 0px">{</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> System.Collections.Generic;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> FluentNHibernate;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> FluentNHibernate.Cfg.Db;</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">public</span> <span style="color: #cc7832">class</span> <span style="color: #ffc66d">SessionSourceConfiguration</span> : <span style="color: #6897bb">ISessionSourceConfiguration</span></p><p style="margin: 0px">&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">private</span> <span style="color: #cc7832">readonly</span> <span style="color: #cc7832">string</span> _connectionString;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">public</span> <span style="color: #cc7832">bool</span> ResetDatabase { <span style="color: #cc7832">get</span>; <span style="color: #cc7832">private</span> <span style="color: #cc7832">set</span>; }</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">public</span> SessionSourceConfiguration( <span style="color: #cc7832">string</span> connectionString, <span style="color: #cc7832">bool</span> resetDb )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _connectionString = connectionString;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ResetDatabase = resetDb;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">public</span> <span style="color: #6897bb">ISessionSource</span> CreateSessionSource( <span style="color: #ffc66d">PersistenceModel</span> model )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">var</span> properties = GetProperties( _connectionString );</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">var</span> source = <span style="color: #cc7832">new</span> <span style="color: #ffc66d">SessionSource</span>( properties, model );</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; CreateDbWithSchema( source );</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">return</span> source;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">public</span> <span style="color: #6897bb">IDictionary</span><span style="font-weight: normal">&lt;</span><span style="color: #cc7832">string</span>, <span style="color: #cc7832">string</span><span style="font-weight: normal">&gt; GetProperties( </span><span style="color: #cc7832">string</span> connectionString )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">return</span> <span style="color: #ffc66d">MsSqlConfiguration</span></p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .MsSql2005</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .ConnectionString( c =&gt; c.Is( connectionString ) )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .UseOuterJoin()</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .ShowSql()</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .ToProperties();</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">private</span> <span style="color: #cc7832">void</span> CreateDbWithSchema( <span style="color: #6897bb">ISessionSource</span> source )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">if</span>( ResetDatabase )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; source.BuildSchema();</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p style="margin: 0px">&#160;&#160;&#160; }</p><p style="margin: 0px">}</p></div></pre>

<p>The ResetDatabase property is used to either create a new database from our mappings or reset the database. We have a method called GetProperties from which we generate the connection properties.</p>

<p>As you can see in the CreateSessionSource method, we are passing a PersistenceModel object. This object is used to add the mapping from a specified assembly, in our case, where we have defined the Post, Tag and Comment maps. Lets call it MPBlogPersistenceModel. Here is what it looks like.</p>

<pre class="ncode"><div style="font-weight: bold; font-size: 10pt; background: #1e1e1e; color: silver; font-family: consolas"><p style="margin: 0px"><span style="color: #cc7832">using</span> FluentNHibernate;</p><p style="margin: 0px">&#160;</p><p style="margin: 0px"><span style="color: #cc7832">namespace</span> MPBlog.Persistence</p><p style="margin: 0px">{</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">public</span> <span style="color: #cc7832">class</span> <span style="color: #ffc66d">MPBlogPersistenceModel</span> : <span style="color: #ffc66d">PersistenceModel</span></p><p style="margin: 0px">&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">public</span> MPBlogPersistenceModel()</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; addMappingsFromThisAssembly();</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p style="margin: 0px">&#160;&#160;&#160; }</p><p style="margin: 0px">}</p></div></pre>

<p>The PresistenceModel object, connectionString, and resetDB parameters are injected using an IoC container which we’ll have a look in a later post.</p>

<p>Following are the tests I have written to check my mapping are correct. I am using an in memory SQLite database and the PersistenceSpecification&lt;T&gt; provided by Fluent NHibernate to check my mapping.</p>

<p><u><em>Mapping Tests</em></u></p>

<pre class="ncode"><div style="font-weight: bold; font-size: 10pt; background: #1e1e1e; color: silver; font-family: consolas"><p style="margin: 0px"><span style="color: #cc7832">namespace</span> MPBlog.Tests.Persistence.Tests</p><p style="margin: 0px">{</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> System;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> Core.Domain;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> FluentNHibernate;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> FluentNHibernate.Cfg.Db;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> FluentNHibernate.Testing;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> MPBlog.Persistence;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> NHibernate;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">using</span> Xunit;</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160; <span style="color: #cc7832">public</span> <span style="color: #cc7832">class</span> <span style="color: #ffc66d">PersistenceTests</span></p><p style="margin: 0px">&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">private</span> <span style="color: #6897bb">ISession</span> session;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">public</span> PersistenceTests()</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">var</span> persistenceModel = <span style="color: #cc7832">new</span> <span style="color: #ffc66d">MPBlogPersistenceModel</span>();</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">var</span> config = <span style="color: #cc7832">new</span> <span style="color: #ffc66d">SQLiteConfiguration</span>()</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .InMemory()</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .ConnectionString( c =&gt; c.Is( <span style="color: #a5c25c">&quot;Data Source=:memory:;Version=3;New=True;&quot;</span> ) )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .ShowSql();</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">var</span> sessionSource = <span style="color: #cc7832">new</span> <span style="color: #ffc66d">SessionSource</span>( config.ToProperties(), persistenceModel );</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; session = sessionSource.CreateSession();</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sessionSource.BuildSchema( session );</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; [<span style="color: #ffc66d">Fact</span>]</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">public</span> <span style="color: #cc7832">void</span> Post_mapping_test()</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">new</span> <span style="color: #ffc66d">PersistenceSpecification</span><span style="font-weight: normal">&lt;</span><span style="color: #ffc66d">Post</span><span style="font-weight: normal">&gt;( session )</span></p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .CheckProperty( p =&gt; p.AddedBy, <span style="color: #a5c25c">&quot;vinay&quot;</span> )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .CheckProperty( p =&gt; p.PostTitle, <span style="color: #a5c25c">&quot;title&quot;</span> )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .CheckProperty( p =&gt; p.PostText, <span style="color: #a5c25c">&quot;text&quot;</span> )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .CheckProperty( p =&gt; p.ExcerptText, <span style="color: #a5c25c">&quot;text&quot;</span> )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .CheckProperty( p =&gt; p.PostSlug, <span style="color: #a5c25c">&quot;slug&quot;</span> )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .CheckProperty( p =&gt; p.PublishDate, <span style="color: #6897bb">DateTime</span><span style="font-weight: normal">.Today )</span></p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .VerifyTheMappings();</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; [<span style="color: #ffc66d">Fact</span>]</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">public</span> <span style="color: #cc7832">void</span> Tag_mapping_test()</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">new</span> <span style="color: #ffc66d">PersistenceSpecification</span><span style="font-weight: normal">&lt;</span><span style="color: #ffc66d">Tag</span><span style="font-weight: normal">&gt;( session )</span></p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .CheckProperty( t =&gt; t.Description, <span style="color: #a5c25c">&quot;tag1&quot;</span> )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .CheckProperty( t =&gt; t.CreatedDate, <span style="color: #6897bb">DateTime</span><span style="font-weight: normal">.Today )</span></p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .VerifyTheMappings();</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p style="margin: 0px">&#160;</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; [<span style="color: #ffc66d">Fact</span>]</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">public</span> <span style="color: #cc7832">void</span> Comment_mapping_test()</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">new</span> <span style="color: #ffc66d">PersistenceSpecification</span><span style="font-weight: normal">&lt;</span><span style="color: #ffc66d">Comment</span><span style="font-weight: normal">&gt;( session )</span></p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .CheckProperty( c =&gt; c.AuthorEmail, <span style="color: #a5c25c">&quot;vinay@simplyvinay.com&quot;</span> )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .CheckProperty( c =&gt; c.AuthorIP, <span style="color: #a5c25c">&quot;127.0.0.1&quot;</span> )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .CheckProperty( c =&gt; c.AuthorName, <span style="color: #a5c25c">&quot;vinay&quot;</span> )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .CheckProperty( c =&gt; c.AuthorUrl, <span style="color: #a5c25c">&quot;www.simplyvinay.com&quot;</span> )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .CheckProperty( c =&gt; c.Body, <span style="color: #a5c25c">&quot;comment&quot;</span> )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .CheckProperty( c =&gt; c.AddedDate, <span style="color: #6897bb">DateTime</span><span style="font-weight: normal">.Today )</span></p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .CheckReference( c =&gt; c.Post,</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color: #cc7832">new</span> <span style="color: #ffc66d">Post</span></p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; AddedBy = <span style="color: #a5c25c">&quot;vinay&quot;</span>,</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; PostTitle = <span style="color: #a5c25c">&quot;title&quot;</span>,</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; PostText = <span style="color: #a5c25c">&quot;text&quot;</span>,</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ExcerptText = <span style="color: #a5c25c">&quot;text&quot;</span>,</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; PostSlug = <span style="color: #a5c25c">&quot;slug&quot;</span>,</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; PublishDate = <span style="color: #6897bb">DateTime</span><span style="font-weight: normal">.Today</span></p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } )</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .VerifyTheMappings();</p><p style="margin: 0px">&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p><p style="margin: 0px">&#160;&#160;&#160; }</p><p style="margin: 0px">}</p></div></pre>

<p>That's it for now. In my next post, I’ll discuss about the repository and the unit of work implementations. Any sort of feedback will be appreciated.</p>]]></description>
         <link><![CDATA[http://www.simplyvinay.com/Post/49/MPBlog-Implementation.-Part-3.aspx]]></link>
         <pubDate>Mon, 11 May 2009 03:27:00 GMT</pubDate>
      </item>
   
      <item>
         <title><![CDATA[Lazy Loading of Objects]]></title>
         <author><![CDATA[vinay]]></author>
         <description><![CDATA[Lazy loading of objects essentially means that the data is loaded only when requested and not when the object instance is created.<br><br>For Eg. suppose we have a Blog class which has a blogText property. Now this property can be encapsulated like so.<pre class="code"><!--
{\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue255;\red255\green255\blue255;\red0\green0\blue0;\red43\green145\blue175;}??\fs20 \cf1 public\cf0  \cf1 string\cf0  BlogText\par ??\{\par ??    \cf1 get\cf0  \par ??    \{\par ??        \cf1 if\cf0  (blogText == \cf1 null\cf0 )\par ??            blogText = \cf4 SiteProvider\cf0 .Blogs.GetBlogBody(Id);\par ??        \cf1 return\cf0  blogText; \par ??    \}\par ??    \cf1 set\cf0  \{ blogText = \cf1 value\cf0 ; \}\par ??\}}
-->
<div style="background: white none repeat scroll 0% 50%; font-family: Courier New; font-size: 10pt; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;&nbsp;1</span>&nbsp;<span style="color: blue;">public</span> <span style="color: blue;">string</span> BlogText</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;&nbsp;2</span>&nbsp;{</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;&nbsp;3</span>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">get</span> </p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;&nbsp;4</span>&nbsp;&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">if</span> (blogText == <span style="color: blue;">null</span>)</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; blogText = <span style="color: rgb(43, 145, 175);">SiteProvider</span>.Blogs.GetBlogBody(Id);</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">return</span> blogText; </p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">set</span> { blogText = <span style="color: blue;">value</span>; }</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;10</span>&nbsp;}</p></div></pre>Here the BlogText property implements the lazy load pattern which means that the blogText field is retrieved only when it's being accessed by another class. Hence if this property is not accessed from anywhere then the data will not be read from the database. Once the data is retrieved it will be held in memory for subsequent requests, hence i am checking if the value is null, if not then only hit the database and get the value.<br>]]></description>
         <link><![CDATA[http://www.simplyvinay.com/Post/3/Lazy-Loading-of-Objects.aspx]]></link>
         <pubDate>Mon, 23 Jun 2008 00:00:00 GMT</pubDate>
      </item>
   
         </channel>
      </rss>  
   
