<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-34047625</id><updated>2011-11-27T17:04:38.265-07:00</updated><category term='NHibernate'/><category term='DJ'/><title type='text'>e.zed</title><subtitle type='html'>"a moment on the lips, a lifetime on the hips..."</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.ezed.ca/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>64</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-34047625.post-1844054250315141353</id><published>2008-10-30T13:30:00.002-06:00</published><updated>2008-10-30T14:19:06.718-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NHibernate'/><title type='text'>NHibernate for the Lazies</title><content type='html'>I don't know about you, but sometimes if you want to learn a new framework, you want to see results right away. Most of the time, it never happens that way. Let's take &lt;a href="http://nhforge.org/"&gt;nHibernate&lt;/a&gt; as an example. For somebody that is very new, you go to tutorials, how to create one and hope it works. One thing that pissed me off when I was learning NH back in the days, was writing those .hbm files.&lt;br /&gt;&lt;br /&gt;Don't you wish there was an easy way to learn nHibernate, learn how to use sessions, transactions, unit of work, and all that good stuff? Ofcourse we have &lt;a href="http://code.google.com/p/fluent-nhibernate/"&gt;fluent-nhibernate&lt;/a&gt; as a good way to start up. But what if (1)you're using .net 2.0? (2)you don't like how integrated the mapping is with your application?&lt;br /&gt;&lt;br /&gt;One day, I decided to spike a generator that generates your .hbm on the fly based on your domain objects.&lt;br /&gt;&lt;br /&gt;Word of caution. I just used this as a spike, not a solution - More like a fast way of developing a small app without the pain of .hbm.xml files. Also, this exercise shows that you can have a domain model, totally ignorant how stuff is being saved to some kind of a persistance layer - hence mapping files. And finally it's totally doable to generate a mapping file on the fly based on your domain object.&lt;br /&gt;&lt;br /&gt;Now let's talk code. The way this exercise was done, I was taking advantage of the &lt;a href="http://en.wikipedia.org/wiki/Chain-of-responsibility_pattern"&gt;Chain of responsibilty&lt;/a&gt; pattern to build the mapping files.&lt;br /&gt;&lt;br /&gt;Before we go with any code, lets follow the basic rules:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Every .net data types are property &lt;property&gt; &lt;property&gt; elements&lt;/property&gt;&lt;/property&gt;&lt;/li&gt;&lt;li&gt;Every custom objects are many-to-one &lt;many-to-one&gt; &lt;many-to-one&gt; elements&lt;/many-to-one&gt;&lt;/many-to-one&gt;&lt;/li&gt;&lt;li&gt;Every IList&lt;t&gt;&lt;t&gt;&lt;&gt; are bag &lt;bag&gt; &lt;bag&gt; items&lt;/bag&gt;&lt;/bag&gt;&lt;/t&gt;&lt;/t&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;The Model&lt;br /&gt;&lt;textarea name="code" class="c#" cols="60" rows="10"&gt;&lt;br /&gt;public class Task&lt;br /&gt;{&lt;br /&gt;    public virtual int Id { get; set; }&lt;br /&gt;    public virtual User User { get; set; }&lt;br /&gt;    public virtual Priority Priority { get; set; }&lt;br /&gt;    public virtual string Description { get; set; }&lt;br /&gt;    public virtual string Status { get; set; }&lt;br /&gt;    public virtual IList&lt;comment&gt; Comments { get; set; }&lt;br /&gt;    public virtual DateTime CreatedDate { get; set; }&lt;br /&gt;    public virtual DateTime? CompletedDate { get; set; }&lt;br /&gt;}&lt;br /&gt;&lt;/textarea&gt;&lt;br /&gt;&lt;br /&gt;The Test&lt;br /&gt;&lt;textarea name="code" class="c#" cols="60" rows="10"&gt;&lt;br /&gt;[TestFixture]&lt;br /&gt;public class HbmFilesSuckTest&lt;br /&gt;{&lt;br /&gt;    private readonly string expected =&lt;br /&gt;        @"&lt;hibernate-mapping xmlns="'urn:nhibernate-mapping-2.2'" namespace="'ezed.workstuff.domain'" assembly="'ezed.workstuff.domain'"&gt;&lt;class name="'Task'" table="'dbo.[Task]'"&gt;&lt;id name="'Id'" type="'Int32'"&gt;&lt;generator class="'identity'"&gt;&lt;/id&gt;&lt;property name="'Description'"&gt;&lt;property name="'Status'"&gt;&lt;property name="'CreatedDate'"&gt;&lt;property name="'CompletedDate'"&gt;&lt;many-to-one name="'User'" column="'UserId'" class="'ezed.workstuff.domain.User'"&gt;&lt;many-to-one name="'Priority'" column="'PriorityId'" class="'ezed.workstuff.domain.Priority'"&gt;&lt;bag name="'Comments'"&gt;&lt;key column="'TaskId'"&gt;&lt;one-to-many class="'ezed.workstuff.domain.Comment'"&gt;&lt;/bag&gt;&lt;/class&gt;&lt;/hibernate-mapping&gt;"&lt;br /&gt;            .Replace(@"'", @"""");&lt;br /&gt;&lt;br /&gt;    [Test]&lt;br /&gt;    public void ShouldCreateValidHbmFile()&lt;br /&gt;    {&lt;br /&gt;        var actual = HbmFilesSuck.CreateMappingFileFrom&lt;task&gt;();&lt;br /&gt;        Assert.That(actual, Is.EqualTo(expected));&lt;br /&gt;        try&lt;br /&gt;        {&lt;br /&gt;            var configuration = new Configuration();&lt;br /&gt;            configuration.Configure();&lt;br /&gt;            configuration.AddXmlString(HbmFilesSuck.CreateMappingFileFrom&lt;task&gt;());&lt;br /&gt;            configuration.AddAssembly(typeof (Task).Assembly);&lt;br /&gt;        }&lt;br /&gt;        catch (Exception e)&lt;br /&gt;        {&lt;br /&gt;            Assert.Fail(string.Format("Your hbm file is sooo wrong! {0}", e));&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/textarea&gt;&lt;br /&gt;&lt;br /&gt;The IHandler Interface&lt;br /&gt;&lt;textarea name="code" class="c#" cols="60" rows="10"&gt;&lt;br /&gt;public interface IHandler&lt;br /&gt;{&lt;br /&gt;    void HandleRequest&lt;itemtype&gt;(XmlDocument xml, ItemType itemType);&lt;br /&gt;}&lt;br /&gt;&lt;/textarea&gt;&lt;br /&gt;&lt;br /&gt;The Mapping File Builder&lt;br /&gt;&lt;textarea name="code" class="c#" cols="60" rows="10"&gt;&lt;br /&gt;public class HbmFilesSuck&lt;br /&gt;{&lt;br /&gt;    private static readonly IHandler hibernateMappingHandler;&lt;br /&gt;&lt;br /&gt;    static HbmFilesSuck()&lt;br /&gt;    {&lt;br /&gt;        hibernateMappingHandler = new HibernateMappingHandler(&lt;br /&gt;            new ClassNameHandler(&lt;br /&gt;                new IdHandler(&lt;br /&gt;                    new PropertyHandler(&lt;br /&gt;                        new ManyToOneHandler(&lt;br /&gt;                            new BagHandler())))));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static string CreateMappingFileFrom&lt;t&gt;()&lt;br /&gt;    {&lt;br /&gt;        var mappingFile = new XmlDocument();&lt;br /&gt;        hibernateMappingHandler.HandleRequest(mappingFile, Activator.CreateInstance&lt;t&gt;());&lt;br /&gt;&lt;br /&gt;        return mappingFile.OuterXml;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/textarea&gt;&lt;br /&gt;&lt;br /&gt;The Handlers&lt;br /&gt;&lt;textarea name="code" class="c#" cols="60" rows="210"&gt;&lt;br /&gt;public class HibernateMappingHandler : IHandler&lt;br /&gt;{&lt;br /&gt;    private readonly IHandler successor;&lt;br /&gt;&lt;br /&gt;    public HibernateMappingHandler(IHandler successor)&lt;br /&gt;    {&lt;br /&gt;        this.successor = successor;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void HandleRequest&lt;itemtype&gt;(XmlDocument xml, ItemType itemType)&lt;br /&gt;    {&lt;br /&gt;        var element = xml.CreateElement("hibernate-mapping")&lt;br /&gt;            .WithAttribute("xmlns", "urn:nhibernate-mapping-2.2")&lt;br /&gt;            .WithAttribute("namespace", itemType.GetType().Namespace)&lt;br /&gt;            .WithAttribute("assembly", itemType.GetType().Assembly.GetName().Name);&lt;br /&gt;        xml.AppendChild(element);&lt;br /&gt;&lt;br /&gt;        successor.HandleRequest(xml, itemType);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class ClassNameHandler : IHandler&lt;br /&gt;{&lt;br /&gt;    private readonly IHandler successor;&lt;br /&gt;&lt;br /&gt;    public ClassNameHandler(IHandler successor)&lt;br /&gt;    {&lt;br /&gt;        this.successor = successor;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void HandleRequest&lt;itemtype&gt;(XmlDocument xml, ItemType itemType)&lt;br /&gt;    {&lt;br /&gt;        xml.DocumentElement.WithElement("class")&lt;br /&gt;            .WithAttribute("name", itemType.GetType().Name)&lt;br /&gt;            .WithAttribute("table", string.Format("dbo.[{0}]", itemType.GetType().Name));&lt;br /&gt;        successor.HandleRequest(xml, itemType);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class IdHandler : IHandler&lt;br /&gt;{&lt;br /&gt;    private readonly IHandler successor;&lt;br /&gt;&lt;br /&gt;    public IdHandler(IHandler successor)&lt;br /&gt;    {&lt;br /&gt;        this.successor = successor;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void HandleRequest&lt;itemtype&gt;(XmlDocument xml, ItemType itemType)&lt;br /&gt;    {&lt;br /&gt;        var idElement = xml.DocumentElement.WithElement("id").WithAttribute("name", "Id").WithAttribute("type", "Int32");&lt;br /&gt;        idElement.WithElement("generator").WithAttribute("class", "identity");&lt;br /&gt;&lt;br /&gt;        xml.SelectSingleNode(@"/hibernate-mapping/class").AppendChild(idElement);&lt;br /&gt;&lt;br /&gt;        successor.HandleRequest(xml, itemType);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class PropertyHandler : IHandler&lt;br /&gt;{&lt;br /&gt;    private readonly IHandler successor;&lt;br /&gt;    public static readonly List&lt;type&gt; AllowedTypes;&lt;br /&gt;&lt;br /&gt;    static PropertyHandler()&lt;br /&gt;    {&lt;br /&gt;        AllowedTypes = new List&lt;type&gt;&lt;br /&gt;                           {&lt;br /&gt;                               typeof (int),&lt;br /&gt;                               typeof (int?),&lt;br /&gt;                               typeof (bool),&lt;br /&gt;                               typeof (decimal),&lt;br /&gt;                               typeof (DateTime),&lt;br /&gt;                               typeof (DateTime?),&lt;br /&gt;                               typeof (string)&lt;br /&gt;                           };&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public PropertyHandler(IHandler successor)&lt;br /&gt;    {&lt;br /&gt;        this.successor = successor;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void HandleRequest&lt;itemtype&gt;(XmlDocument xml, ItemType itemType)&lt;br /&gt;    {&lt;br /&gt;        foreach (var property in itemType.GetType().GetProperties())&lt;br /&gt;        {&lt;br /&gt;            var getMethod = property.GetGetMethod();&lt;br /&gt;            if (string.Compare(property.Name, "Id", true) == 0) continue;&lt;br /&gt;            if (!AllowedTypes.Exists(t =&gt; t.Equals(getMethod.ReturnType))) continue;&lt;br /&gt;&lt;br /&gt;            var propertyElement = xml.DocumentElement.WithElement("property").WithAttribute("name", property.Name);&lt;br /&gt;            xml.SelectSingleNode(@"/hibernate-mapping/class").AppendChild(propertyElement);&lt;br /&gt;        }&lt;br /&gt;        successor.HandleRequest(xml, itemType);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class ManyToOneHandler : IHandler&lt;br /&gt;{&lt;br /&gt;    private readonly IHandler successor;&lt;br /&gt;&lt;br /&gt;    public ManyToOneHandler(IHandler successor)&lt;br /&gt;    {&lt;br /&gt;        this.successor = successor;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void HandleRequest&lt;itemtype&gt;(XmlDocument xml, ItemType itemType)&lt;br /&gt;    {&lt;br /&gt;        foreach (var property in itemType.GetType().GetProperties())&lt;br /&gt;        {&lt;br /&gt;            var getMethod = property.GetGetMethod();&lt;br /&gt;            if (string.Compare(property.Name, "Id", true) == 0) continue;&lt;br /&gt;            var returnType = getMethod.ReturnType;&lt;br /&gt;            if (PropertyHandler.AllowedTypes.Exists(t =&gt; t.Equals(returnType))) continue;&lt;br /&gt;            if (IsGenericCollection(returnType)) continue;&lt;br /&gt;&lt;br /&gt;            var propertyElement = xml.DocumentElement.WithElement("many-to-one")&lt;br /&gt;                .WithAttribute("name", property.Name)&lt;br /&gt;                .WithAttribute("column", string.Format("{0}Id", property.Name))&lt;br /&gt;                .WithAttribute("class", returnType.FullName);&lt;br /&gt;            xml.SelectSingleNode(@"/hibernate-mapping/class").AppendChild(propertyElement);&lt;br /&gt;        }&lt;br /&gt;        successor.HandleRequest(xml, itemType);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static bool IsGenericCollection(Type type)&lt;br /&gt;    {&lt;br /&gt;        return type.IsGenericType &amp;amp;&amp;amp;&lt;br /&gt;               typeof(ICollection&lt;&gt;).MakeGenericType(type.GetGenericArguments()).IsAssignableFrom(type);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class BagHandler : IHandler&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    public void HandleRequest&lt;itemtype&gt;(XmlDocument xml, ItemType itemType)&lt;br /&gt;    {&lt;br /&gt;        foreach (var property in itemType.GetType().GetProperties())&lt;br /&gt;        {&lt;br /&gt;            var returnType = property.GetGetMethod().ReturnType;&lt;br /&gt;            if (!ManyToOneHandler.IsGenericCollection(returnType)) continue;&lt;br /&gt;            var bagElement = xml.DocumentElement.WithElement("bag").WithAttribute("name", property.Name);&lt;br /&gt;            bagElement.WithElement("key").WithAttribute("column", string.Format("{0}Id", itemType.GetType().Name));&lt;br /&gt;            bagElement.WithElement("one-to-many").WithAttribute("class", returnType.GetGenericArguments()[0].FullName);&lt;br /&gt;&lt;br /&gt;            xml.SelectSingleNode(@"/hibernate-mapping/class").AppendChild(bagElement);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/textarea&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The Implementation&lt;br /&gt;&lt;textarea name="code" class="c#" cols="60" rows="10"&gt;&lt;br /&gt;public class SessionManager&lt;br /&gt;{&lt;br /&gt;    private static ISessionFactory sessionFactory;&lt;br /&gt;&lt;br /&gt;    private static ISessionFactory SessionFactory&lt;br /&gt;    {&lt;br /&gt;        get&lt;br /&gt;        {&lt;br /&gt;            if (sessionFactory != null) return sessionFactory;&lt;br /&gt;&lt;br /&gt;            var configuration = new Configuration();&lt;br /&gt;            configuration.Configure();&lt;br /&gt;            configuration.AddXmlString(HbmFilesSuck.CreateMappingFileFrom&lt;task&gt;());&lt;br /&gt;            configuration.AddAssembly(typeof (Task).Assembly);&lt;br /&gt;            sessionFactory = configuration.BuildSessionFactory();&lt;br /&gt;&lt;br /&gt;            return sessionFactory;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static ISession OpenSession()&lt;br /&gt;    {&lt;br /&gt;        return SessionFactory.OpenSession();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/textarea&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-1844054250315141353?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/1844054250315141353/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=1844054250315141353' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/1844054250315141353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/1844054250315141353'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2008/10/nhibernate-for-lazies.html' title='NHibernate for the Lazies'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-1989955572208662766</id><published>2008-07-14T15:48:00.004-06:00</published><updated>2008-12-10T21:59:20.168-07:00</updated><title type='text'>SproutCore &amp; WCF</title><content type='html'>&lt;blockquote&gt;&lt;/blockquote&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;Before you start ctrl+c &amp;amp; ctrl+v'ing some source code, make sure you have tried the hello world sample and read the &lt;a href="http://github.com/sproutit/sproutcore/wikis/using-the-built-in-rest-api"&gt;Rest API sample&lt;/a&gt; on the sproutcore wiki. Also, make sure you have played with FireBug to call some of the sproutcore commands shown in the sproutcore tutorials.&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Ever since WWDC 2008 announced &lt;a href="http://www.sproutcore.com/"&gt;SproutCore&lt;/a&gt;, I got curius with how this javascript mvc framework communicates with a server backend. Since I have very limited knowledge of RoR rest, I decided to stick to what I know - WCF.&lt;br /&gt;&lt;br /&gt;For my sample, I am using the &lt;a href="http://sproutcore.googlecode.com/svn/trunk/samples/clients/contacts"&gt;contacts example&lt;/a&gt; that is posted on the &lt;a href="http://code.google.com/p/sproutcore/"&gt;sproutcore googlecode website&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;JSON &amp;amp; DTO's&lt;/span&gt;&lt;br /&gt;Let's start with how the Contacts JSON object should look like:&lt;br /&gt;&lt;textarea name="code" class="js" cols="60" rows="10"&gt;&lt;br /&gt;{"records":&lt;br /&gt;    [ {"last_name": "Jobs",&lt;br /&gt;       "first_name": "Steve",&lt;br /&gt;       "guid": "1",&lt;br /&gt;       "type": "Contact"},&lt;br /&gt;      {"last_name": "Sculley",&lt;br /&gt;       "first_name": "John",&lt;br /&gt;       "guid": "2",&lt;br /&gt;       "type": "Contact"},&lt;br /&gt;      {"last_name": "Scott",&lt;br /&gt;       "first_name": "Michael",&lt;br /&gt;       "guid": "3",&lt;br /&gt;       "type": "Contact"}&lt;br /&gt;    ],&lt;br /&gt; "ids": [1,2,3]&lt;br /&gt;}&lt;br /&gt;&lt;/textarea&gt;&lt;br /&gt;&lt;blockquote&gt;Notice how SproutCore collections has a defined format: {"records":[], "ids":[]}, also take notice on how the properties are defined: "first_name", "last_name" - Looks like sproutcore does some nyahh and puts underscores.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Now let's look @ the ContactDTO &amp;amp; SproutCoreContactDTO DataContracts in C# and let's make this work for sproutcore:&lt;br /&gt;&lt;textarea name="code" class="c#" cols="60" rows="10"&gt;&lt;br /&gt;[Serializable, DataContract]&lt;br /&gt;public class ContactDTO&lt;br /&gt;{&lt;br /&gt;    [DataMember(Name = "guid")]&lt;br /&gt;    public int Guid { get; set; }&lt;br /&gt;&lt;br /&gt;    [DataMember(Name = "first_name")]&lt;br /&gt;    public string FirstName { get; set; }&lt;br /&gt;&lt;br /&gt;    [DataMember(Name = "last_name")]&lt;br /&gt;    public string LastName { get; set; }&lt;br /&gt;}&lt;br /&gt;&lt;/textarea&gt;&lt;br /&gt;&lt;textarea name="code" class="c#" cols="60" rows="10"&gt;&lt;br /&gt;[Serializable, DataContract]&lt;br /&gt;public class SproutCoreContactDTO&lt;br /&gt;{&lt;br /&gt;    [DataMember]&lt;br /&gt;    public ContactDTO[] Records { get; set; }&lt;br /&gt;&lt;br /&gt;    [DataMember]&lt;br /&gt;    public int[] Ids { get; set; }&lt;br /&gt;}&lt;br /&gt;&lt;/textarea&gt;&lt;br /&gt;&lt;br /&gt;This is how we build the SproutCoreContactDTO object:&lt;br /&gt;&lt;textarea name="code" class="js" cols="60" rows="10"&gt;&lt;br /&gt;return new SproutCoreContactDTO { Records = contacts.ToArray(), Ids = (from dto in contacts&lt;br /&gt;                                                                                  select dto.Guid).ToArray()};&lt;br /&gt;&lt;/textarea&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;WCF Service &amp;amp; Web.Config&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now we've built out dto and have an idea how we build our JSON object, let's make WCF do some crazyness and send and take in DTO's as JSON from something that is not a .Net proxy!&lt;br /&gt;&lt;br /&gt;Here's the service:&lt;br /&gt;&lt;br /&gt;&lt;textarea name="code" class="c#" cols="60" rows="10"&gt;&lt;br /&gt;[ServiceContract]&lt;br /&gt;public class ContactService&lt;br /&gt;{&lt;br /&gt;    private readonly ContactTask task = new ContactTask();&lt;br /&gt;&lt;br /&gt;    [OperationContract, WebGet(ResponseFormat = WebMessageFormat.Json)]&lt;br /&gt;    public SproutCoreContactDTO List()&lt;br /&gt;    {&lt;br /&gt;        return task.List();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    [OperationContract, WebInvoke(Method = "POST")]&lt;br /&gt;    public void Create(ContactDTO dto)&lt;br /&gt;    {&lt;br /&gt;        task.Create(dto);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    [OperationContract, WebInvoke(Method = "POST")]&lt;br /&gt;    public void Update(ContactDTO dto)&lt;br /&gt;    {&lt;br /&gt;        task.Update(dto);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    [OperationContract, WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "show/{id}")]&lt;br /&gt;    public ContactDTO Show(string id)&lt;br /&gt;    {&lt;br /&gt;        return task.Show(Convert.ToInt32(id));&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/textarea&gt;&lt;br /&gt;&lt;blockquote&gt;Notice how my methods are List, Create, Update, Show? That's taking advantage of sproutcore's built-in Record functionality.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Note that complex types like ContactDTO being consumed as a parameter &lt;b&gt;must&lt;/b&gt; be a WebInvoke and an HTTP-POST method - you will have pain if u dont!&lt;br /&gt;&lt;br /&gt;The key words to return your objects as JSON in WCF is "ResponseFormat = WebMessageFormat.Json"&lt;br /&gt;&lt;br /&gt;Web.config (system.servicemodel configuration)&lt;br /&gt;&lt;textarea name="code" class="xml" cols="60" rows="10"&gt;&lt;br /&gt;&lt;system.servicemodel&gt;&lt;br /&gt;    &lt;bindings&gt;&lt;br /&gt;        &lt;webhttpbinding&gt;&lt;br /&gt;            &lt;binding name="ezed.binding"&gt;&lt;br /&gt;        &lt;/webhttpbinding&gt;&lt;br /&gt;    &lt;/bindings&gt;&lt;br /&gt;    &lt;behaviors&gt;&lt;br /&gt;        &lt;endpointbehaviors&gt;&lt;br /&gt;            &lt;behavior name="ezed.endpoint"&gt;&lt;br /&gt;                &lt;webhttp&gt;&lt;br /&gt;            &lt;/behavior&gt;&lt;br /&gt;        &lt;/endpointbehaviors&gt;&lt;br /&gt;        &lt;servicebehaviors&gt;&lt;br /&gt;            &lt;behavior name="ezed.service"&gt;&lt;br /&gt;                &lt;servicemetadata httpgetenabled="true"&gt;&lt;br /&gt;                &lt;servicedebug includeexceptiondetailinfaults="true"&gt;&lt;br /&gt;            &lt;/behavior&gt;&lt;br /&gt;        &lt;/servicebehaviors&gt;&lt;br /&gt;    &lt;/behaviors&gt;&lt;br /&gt;    &lt;services&gt;&lt;br /&gt;        &lt;service behaviorconfiguration="ezed.service" name="ezed.spikes.services.ContactService"&gt;&lt;br /&gt;            &lt;endpoint address="" behaviorconfiguration="ezed.endpoint" binding="webHttpBinding" bindingconfiguration="" name="" contract="ezed.spikes.services.ContactService"&gt;&lt;br /&gt;        &lt;/service&gt;&lt;br /&gt;    &lt;/services&gt;&lt;br /&gt;&lt;/system.serviceModel&gt;&lt;br /&gt;&lt;/textarea&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Things to remember about your wcf service:&lt;br /&gt;1) must be webHttpBinding to talk to any non-microsoft clients&lt;br /&gt;2) must have a webHttp endpoint behavior&lt;/blockquote&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;NUnit Tests&lt;/span&gt;&lt;br /&gt;We could create a proxy to verify if our services work, but since we're going to be using sproutcore as our UI, we're going to do it the hard way. We're going to bust some serious System.Net skillz... soo peep this awesomeness:&lt;br /&gt;&lt;br /&gt;&lt;textarea name="code" class="c#" cols="60" rows="10"&gt;&lt;br /&gt;[TestFixture]&lt;br /&gt;public class ContactServiceTest&lt;br /&gt;{&lt;br /&gt;    private const string url = @"http://localhost:8080/ContactService.svc/{0}";&lt;br /&gt;&lt;br /&gt;    [Test]&lt;br /&gt;    public void GetAll_ShouldGetAllContacts_UsingHttpGet()&lt;br /&gt;    {&lt;br /&gt;        var resultJsonDto = new WebClient().DownloadString(string.Format(url, "List"));&lt;br /&gt;        var contacts = resultJsonDto.ToSproutCoreContactDTO();&lt;br /&gt;        Assert.That(contacts.Records.Length, Is.GreaterThan(1));&lt;br /&gt;        AssertExists("Jonas", "Awesome", contacts.Records);&lt;br /&gt;        AssertExists("Gucci", "Player", contacts.Records);&lt;br /&gt;        AssertExists("Dude", "Love", contacts.Records);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    [Test]&lt;br /&gt;    public void Create_ShouldCreateContact_UsingHttpPost()&lt;br /&gt;    {&lt;br /&gt;        HttpPost(new ContactDTO {Guid = 3, FirstName = "New", LastName = "One"}.ToJSON(), "Create");&lt;br /&gt;        HttpPost(new ContactDTO {Guid = 4, FirstName = "Second", LastName = "Two"}.ToJSON(), "Create");&lt;br /&gt;&lt;br /&gt;        var resultJsonDto = new WebClient().DownloadString(string.Format(url, "List"));&lt;br /&gt;        var contacts = resultJsonDto.ToSproutCoreContactDTO();&lt;br /&gt;        AssertExists("New", "One", contacts.Records);&lt;br /&gt;        AssertExists("Second", "Two", contacts.Records);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    [Test]&lt;br /&gt;    public void Update_ShouldUpdate_UsingHttpPost()&lt;br /&gt;    {&lt;br /&gt;        var client = new WebClient();&lt;br /&gt;        var resultJsonDto = client.DownloadString(string.Format(url, "Show/1"));&lt;br /&gt;        var toUpdate = resultJsonDto.ToContactDto();&lt;br /&gt;        toUpdate.LastName = "changed";&lt;br /&gt;&lt;br /&gt;        HttpPost(toUpdate.ToJSON(), "Update");&lt;br /&gt;        resultJsonDto = client.DownloadString(string.Format(url, "Show/1"));&lt;br /&gt;&lt;br /&gt;        var result = resultJsonDto.ToContactDto();&lt;br /&gt;        Assert.That(toUpdate.LastName, Is.EqualTo(result.LastName));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    [Test]&lt;br /&gt;    public void Show_ShouldShowContactById_UsingHttpGet()&lt;br /&gt;    {&lt;br /&gt;        var resultJsonDto = new WebClient().DownloadString(string.Format(url, "Show/2"));&lt;br /&gt;        var dudeLove = resultJsonDto.ToContactDto();&lt;br /&gt;        Assert.That(dudeLove.FirstName, Is.EqualTo("Dude"));&lt;br /&gt;        Assert.That(dudeLove.LastName, Is.EqualTo("Love"));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private static void AssertExists(string firstName, string lastName, IEnumerable&lt;contactdto&gt; contacts)&lt;br /&gt;    {&lt;br /&gt;        Assert.That(from c in contacts&lt;br /&gt;                    where c.FirstName == firstName &amp;amp;&amp;amp; c.LastName == lastName&lt;br /&gt;                    select c, Is.Not.Null);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private static void HttpPost(string jsonDto, string methodName)&lt;br /&gt;    {&lt;br /&gt;        var request = WebRequest.Create(new Uri(string.Format(url, methodName)));&lt;br /&gt;        request.Method = WebRequestMethods.Http.Post;&lt;br /&gt;        request.ContentType = "application/json";&lt;br /&gt;        var bytes = new ASCIIEncoding().GetBytes(jsonDto);&lt;br /&gt;        request.ContentLength = bytes.Length;&lt;br /&gt;        using (var stream = request.GetRequestStream())&lt;br /&gt;            stream.Write(bytes, 0, bytes.Length);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;internal static class TestExtensions&lt;br /&gt;{&lt;br /&gt;    public static SproutCoreContactDTO ToSproutCoreContactDTO(this string json)&lt;br /&gt;    {&lt;br /&gt;        return ToItemType&lt;sproutcorecontactdto&gt;(json);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static ContactDTO ToContactDto(this string json)&lt;br /&gt;    {&lt;br /&gt;        return ToItemType&lt;contactdto&gt;(json);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private static ItemType ToItemType&lt;itemtype&gt;(this string json)&lt;br /&gt;    {&lt;br /&gt;        using (var memoryStream = new MemoryStream(Encoding.Unicode.GetBytes(json)))&lt;br /&gt;            return (ItemType)new DataContractJsonSerializer(typeof(ItemType)).ReadObject(memoryStream);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static string ToJSON(this ContactDTO dto)&lt;br /&gt;    {&lt;br /&gt;        using (var stream = new MemoryStream())&lt;br /&gt;        {&lt;br /&gt;            new DataContractJsonSerializer(typeof (ContactDTO)).WriteObject(stream, dto);&lt;br /&gt;            return Encoding.Default.GetString(stream.ToArray());&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/textarea&gt;&lt;br /&gt;&lt;br /&gt;Now that's some awesome shizzle! all works, and it's all good in the hood!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Apache, Mongrel, IIS - Fo Shizzle my Nizzle!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In order for your sc-server (mongrel) to have the proper resourceUrl for your WCF web service, we need to use a middleman as our reverse proxy - &lt;a href="http://www.apache.org/"&gt;apache&lt;/a&gt;. Soo, we need to do the following:&lt;br /&gt;1) download apache web server&lt;br /&gt;2) make sure your port is something other than port 80 (I was running IIS and Apache on the same computer)&lt;br /&gt;3) uncomment the following on httpd.conf:&lt;br /&gt; - proxy_module&lt;br /&gt; - proxy_ajp_module&lt;br /&gt; - proxy_balancer_module&lt;br /&gt; - proxy_connect_module&lt;br /&gt; - proxy_http_module&lt;br /&gt;4) add the following in the very bottom of httpd.conf:&lt;br /&gt;#SproutCore Stuff&lt;br /&gt;ProxyPass /contacts http://localhost:4020/contacts&lt;br /&gt;ProxyPassReverse /contacts http://localhost:4020/contacts&lt;br /&gt;ProxyPass /static http://localhost:4020/static&lt;br /&gt;ProxyPassReverse /static http://localhost:4020/static&lt;br /&gt;#IIS Stuff - Where my ContactService.svc is at&lt;br /&gt;ProxyPass / http://localhost:8080/&lt;br /&gt;ProxyPassReverse / http://localhost:8080/&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;With ReverProxy set-up, you can still go to localhost:4020, but your reference to your wcf service won't work. Depending on how you configured you apache server, you now have to access your sproutcore site via apache.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Finally! some sproutcore action!!&lt;/span&gt;&lt;br /&gt;I'm assuming you have already exported the &lt;a href="http://sproutcore.googlecode.com/svn/trunk/samples/clients/contacts/"&gt;contacts sample&lt;/a&gt; from google code, and read "&lt;a href="http://github.com/sproutit/sproutcore/wikis/using-the-built-in-rest-api"&gt;Using the built-in REST API&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;We need to modify a couple of things so we can talk to our wcf service.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Model\contact.js&lt;/span&gt;&lt;br /&gt;&lt;textarea name="code" class="js" cols="60" rows="10"&gt;&lt;br /&gt;Contacts.Contact = SC.Record.extend(&lt;br /&gt;/** @scope Contacts.Contact.prototype */ {&lt;br /&gt;  &lt;br /&gt;  dataSource: Contacts.server, &lt;br /&gt;  resourceURL: 'ContactService.svc', &lt;br /&gt;  &lt;br /&gt;  fullName: function() {&lt;br /&gt;    return [this.get('firstName'), this.get('lastName')].compact().join(' ');&lt;br /&gt;  }.property('firstName', 'lastName')&lt;br /&gt;  &lt;br /&gt;}) ;&lt;br /&gt;&lt;/textarea&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;contacts\main.js&lt;/span&gt;&lt;br /&gt;&lt;textarea name="code" class="js" cols="60" rows="10"&gt;&lt;br /&gt;function main() {&lt;br /&gt;  &lt;br /&gt;  //Contacts.server.preload(Contacts.FIXTURES) ;&lt;br /&gt;  Contacts.server.listFor({recordType: Contacts.Contact}); &lt;br /&gt;&lt;br /&gt;  SC.page.awake() ;&lt;br /&gt;&lt;br /&gt;  var records = Contacts.Contact.collection() ;&lt;br /&gt;  Contacts.masterController.set('content', records) ;  &lt;br /&gt;  records.refresh() ;&lt;br /&gt;} ;&lt;br /&gt;&lt;/textarea&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;The Finished Product&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;With all your sc-gen, iisreset, and all that good stuff, run your site to see the final product.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wL74_LjB1qo/SHvahfATl1I/AAAAAAAAAHQ/p89pVB_dyeo/s1600-h/wcfsproutcore.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_wL74_LjB1qo/SHvahfATl1I/AAAAAAAAAHQ/p89pVB_dyeo/s320/wcfsproutcore.png" alt="" id="BLOGGER_PHOTO_ID_5223008461659543378" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;And ofcourse, what's this long post without the sourcecode? download it from &lt;a href="http://ezed.googlecode.com/svn/spikes/SproutCore&amp;amp;WCF"&gt;here&lt;/a&gt; or if you have svn, type "svn co http://ezed.googlecode.com/svn/spikes/SproutCore&amp;amp;WCF"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-1989955572208662766?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/1989955572208662766/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=1989955572208662766' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/1989955572208662766'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/1989955572208662766'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2008/07/sproutcore-wcf.html' title='SproutCore &amp; WCF'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_wL74_LjB1qo/SHvahfATl1I/AAAAAAAAAHQ/p89pVB_dyeo/s72-c/wcfsproutcore.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-1550177607829794539</id><published>2008-07-09T16:20:00.007-06:00</published><updated>2008-07-14T23:02:53.271-06:00</updated><title type='text'>Boo &amp; System.Collections.Generic</title><content type='html'>i know there is the boo.lang.hash type, but i needed to use the IDictionary for this one.&lt;br /&gt;&lt;br /&gt;Soo....&lt;br /&gt;&lt;br /&gt;if you're busting some C#:&lt;br /&gt;&lt;textarea name="code" class="c#" cols="60" rows="10"&gt;&lt;br /&gt;var domainObjects = new Dictionary&amp;lt;IValidatingDomainObject,IPimpList&lt;ISomeAwesomeStuff&gt;&amp;gt;(); &lt;br /&gt;&lt;/textarea&gt;&lt;br /&gt;&lt;br /&gt;and if you're freestylin' with boo...&lt;br /&gt;&lt;textarea name="code" class="py" cols="60" rows="10"&gt;&lt;br /&gt;dictionary = Dictionary[of IValidatingDomainObject, IPimpList[of ISomeAwesomeStuff]]()&lt;br /&gt;&lt;/textarea&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-1550177607829794539?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/1550177607829794539/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=1550177607829794539' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/1550177607829794539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/1550177607829794539'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2008/07/boo-systemcollectionsgeneric.html' title='Boo &amp; System.Collections.Generic'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-2349035764946819027</id><published>2008-06-19T20:16:00.002-06:00</published><updated>2008-06-19T20:49:08.267-06:00</updated><title type='text'>ClickOnce and Multiple Environments...</title><content type='html'>This is dedicated to the peeps that have been googlin' how to handle multiple environments and using &lt;a href="http://msdn.microsoft.com/en-us/library/wh45kb66.aspx"&gt;ClickOnce&lt;/a&gt;.  When I mean multiple environments, you are deploying an application on multiple servers and in different environments, and the only difference are miniscule settings on the app.config file...&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you have:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Multiple Instances of your ClickOnce app on Server 1&lt;/div&gt;&lt;div&gt;http://Server1/Development/&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;MyApp.application&lt;/span&gt;&lt;/div&gt;&lt;div&gt;http://Server1/Test/&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;MyApp.application&lt;/span&gt;&lt;/div&gt;&lt;div&gt;http://Server1/Production/&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;MyApp.application&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Multiple Instances of your ClickOnce app on Server 1&lt;/div&gt;&lt;div&gt;http://Server2/Development/&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;MyApp.application&lt;/span&gt;&lt;/div&gt;&lt;div&gt;http://Server2/Test/&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;MyApp.application&lt;/span&gt;&lt;/div&gt;&lt;div&gt;http://Server2/Production/&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;MyApp.application&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;With the setup above, all environments also have a manifest with the same name but just signed differently.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What's whacked is even though they are different applications when they download. What happens is &lt;span class="Apple-style-span" style="font-style: italic;"&gt;the first one you download, will be the default app.config.&lt;/span&gt; This may sound crazy, but it's true... &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After some googlin' and spiking up some shizzle, I decided to &lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;new&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(204, 51, 204);"&gt; InitializeKISSMethod&lt;/span&gt;()&lt;/span&gt; (keep it simple stupid!). And ended coming up with a naming convention of &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;[server].[environment].application&lt;/span&gt; and &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;[server].[environment].manifest&lt;/span&gt;.  So it would looks like:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Multiple Instances of your ClickOnce app on Server 1&lt;/div&gt;&lt;div&gt;http://Server1/Development/&lt;span class="Apple-style-span" style="color: rgb(51, 204, 0);"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Server1.Development.application&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;http://Server1/Test/&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 204, 0);"&gt;Server1.Test.application&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;http://Server1/Production/&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 204, 0);"&gt;Server1.Production.application&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Multiple Instances of your ClickOnce app on Server 1&lt;/div&gt;&lt;div&gt;http://Server2/Development/&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 204, 0);"&gt;Server2.Development.application&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;http://Server2/Test/&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 204, 0);"&gt;Server2.Test.applicatio&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 204, 0);"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;http://Server2/Production/&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 204, 0);"&gt;Server2.Production.application&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 204, 0); font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 204, 0); font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;--------&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;So if you're a developer that is very depended on VS2005 (or 2008), this may be a lot of work! I would suggest &lt;a href="http://blog.gravityfree.ca/2006/07/click-once-deployment-using-nant.html"&gt;automating&lt;/a&gt; this - will make your life ezed!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And remember, start with mageui.exe, then go all out with mage.exe.  You will get a better understanding what's happenin' when you are bustin' some serious &lt;a href="http://msdn.microsoft.com/en-us/library/wh45kb66.aspx"&gt;ClickOnce&lt;/a&gt; nyahhhh.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-2349035764946819027?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/2349035764946819027/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=2349035764946819027' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/2349035764946819027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/2349035764946819027'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2008/06/clickonce-and-multiple-environments.html' title='ClickOnce and Multiple Environments...'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-2932856107654453651</id><published>2008-05-29T22:25:00.001-06:00</published><updated>2008-05-29T22:32:40.208-06:00</updated><title type='text'>LinqToYourBrain Recap</title><content type='html'>Thanks to Edmug for organizing tonights event and thanks to all the people that came and checked out my presentation - I enjoyed presenting!&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For those who are interested playing with the source code, I have posted it on googlecode. So if you have subversion type:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;svn checkout &lt;a href="http://ezed.googlecode.com/svn/trunk/presentations/20080529_linqtosql"&gt;http://ezed.googlecode.com/svn/trunk/presentations/20080529_linqtosql&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-2932856107654453651?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/2932856107654453651/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=2932856107654453651' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/2932856107654453651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/2932856107654453651'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2008/05/deep-dive-to-linqtosql-recap.html' title='LinqToYourBrain Recap'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-8228489283771425048</id><published>2008-05-13T22:01:00.000-06:00</published><updated>2008-05-13T22:05:45.508-06:00</updated><title type='text'>LinqToYourBrain</title><content type='html'>Some of  you may have heard,  some have not. But  I will be presenting  an introduction to LinqToSql  on May 29th.&lt;br /&gt;&lt;br /&gt;Thanks to &lt;a href="http://www.edmug.net/Default.aspx"&gt;Edmug&lt;/a&gt;  for hooking me up with a spot, and finally presenting to a public and devoted audience of developers.&lt;br /&gt;&lt;br /&gt;See you there!&lt;hints id="hah_hints"&gt;&lt;/hints&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-8228489283771425048?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/8228489283771425048/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=8228489283771425048' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/8228489283771425048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/8228489283771425048'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2008/05/linqtoyourbrain.html' title='LinqToYourBrain'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-619355105527134600</id><published>2008-02-22T23:31:00.003-07:00</published><updated>2008-12-10T21:59:20.375-07:00</updated><title type='text'>My MacBook Pro is F***ing Alive!!!!</title><content type='html'>Well I was supposed to sell my macbook, but then when I had some interested buyers  I found an&lt;a href="http://stores.ebay.com/Mac-Pro-Systems"&gt;  ebay store&lt;/a&gt; that sold an 8x  Dual-Layer Superdrive for $159USD - So I bought it!!!!&lt;br /&gt;&lt;br /&gt;Then I decided to  buy a 160GB 7200RPM hard drive,  so my shit can compile faster when i'm coding.&lt;br /&gt;&lt;br /&gt;All in all,  the total cost of fixing my MBP was  $314.23 which is awesome!  I didn't  go with buying a bottom case... just used a hammer, and a  wooden train track from my kid's thomas the tank engine set to remove the dent.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;And viola! It's installing Leopard as I type this!!&lt;br /&gt;&lt;br /&gt;Notes:&lt;br /&gt;- Go to &lt;a href="http://www.ifixit.com/Guide/Mac/MacBook-Pro-15-Inch-Core-Duo/85/"&gt;ifixit.com&lt;/a&gt; and check out their detailed instructions how to open your MBP.&lt;br /&gt;- Remember to hold the "C" button after you hear the "bong" sound - that makes your MBP boot up on you DVD drive.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wL74_LjB1qo/R7-_GONKS6I/AAAAAAAAAHI/Xs6kfef4SIY/s1600-h/P2220021.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_wL74_LjB1qo/R7-_GONKS6I/AAAAAAAAAHI/Xs6kfef4SIY/s320/P2220021.JPG" alt="" id="BLOGGER_PHOTO_ID_5170061010858036130" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Youporn! Here I come! I missed 1 week of your awesome content!!!&lt;hints id="hah_hints"&gt;&lt;/hints&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-619355105527134600?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/619355105527134600/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=619355105527134600' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/619355105527134600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/619355105527134600'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2008/02/my-macbook-pro-is-fing-alive.html' title='My MacBook Pro is F***ing Alive!!!!'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_wL74_LjB1qo/R7-_GONKS6I/AAAAAAAAAHI/Xs6kfef4SIY/s72-c/P2220021.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-2702283226163004890</id><published>2008-02-13T22:33:00.002-07:00</published><updated>2008-12-10T21:59:22.460-07:00</updated><title type='text'>For Sale - Busted MacBook Pro (with Busted SuperDrive)</title><content type='html'>Once upon a time... ahhh forget it. It's for sale for $500 for parts or if you want to spend some more money, you can buy a new SuperDrive and you have a cheap macbook pro. Hard drive not included.&lt;br /&gt;&lt;br /&gt;Here are the specs:&lt;br /&gt;&lt;br /&gt;- MBP 1st gen.&lt;br /&gt;- ATI 256MB Video Card&lt;br /&gt;- 2GB Ram&lt;br /&gt;- new MagSafe power adapter&lt;br /&gt;- OSX Leopard DVD&lt;br /&gt;- 2 Macbook Pro batteries (Holy Sh*t!)&lt;br /&gt;- Some awesome white decals&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Long story short, I was updating my MBP with a software update, then something messed up so I needed to re-install.&lt;br /&gt;&lt;br /&gt;But what I noticed was that there was a dent on the bottom case, so I couldn't fit my Leopard DVD (Damn pop-can).&lt;br /&gt;&lt;br /&gt;So I opened my MBP, fixed the case, and then found that the SuperDrive (DVD) was busted.&lt;br /&gt;&lt;br /&gt;As much as I wanna fix it, I don't have time.&lt;br /&gt;&lt;br /&gt;"But Jonas, what about you brining it to the shop and getting it repaired?" - Nahhhhhh... I'm due for another laptop, and have been eye'ing on a macbook (black).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So if you have skill and the $500 to buy an awesome laptop that gave me my coding skills, this is the laptop for you! All you need is to buy a new hard drive, and a new SuperDrive. And you will have an uber facebook browser.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;holla at me if you wants it... Oh yea, Canada only.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Below are some pics of the MBP.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wL74_LjB1qo/R7PTkuNKS1I/AAAAAAAAAGg/eLHH-_nn-_A/s1600-h/P2130068.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_wL74_LjB1qo/R7PTkuNKS1I/AAAAAAAAAGg/eLHH-_nn-_A/s320/P2130068.JPG" alt="" id="BLOGGER_PHOTO_ID_5166705825356073810" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wL74_LjB1qo/R7PTk-NKS2I/AAAAAAAAAGo/vAHo1QlAe6Q/s1600-h/P2130069.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_wL74_LjB1qo/R7PTk-NKS2I/AAAAAAAAAGo/vAHo1QlAe6Q/s320/P2130069.JPG" alt="" id="BLOGGER_PHOTO_ID_5166705829651041122" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wL74_LjB1qo/R7PTleNKS3I/AAAAAAAAAGw/hp-NLNtoZDM/s1600-h/P2130070.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_wL74_LjB1qo/R7PTleNKS3I/AAAAAAAAAGw/hp-NLNtoZDM/s320/P2130070.JPG" alt="" id="BLOGGER_PHOTO_ID_5166705838240975730" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_wL74_LjB1qo/R7PTmeNKS4I/AAAAAAAAAG4/iGBTWQFZzf0/s1600-h/P2130071.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_wL74_LjB1qo/R7PTmeNKS4I/AAAAAAAAAG4/iGBTWQFZzf0/s320/P2130071.JPG" alt="" id="BLOGGER_PHOTO_ID_5166705855420844930" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_wL74_LjB1qo/R7PTmuNKS5I/AAAAAAAAAHA/S6vR1boMZhM/s1600-h/P2130072.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_wL74_LjB1qo/R7PTmuNKS5I/AAAAAAAAAHA/S6vR1boMZhM/s320/P2130072.JPG" alt="" id="BLOGGER_PHOTO_ID_5166705859715812242" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;hints id="hah_hints"&gt;&lt;/hints&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-2702283226163004890?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/2702283226163004890/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=2702283226163004890' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/2702283226163004890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/2702283226163004890'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2008/02/for-sale-busted-macbook-pro-with-busted.html' title='For Sale - Busted MacBook Pro (with Busted SuperDrive)'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_wL74_LjB1qo/R7PTkuNKS1I/AAAAAAAAAGg/eLHH-_nn-_A/s72-c/P2130068.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-7989502142758261003</id><published>2008-02-08T11:25:00.000-07:00</published><updated>2008-02-08T11:30:21.190-07:00</updated><title type='text'>I've been GoogleCoded!</title><content type='html'>I have a bunch of spikes and some cool stuff that I wanna keep... so I decided to post it on google code....&lt;br /&gt;&lt;br /&gt;To Check out the stuff that I have, go here: &lt;a href="http://ezed.googlecode.com/svn/trunk/"&gt;&lt;strong&gt;&lt;em&gt;http&lt;/em&gt;&lt;/strong&gt;://ezed.googlecode.com/svn/trunk/&lt;/a&gt; &lt;/tt&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-7989502142758261003?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/7989502142758261003/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=7989502142758261003' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/7989502142758261003'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/7989502142758261003'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2008/02/ive-been-googlecoded.html' title='I&apos;ve been GoogleCoded!'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-4595666576663080381</id><published>2008-02-04T03:20:00.000-07:00</published><updated>2008-02-04T03:22:08.544-07:00</updated><title type='text'>YouTube: Scarface - Short Version</title><content type='html'>I love the word fuck. Who is with me?&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/aZWZXnnyIqA&amp;amp;rel=1"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;embed src="http://www.youtube.com/v/aZWZXnnyIqA&amp;amp;rel=1" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-4595666576663080381?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/4595666576663080381/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=4595666576663080381' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/4595666576663080381'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/4595666576663080381'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2008/02/youtube-scarface-short-version.html' title='YouTube: Scarface - Short Version'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-2426840143634893455</id><published>2008-01-14T23:57:00.000-07:00</published><updated>2008-01-15T00:00:44.154-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DJ'/><title type='text'>If James Keller was a DJ</title><content type='html'>Referring to &lt;a href="http://jameslikesbeer.blogspot.com/2007/12/dear-terry-tarle.html"&gt;this&lt;/a&gt; post. He would DJ like our boy DJ Swamp!&lt;br /&gt;&lt;object height="355" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/ExH9IS4UdF4&amp;amp;rel=1"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;embed src="http://www.youtube.com/v/ExH9IS4UdF4&amp;amp;rel=1" type="application/x-shockwave-flash" wmode="transparent" height="355" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;hints id="hah_hints"&gt;&lt;/hints&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-2426840143634893455?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/2426840143634893455/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=2426840143634893455' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/2426840143634893455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/2426840143634893455'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2008/01/if-james-keller-was-dj.html' title='If James Keller was a DJ'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-2475337166231427014</id><published>2008-01-04T10:28:00.001-07:00</published><updated>2008-01-04T10:28:47.331-07:00</updated><title type='text'>Convert XML to HTML using NUnit</title><content type='html'>&lt;div style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: Courier New"&gt;&lt;p style="MARGIN: 0px"&gt;[Test]&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Convert_xml_to_html()&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;        &lt;span style="color:blue;"&gt;string&lt;/span&gt; xml = &lt;span style="color:#a31515;"&gt;@"&amp;lt;configuration&amp;gt; &lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:#a31515;"&gt;... &lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:#a31515;"&gt;  &amp;lt;system.diagnostics&amp;gt; &lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:#a31515;"&gt;    &amp;lt;trace autoflush='true' /&amp;gt; &lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:#a31515;"&gt;    &amp;lt;sources&amp;gt; &lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:#a31515;"&gt;      &amp;lt;source name='System.ServiceModel' &lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:#a31515;"&gt;              switchValue='Information, ActivityTracing' &lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:#a31515;"&gt;              propagateActivity='true'&amp;gt; &lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:#a31515;"&gt;        &amp;lt;listeners&amp;gt; &lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:#a31515;"&gt;          &amp;lt;add name='FuckingAwesomeWCFLogger' &lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:#a31515;"&gt;              type='System.Diagnostics.XmlWriterTraceListener' &lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:#a31515;"&gt;              initializeData='FuckingAwesomeWCF.log'  /&amp;gt; &lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:#a31515;"&gt;        &amp;lt;/listeners&amp;gt; &lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:#a31515;"&gt;      &amp;lt;/source&amp;gt; &lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:#a31515;"&gt;    &amp;lt;/sources&amp;gt; &lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:#a31515;"&gt;  &amp;lt;/system.diagnostics&amp;gt; &lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:#a31515;"&gt;...&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:#a31515;"&gt;&amp;lt;/configuration&amp;gt;"&lt;/span&gt;;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;    &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.Out.WriteLine(xml.Replace(&lt;span style="color:#a31515;"&gt;"&amp;lt;"&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;"&amp;amp;lt;"&lt;/span&gt;).Replace(&lt;span style="color:#a31515;"&gt;"&amp;gt;"&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;"&amp;amp;gt;"&lt;/span&gt;).Replace(&lt;span style="color:#a31515;"&gt;"'"&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;"&amp;amp;quot;"&lt;/span&gt;).Replace(&lt;span style="color:#a31515;"&gt;"/"&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;"&amp;amp;#47;"&lt;/span&gt;).Replace(&lt;span style="color:#a31515;"&gt;"="&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;"&amp;amp;#61;"&lt;/span&gt;));&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-2475337166231427014?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/2475337166231427014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=2475337166231427014' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/2475337166231427014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/2475337166231427014'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2008/01/convert-xml-to-html-using-nunit.html' title='Convert XML to HTML using NUnit'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-1713513439790881421</id><published>2008-01-04T10:15:00.000-07:00</published><updated>2008-01-04T10:25:40.299-07:00</updated><title type='text'>Logging on WCF Web Services</title><content type='html'>Tired of wondering what error you have on your failing wcf service?&lt;br /&gt;&lt;br /&gt;Add this to your web.cofig&lt;br /&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;system.diagnostics&amp;gt;&lt;br /&gt;&amp;lt;trace autoflush="true" /&amp;gt;&lt;br /&gt;&amp;lt;sources&amp;gt;&lt;br /&gt;&amp;lt;source name="System.ServiceModel"&lt;br /&gt;switchValue="Information, ActivityTracing"&lt;br /&gt;propagateActivity="true"&amp;gt;&lt;br /&gt;&amp;lt;listeners&amp;gt;&lt;br /&gt;&amp;lt;add name="FuckingAwesomeWCFLogger"&lt;br /&gt;type="System.Diagnostics.XmlWriterTraceListener"&lt;br /&gt;initializeData="FuckingAwesomeWCF.log" /&amp;gt;&lt;br /&gt;&amp;lt;/listeners&amp;gt;&lt;br /&gt;&amp;lt;/source&amp;gt;&lt;br /&gt;&amp;lt;/sources&amp;gt;&lt;br /&gt;&amp;lt;/system.diagnostics&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-1713513439790881421?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/1713513439790881421/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=1713513439790881421' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/1713513439790881421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/1713513439790881421'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2008/01/logging-on-wcf-web-services.html' title='Logging on WCF Web Services'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-7070516119578414542</id><published>2008-01-02T23:04:00.000-07:00</published><updated>2008-01-14T23:51:41.926-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DJ'/><title type='text'>DJ'ing = f'in Awesome!</title><content type='html'>&lt;div&gt;I don't know about you, but DJ'in is soo awesome. Just makes you touch  your music.  Also another entertainment peice, another amunition for getting layed with the ladies (human - thanks Justice), and another reason why I'm always broke.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Well just wanted to give you peeps a DJ setup check with ezed!&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://jonas.ave.googlepages.com/P1020008.JPG"&gt;&lt;img style="cursor: pointer; width: 320px;" src="http://jonas.ave.googlepages.com/P1020008.JPG" alt="" border="0" /&gt;&lt;/a&gt;&lt;div&gt;Fig. 1.1 - My DJ steez and my white girl!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://jonas.ave.googlepages.com/P1020009.JPG"&gt;&lt;img style="cursor: pointer; width: 320px;" src="http://jonas.ave.googlepages.com/P1020009.JPG" alt="" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Fig. 1.2 - CDJ 1000MK3 &amp;amp; Rane Empath Steez&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://jonas.ave.googlepages.com/P1020010.JPG"&gt;&lt;img style="cursor: pointer; width: 320px;" src="http://jonas.ave.googlepages.com/P1020010.JPG" alt="" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Fig 1.3 - Sqratch Steez - Tech 1200 M3D, Scratch Live, &amp;amp; Vestax PMC-07 Pro with Pro-X Fade&lt;br /&gt;&lt;br /&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;&lt;div&gt;I said touch... hehehe.....&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;hints id="hah_hints"&gt;&lt;/hints&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-7070516119578414542?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/7070516119578414542/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=7070516119578414542' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/7070516119578414542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/7070516119578414542'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2008/01/djing-fin-awesome.html' title='DJ&apos;ing = f&apos;in Awesome!'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-224076229959718976</id><published>2007-12-17T14:54:00.000-07:00</published><updated>2007-12-17T14:58:05.498-07:00</updated><title type='text'>AES (Rijndael) Encryption in C# - The ezed Way.</title><content type='html'>Wanna encrypt stuff? Well Check this awesome utility that i made...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Test....&lt;br /&gt;&lt;br /&gt;&lt;div style="BACKGROUND: white;font-family:Courier New;font-size:10pt;color:black;"   &gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; AwesomeUtilities;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; NUnit.Framework;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;namespace&lt;/span&gt; Test&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;[&lt;span style="color:#2b91af;"&gt;TestFixture&lt;/span&gt;]&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CryptographyUtilityTest&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;[Test]&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Should_do_some_awesome_encrytion_stuff()&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;string&lt;/span&gt; toEncrypt = &lt;span style="color:#a31515;"&gt;"Encrypt Me Stud"&lt;/span&gt;;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;string&lt;/span&gt; encrypted = &lt;span style="color:#2b91af;"&gt;CryptographyUtility&lt;/span&gt;.Encrypt(toEncrypt);&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(toEncrypt, &lt;span style="color:#2b91af;"&gt;CryptographyUtility&lt;/span&gt;.Decrypt(encrypted));&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The shit that does the stuff&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="BACKGROUND: white;font-family:Courier New;font-size:10pt;color:black;"   &gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; System;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; System.IO;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; System.Security.Cryptography;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; System.Text;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;namespace&lt;/span&gt; AwesomeUtilities&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;abstract&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CryptographyUtility&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;readonly&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; PASSWORD;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;static&lt;/span&gt; CryptographyUtility()&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;PASSWORD = &lt;span style="color:#a31515;"&gt;"MyUberPassword"&lt;/span&gt;; &lt;span style="color:green;"&gt;//Usually taken from a *.config&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; Encrypt(&lt;span style="color:blue;"&gt;string&lt;/span&gt; value)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; Encrypt(value, PASSWORD);&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; Decrypt(&lt;span style="color:blue;"&gt;string&lt;/span&gt; encryptedValue)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; Decrypt(encryptedValue, PASSWORD);&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; Encrypt(&lt;span style="color:blue;"&gt;string&lt;/span&gt; value, &lt;span style="color:blue;"&gt;string&lt;/span&gt; password)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;ValidateTextData(value, password);&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:#2b91af;"&gt;Rfc2898DeriveBytes&lt;/span&gt; keyGenerator = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Rfc2898DeriveBytes&lt;/span&gt;(password, 8);&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;byte&lt;/span&gt;[] rawData = &lt;span style="color:#2b91af;"&gt;Encoding&lt;/span&gt;.Unicode.GetBytes(value);&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;MemoryStream&lt;/span&gt; memoryStream = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MemoryStream&lt;/span&gt;())&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;CryptoStream&lt;/span&gt; cryptoStream = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CryptoStream&lt;/span&gt;(memoryStream, GetRijndaelWith(keyGenerator).CreateEncryptor(), &lt;span style="color:#2b91af;"&gt;CryptoStreamMode&lt;/span&gt;.Write))&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;memoryStream.Write(keyGenerator.Salt, 0, keyGenerator.Salt.Length);&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;cryptoStream.Write(rawData, 0, rawData.Length);&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;cryptoStream.Close();&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Convert&lt;/span&gt;.ToBase64String(memoryStream.ToArray());&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; Decrypt(&lt;span style="color:blue;"&gt;string&lt;/span&gt; encryptedValue, &lt;span style="color:blue;"&gt;string&lt;/span&gt; password)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;ValidateTextData(encryptedValue, password);&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;byte&lt;/span&gt;[] rawData = GetRawData(encryptedValue);&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;MemoryStream&lt;/span&gt; memoryStream = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MemoryStream&lt;/span&gt;())&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;CryptoStream&lt;/span&gt; cryptoStream = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CryptoStream&lt;/span&gt;(memoryStream, GetRijndaelWith(&lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Rfc2898DeriveBytes&lt;/span&gt;(password, GetSalt(rawData))).CreateDecryptor(), &lt;span style="color:#2b91af;"&gt;CryptoStreamMode&lt;/span&gt;.Write))&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;cryptoStream.Write(rawData, 8, rawData.Length - 8);&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;cryptoStream.Close();&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Encoding&lt;/span&gt;.Unicode.GetString(memoryStream.ToArray());&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Rijndael&lt;/span&gt; GetRijndaelWith(&lt;span style="color:#2b91af;"&gt;DeriveBytes&lt;/span&gt; keyGenerator)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:#2b91af;"&gt;Rijndael&lt;/span&gt; aes = &lt;span style="color:#2b91af;"&gt;Rijndael&lt;/span&gt;.Create();&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;aes.IV = keyGenerator.GetBytes(aes.BlockSize/8);&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;aes.Key = keyGenerator.GetBytes(aes.KeySize/8);&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; aes;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;byte&lt;/span&gt;[] GetRawData(&lt;span style="color:blue;"&gt;string&lt;/span&gt; value)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;byte&lt;/span&gt;[] rawData = &lt;span style="color:#2b91af;"&gt;Convert&lt;/span&gt;.FromBase64String(value);&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (rawData.Length &amp;lt; 8)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;throw&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ArgumentException&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;"Invalid input value"&lt;/span&gt;);&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; rawData;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;byte&lt;/span&gt;[] GetSalt(&lt;span style="color:blue;"&gt;byte&lt;/span&gt;[] rawData)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;byte&lt;/span&gt;[] salt = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:blue;"&gt;byte&lt;/span&gt;[8];&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;for&lt;/span&gt; (&lt;span style="color:blue;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; salt.Length; i++)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;salt[i] = rawData[i];&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; salt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; ValidateTextData(&lt;span style="color:blue;"&gt;string&lt;/span&gt; value, &lt;span style="color:blue;"&gt;string&lt;/span&gt; password)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (&lt;span style="color:blue;"&gt;string&lt;/span&gt;.IsNullOrEmpty(value))&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;throw&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ArgumentException&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;"No value given"&lt;/span&gt;);&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (&lt;span style="color:blue;"&gt;string&lt;/span&gt;.IsNullOrEmpty(password))&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;throw&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ArgumentException&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;"No password given"&lt;/span&gt;);&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-224076229959718976?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/224076229959718976/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=224076229959718976' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/224076229959718976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/224076229959718976'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2007/12/aes-rijndael-encryption-in-c-ezed-way.html' title='AES (Rijndael) Encryption in C# - The ezed Way.'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-2680363292330330443</id><published>2007-12-17T11:23:00.000-07:00</published><updated>2007-12-17T11:42:57.198-07:00</updated><title type='text'>WCF and Building your own Awesome WCF Web Service Proxy</title><content type='html'>&lt;span style="font-family:arial;"&gt;Hate using the svcutil.exe to generate your proxy for a WCF web service? Ever wondered if you can make it generic? You came to the right place!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;I can't stand the MPP WCF Service Factory, I don't like svcutil, so I tried to make it pimp!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;So for this example, we will be getting 3 pimp names from a wcf web service. If you are not familliar with WCF, here are some things that I did:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Used BasicHttpBinding to be backwards compatible with classic ASP.net&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Implemented impersonation (refer to the web.config in the clientcredential type)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Did not use a *.config file on the client end, and hand rolled an awesome factory class that does some WCF kungfu!&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Ofcourse, NUnit skillz&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-family:Arial;"&gt;Let's start with the service &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;PimpNameService.svc&lt;/span&gt;&lt;br /&gt;&lt;div style="BACKGROUND: white;font-family:Courier New;font-size:10pt;color:black;"   &gt;&lt;p style="MARGIN: 0px"&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;%@ ServiceHost Language="C#" Debug="true" Service="AwwYeaFoo.PimpNameService" CodeBehind="PimpNameService.cs" %&gt;&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;%@ ServiceHost Language="C#" Debug="true" Service="AwwYeaFoo.PimpNameService" CodeBehind="PimpNameService.cs" %&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;PimpNameService.cs&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="BACKGROUND: white;font-family:Courier New;font-size:10pt;color:black;"   &gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; System.ServiceModel;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; AwwYeaFoo.Interface;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;namespace&lt;/span&gt; AwwYeaFoo&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;PimpNameService&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;IPimpNameService&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;[&lt;span style="color:#2b91af;"&gt;OperationBehavior&lt;/span&gt;(Impersonation = &lt;span style="color:#2b91af;"&gt;ImpersonationOption&lt;/span&gt;.Required)]&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt; GetAllPimpNames()&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:#2b91af;"&gt;IList&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt; pimpNames = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt;();&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;pimpNames.Add(&lt;span style="color:#a31515;"&gt;"Python"&lt;/span&gt;);&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;pimpNames.Add(&lt;span style="color:#a31515;"&gt;"Diamond Trim"&lt;/span&gt;);&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;pimpNames.Add(&lt;span style="color:#a31515;"&gt;"Reverend J Fresh"&lt;/span&gt;);&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; pimpNames;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;IPimpNameService.cs&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="BACKGROUND: white;font-family:Courier New;font-size:10pt;color:black;"   &gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; System.ServiceModel;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;namespace&lt;/span&gt; AwwYeaFoo.Interface&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;[&lt;span style="color:#2b91af;"&gt;ServiceContract&lt;/span&gt;]&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;interface&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IPimpNameService&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;[&lt;span style="color:#2b91af;"&gt;OperationContract&lt;/span&gt;]&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt; GetAllPimpNames();&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;web.config&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="BACKGROUND: white;font-family:Courier New;font-size:10pt;color:black;"   &gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;configuration&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;services&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;service&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;behaviorConfiguration&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;returnFaults&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;AwwYeaFoo.PimpNameService&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;endpoint&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;binding&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;basicHttpBinding&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;bindingConfiguration&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;PimpBinding&lt;/span&gt;"&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;&lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;PimpNameServiceEndPoing&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;contract&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;AwwYeaFoo.Interface.IPimpNameService&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;service&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;services&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;behaviors&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;serviceBehaviors&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;behavior&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;returnFaults&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;serviceMetadata&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;httpGetEnabled&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;true&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;behavior&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;serviceBehaviors&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;behaviors&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;bindings&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;basicHttpBinding&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;binding&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;PimpBinding&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;security&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;mode&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;TransportCredentialOnly&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;transport&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;clientCredentialType&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Windows&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;security&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;binding&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;basicHttpBinding&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;bindings&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;configuration&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;The Test&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="BACKGROUND: white" color="black" size="10pt" face="Courier New"&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;[Test]&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Should_get_all_pimp_names_using_the_AwesomeWCFWebServiceProxy()&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;{&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;AwesomeWCFWebServiceProxy&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;IPimpNameService&lt;/span&gt;&amp;gt; proxy =&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;AwesomeWCFWebServiceProxy&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;IPimpNameService&lt;/span&gt;&amp;gt;(&lt;span style="color:#a31515;"&gt;@"http://localhost/AwwYeaFoo/pimpnameservice.svc"&lt;/span&gt;))&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;{&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt; pimpNames = proxy.GetProxy().GetAllPimpNames();&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color:blue;"&gt;string&lt;/span&gt; pimpName &lt;span style="color:blue;"&gt;in&lt;/span&gt; pimpNames)&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;{&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.Out.WriteLine(pimpName);&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;AwesomeWCFWebServiceProxy.cs&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: Courier New"&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;AwesomeWCFWebServiceProxy&lt;/span&gt;&amp;lt;WCFWebServiceInterface&amp;gt; : &lt;span style="color:#2b91af;"&gt;IDisposable&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;BasicHttpBinding&lt;/span&gt; binding;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ChannelFactory&lt;/span&gt;&amp;lt;WCFWebServiceInterface&amp;gt; factory;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;protected&lt;/span&gt; WCFWebServiceInterface proxy;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;readonly&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; url;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; AwesomeWCFWebServiceProxy(&lt;span style="color:blue;"&gt;string&lt;/span&gt; url)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;.url = url;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;InitializeHTTPBinding();&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;InitializeChannelFactory();&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;InitializeProxy();&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; InitializeHTTPBinding()&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;binding = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;BasicHttpBinding&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;BasicHttpSecurityMode&lt;/span&gt;.TransportCredentialOnly);&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;binding.Security.Transport.ClientCredentialType = &lt;span style="color:#2b91af;"&gt;HttpClientCredentialType&lt;/span&gt;.Windows;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; InitializeChannelFactory()&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;factory = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ChannelFactory&lt;/span&gt;&amp;lt;WCFWebServiceInterface&amp;gt;(&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;binding, &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EndpointAddress&lt;/span&gt;(url));&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;factory.Credentials.Windows.AllowedImpersonationLevel = &lt;span style="color:#2b91af;"&gt;TokenImpersonationLevel&lt;/span&gt;.Impersonation;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; InitializeProxy()&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;proxy = factory.CreateChannel();&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; WCFWebServiceInterface GetProxy()&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; proxy;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Dispose()&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;((&lt;span style="color:#2b91af;"&gt;IChannel&lt;/span&gt;)proxy).Close();&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;factory.Close();&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-2680363292330330443?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/2680363292330330443/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=2680363292330330443' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/2680363292330330443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/2680363292330330443'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2007/12/wcf-and-building-your-own-awesome-wcf.html' title='WCF and Building your own Awesome WCF Web Service Proxy'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-4878670309842857833</id><published>2007-11-28T14:44:00.000-07:00</published><updated>2007-11-28T14:46:07.692-07:00</updated><title type='text'>Excel Skills...</title><content type='html'>Note to self:&lt;br /&gt;&lt;br /&gt;If you (Jonas) wants to migrate excel data to a database the ghetto way, use this:&lt;br /&gt;&lt;br /&gt;="insert into message (messageid, usermessage, systemmessage) values (" &amp;amp; A2 &amp;amp;", '" &amp;amp; SUBSTITUTE(B2, "'", "''") &amp;amp; "', '" &amp;amp; SUBSTITUTE(C2, "'", "''") &amp;amp; "' );"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-4878670309842857833?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/4878670309842857833/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=4878670309842857833' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/4878670309842857833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/4878670309842857833'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2007/11/excel-skills.html' title='Excel Skills...'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-8161443998998145943</id><published>2007-10-31T12:52:00.000-06:00</published><updated>2007-10-31T12:59:31.026-06:00</updated><title type='text'>OpenSocial API Tomorrow!</title><content type='html'>wanna build a widget for hi5, linkedin, friendster, and all the other social networking sites?&lt;br /&gt;&lt;br /&gt;Tomorrow Google will release it's &lt;a href="http://code.google.com/apis/opensocial"&gt;OpenSocial API&lt;/a&gt;.  Instead of learning a new *ML (markup language) you just code with regular javascript or html with the help of OpenSocial.&lt;br /&gt;&lt;br /&gt;I'm not sure if this will work with facebook with it's FBML and all that jazz. I could be wrong.&lt;br /&gt;&lt;br /&gt;Man, these portal's are the way to go for startups these days. Or build a porn site.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-8161443998998145943?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/8161443998998145943/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=8161443998998145943' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/8161443998998145943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/8161443998998145943'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2007/10/opensocial-api-tomorrow.html' title='OpenSocial API Tomorrow!'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-790325896254154283</id><published>2007-10-23T12:32:00.000-06:00</published><updated>2007-10-23T12:35:56.255-06:00</updated><title type='text'>XmlSerialization using MemoryStream</title><content type='html'>&lt;div style="BACKGROUND: white;font-family:Courier New;font-size:10pt;color:black;"   &gt;Here's a treat for you peeps that need some serialization action, and making it a utility... Check it!&lt;/div&gt;&lt;div style="BACKGROUND: white" color="black" size="10pt" face="Courier New"&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- {\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;\red163\green21\blue21;}??\fs20 \cf1 public\cf0  \cf1 static\cf0  \cf1 string\cf0  Serialize&lt;item_to_serialize&gt;(ITEM_TO_SERIALIZE itemToSerialize)\par ??\{\par ??    \cf1 using\cf0  (\cf4 MemoryStream\cf0  memoryStream = \cf1 new\cf0  \cf4 MemoryStream\cf0 ())\par ??    \{\par ??        \cf4 XmlSerializer\cf0  serializer = \cf1 new\cf0  \cf4 XmlSerializer\cf0 (itemToSerialize.GetType());\par ??        \cf4 XmlTextWriter\cf0  writer = \cf1 new\cf0  \cf4 XmlTextWriter\cf0 (memoryStream, \cf1 new\cf0  \cf4 UTF8Encoding\cf0 ());\par ??        writer.Formatting = \cf4 Formatting\cf0 .Indented;\par ??        writer.IndentChar = \cf5 ' '\cf0 ;\par ??        writer.Indentation = 5;\par ??\par ??        serializer.Serialize(writer, itemToSerialize);\par ??\par ??        \cf1 return\cf0  \cf4 ASCIIEncoding\cf0 .UTF8.GetString(memoryStream.ToArray());\par ??    \}\par ??\}} --&gt;&lt;br /&gt;&lt;div style="BACKGROUND: white;font-family:Courier New;font-size:10pt;color:black;"   &gt;&lt;p style="MARGIN: 0px"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; Serialize&amp;lt;ITEM_TO_SERIALIZE&amp;gt;(ITEM_TO_SERIALIZE itemToSerialize)&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;    &lt;span style="color:blue;"&gt;using&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;MemoryStream&lt;/span&gt; memoryStream = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MemoryStream&lt;/span&gt;())&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;    {&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;        &lt;span style="color:#2b91af;"&gt;XmlSerializer&lt;/span&gt; serializer = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;XmlSerializer&lt;/span&gt;(itemToSerialize.GetType());&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;        &lt;span style="color:#2b91af;"&gt;XmlTextWriter&lt;/span&gt; writer = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;XmlTextWriter&lt;/span&gt;(memoryStream, &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;UTF8Encoding&lt;/span&gt;());&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;        writer.Formatting = &lt;span style="color:#2b91af;"&gt;Formatting&lt;/span&gt;.Indented;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;        writer.IndentChar = &lt;span style="color:#a31515;"&gt;' '&lt;/span&gt;;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;        writer.Indentation = 5;&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;        serializer.Serialize(writer, itemToSerialize);&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt; &lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;        &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ASCIIEncoding&lt;/span&gt;.UTF8.GetString(memoryStream.ToArray());&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;    }&lt;/p&gt;&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-790325896254154283?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/790325896254154283/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=790325896254154283' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/790325896254154283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/790325896254154283'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2007/10/xmlserialization-using-memorystream.html' title='XmlSerialization using MemoryStream'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-2633999572250445580</id><published>2007-10-22T23:03:00.000-06:00</published><updated>2007-10-22T23:11:43.270-06:00</updated><title type='text'>Whoa! Where Have I Been?</title><content type='html'>Been reading this: &lt;a href="http://rfacebook.rubyforge.org/"&gt;http://rfacebook.rubyforge.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And this....&lt;br /&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="keywords"&gt; def&lt;/span&gt; select&lt;br /&gt;  fql =  &lt;span class="string"&gt;"SELECT uid, name FROM user WHERE uid IN"&lt;/span&gt; +&lt;br /&gt;  &lt;span class="string"&gt;"(SELECT uid2 FROM friend WHERE uid1 = #{@current_fb_user_id}) "&lt;/span&gt; +&lt;br /&gt;  &lt;span class="string"&gt;"AND has_added_app = 0"&lt;/span&gt;&lt;br /&gt;  xml_friends = fbsession&lt;span class="method"&gt;.&lt;span style="font-weight: bold;"&gt;fql&lt;/span&gt;_query&lt;/span&gt; &lt;span class="symbol"&gt;:query&lt;/span&gt; =&gt; &lt;span style="font-weight: bold;"&gt;fql&lt;/span&gt;&lt;br /&gt;  &lt;span class="instance"&gt;@friends&lt;/span&gt; = &lt;span class="constants"&gt;Hash&lt;/span&gt;&lt;span class="method"&gt;.new&lt;/span&gt;&lt;br /&gt;  xml_friends&lt;span class="method"&gt;.search&lt;/span&gt;&lt;span class="brackets"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"//user"&lt;/span&gt;&lt;span class="brackets"&gt;)&lt;/span&gt;&lt;span class="method"&gt;.map&lt;/span&gt; &lt;span class="keywords"&gt;do&lt;/span&gt;|usrNode|&lt;br /&gt;    &lt;span class="instance"&gt;@friends&lt;/span&gt;&lt;span class="brackets"&gt;[&lt;/span&gt;&lt;span class="brackets"&gt;(&lt;/span&gt;usrNode/&lt;span class="string"&gt;"uid"&lt;/span&gt;&lt;span class="brackets"&gt;)&lt;/span&gt;&lt;span class="method"&gt;.inner_html&lt;/span&gt;&lt;span class="brackets"&gt;]&lt;/span&gt; = &lt;span class="brackets"&gt;(&lt;/span&gt;usrNode/&lt;span class="string"&gt;"name"&lt;/span&gt;&lt;span class="brackets"&gt;)&lt;/span&gt;&lt;span class="method"&gt;.inner_html&lt;/span&gt;&lt;br /&gt;  &lt;span class="keywords"&gt;end&lt;/span&gt;&lt;br /&gt;  render_facebook&lt;br /&gt;&lt;span class="keywords"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;I will announce once my app is ready for the public!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-2633999572250445580?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/2633999572250445580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=2633999572250445580' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/2633999572250445580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/2633999572250445580'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2007/10/whoa-where-have-i-been.html' title='Whoa! Where Have I Been?'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-8620946138720939030</id><published>2007-08-01T21:23:00.001-06:00</published><updated>2007-08-01T21:24:39.619-06:00</updated><title type='text'>Jonas is...</title><content type='html'>は今の仕事が大嫌い。今転職先を探し中。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-8620946138720939030?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/8620946138720939030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=8620946138720939030' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/8620946138720939030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/8620946138720939030'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2007/08/jonas-is.html' title='Jonas is...'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-5935657208275392526</id><published>2007-07-27T14:05:00.000-06:00</published><updated>2008-12-10T21:59:22.961-07:00</updated><title type='text'>Jonas' Crazy Adventures in RoR - Part V - The Red thing Goes to my Wrist Watch... Oops!</title><content type='html'>Okay, this may be the end of the long ass blogs that I'll be doing for this series. Most of the stuff after will be controller and UI related stuff.&lt;br /&gt;&lt;br /&gt;But on part IV, we were talking about how to paginate with will_paginate. But we did not cover a login ONLY viewing their assigned-to projects. And here's how you do it. In &lt;a href="http://technoweenie.stikipad.com/plugins/show/Acts+as+Authenticated"&gt;AAA&lt;/a&gt; we have a current_user item that keeps track of the current user - We will take advantage of that. So check this out&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_wL74_LjB1qo/RqpTtNjOL6I/AAAAAAAAAE8/Y9fRmdf2Hgs/s1600-h/Picture+1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_wL74_LjB1qo/RqpTtNjOL6I/AAAAAAAAAE8/Y9fRmdf2Hgs/s320/Picture+1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5091974364892376994" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;With that simple change, you will only see the first two projects assigned to you!&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_wL74_LjB1qo/RqpT-tjOL7I/AAAAAAAAAFE/RQI4t4hr8xM/s1600-h/Picture+2.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_wL74_LjB1qo/RqpT-tjOL7I/AAAAAAAAAFE/RQI4t4hr8xM/s320/Picture+2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5091974665540087730" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Semi-Conclusion&lt;/b&gt;&lt;br /&gt;I can't believe that building a website would be this ezed! Ruby &amp; RoR is a framework that could not be compared with any programming technologies that I have used so far.&lt;br /&gt;&lt;br /&gt;For those people who were curious, I used:&lt;br /&gt;- TextMate **Highly Recommended&lt;br /&gt;- iTerm&lt;br /&gt;- macports&lt;br /&gt;- Macbook Pro 1st get&lt;br /&gt;- MySql&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-5935657208275392526?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/5935657208275392526/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=5935657208275392526' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/5935657208275392526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/5935657208275392526'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2007/07/jonas-crazy-adventures-in-ror-part-v.html' title='Jonas&apos; Crazy Adventures in RoR - Part V - The Red thing Goes to my Wrist Watch... Oops!'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_wL74_LjB1qo/RqpTtNjOL6I/AAAAAAAAAE8/Y9fRmdf2Hgs/s72-c/Picture+1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-7461302793720571757</id><published>2007-07-26T21:57:00.000-06:00</published><updated>2008-12-10T21:59:24.979-07:00</updated><title type='text'>Jonas' Crazy Adventures in RoR - Part IV - Test Data, will_paginate, Page Security</title><content type='html'>Okay, now we have a semi-well built model, let's see some UI action shall we? It won't be as fancy as you may think, but we're only focusing on the functionality right now and all that good stuff. in &lt;a href="http://jonasavellana.blogspot.com/2007/07/jonas-crazy-adventures-in-ror-part-ii.html"&gt;part deuce&lt;/a&gt; of the jonas series, we covered how to create a login acount using &lt;a href="http://technoweenie.stikipad.com/plugins/show/Acts+as+Authenticated"&gt;Acts as Authenticated (AAA)&lt;/a&gt;. So that pretty much means that we have a user in the DB.&lt;br /&gt;&lt;br /&gt;How do we verify this? &lt;i&gt;script/console&lt;/i&gt; ofcourse! Below is a screenshot on how to verify if I have anything on my users table.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_wL74_LjB1qo/RqlvC9jOLsI/AAAAAAAAADM/RU18RvsPoF8/s1600-h/Picture+1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_wL74_LjB1qo/RqlvC9jOLsI/AAAAAAAAADM/RU18RvsPoF8/s320/Picture+1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5091722950391770818" /&gt;&lt;/a&gt;&lt;br /&gt;As you can see we have the one record - The account we made back in the days.&lt;br /&gt;&lt;br /&gt;So let's go create some test data shall we? Again, I will be using the &lt;i&gt;script/console&lt;/i&gt; style to insert my data... I'm going to create three new projects, and the first two will be assigned to the only user.&lt;br /&gt;&lt;br /&gt;Here's how you do it:&lt;br /&gt;&lt;i&gt;&lt;br /&gt;Project.create :name =&amp;gt; 'First Project', :description =&amp;gt;  'This is my first project', :start_date =&amp;gt;  Date.today&lt;br /&gt;Assignment.create :user_id =&amp;gt; 1, :project_id =&gt; 2&lt;br /&gt;Project.create :name =&amp;gt;  'Second Project', :description =&gt; 'This is my second project', :start_date =&amp;gt;  Date.today&lt;br /&gt;Assignment.create :user_id =&amp;gt;  1, :project_id =&amp;gt; 1&lt;br /&gt;Project.create :name =&amp;gt;  'Third Project', :description =&amp;gt;  'This is my third project', :start_date =&amp;gt;  Date.today&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Now let's check the database to show that I ain't bullsh*ttin'&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_wL74_LjB1qo/Rqlx7djOLtI/AAAAAAAAADU/kfwAXsbSN-U/s1600-h/Picture+2.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_wL74_LjB1qo/Rqlx7djOLtI/AAAAAAAAADU/kfwAXsbSN-U/s320/Picture+2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5091726120077635282" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Again, I just wanna let you guys know that I am intentionally making "Third Project" not assigned to any user. What I want to later is for the current user to be able to view his assigned projects. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Wait a sec. Jonas, I'm assuming u cannot add the same user to the same project more than once - How are you handling this?&lt;/b&gt;&lt;br /&gt;Check this out suckah!&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_wL74_LjB1qo/Rqly59jOLuI/AAAAAAAAADc/I4cDgHOGdac/s1600-h/Picture+3.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_wL74_LjB1qo/Rqly59jOLuI/AAAAAAAAADc/I4cDgHOGdac/s320/Picture+3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5091727193819459298" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;I want to see some UI action!!!!&lt;/h3&gt;&lt;br /&gt;I am going to cheat... I will be using &lt;i&gt;script/generate scaffolding&lt;/i&gt; to generate my UI... But hey, at least I won't be coding a lot of stuff! The only difference is that I will be using a different method of pagination. I will be using &lt;a href="http://errtheblog.com/post/4791"&gt;will_paginate&lt;/a&gt; from errtheblog.&lt;br /&gt;&lt;br /&gt;Lets just run our page for now, and see what we have:&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_wL74_LjB1qo/Rql0s9jOLwI/AAAAAAAAADs/zZRZZTWyjS8/s1600-h/Picture+5.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_wL74_LjB1qo/Rql0s9jOLwI/AAAAAAAAADs/zZRZZTWyjS8/s320/Picture+5.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5091729169504415490" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Yay! we have a page! I will create 4 more test data to see the pagination stuff, and we will have 7:&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_wL74_LjB1qo/Rql1edjOLxI/AAAAAAAAAD0/Avz0vabPAHs/s1600-h/Picture+6.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_wL74_LjB1qo/Rql1edjOLxI/AAAAAAAAAD0/Avz0vabPAHs/s320/Picture+6.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5091730019907940114" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_wL74_LjB1qo/Rql1etjOLyI/AAAAAAAAAD8/HMhmCzTY6gM/s1600-h/Picture+7.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_wL74_LjB1qo/Rql1etjOLyI/AAAAAAAAAD8/HMhmCzTY6gM/s320/Picture+7.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5091730024202907426" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Not bad, it works... but lets take a look at the list method that does the pagination stuff&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_wL74_LjB1qo/Rql14djOLzI/AAAAAAAAAEE/1klAyQnWBiE/s1600-h/Picture+8.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_wL74_LjB1qo/Rql14djOLzI/AAAAAAAAAEE/1klAyQnWBiE/s320/Picture+8.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5091730466584538930" /&gt;&lt;/a&gt;&lt;br /&gt;"&lt;br /&gt;You will notice that it returns &lt;b&gt;two&lt;/b&gt; items! Soo ghetto! After talking with &lt;a href="http://blog.sideline.ca"&gt;sideline&lt;/a&gt;. he pointed me to a rails cast about pagination found &lt;a href="http://railscasts.com/episodes/51"&gt;here&lt;/a&gt;. That will be the "new" way of pagination because in Rails 2.0 they will get rid of the ghetto-classic paging.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;note: I semi-like will_paginate. the thing I don't like is that my model knows the implementation of paginate. If i used a presentation layer that handles the pagination, it would be better...&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;So what do we have to change?&lt;br /&gt;list.rhtml, &amp; product_controller.rb in the list method. Check out the before and after shots of the changes:&lt;br /&gt;&lt;br /&gt;list.rhtml before&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_wL74_LjB1qo/Rql4RtjOL3I/AAAAAAAAAEk/3MCTfZ0tPjA/s1600-h/Picture+11.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_wL74_LjB1qo/Rql4RtjOL3I/AAAAAAAAAEk/3MCTfZ0tPjA/s320/Picture+11.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5091733099399491442" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;list.rhtml after&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_wL74_LjB1qo/Rql4EdjOL2I/AAAAAAAAAEc/V7JZWPUFH6I/s1600-h/Picture+12.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_wL74_LjB1qo/Rql4EdjOL2I/AAAAAAAAAEc/V7JZWPUFH6I/s320/Picture+12.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5091732871766224738" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def list before&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_wL74_LjB1qo/Rql14djOLzI/AAAAAAAAAEE/1klAyQnWBiE/s1600-h/Picture+8.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_wL74_LjB1qo/Rql14djOLzI/AAAAAAAAAEE/1klAyQnWBiE/s320/Picture+8.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5091730466584538930" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;def list after&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_wL74_LjB1qo/Rql3H9jOL0I/AAAAAAAAAEM/vWtahYqHPPo/s1600-h/Picture+9.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_wL74_LjB1qo/Rql3H9jOL0I/AAAAAAAAAEM/vWtahYqHPPo/s320/Picture+9.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5091731832384139074" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Not much change so it's all good!&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Page Security&lt;/h3&gt;&lt;br /&gt;I will cover it briefly. Basically right now, we have a login page that does nothing, and our projects can be viewed by anyone. What we want to do is implement &lt;a href="http://technoweenie.stikipad.com/plugins/show/Acts+as+Authenticated"&gt;AAA&lt;/a&gt;'s security stuff on our new project controller and here's how you do it:&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_wL74_LjB1qo/Rql7EtjOL4I/AAAAAAAAAEs/YGz5dueKB7o/s1600-h/Picture+13.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_wL74_LjB1qo/Rql7EtjOL4I/AAAAAAAAAEs/YGz5dueKB7o/s320/Picture+13.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5091736174596075394" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;That frikken ezed! now your anyone accessing project controller pages are required to login if they haven't yet.&lt;br /&gt;&lt;br /&gt;This is jonas saying "alll right!"&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_wL74_LjB1qo/Rql7YtjOL5I/AAAAAAAAAE0/cPnkYL1Zc9g/s1600-h/Quagmire.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_wL74_LjB1qo/Rql7YtjOL5I/AAAAAAAAAE0/cPnkYL1Zc9g/s320/Quagmire.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5091736518193459090" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Next time I will cover displaying only the projects a user is assigned to after login.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-7461302793720571757?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/7461302793720571757/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=7461302793720571757' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/7461302793720571757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/7461302793720571757'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2007/07/jonas-crazy-adventures-in-ror-part-iv.html' title='Jonas&apos; Crazy Adventures in RoR - Part IV - Test Data, will_paginate, Page Security'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_wL74_LjB1qo/RqlvC9jOLsI/AAAAAAAAADM/RU18RvsPoF8/s72-c/Picture+1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-1149953511116940614</id><published>2007-07-25T23:43:00.000-06:00</published><updated>2008-12-10T21:59:25.227-07:00</updated><title type='text'>Luxuries of Riding Single Track</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/_wL74_LjB1qo/Rqg08NjOLrI/AAAAAAAAADE/EHrahz5h_K4/s1600-h/1638.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_wL74_LjB1qo/Rqg08NjOLrI/AAAAAAAAADE/EHrahz5h_K4/s320/1638.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5091377587776532146" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Finding porn mags. left by some bum/12 year old kid/perv to be viewed by mtb'ers! I'm the one on the &lt;a href="http://surlybikes.com/1X1.html"&gt;Surly 1x1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;p.s. If you notice I blog a lot... I'm f*cking bored @ work!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-1149953511116940614?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/1149953511116940614/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=1149953511116940614' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/1149953511116940614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/1149953511116940614'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2007/07/luxuries-of-riding-single-track.html' title='Luxuries of Riding Single Track'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_wL74_LjB1qo/Rqg08NjOLrI/AAAAAAAAADE/EHrahz5h_K4/s72-c/1638.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-1208093026208925831</id><published>2007-07-25T20:59:00.000-06:00</published><updated>2008-12-10T21:59:26.865-07:00</updated><title type='text'>Jonas' Crazy Adventures in RoR - Part III - Migration Files &amp; Models/Domain Objects</title><content type='html'>After the ezed stuff like login and creating your idea, now time to implement some ish...&lt;br /&gt;&lt;br /&gt;So what did I do first? Create the model!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 1&lt;/b&gt;&lt;br /&gt;below is a screen that I used to create my models/domain objects simply by bustin &lt;i&gt;script/generate model &amp;lt;model_name&amp;gt;&lt;/i&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_wL74_LjB1qo/RqfrRtjOLkI/AAAAAAAAACM/AE_a1-pa1b4/s1600-h/Picture+1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_wL74_LjB1qo/RqfrRtjOLkI/AAAAAAAAACM/AE_a1-pa1b4/s320/Picture+1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5091296593283264066" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;once that is done, it will create a bunch of files... what we need to look for is the NNN_create_&lt;model&gt;.rb where NNN is the version number. The cool thing is that it generated the crap that you need by default&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_wL74_LjB1qo/RqfsN9jOLlI/AAAAAAAAACU/9_ggsK4j_l4/s1600-h/Picture+2.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_wL74_LjB1qo/RqfsN9jOLlI/AAAAAAAAACU/9_ggsK4j_l4/s320/Picture+2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5091297628370382418" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;now all you need to to create your fields&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_wL74_LjB1qo/RqfsadjOLmI/AAAAAAAAACc/cU8DGGmHMow/s1600-h/Picture+3.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_wL74_LjB1qo/RqfsadjOLmI/AAAAAAAAACc/cU8DGGmHMow/s320/Picture+3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5091297843118747234" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;What I noticed is that there is no way by default to create your foreign keys on your migration file by default, you either have to (1)call the execute method I.E. "execute 'alter table....'" or (2)download a gem that does it for you. It looks like in rails development, all the relationships are built through your models/domain objects.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 2&lt;/b&gt;&lt;br /&gt;Once you have finished creating your migration files time for the domain objects.&lt;br /&gt;&lt;br /&gt;So lets start with the crazy ones... User, Assignment, &amp; Project.&lt;br /&gt;&lt;br /&gt;Before we begin check out the the relationship between user &amp; project&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_wL74_LjB1qo/RqgR29jOLpI/AAAAAAAAAC0/Zx4Rm9-gJEs/s1600-h/Picture+6.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_wL74_LjB1qo/RqgR29jOLpI/AAAAAAAAAC0/Zx4Rm9-gJEs/s320/Picture+6.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5091339014675246738" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You will notice we're busting a many to many relationship with users &amp; projects through assignments. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This is how you implement the relationship in rails&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_wL74_LjB1qo/RqgRYdjOLnI/AAAAAAAAACk/lAkUMJSiYgs/s1600-h/Picture+4.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_wL74_LjB1qo/RqgRYdjOLnI/AAAAAAAAACk/lAkUMJSiYgs/s320/Picture+4.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5091338490689236594" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_wL74_LjB1qo/RqgRl9jOLoI/AAAAAAAAACs/sg7oj_NHWzs/s1600-h/Picture+5.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_wL74_LjB1qo/RqgRl9jOLoI/AAAAAAAAACs/sg7oj_NHWzs/s320/Picture+5.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5091338722617470594" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;once that "hard" part is done, everything else is ezed!&lt;br /&gt;&lt;br /&gt;here's the most code I have done so far on my domain object&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_wL74_LjB1qo/RqgUO9jOLqI/AAAAAAAAAC8/4uItyQUjKDI/s1600-h/Picture+7.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_wL74_LjB1qo/RqgUO9jOLqI/AAAAAAAAAC8/4uItyQUjKDI/s320/Picture+7.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5091341626015362722" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Well that's it for now... Stay tuned for testing the domain objects!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-1208093026208925831?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/1208093026208925831/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=1208093026208925831' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/1208093026208925831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/1208093026208925831'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2007/07/jonas-crazy-adventures-in-ror-part-iii.html' title='Jonas&apos; Crazy Adventures in RoR - Part III - Migration Files &amp; Models/Domain Objects'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_wL74_LjB1qo/RqfrRtjOLkI/AAAAAAAAACM/AE_a1-pa1b4/s72-c/Picture+1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-3925414229167164397</id><published>2007-07-24T21:42:00.000-06:00</published><updated>2008-12-10T21:59:29.202-07:00</updated><title type='text'>Jonas' Crazy Adventures in RoR - Part II - The Login</title><content type='html'>I know, I showed some ghetto ERD skillz on part 1, but I would like to try out some of the gems out there that has a pimp implementation of user authentication.&lt;br /&gt;&lt;br /&gt;I talked to &lt;a href="http://blog.sideline.ca/"&gt;sideline&lt;/a&gt; and the &lt;a href="http://jasonsaid.wordpress.com/"&gt;semi-hottest .rb developer in cowtown&lt;/a&gt;, and they recommended &lt;a href="http://technoweenie.stikipad.com/plugins/show/Acts+as+Authenticated"&gt;Acts as Authenticated&lt;/a&gt;. So I'm trying it...&lt;br /&gt;&lt;br /&gt;So far, not so bad... Installing it was cakes &lt;i&gt;script/plugin install http://svn.techno-weenie.net/projects/plugins/acts_as_authenticated&lt;/i&gt;&lt;br /&gt;then&lt;br /&gt;&lt;i&gt;script/generate authenticated user account&lt;/i&gt;&lt;br /&gt;then&lt;br /&gt;update your database.yml with the proper credentials to your db&lt;br /&gt;then if you're using mysql&lt;br /&gt;&lt;i&gt;mysqladmin -u root -p create &amp;lt;database name&amp;gt;&lt;/i&gt;&lt;br /&gt;then&lt;br /&gt;&lt;i&gt;rake db:migrate&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;if all goes well, your iTerm should look like:&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_wL74_LjB1qo/RqbKqtjOLdI/AAAAAAAAABU/6tlxtwm6wFw/s1600-h/aaa.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_wL74_LjB1qo/RqbKqtjOLdI/AAAAAAAAABU/6tlxtwm6wFw/s320/aaa.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5090979263919566290" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;also, it will create a "Users" table on your database&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_wL74_LjB1qo/RqbRMdjOLjI/AAAAAAAAACE/R9DbSe14hvg/s1600-h/Picture+3.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_wL74_LjB1qo/RqbRMdjOLjI/AAAAAAAAACE/R9DbSe14hvg/s320/Picture+3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5090986440809918002" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;So now what?&lt;/h3&gt;&lt;br /&gt;Check out what you created! goto your browser and type: &lt;i&gt;http://localhost:3000/account/index&lt;/i&gt;&lt;br /&gt;and you will see a signup page&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_wL74_LjB1qo/RqbLsdjOLeI/AAAAAAAAABc/aXUqw7bHBT4/s1600-h/signup.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_wL74_LjB1qo/RqbLsdjOLeI/AAAAAAAAABc/aXUqw7bHBT4/s320/signup.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5090980393495965154" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;once you register, you will see..&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_wL74_LjB1qo/RqbMD9jOLfI/AAAAAAAAABk/nD-Joy5Q5EM/s1600-h/index.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_wL74_LjB1qo/RqbMD9jOLfI/AAAAAAAAABk/nD-Joy5Q5EM/s320/index.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5090980797222890994" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;what the hell is that???&lt;br /&gt;looking @ the account_controller.rb file, especially the index method it does some logic... check you the screenshot:&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_wL74_LjB1qo/RqbM5djOLgI/AAAAAAAAABs/opmhE062Zlo/s1600-h/indexcontroller.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_wL74_LjB1qo/RqbM5djOLgI/AAAAAAAAABs/opmhE062Zlo/s320/indexcontroller.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5090981716345892354" /&gt;&lt;/a&gt;&lt;br /&gt;also, check out&lt;br /&gt;&amp;lt;project&amp;gt;/app/views/account/index.rhtml... there it is! that weird poem... get rid of that, and put something that makes sense... for me it's jonas is a f*cking stud!&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_wL74_LjB1qo/RqbOrtjOLhI/AAAAAAAAAB0/uEOgSaVNfiI/s1600-h/Picture+2.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_wL74_LjB1qo/RqbOrtjOLhI/AAAAAAAAAB0/uEOgSaVNfiI/s320/Picture+2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5090983679145946642" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;by viewing the account_controller.rb, you will get an idea all the stuff that is exposed: index, login, signup, logout&lt;br /&gt;so that means when you go to your site, http://localhost:3000/accounts/&amp;lt;operation&amp;gt;, just put the operation you want, and you will do one of the four&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_wL74_LjB1qo/RqbOztjOLiI/AAAAAAAAAB8/e1CYGWDNgw0/s1600-h/Picture+1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_wL74_LjB1qo/RqbOztjOLiI/AAAAAAAAAB8/e1CYGWDNgw0/s320/Picture+1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5090983816584900130" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is ezed signing off for part deuce!... Watch out for part tres for the rake migrations! nyahhhhhHH!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-3925414229167164397?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/3925414229167164397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=3925414229167164397' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/3925414229167164397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/3925414229167164397'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2007/07/jonas-crazy-adventures-in-ror-part-ii.html' title='Jonas&apos; Crazy Adventures in RoR - Part II - The Login'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_wL74_LjB1qo/RqbKqtjOLdI/AAAAAAAAABU/6tlxtwm6wFw/s72-c/aaa.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-5191411246778219793</id><published>2007-07-24T20:12:00.000-06:00</published><updated>2008-12-10T21:59:29.474-07:00</updated><title type='text'>Jonas' Crazy Adventures in RoR - Part I - The Idea</title><content type='html'>After my &lt;a href="http://jonasavellana.blogspot.com/2007/07/macports-ruby-installation-part-ii.html"&gt;pain&lt;/a&gt;, it is finally time to do some coding.&lt;br /&gt;&lt;br /&gt;But I don't want to do any "hello rails" app, I want something that I would use. Well what do I need?&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;Iteration Management Tool!&lt;/h1&gt;&lt;br /&gt;&lt;br /&gt;I know... there are tons of those online, but hey I gotta do some shizzle. There is definately nothing wrong with my post-it notes style of showing my progress on a project, but it would be nice to do some graphs, some reporting, and some stuff to show me the status of my project on the world wide interweb.&lt;br /&gt;&lt;br /&gt;Me and my buddy &lt;a href="http://becomingagile.blogspot.com/"&gt;Nei&lt;/a&gt;l had this idea before, but nothing really happened. I attempted in &lt;a href="http://castleproject.org/monorail/index.html"&gt;MonoRail&lt;/a&gt;, but it ended up like my other projects, I got lazy and moved on.&lt;br /&gt;&lt;br /&gt;So for the idea, I whipped up a ghetto high-level database diagram of the tables. Nothing fancy... just what I need so far.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_wL74_LjB1qo/RqaxzNjOLcI/AAAAAAAAABM/nhvzEIm79ro/s1600-h/imagine.gif"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_wL74_LjB1qo/RqaxzNjOLcI/AAAAAAAAABM/nhvzEIm79ro/s320/imagine.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5090951922157759938" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I really want this project to be a 2 week project, so I will pimp it up one day.&lt;br /&gt;&lt;br /&gt;Stay tuned for Part deuce - the login!&lt;br /&gt;&lt;br /&gt;peace! I'm uber pumped!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-5191411246778219793?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/5191411246778219793/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=5191411246778219793' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/5191411246778219793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/5191411246778219793'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2007/07/jonas-crazy-adventures-in-ror-part-i.html' title='Jonas&apos; Crazy Adventures in RoR - Part I - The Idea'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_wL74_LjB1qo/RqaxzNjOLcI/AAAAAAAAABM/nhvzEIm79ro/s72-c/imagine.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-2070133625285186174</id><published>2007-07-23T23:09:00.000-06:00</published><updated>2007-07-23T23:21:16.639-06:00</updated><title type='text'>macports &amp; ruby installation part II</title><content type='html'>I had to post another one... F*cking thing is a pain when it's the first time running it....&lt;br /&gt;&lt;br /&gt;So this post is dedicated to anyone that has a mac and wants to pursue a macport way of installing RoR &amp; MySQL&lt;br /&gt;&lt;br /&gt;1) Download &amp; install iTerm&lt;br /&gt;2) Download &amp; install XCode 2.4.1&lt;br /&gt;3) Download &amp; install macports&lt;br /&gt;4) update /etc/profile or ~/.profile with the following PATH="/opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/local/sbin:/bin:/sbin:/usr/bin:/usr/sbin"&lt;br /&gt;5) open iTerm and type: &lt;i&gt;sudo port selfupdate&lt;/i&gt;&lt;br /&gt;6) install ruby: &lt;i&gt;sudo port install ruby rb-rubygems rb-termios&lt;/i&gt;&lt;br /&gt;7) install mysql &lt;i&gt;sudo port install mysql5 +server&lt;/i&gt;&lt;br /&gt;8) create a symbolic link to mysql.sock: &lt;i&gt;sudo ln -s /opt/local/var/run/mysql5/mysqld.sock /tmp/mysql.sock&lt;/i&gt;&lt;br /&gt;9) to autostart mysql: &lt;i&gt;launchctl load -w /Library/LaunchDaemons/org.macports.mysql5.plist&lt;/i&gt;&lt;br /&gt;10) configure mysql: &lt;i&gt;sudo mysql_install_db5 --user=mysql&lt;/i&gt;&lt;br /&gt;11) secure mysql: &lt;i&gt;sudo -u mysql mysql_install_db5&lt;/i&gt;&lt;br /&gt;12) start mysql: &lt;i&gt;sudo -u mysql /opt/local/lib/mysql5/bin/mysqld_safe&lt;/i&gt;&lt;br /&gt;13) update mysql root password: &lt;i&gt;/opt/local/lib/mysql5/bin/mysqladmin -u root password 'your_password'&lt;/i&gt;&lt;br /&gt;14) install ruby mysql adapter: &lt;i&gt;sudo port install rb-mysql&lt;/i&gt;&lt;br /&gt;15) Finally install rails and other stuff: &lt;i&gt;sudo gem install rake rails capistrano mongrel mongrel_cluster deprec --include-dependencies&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-2070133625285186174?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/2070133625285186174/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=2070133625285186174' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/2070133625285186174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/2070133625285186174'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2007/07/macports-ruby-installation-part-ii.html' title='macports &amp; ruby installation part II'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-1445952070205765268</id><published>2007-07-23T20:33:00.000-06:00</published><updated>2007-07-23T20:44:01.089-06:00</updated><title type='text'>macports &amp; ruby installation on my pimp macbook pro</title><content type='html'>I've decided to give RoR a shot again but this time with macports. For those people on the mac trying to develop RoR apps, macports is the way to go!&lt;br /&gt;&lt;br /&gt;But here are some things that I did when im installing ruby on my mac:&lt;br /&gt;1) Google "macports+rails"&lt;br /&gt;2) mongrel doesnt work if you install it after rails. to avoid this pain, type &lt;i&gt;"sudo gem install -y mongrel mongrel_cluster rails"&lt;/i&gt;&lt;br /&gt;3) When running the webserver for the first time, make sure you update your /etc/profile configuration file to use the macport ruby not the default mac ruby found on /usr/bin. Sooo change this: PATH="/bin:/sbin:/usr/bin:/usr/sbin" to this &lt;b&gt;PATH="/opt/local/bin:/opt/local/sbin:/bin:/sbin:/usr/bin:/usr/sbin"&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Now go .rb'ing like a mofo!&lt;br /&gt;&lt;br /&gt;p.s. If you bought &lt;br /&gt;&lt;img src="http://pragmaticprogrammer.com/images/rails_medium.jpg"&gt;&lt;br /&gt;&lt;br /&gt;burn it and get&lt;br /&gt;&lt;br /&gt;&lt;img src="http://pragmaticprogrammer.com/images/rails2_medium.jpg"&gt;&lt;br /&gt;&lt;br /&gt;Rails changed dramatically on 1.2&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-1445952070205765268?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/1445952070205765268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=1445952070205765268' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/1445952070205765268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/1445952070205765268'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2007/07/macports-ruby-installation-on-my-pimp.html' title='macports &amp; ruby installation on my pimp macbook pro'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-2877447037658961184</id><published>2007-07-09T23:04:00.000-06:00</published><updated>2008-01-14T23:54:09.734-07:00</updated><title type='text'>Getting your CruiseControl.Net/.rb 's Project Status in C#</title><content type='html'>Ever wondered how to get a CruiseControl.Net/.rb project status?&lt;br /&gt;&lt;br /&gt;Below is a spike I did to see if I can do it.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div    style="background: white none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;font-family:Courier New;font-size:10pt;color:black;"&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; System;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; System.Runtime.Remoting;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; MbUnit.Framework;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; Rhino.Mocks;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; ThoughtWorks.CruiseControl.CCTrayLib.Configuration;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; ThoughtWorks.CruiseControl.CCTrayLib.Monitoring;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; ThoughtWorks.CruiseControl.Remote;&lt;/p&gt;&lt;p style="margin: 0px;"&gt; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:blue;"&gt;namespace&lt;/span&gt; i.ma.gine.spike&lt;/p&gt;&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;&lt;p style="margin: 0px;"&gt;    [&lt;span style="color: rgb(43, 145, 175);"&gt;TestFixture&lt;/span&gt;]&lt;/p&gt;&lt;p style="margin: 0px;"&gt;    &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;CruiseControlMonitorSpike&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;    {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;        [&lt;span style="color: rgb(43, 145, 175);"&gt;Test&lt;/span&gt;]&lt;/p&gt;&lt;p style="margin: 0px;"&gt;        &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Create_ShouldCallCreate()&lt;/p&gt;&lt;p style="margin: 0px;"&gt;        {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;            &lt;span style="color: rgb(43, 145, 175);"&gt;MockRepository&lt;/span&gt; mockery = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;MockRepository&lt;/span&gt;();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;            &lt;span style="color: rgb(43, 145, 175);"&gt;ICruiseProjectManager&lt;/span&gt; mockManager = mockery.CreateMock&amp;lt;&lt;span style="color: rgb(43, 145, 175);"&gt;ICruiseProjectManager&lt;/span&gt;&amp;gt;();&lt;/p&gt;&lt;p style="margin: 0px;"&gt; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;            &lt;span style="color: rgb(43, 145, 175);"&gt;ProjectStatus&lt;/span&gt; status = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ProjectStatus&lt;/span&gt;();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;            &lt;span style="color: rgb(43, 145, 175);"&gt;Expect&lt;/span&gt;.Call(mockManager.ProjectStatus).Return(status);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;            mockery.ReplayAll();&lt;/p&gt;&lt;p style="margin: 0px;"&gt; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;            &lt;span style="color: rgb(43, 145, 175);"&gt;ProjectMonitor&lt;/span&gt; monitor = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ProjectMonitor&lt;/span&gt;(mockManager);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;            monitor.Poll();&lt;/p&gt;&lt;p style="margin: 0px;"&gt; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;            &lt;span style="color: rgb(43, 145, 175);"&gt;Assert&lt;/span&gt;.AreSame(status, monitor.ProjectStatus);&lt;/p&gt;&lt;p style="margin: 0px;"&gt; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;            mockery.VerifyAll();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;        }&lt;/p&gt;&lt;p style="margin: 0px;"&gt; &lt;/p&gt;&lt;p style="margin: 0px;"&gt; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;        [&lt;span style="color: rgb(43, 145, 175);"&gt;Test&lt;/span&gt;, &lt;span style="color: rgb(43, 145, 175);"&gt;Ignore&lt;/span&gt;(&lt;span style="color: rgb(163, 21, 21);"&gt;"Just wanted to verify if I can actually connect to my CruiseControl.rb server"&lt;/span&gt;)]&lt;/p&gt;&lt;p style="margin: 0px;"&gt;        &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Create_ShouldCallCreateRunningRealCruiseControlServer()&lt;/p&gt;&lt;p style="margin: 0px;"&gt;        {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;            &lt;span style="color: rgb(43, 145, 175);"&gt;ICruiseProjectManagerFactory&lt;/span&gt; cruiseProjectManagerFactory =&lt;/p&gt;&lt;p style="margin: 0px;"&gt;                &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;CruiseProjectManagerFactory&lt;/span&gt;(&lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;FakeCruiseManagerFactory&lt;/span&gt;(), &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;WebRetriever&lt;/span&gt;());&lt;/p&gt;&lt;p style="margin: 0px;"&gt;            &lt;span style="color: rgb(43, 145, 175);"&gt;ProjectMonitor&lt;/span&gt; monitor =&lt;/p&gt;&lt;p style="margin: 0px;"&gt;                &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ProjectMonitor&lt;/span&gt;(&lt;/p&gt;&lt;p style="margin: 0px;"&gt;                    cruiseProjectManagerFactory.Create(&lt;/p&gt;&lt;p style="margin: 0px;"&gt;                        &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Project&lt;/span&gt;(&lt;span style="color: rgb(163, 21, 21);"&gt;"http://localhost:3333/XmlStatusReport.aspx"&lt;/span&gt;, &lt;span style="color: rgb(163, 21, 21);"&gt;"imagine"&lt;/span&gt;)));&lt;/p&gt;&lt;p style="margin: 0px;"&gt;            monitor.Poll();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;            &lt;span style="color: rgb(43, 145, 175);"&gt;Console&lt;/span&gt;.Out.WriteLine(monitor.ProjectState);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;            &lt;span style="color: rgb(43, 145, 175);"&gt;Console&lt;/span&gt;.Out.WriteLine(monitor.LastBuildTime);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;        }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;    }&lt;/p&gt;&lt;p style="margin: 0px;"&gt; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;    &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;FakeCruiseManagerFactory&lt;/span&gt; : &lt;span style="color: rgb(43, 145, 175);"&gt;ICruiseManagerFactory&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;    {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;        &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ICruiseManager&lt;/span&gt; GetCruiseManager(&lt;span style="color:blue;"&gt;string&lt;/span&gt; url)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;        {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;            &lt;span style="color:blue;"&gt;return&lt;/span&gt; (&lt;span style="color: rgb(43, 145, 175);"&gt;ICruiseManager&lt;/span&gt;) &lt;span style="color: rgb(43, 145, 175);"&gt;RemotingServices&lt;/span&gt;.Connect(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt; (&lt;span style="color: rgb(43, 145, 175);"&gt;ICruiseManager&lt;/span&gt;), url);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;        }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;    }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;With the following spike above, I was able to do this in code:&lt;br /&gt;&lt;br /&gt;&lt;div    style="background: white none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;font-family:Courier New;font-size:10pt;color:black;"&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; Format(&lt;span style="color: rgb(43, 145, 175);"&gt;ICruiseControlProject&lt;/span&gt; project)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;&lt;p style="margin: 0px;"&gt;    &lt;span style="color:blue;"&gt;try&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;    {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;        &lt;span style="color:blue;"&gt;if&lt;/span&gt; (project.ProjectMonitor.ProjectState.ToString() == &lt;span style="color: rgb(163, 21, 21);"&gt;"Success"&lt;/span&gt;)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;            &lt;span style="color:blue;"&gt;return&lt;/span&gt; GetHTMLString(project.ProjectMonitor, &lt;span style="color: rgb(163, 21, 21);"&gt;"green"&lt;/span&gt;);&lt;/p&gt;&lt;p style="margin: 0px;"&gt; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;        &lt;span style="color:blue;"&gt;return&lt;/span&gt; GetHTMLString(project.ProjectMonitor, &lt;span style="color: rgb(163, 21, 21);"&gt;"red"&lt;/span&gt;);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;    }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;    &lt;span style="color:blue;"&gt;catch&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;    {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;        &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color: rgb(163, 21, 21);"&gt;"&amp;lt;font color=\"red\"&amp;gt;{0}&amp;lt;/font&amp;gt;"&lt;/span&gt;, project.ProjectMonitor.ProjectState);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;    }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;&lt;p style="margin: 0px;"&gt; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; GetHTMLString(&lt;span style="color: rgb(43, 145, 175);"&gt;IProjectMonitor&lt;/span&gt; monitor, &lt;span style="color:blue;"&gt;string&lt;/span&gt; fontColor)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;&lt;p style="margin: 0px;"&gt;    &lt;span style="color:blue;"&gt;return&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;        &lt;span style="color:blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color: rgb(163, 21, 21);"&gt;"&amp;lt;font color=\"{2}\"&amp;gt;{0} - {1}&amp;lt;/font&amp;gt;"&lt;/span&gt;, monitor.ProjectState,&lt;/p&gt;&lt;p style="margin: 0px;"&gt;                      ((&lt;span style="color: rgb(43, 145, 175);"&gt;ProjectMonitor&lt;/span&gt;) monitor).LastBuildTime, fontColor);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Note:&lt;br /&gt;I imported the following .dll's from CCTray (1)ThoughtWorks.CruiseControl.CCTrayLib.dll (2)ThoughtWorks.CruiseControl.Remote.dll&lt;hints id="hah_hints"&gt;&lt;/hints&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-2877447037658961184?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/2877447037658961184/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=2877447037658961184' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/2877447037658961184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/2877447037658961184'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2007/07/getting-your-cruisecontrolnetrb-s.html' title='Getting your CruiseControl.Net/.rb &apos;s Project Status in C#'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-4267652328913094819</id><published>2007-07-06T00:50:00.000-06:00</published><updated>2007-07-06T00:51:56.433-06:00</updated><title type='text'>Google Reader</title><content type='html'>Anyone know why Google Reader takes a long time to show new posts from blogger.com?&lt;br /&gt;&lt;br /&gt;I had a post on July 2, and I just saw it on my google reader on July 6th.&lt;br /&gt;&lt;br /&gt;Anyone has an answer to this?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-4267652328913094819?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/4267652328913094819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=4267652328913094819' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/4267652328913094819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/4267652328913094819'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2007/07/google-reader.html' title='Google Reader'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-657134841517138519</id><published>2007-07-06T00:24:00.000-06:00</published><updated>2007-07-06T00:44:16.518-06:00</updated><title type='text'>Passive View + Rhino Mocks = P.I.M.P.</title><content type='html'>Okay, my &lt;a href="http://jonasavellana.blogspot.com/2006/10/nmock2-rhinomocks-nemesis.html"&gt;previous&lt;/a&gt; post, I said that nMock2 was better - I changed my mind. &lt;br /&gt;&lt;br /&gt;It was just that I didn't know how to use the damn tool. But having used &lt;a href="http://ayende.com/projects/rhino-mocks.aspx"&gt;Rhino Mocks&lt;/a&gt; for over 8+ months now It has become my favorite mocking tool... &lt;br /&gt;&lt;br /&gt;To show you guys some nyahh, check this passive view mvp test using rhino:&lt;br /&gt;&lt;br /&gt;&lt;!--&lt;br /&gt;{\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red43\green145\blue175;\red0\green0\blue255;}??\fs20 [\cf3 Test\cf0 ]\par ??\cf4 public\cf0  \cf4 void\cf0  Load_ShouldLoadView()\par ??\{\par ??    \cf3 MockRepository\cf0  mockery = \cf4 new\cf0  \cf3 MockRepository\cf0 ();\par ??    \cf3 IPimpBlogView\cf0  view = mockery.CreateMock&amp;lt;\cf3 IPimpBlogView\cf0 &amp;gt;();\par ??    \cf3 IBlogPostTask\cf0  task = mockery.CreateMock&amp;lt;\cf3 IBlogPostTask\cf0 &amp;gt;();\par ??\par ??    view.Load += \cf4 null\cf0 ;\par ??    \cf3 IEventRaiser\cf0  raiser = \cf3 LastCall\cf0 .Constraints(\cf3 Is\cf0 .NotNull()).GetEventRaiser();\par ??    \cf3 Expect\cf0 .Call(task.GetBlogPosts()).Return(\cf4 new\cf0  \cf3 List\cf0 &amp;lt;\cf3 IBlogPost\cf0 &amp;gt;());\par ??    view.BlogPosts = \cf4 new\cf0  \cf3 List\cf0 &amp;lt;\cf3 IBlogPost\cf0 &amp;gt;();\par ??    \cf3 LastCall\cf0 .IgnoreArguments();\par ??\par ??    mockery.ReplayAll();\par ??\par ??    \cf4 new\cf0  \cf3 PimpBlogPresenter\cf0 (view, task);\par ??    raiser.Raise(\cf4 null\cf0 , \cf4 null\cf0 );\par ??    mockery.VerifyAll();\par ??\}}&lt;br /&gt;--&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;p style="margin: 0px;"&gt;[&lt;span style="color: #2b91af;"&gt;Test&lt;/span&gt;]&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Load_ShouldLoadView()&lt;/p&gt;&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;MockRepository&lt;/span&gt; mockery = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;MockRepository&lt;/span&gt;();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;IPimpBlogView&lt;/span&gt; view = mockery.CreateMock&amp;lt;&lt;span style="color: #2b91af;"&gt;IPimpBlogView&lt;/span&gt;&amp;gt;();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;IBlogPostTask&lt;/span&gt; task = mockery.CreateMock&amp;lt;&lt;span style="color: #2b91af;"&gt;IBlogPostTask&lt;/span&gt;&amp;gt;();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; view.Load += &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;IEventRaiser&lt;/span&gt; raiser = &lt;span style="color: #2b91af;"&gt;LastCall&lt;/span&gt;.Constraints(&lt;span style="color: #2b91af;"&gt;Is&lt;/span&gt;.NotNull()).GetEventRaiser();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Expect&lt;/span&gt;.Call(task.GetBlogPosts()).Return(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;IBlogPost&lt;/span&gt;&amp;gt;());&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; view.BlogPosts = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;IBlogPost&lt;/span&gt;&amp;gt;();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;LastCall&lt;/span&gt;.IgnoreArguments();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; mockery.ReplayAll();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;PimpBlogPresenter&lt;/span&gt;(view, task);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; raiser.Raise(&lt;span style="color: blue;"&gt;null&lt;/span&gt;, &lt;span style="color: blue;"&gt;null&lt;/span&gt;);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; mockery.VerifyAll();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As you can see from the above test, that is f'in pimp... I used an event raiser to raise my "Load" method to pretend it did stuff to load all my blog posts...&lt;br /&gt;&lt;br /&gt;Below is the code for the passive mvp for those who missed out on the "pink" of enterprise development last year:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;PimpBlogPresenter&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;readonly&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IBlogPostTask&lt;/span&gt; task;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; PimpBlogPresenter(&lt;span style="color: #2b91af;"&gt;IPimpBlogView&lt;/span&gt; view, &lt;span style="color: #2b91af;"&gt;IBlogPostTask&lt;/span&gt; task)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.task = task;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; view.Load += &lt;span style="color: blue;"&gt;delegate&lt;/span&gt; { HookUpEventsFor(view); };&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; PimpBlogPresenter(&lt;span style="color: #2b91af;"&gt;IPimpBlogView&lt;/span&gt; view) : &lt;span style="color: blue;"&gt;this&lt;/span&gt;(view, &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;BlogPostTask&lt;/span&gt;())&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; HookUpEventsFor(&lt;span style="color: #2b91af;"&gt;IPimpBlogView&lt;/span&gt; view)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; view.BlogPosts = task.GetBlogPosts();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The Form &amp; View&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;partial&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;PimpBlog&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Page&lt;/span&gt;, &lt;span style="color: #2b91af;"&gt;IPimpBlogView&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; #region&lt;/span&gt; IPimpBlogView Members&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;IBlogPost&lt;/span&gt;&amp;gt; BlogPosts&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; blogPostRepeater.DataSource = &lt;span style="color: blue;"&gt;value&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; blogPostRepeater.DataBind();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; #endregion&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; OnInit(&lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt; e)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;PimpBlogPresenter&lt;/span&gt;(&lt;span style="color: blue;"&gt;this&lt;/span&gt;);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;base&lt;/span&gt;.OnInit(e);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;interface&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IPimpBlogView&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;IBlogPost&lt;/span&gt;&amp;gt; BlogPosts { &lt;span style="color: blue;"&gt;set&lt;/span&gt;; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;event&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;EventHandler&lt;/span&gt; Load;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In conclusion, &lt;a href="http://ayende.com/projects/rhino-mocks.aspx"&gt;Rhino Mocks&lt;/a&gt; is pimp. Thanks Ayende for making such an awesome weapon for dealing with the pain!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-657134841517138519?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/657134841517138519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=657134841517138519' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/657134841517138519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/657134841517138519'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2007/07/passive-view-rhino-mocks-pimp.html' title='Passive View + Rhino Mocks = P.I.M.P.'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-6618275194232611436</id><published>2007-07-02T22:45:00.000-06:00</published><updated>2008-12-10T21:59:29.702-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DJ'/><title type='text'>My DJ Setup</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/_wL74_LjB1qo/RonUuFgJBKI/AAAAAAAAAA8/ZORg7TOlHpM/s1600-h/P7020021.JPG"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_wL74_LjB1qo/RonUuFgJBKI/AAAAAAAAAA8/ZORg7TOlHpM/s320/P7020021.JPG" alt="" id="BLOGGER_PHOTO_ID_5082827542680372386" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Macbook Pro (1st Gen)&lt;br /&gt;- Vestax - VCI 100 MIDI Controller&lt;br /&gt;- M-Audio Fast Track Pro Audio Interface&lt;br /&gt;- Vestax PMC 07 Mixer&lt;br /&gt;- Technics 1200 M3D&lt;br /&gt;- My Awesome Skills!&lt;hints id="hah_hints"&gt;&lt;/hints&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-6618275194232611436?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/6618275194232611436/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=6618275194232611436' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/6618275194232611436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/6618275194232611436'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2007/07/my-dj-setup.html' title='My DJ Setup'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_wL74_LjB1qo/RonUuFgJBKI/AAAAAAAAAA8/ZORg7TOlHpM/s72-c/P7020021.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-7089826764961694605</id><published>2007-06-12T20:59:00.000-06:00</published><updated>2007-06-12T21:10:54.812-06:00</updated><title type='text'>IEnumerable&lt;T&gt;, Fluent Interfaces, Specification Pattern = Ménage à trois</title><content type='html'>Since I haven't blogged for months, might as well bust a Ménage à trois post.&lt;br /&gt;&lt;br /&gt;In this post you will learn the following:&lt;br /&gt;&lt;br /&gt;- An implementation of IEnumerable&amp;lt;T&amp;gt;&lt;br /&gt;- &lt;a href="http://www.martinfowler.com/bliki/FluentInterface.html"&gt;Fluent interfaces&lt;/a&gt;&lt;br /&gt;- Simpe implementation of the &lt;a href="http://www.martinfowler.com/apsupp/spec.pdf"&gt;Specification Pattern&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To begin, here's the test...&lt;br /&gt;&lt;br /&gt;&lt;!--&lt;br /&gt;{\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;\red163\green21\blue21;}??\fs20 \cf1 using\cf0  System.Collections;\par ??\cf1 using\cf0  System.Collections.Generic;\par ??\cf1 using\cf0  MbUnit.Framework;\par ??\cf1 using\cf0  specification;\par ??\par ??\cf1 namespace\cf0  test\par ??\{\par ??    [\cf4 TestFixture\cf0 ]\par ??    \cf1 public\cf0  \cf1 class\cf0  \cf4 InventoryTest\par ??\cf0     \{\par ??        [\cf4 Test\cf0 ]\par ??        \cf1 public\cf0  \cf1 void\cf0  Add_ShouldBuildInventory_UsingAdd_ButItIsNotAsCool()\par ??        \{\par ??            \cf4 Inventory\cf0  musicalInstrumentInventory = \cf1 new\cf0  \cf4 Inventory\cf0 ();\par ??            musicalInstrumentInventory.Add(\cf1 new\cf0  \cf4 MusicalInstrument\cf0 (\cf5 "Guitar"\cf0 ));\par ??            musicalInstrumentInventory.Add(\cf1 new\cf0  \cf4 MusicalInstrument\cf0 (\cf5 "Turntables"\cf0 ));\par ??            musicalInstrumentInventory.Add(\cf1 new\cf0  \cf4 MusicalInstrument\cf0 (\cf5 "Drums"\cf0 ));\par ??            musicalInstrumentInventory.Add(\cf1 new\cf0  \cf4 MusicalInstrument\cf0 (\cf5 "Banjo"\cf0 ));\par ??\par ??            \cf1 int\cf0  totalMusicalInstruments = 0;\par ??            \cf4 IEnumerator\cf0  enumerator = musicalInstrumentInventory.GetEnumerator();\par ??            \cf1 while\cf0  (enumerator.MoveNext())\par ??            \{\par ??                totalMusicalInstruments++;\par ??            \}\par ??\par ??            \cf4 Assert\cf0 .AreEqual(4, totalMusicalInstruments);\par ??        \}\par ??\par ??        [\cf4 Test\cf0 ]\par ??        \cf1 public\cf0  \cf1 void\cf0  With_ShouldBuildInventory_UsingFluentInterface()\par ??        \{\par ??            \cf4 Inventory\cf0  musicalInstrumentInventory = \cf1 new\cf0  \cf4 Inventory\cf0 ()\par ??                .With(\cf1 new\cf0  \cf4 MusicalInstrument\cf0 (\cf5 "Guitar"\cf0 ))\par ??                .With(\cf1 new\cf0  \cf4 MusicalInstrument\cf0 (\cf5 "Turntables"\cf0 ))\par ??                .With(\cf1 new\cf0  \cf4 MusicalInstrument\cf0 (\cf5 "Drums"\cf0 ))\par ??                .With(\cf1 new\cf0  \cf4 MusicalInstrument\cf0 (\cf5 "Banjo"\cf0 ));\par ??\par ??            \cf1 int\cf0  totalMusicalInstruments = 0;\par ??            \cf4 IEnumerator\cf0  enumerator = musicalInstrumentInventory.GetEnumerator();\par ??            \cf1 while\cf0  (enumerator.MoveNext())\par ??            \{\par ??                totalMusicalInstruments++;\par ??            \}\par ??\par ??            \cf4 Assert\cf0 .AreEqual(4, totalMusicalInstruments);\par ??        \}\par ??\par ??        [\cf4 Test\cf0 ]\par ??        \cf1 public\cf0  \cf1 void\cf0  FindAll_ShouldFindGuitar()\par ??        \{\par ??            \cf4 MusicalInstrument\cf0  guitar = \cf1 new\cf0  \cf4 MusicalInstrument\cf0 (\cf5 "Guitar"\cf0 );\par ??            \cf4 Inventory\cf0  musicalInstrumentInventory = \cf1 new\cf0  \cf4 Inventory\cf0 ()\par ??                .With(guitar)\par ??                .With(\cf1 new\cf0  \cf4 MusicalInstrument\cf0 (\cf5 "Turntables"\cf0 ))\par ??                .With(\cf1 new\cf0  \cf4 MusicalInstrument\cf0 (\cf5 "Drums"\cf0 ))\par ??                .With(\cf1 new\cf0  \cf4 MusicalInstrument\cf0 (\cf5 "Banjo"\cf0 ));\par ??\par ??            \cf4 MusicalInstrument\cf0  resultGuitar =\par ??                    \cf1 new\cf0  \cf4 List\cf0 &amp;lt;\cf4 MusicalInstrument\cf0 &amp;gt;\par ??                        (\par ??                            musicalInstrumentInventory.FindAll(\cf1 new\cf0  \cf4 GetGuitarSpecification\cf0 ())\par ??                        )[0];\par ??\par ??            \cf4 Assert\cf0 .IsTrue(guitar.Equals(resultGuitar));\par ??        \}\par ??\par ??        \cf1 private\cf0  \cf1 class\cf0  \cf4 GetGuitarSpecification\cf0  : \cf4 ISpecification\cf0 &amp;lt;\cf4 MusicalInstrument\cf0 &amp;gt;\par ??        \{\par ??            \cf1 public\cf0  \cf1 bool\cf0  IsSatisfiedBy(\cf4 MusicalInstrument\cf0  item)\par ??            \{\par ??                \cf1 return\cf0  item.Name.Equals(\cf5 "Guitar"\cf0 );\par ??            \}\par ??        \}\par ??    \}\par ??\}}&lt;br /&gt;--&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 8pt; color: black; background: white;"&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Collections;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; MbUnit.Framework;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; specification;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;namespace&lt;/span&gt; test&lt;/p&gt;&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; [&lt;span style="color: #2b91af;"&gt;TestFixture&lt;/span&gt;]&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;InventoryTest&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;span style="color: #2b91af;"&gt;Test&lt;/span&gt;]&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Add_ShouldBuildInventory_UsingAdd_ButItIsNotAsCool()&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Inventory&lt;/span&gt; musicalInstrumentInventory = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Inventory&lt;/span&gt;();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; musicalInstrumentInventory.Add(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;MusicalInstrument&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Guitar"&lt;/span&gt;));&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; musicalInstrumentInventory.Add(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;MusicalInstrument&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Turntables"&lt;/span&gt;));&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; musicalInstrumentInventory.Add(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;MusicalInstrument&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Drums"&lt;/span&gt;));&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; musicalInstrumentInventory.Add(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;MusicalInstrument&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Banjo"&lt;/span&gt;));&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; totalMusicalInstruments = 0;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;IEnumerator&lt;/span&gt; enumerator = musicalInstrumentInventory.GetEnumerator();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;while&lt;/span&gt; (enumerator.MoveNext())&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; totalMusicalInstruments++;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(4, totalMusicalInstruments);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;span style="color: #2b91af;"&gt;Test&lt;/span&gt;]&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; With_ShouldBuildInventory_UsingFluentInterface()&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Inventory&lt;/span&gt; musicalInstrumentInventory = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Inventory&lt;/span&gt;()&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .With(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;MusicalInstrument&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Guitar"&lt;/span&gt;))&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .With(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;MusicalInstrument&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Turntables"&lt;/span&gt;))&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .With(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;MusicalInstrument&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Drums"&lt;/span&gt;))&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .With(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;MusicalInstrument&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Banjo"&lt;/span&gt;));&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; totalMusicalInstruments = 0;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;IEnumerator&lt;/span&gt; enumerator = musicalInstrumentInventory.GetEnumerator();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;while&lt;/span&gt; (enumerator.MoveNext())&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; totalMusicalInstruments++;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(4, totalMusicalInstruments);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;span style="color: #2b91af;"&gt;Test&lt;/span&gt;]&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; FindAll_ShouldFindGuitar()&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;MusicalInstrument&lt;/span&gt; guitar = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;MusicalInstrument&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Guitar"&lt;/span&gt;);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Inventory&lt;/span&gt; musicalInstrumentInventory = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Inventory&lt;/span&gt;()&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .With(guitar)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .With(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;MusicalInstrument&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Turntables"&lt;/span&gt;))&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .With(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;MusicalInstrument&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Drums"&lt;/span&gt;))&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .With(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;MusicalInstrument&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Banjo"&lt;/span&gt;));&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;MusicalInstrument&lt;/span&gt; resultGuitar =&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;MusicalInstrument&lt;/span&gt;&amp;gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; musicalInstrumentInventory.FindAll(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;GetGuitarSpecification&lt;/span&gt;())&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )[0];&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Assert&lt;/span&gt;.IsTrue(guitar.Equals(resultGuitar));&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;GetGuitarSpecification&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;ISpecification&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;MusicalInstrument&lt;/span&gt;&amp;gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;bool&lt;/span&gt; IsSatisfiedBy(&lt;span style="color: #2b91af;"&gt;MusicalInstrument&lt;/span&gt; item)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; item.Name.Equals(&lt;span style="color: #a31515;"&gt;"Guitar"&lt;/span&gt;);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now the code...&lt;br /&gt;&lt;br /&gt;&lt;!--&lt;br /&gt;{\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 using\cf0  System.Collections;\par ??\cf1 using\cf0  System.Collections.Generic;\par ??\par ??\cf1 namespace\cf0  specification\par ??\{\par ??    \cf1 public\cf0  \cf1 class\cf0  \cf4 Inventory\cf0  : \cf4 IEnumerable\cf0 &amp;lt;\cf4 MusicalInstrument\cf0 &amp;gt;\par ??    \{\par ??        \cf1 private\cf0  \cf4 List\cf0 &amp;lt;\cf4 MusicalInstrument\cf0 &amp;gt; instruments;\par ??\par ??        \cf1 public\cf0  Inventory()\par ??        \{\par ??            instruments = \cf1 new\cf0  \cf4 List\cf0 &amp;lt;\cf4 MusicalInstrument\cf0 &amp;gt;();\par ??        \}\par ??\par ??        \cf1 public\cf0  \cf1 void\cf0  Add(\cf4 MusicalInstrument\cf0  musicalInstrument)\par ??        \{\par ??            instruments.Add(musicalInstrument);\par ??        \}\par ??\par ??        \cf1 public\cf0  \cf4 Inventory\cf0  With(\cf4 MusicalInstrument\cf0  musicalInstrument)\par ??        \{\par ??            Add(musicalInstrument);\par ??            \cf1 return\cf0  \cf1 this\cf0 ;\par ??        \}\par ??\par ??        \cf1 public\cf0  \cf4 IEnumerable\cf0 &amp;lt;\cf4 MusicalInstrument\cf0 &amp;gt; FindAll(\cf4 ISpecification\cf0 &amp;lt;\cf4 MusicalInstrument\cf0 &amp;gt; specification)\par ??        \{\par ??            \cf1 return\cf0  instruments.FindAll(\cf1 delegate\cf0 (\cf4 MusicalInstrument\cf0  instrument)\par ??                                           \{\par ??                                               \cf1 return\cf0  specification.IsSatisfiedBy(instrument);\par ??                                           \});\par ??        \}\par ??\par ??        \cf4 IEnumerator\cf0 &amp;lt;\cf4 MusicalInstrument\cf0 &amp;gt; \cf4 IEnumerable\cf0 &amp;lt;MusicalInstrument&amp;gt;.GetEnumerator()\par ??        \{\par ??            \cf1 return\cf0  instruments.GetEnumerator();\par ??        \}\par ??\par ??        \cf1 public\cf0  \cf4 IEnumerator\cf0  GetEnumerator()\par ??        \{\par ??            \cf1 return\cf0  instruments.GetEnumerator();\par ??        \}\par ??    \}\par ??\}}&lt;br /&gt;--&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 8pt; color: black; background: white;"&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Collections;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;namespace&lt;/span&gt; specification&lt;/p&gt;&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Inventory&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;MusicalInstrument&lt;/span&gt;&amp;gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;MusicalInstrument&lt;/span&gt;&amp;gt; instruments;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; Inventory()&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; instruments = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;MusicalInstrument&lt;/span&gt;&amp;gt;();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Add(&lt;span style="color: #2b91af;"&gt;MusicalInstrument&lt;/span&gt; musicalInstrument)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; instruments.Add(musicalInstrument);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Inventory&lt;/span&gt; With(&lt;span style="color: #2b91af;"&gt;MusicalInstrument&lt;/span&gt; musicalInstrument)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Add(musicalInstrument);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;this&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;MusicalInstrument&lt;/span&gt;&amp;gt; FindAll(&lt;span style="color: #2b91af;"&gt;ISpecification&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;MusicalInstrument&lt;/span&gt;&amp;gt; specification)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; instruments.FindAll(&lt;span style="color: blue;"&gt;delegate&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;MusicalInstrument&lt;/span&gt; instrument)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  &lt;span style="color: blue;"&gt;return&lt;/span&gt; specification.IsSatisfiedBy(instrument);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  });&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;IEnumerator&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;MusicalInstrument&lt;/span&gt;&amp;gt; &lt;span style="color: #2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;MusicalInstrument&amp;gt;.GetEnumerator()&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; instruments.GetEnumerator();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IEnumerator&lt;/span&gt; GetEnumerator()&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; instruments.GetEnumerator();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;And finally the ISpecification Interface&lt;br /&gt;&lt;br /&gt;&lt;!--&lt;br /&gt;{\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 namespace\cf0  specification\par ??\{\par ??    \cf1 public\cf0  \cf1 interface\cf0  \cf4 ISpecification\cf0 &amp;lt;PersistentItem&amp;gt;\par ??    \{\par ??        \cf1 bool\cf0  IsSatisfiedBy(PersistentItem item);\par ??    \}\par ??\}}&lt;br /&gt;--&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 8pt; color: black; background: white;"&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;namespace&lt;/span&gt; specification&lt;/p&gt;&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;interface&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ISpecification&lt;/span&gt;&amp;lt;PersistentItem&amp;gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;bool&lt;/span&gt; IsSatisfiedBy(PersistentItem item);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-7089826764961694605?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/7089826764961694605/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=7089826764961694605' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/7089826764961694605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/7089826764961694605'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2007/06/ienumerable-fluent-interfaces.html' title='IEnumerable&amp;lt;T&amp;gt;, Fluent Interfaces, Specification Pattern = Ménage à trois'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-8046318755113875921</id><published>2007-03-20T14:34:00.000-06:00</published><updated>2007-03-20T14:51:06.350-06:00</updated><title type='text'>Unit of Work Pattern - Take 2</title><content type='html'>I attempted the Unit of Work pattern a couple of times &lt;a href="http://jonasavellana.blogspot.com/2006/11/nerdage.html"&gt;(here)&lt;/a&gt; and &lt;a href="http://jonasavellana.blogspot.com/2006/10/unit-of-work-pattern.html"&gt;(here)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;But I think during the JP bootcamp, we were talking about how the implementation in the Fowler book is very cluttered. Domain objects know about the unit of work, bla, bla bla... I decided to take a stab on implementing a UoW with Domain objects not knowing about the pattern... Before I go, I kind of cheated with making my domain object know how to mark it self. &lt;br /&gt;&lt;br /&gt;And if you want the source code, download it &lt;a href="http://jonas.ave.googlepages.com/UnitOfWork.zip"&gt;(here)&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;The Test&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;!--&lt;br /&gt;{\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 using\cf0  System.Collections.Generic;\par ??\cf1 using\cf0  MbUnit.Framework;\par ??\cf1 using\cf0  Rhino.Mocks;\par ??\cf1 using\cf0  unitofwork.spike.Dataaccess;\par ??\cf1 using\cf0  unitofwork.spike.Domain;\par ??\cf1 using\cf0  unitofwork.spike.utility;\par ??\par ??\cf1 namespace\cf0  unitofwork.spike.test.Task\par ??\{\par ??    [\cf4 TestFixture\cf0 ]\par ??    \cf1 public\cf0  \cf1 class\cf0  \cf4 UnitOfWorkTest\par ??\cf0     \{\par ??        \cf1 private\cf0  \cf4 MockRepository\cf0  mockery;\par ??        \cf1 private\cf0  \cf4 IDatabaseConnection\cf0  connection;\par ??        \cf1 private\cf0  \cf4 IMapper\cf0  mapper;\par ??\par ??        [\cf4 SetUp\cf0 ]\par ??        \cf1 public\cf0  \cf1 void\cf0  Setup()\par ??        \{\par ??            mockery = \cf1 new\cf0  \cf4 MockRepository\cf0 ();\par ??            mapper = mockery.CreateMock&amp;lt;\cf4 IMapper\cf0 &amp;gt;();\par ??            connection = mockery.CreateMock&amp;lt;\cf4 IDatabaseConnection\cf0 &amp;gt;();\par ??            \cf4 DependencyResolver\cf0 .Add(\cf1 typeof\cf0  (\cf4 FakeUser\cf0 ), mapper);\par ??        \}\par ??\par ??        [\cf4 TearDown\cf0 ]\par ??        \cf1 public\cf0  \cf1 void\cf0  TearDown()\par ??        \{\par ??            mockery.VerifyAll();\par ??            \cf4 DependencyResolver\cf0 .Remove(\cf1 typeof\cf0  (\cf4 FakeUser\cf0 ));\par ??        \}\par ??\par ??        [\cf4 Test\cf0 ]\par ??        \cf1 public\cf0  \cf1 void\cf0  ShouldInstanciate()\par ??        \{\par ??            mockery.ReplayAll();\par ??            \cf4 IUnitOfWork\cf0  work = \cf1 new\cf0  \cf4 UnitOfWork\cf0 (connection);\par ??\par ??            \cf4 Assert\cf0 .IsNotNull(work);\par ??        \}\par ??\par ??        [\cf4 Test\cf0 ]\par ??        \cf1 public\cf0  \cf1 void\cf0  Commit_ShouldCommit_OnlyRegisterNew()\par ??        \{\par ??            \cf4 FakeUser\cf0  user = \cf1 new\cf0  \cf4 FakeUser\cf0 ();\par ??\par ??            mapper.Save(connection, user);\par ??            connection.Dispose();\par ??\par ??            mockery.ReplayAll();\par ??\par ??            \cf4 IUnitOfWork\cf0  work = \cf1 new\cf0  \cf4 UnitOfWork\cf0 (connection);\par ??\par ??            work.RegisterNew(user);\par ??            work.Commit();\par ??        \}\par ??\par ??        [\cf4 Test\cf0 ]\par ??        \cf1 public\cf0  \cf1 void\cf0  Commit_ShouldCommitABunchOfStuff()\par ??        \{\par ??            \cf4 IList\cf0 &amp;lt;\cf4 IDomainObject\cf0 &amp;gt; fakeUsers = \cf1 new\cf0  \cf4 List\cf0 &amp;lt;\cf4 IDomainObject\cf0 &amp;gt;();\par ??            \cf4 FakeUser\cf0  firstUser = \cf1 new\cf0  \cf4 FakeUser\cf0 ();\par ??            \cf4 FakeUser\cf0  secondUser = \cf1 new\cf0  \cf4 FakeUser\cf0 ();\par ??            \cf4 FakeUser\cf0  thirdUser = \cf1 new\cf0  \cf4 FakeUser\cf0 ();\par ??            \cf4 FakeUser\cf0  fourthUser = \cf1 new\cf0  \cf4 FakeUser\cf0 ();\par ??            \cf4 FakeUser\cf0  fifthUser = \cf1 new\cf0  \cf4 FakeUser\cf0 ();\par ??\par ??            firstUser.Mark = \cf4 Mark\cf0 .New;\par ??            secondUser.Mark = \cf4 Mark\cf0 .Dirty;\par ??            thirdUser.Mark = \cf4 Mark\cf0 .Delete;\par ??\par ??            fakeUsers.Add(firstUser);\par ??            fakeUsers.Add(secondUser);\par ??            fakeUsers.Add(thirdUser);\par ??            fakeUsers.Add(fourthUser);\par ??            fakeUsers.Add(fifthUser);\par ??\par ??            mapper.Save(connection, firstUser);\par ??            mapper.Update(connection, secondUser);\par ??            mapper.Delete(connection, thirdUser);\par ??\par ??            connection.Dispose();\par ??\par ??            mockery.ReplayAll();\par ??\par ??            \cf4 IUnitOfWork\cf0  work = \cf1 new\cf0  \cf4 UnitOfWork\cf0 (connection);\par ??\par ??            work.Register(fakeUsers);\par ??            work.Commit();\par ??        \}\par ??\par ??        \cf1 private\cf0  \cf1 class\cf0  \cf4 FakeUser\cf0  : \cf4 IDomainObject\par ??\cf0         \{\par ??            \cf1 private\cf0  \cf4 Mark\cf0  mark;\par ??\par ??            \cf1 public\cf0  \cf4 Mark\cf0  Mark\par ??            \{\par ??                \cf1 get\cf0  \{ \cf1 return\cf0  mark; \}\par ??                \cf1 set\cf0  \{ mark = \cf1 value\cf0 ; \}\par ??            \}\par ??        \}\par ??    \}\par ??\}}&lt;br /&gt;--&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 8pt; color: black; background: white;"&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;using&lt;/span&gt; MbUnit.Framework;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;using&lt;/span&gt; Rhino.Mocks;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;using&lt;/span&gt; unitofwork.spike.Dataaccess;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;using&lt;/span&gt; unitofwork.spike.Domain;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;using&lt;/span&gt; unitofwork.spike.utility;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;namespace&lt;/span&gt; unitofwork.spike.test.Task&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;{&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;10&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; [&lt;span style="color: #2b91af;"&gt;TestFixture&lt;/span&gt;]&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;11&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;UnitOfWorkTest&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;12&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;13&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;MockRepository&lt;/span&gt; mockery;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;14&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IDatabaseConnection&lt;/span&gt; connection;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;15&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IMapper&lt;/span&gt; mapper;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;16&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;17&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;span style="color: #2b91af;"&gt;SetUp&lt;/span&gt;]&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;18&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Setup()&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;19&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;20&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mockery = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;MockRepository&lt;/span&gt;();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;21&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mapper = mockery.CreateMock&amp;lt;&lt;span style="color: #2b91af;"&gt;IMapper&lt;/span&gt;&amp;gt;();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;22&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; connection = mockery.CreateMock&amp;lt;&lt;span style="color: #2b91af;"&gt;IDatabaseConnection&lt;/span&gt;&amp;gt;();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;23&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;DependencyResolver&lt;/span&gt;.Add(&lt;span style="color: blue;"&gt;typeof&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;FakeUser&lt;/span&gt;), mapper);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;24&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;25&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;26&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;span style="color: #2b91af;"&gt;TearDown&lt;/span&gt;]&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;27&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; TearDown()&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;28&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;29&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mockery.VerifyAll();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;30&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;DependencyResolver&lt;/span&gt;.Remove(&lt;span style="color: blue;"&gt;typeof&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;FakeUser&lt;/span&gt;));&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;31&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;32&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;33&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;span style="color: #2b91af;"&gt;Test&lt;/span&gt;]&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;34&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; ShouldInstanciate()&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;35&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;36&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mockery.ReplayAll();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;37&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;IUnitOfWork&lt;/span&gt; work = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;UnitOfWork&lt;/span&gt;(connection);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;38&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;39&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Assert&lt;/span&gt;.IsNotNull(work);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;40&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;41&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;42&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;span style="color: #2b91af;"&gt;Test&lt;/span&gt;]&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;43&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Commit_ShouldCommit_OnlyRegisterNew()&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;44&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;45&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;FakeUser&lt;/span&gt; user = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FakeUser&lt;/span&gt;();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;46&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;47&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mapper.Save(connection, user);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;48&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; connection.Dispose();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;49&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;50&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mockery.ReplayAll();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;51&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;52&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;IUnitOfWork&lt;/span&gt; work = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;UnitOfWork&lt;/span&gt;(connection);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;53&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;54&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; work.RegisterNew(user);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;55&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; work.Commit();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;56&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;57&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;58&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;span style="color: #2b91af;"&gt;Test&lt;/span&gt;]&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;59&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Commit_ShouldCommitABunchOfStuff()&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;60&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;61&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;IList&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;IDomainObject&lt;/span&gt;&amp;gt; fakeUsers = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;IDomainObject&lt;/span&gt;&amp;gt;();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;62&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;FakeUser&lt;/span&gt; firstUser = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FakeUser&lt;/span&gt;();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;63&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;FakeUser&lt;/span&gt; secondUser = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FakeUser&lt;/span&gt;();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;64&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;FakeUser&lt;/span&gt; thirdUser = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FakeUser&lt;/span&gt;();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;65&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;FakeUser&lt;/span&gt; fourthUser = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FakeUser&lt;/span&gt;();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;66&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;FakeUser&lt;/span&gt; fifthUser = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FakeUser&lt;/span&gt;();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;67&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;68&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; firstUser.Mark = &lt;span style="color: #2b91af;"&gt;Mark&lt;/span&gt;.New;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;69&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; secondUser.Mark = &lt;span style="color: #2b91af;"&gt;Mark&lt;/span&gt;.Dirty;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;70&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; thirdUser.Mark = &lt;span style="color: #2b91af;"&gt;Mark&lt;/span&gt;.Delete;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;71&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;72&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fakeUsers.Add(firstUser);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;73&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fakeUsers.Add(secondUser);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;74&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fakeUsers.Add(thirdUser);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;75&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fakeUsers.Add(fourthUser);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;76&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fakeUsers.Add(fifthUser);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;77&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;78&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mapper.Save(connection, firstUser);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;79&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mapper.Update(connection, secondUser);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;80&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mapper.Delete(connection, thirdUser);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;81&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;82&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; connection.Dispose();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;83&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;84&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mockery.ReplayAll();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;85&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;86&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;IUnitOfWork&lt;/span&gt; work = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;UnitOfWork&lt;/span&gt;(connection);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;87&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;88&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; work.Register(fakeUsers);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;89&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; work.Commit();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;90&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;91&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;92&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;FakeUser&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;IDomainObject&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;93&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;94&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Mark&lt;/span&gt; mark;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;95&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;96&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Mark&lt;/span&gt; Mark&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;97&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;98&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt; { &lt;span style="color: blue;"&gt;return&lt;/span&gt; mark; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;99&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt; { mark = &lt;span style="color: blue;"&gt;value&lt;/span&gt;; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;100&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;101&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;102&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;103&lt;/span&gt;&amp;nbsp;}&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;The Code&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;!--&lt;br /&gt;{\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 using\cf0  System.Collections.Generic;\par ??\cf1 using\cf0  unitofwork.spike.Dataaccess;\par ??\cf1 using\cf0  unitofwork.spike.Domain;\par ??\par ??\cf1 namespace\cf0  unitofwork.spike.utility\par ??\{\par ??    \cf1 public\cf0  \cf1 class\cf0  \cf4 UnitOfWork\cf0  : \cf4 IUnitOfWork\par ??\cf0     \{\par ??        \cf1 private\cf0  \cf1 readonly\cf0  \cf4 IDatabaseConnection\cf0  connection;\par ??        \cf1 private\cf0  \cf4 IList\cf0 &amp;lt;\cf4 IDomainObject\cf0 &amp;gt; registerNew;\par ??        \cf1 private\cf0  \cf4 IList\cf0 &amp;lt;\cf4 IDomainObject\cf0 &amp;gt; registerDirty;\par ??        \cf1 private\cf0  \cf4 IList\cf0 &amp;lt;\cf4 IDomainObject\cf0 &amp;gt; registerDelete;\par ??\par ??        \cf1 public\cf0  UnitOfWork(\cf4 IDatabaseConnection\cf0  connection)\par ??        \{\par ??            \cf1 this\cf0 .connection = connection;\par ??            registerNew = \cf1 new\cf0  \cf4 List\cf0 &amp;lt;\cf4 IDomainObject\cf0 &amp;gt;();\par ??            registerDirty = \cf1 new\cf0  \cf4 List\cf0 &amp;lt;\cf4 IDomainObject\cf0 &amp;gt;();\par ??            registerDelete = \cf1 new\cf0  \cf4 List\cf0 &amp;lt;\cf4 IDomainObject\cf0 &amp;gt;();\par ??        \}\par ??\par ??        \cf1 public\cf0  UnitOfWork() : \cf1 this\cf0  (\cf4 DependencyResolver\cf0 .GetImplementationOf&amp;lt;\cf4 IDatabaseConnection\cf0 &amp;gt;(\cf1 typeof\cf0 (\cf4 IDatabaseConnection\cf0 )))\par ??        \{\par ??        \}\par ??\par ??        \cf1 public\cf0  \cf1 void\cf0  RegisterNew(\cf4 IDomainObject\cf0  domainObject)\par ??        \{\par ??            registerNew.Add(domainObject);\par ??        \}\par ??\par ??        \cf1 public\cf0  \cf1 void\cf0  RegisterDirty(\cf4 IDomainObject\cf0  domainObject)\par ??        \{\par ??            registerDirty.Add(domainObject);\par ??        \}\par ??\par ??        \cf1 public\cf0  \cf1 void\cf0  RegisterDelete(\cf4 IDomainObject\cf0  domainObject)\par ??        \{\par ??            registerDelete.Add(domainObject);\par ??        \}\par ??\par ??        \cf1 public\cf0  \cf1 void\cf0  Register(\cf4 IList\cf0 &amp;lt;\cf4 IDomainObject\cf0 &amp;gt; domainObjects)\par ??        \{\par ??            \cf1 foreach\cf0  (\cf4 IDomainObject\cf0  domainObject \cf1 in\cf0  domainObjects)\par ??            \{\par ??                \cf1 if\cf0  (domainObject.Mark != \cf1 null\cf0 )\par ??                \{\par ??                    \cf1 if\cf0  (domainObject.Mark == \cf4 Mark\cf0 .New)\par ??                        RegisterNew(domainObject);\par ??\par ??                    \cf1 if\cf0  (domainObject.Mark == \cf4 Mark\cf0 .Dirty)\par ??                        RegisterDirty(domainObject);\par ??\par ??                    \cf1 if\cf0  (domainObject.Mark == \cf4 Mark\cf0 .Delete)\par ??                        RegisterDelete(domainObject);\par ??                \}\par ??            \}\par ??        \}\par ??\par ??        \cf1 public\cf0  \cf1 void\cf0  Commit()\par ??        \{\par ??            \cf1 using\cf0  (connection)\par ??            \{\par ??                \cf1 try\par ??\cf0                 \{\par ??                    Save(connection);\par ??                    Update(connection);\par ??                    Delete(connection);\par ??                \}\par ??                \cf1 catch\par ??\cf0                 \{\par ??                    connection.Rollback();\par ??                \}\par ??            \}\par ??        \}\par ??\par ??        \cf1 private\cf0  \cf1 void\cf0  Delete(\cf4 IDatabaseConnection\cf0  connection)\par ??        \{\par ??            \cf1 foreach\cf0  (\cf4 IDomainObject\cf0  domainObject \cf1 in\cf0  registerDelete)\par ??            \{\par ??                \cf4 DependencyResolver\cf0 .GetImplementationOf&amp;lt;\cf4 IMapper\cf0 &amp;gt;(domainObject.GetType()).Delete(connection, domainObject);\par ??            \}\par ??        \}\par ??\par ??        \cf1 private\cf0  \cf1 void\cf0  Update(\cf4 IDatabaseConnection\cf0  connection)\par ??        \{\par ??            \cf1 foreach\cf0  (\cf4 IDomainObject\cf0  domainObject \cf1 in\cf0  registerDirty)\par ??            \{\par ??                \cf4 DependencyResolver\cf0 .GetImplementationOf&amp;lt;\cf4 IMapper\cf0 &amp;gt;(domainObject.GetType()).Update(connection, domainObject);\par ??            \}\par ??        \}\par ??\par ??        \cf1 private\cf0  \cf1 void\cf0  Save(\cf4 IDatabaseConnection\cf0  connection)\par ??        \{\par ??            \cf1 foreach\cf0  (\cf4 IDomainObject\cf0  domainObject \cf1 in\cf0  registerNew)\par ??            \{\par ??                \cf4 DependencyResolver\cf0 .GetImplementationOf&amp;lt;\cf4 IMapper\cf0 &amp;gt;(domainObject.GetType()).Save(connection, domainObject);\par ??            \}\par ??        \}\par ??    \}\par ??\}}&lt;br /&gt;--&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 8pt; color: black; background: white;"&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;using&lt;/span&gt; unitofwork.spike.Dataaccess;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;using&lt;/span&gt; unitofwork.spike.Domain;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;namespace&lt;/span&gt; unitofwork.spike.utility&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;{&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;UnitOfWork&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;IUnitOfWork&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;readonly&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IDatabaseConnection&lt;/span&gt; connection;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;10&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IList&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;IDomainObject&lt;/span&gt;&amp;gt; registerNew;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;11&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IList&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;IDomainObject&lt;/span&gt;&amp;gt; registerDirty;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;12&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IList&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;IDomainObject&lt;/span&gt;&amp;gt; registerDelete;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;13&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;14&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; UnitOfWork(&lt;span style="color: #2b91af;"&gt;IDatabaseConnection&lt;/span&gt; connection)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;15&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;16&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.connection = connection;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;17&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; registerNew = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;IDomainObject&lt;/span&gt;&amp;gt;();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;18&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; registerDirty = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;IDomainObject&lt;/span&gt;&amp;gt;();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;19&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; registerDelete = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;IDomainObject&lt;/span&gt;&amp;gt;();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;20&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;21&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;22&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; UnitOfWork() : &lt;span style="color: blue;"&gt;this&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;DependencyResolver&lt;/span&gt;.GetImplementationOf&amp;lt;&lt;span style="color: #2b91af;"&gt;IDatabaseConnection&lt;/span&gt;&amp;gt;(&lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;IDatabaseConnection&lt;/span&gt;)))&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;23&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;24&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;25&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;26&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; RegisterNew(&lt;span style="color: #2b91af;"&gt;IDomainObject&lt;/span&gt; domainObject)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;27&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;28&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; registerNew.Add(domainObject);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;29&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;30&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;31&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; RegisterDirty(&lt;span style="color: #2b91af;"&gt;IDomainObject&lt;/span&gt; domainObject)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;32&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;33&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; registerDirty.Add(domainObject);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;34&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;35&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;36&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; RegisterDelete(&lt;span style="color: #2b91af;"&gt;IDomainObject&lt;/span&gt; domainObject)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;37&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;38&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; registerDelete.Add(domainObject);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;39&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;40&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;41&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Register(&lt;span style="color: #2b91af;"&gt;IList&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;IDomainObject&lt;/span&gt;&amp;gt; domainObjects)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;42&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;43&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;IDomainObject&lt;/span&gt; domainObject &lt;span style="color: blue;"&gt;in&lt;/span&gt; domainObjects)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;44&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;45&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (domainObject.Mark != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;46&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;47&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (domainObject.Mark == &lt;span style="color: #2b91af;"&gt;Mark&lt;/span&gt;.New)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;48&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; RegisterNew(domainObject);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;49&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;50&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (domainObject.Mark == &lt;span style="color: #2b91af;"&gt;Mark&lt;/span&gt;.Dirty)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;51&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; RegisterDirty(domainObject);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;52&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;53&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (domainObject.Mark == &lt;span style="color: #2b91af;"&gt;Mark&lt;/span&gt;.Delete)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;54&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; RegisterDelete(domainObject);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;55&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;56&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;57&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;58&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;59&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Commit()&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;60&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;61&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;using&lt;/span&gt; (connection)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;62&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;63&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;try&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;64&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;65&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Save(connection);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;66&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Update(connection);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;67&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Delete(connection);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;68&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;69&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;catch&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;70&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;71&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; connection.Rollback();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;72&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;73&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;74&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;75&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;76&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Delete(&lt;span style="color: #2b91af;"&gt;IDatabaseConnection&lt;/span&gt; connection)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;77&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;78&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;IDomainObject&lt;/span&gt; domainObject &lt;span style="color: blue;"&gt;in&lt;/span&gt; registerDelete)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;79&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;80&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;DependencyResolver&lt;/span&gt;.GetImplementationOf&amp;lt;&lt;span style="color: #2b91af;"&gt;IMapper&lt;/span&gt;&amp;gt;(domainObject.GetType()).Delete(connection, domainObject);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;81&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;82&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;83&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;84&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Update(&lt;span style="color: #2b91af;"&gt;IDatabaseConnection&lt;/span&gt; connection)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;85&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;86&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;IDomainObject&lt;/span&gt; domainObject &lt;span style="color: blue;"&gt;in&lt;/span&gt; registerDirty)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;87&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;88&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;DependencyResolver&lt;/span&gt;.GetImplementationOf&amp;lt;&lt;span style="color: #2b91af;"&gt;IMapper&lt;/span&gt;&amp;gt;(domainObject.GetType()).Update(connection, domainObject);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;89&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;90&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;91&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;92&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Save(&lt;span style="color: #2b91af;"&gt;IDatabaseConnection&lt;/span&gt; connection)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;93&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;94&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;IDomainObject&lt;/span&gt; domainObject &lt;span style="color: blue;"&gt;in&lt;/span&gt; registerNew)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;95&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;96&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;DependencyResolver&lt;/span&gt;.GetImplementationOf&amp;lt;&lt;span style="color: #2b91af;"&gt;IMapper&lt;/span&gt;&amp;gt;(domainObject.GetType()).Save(connection, domainObject);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;97&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;98&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;99&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;100&lt;/span&gt;&amp;nbsp;}&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;The other Crap&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;!--&lt;br /&gt;{\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 namespace\cf0  unitofwork.spike.Domain\par ??\{\par ??    \cf1 public\cf0  \cf1 interface\cf0  \cf4 IDomainObject\par ??\cf0     \{\par ??        \cf4 Mark\cf0  Mark \{ \cf1 get\cf0 ; \cf1 set\cf0 ; \}\par ??    \}\par ??\}}&lt;br /&gt;--&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 8pt; color: black; background: white;"&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;namespace&lt;/span&gt; unitofwork.spike.Domain&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;{&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;interface&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IDomainObject&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Mark&lt;/span&gt; Mark { &lt;span style="color: blue;"&gt;get&lt;/span&gt;; &lt;span style="color: blue;"&gt;set&lt;/span&gt;; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;}&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;!--&lt;br /&gt;{\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 namespace\cf0  unitofwork.spike.Domain\par ??\{\par ??    \cf1 public\cf0  \cf1 sealed\cf0  \cf1 class\cf0  \cf4 Mark\par ??\cf0     \{\par ??        \cf1 public\cf0  \cf1 static\cf0  \cf1 readonly\cf0  \cf4 Mark\cf0  New = \cf1 new\cf0  \cf4 Mark\cf0 ();\par ??        \cf1 public\cf0  \cf1 static\cf0  \cf1 readonly\cf0  \cf4 Mark\cf0  Dirty = \cf1 new\cf0  \cf4 Mark\cf0 ();\par ??        \cf1 public\cf0  \cf1 static\cf0  \cf1 readonly\cf0  \cf4 Mark\cf0  Delete = \cf1 new\cf0  \cf4 Mark\cf0 ();\par ??    \}\par ??\}}&lt;br /&gt;--&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 8pt; color: black; background: white;"&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;namespace&lt;/span&gt; unitofwork.spike.Domain&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;{&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;sealed&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Mark&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;readonly&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Mark&lt;/span&gt; New = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Mark&lt;/span&gt;();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;readonly&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Mark&lt;/span&gt; Dirty = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Mark&lt;/span&gt;();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;readonly&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Mark&lt;/span&gt; Delete = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Mark&lt;/span&gt;();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;}&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;!--&lt;br /&gt;{\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 using\cf0  unitofwork.spike.Domain;\par ??\par ??\cf1 namespace\cf0  unitofwork.spike.Dataaccess\par ??\{\par ??    \cf1 public\cf0  \cf1 interface\cf0  \cf4 IMapper\par ??\cf0     \{\par ??        \cf1 void\cf0  Save(\cf4 IDomainObject\cf0  domainObject);\par ??        \cf1 void\cf0  Save(\cf4 IDatabaseConnection\cf0  connection, \cf4 IDomainObject\cf0  domainObject);\par ??        \cf1 void\cf0  Update(\cf4 IDomainObject\cf0  domainObject);\par ??        \cf1 void\cf0  Update(\cf4 IDatabaseConnection\cf0  connection, \cf4 IDomainObject\cf0  domainObject);\par ??        \cf1 void\cf0  Delete(\cf4 IDomainObject\cf0  domainObject);\par ??        \cf1 void\cf0  Delete(\cf4 IDatabaseConnection\cf0  connection, \cf4 IDomainObject\cf0  domainObject);\par ??    \}\par ??\}}&lt;br /&gt;--&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 8pt; color: black; background: white;"&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;using&lt;/span&gt; unitofwork.spike.Domain;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;namespace&lt;/span&gt; unitofwork.spike.Dataaccess&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;{&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;interface&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;IMapper&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Save(&lt;span style="color: #2b91af;"&gt;IDomainObject&lt;/span&gt; domainObject);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Save(&lt;span style="color: #2b91af;"&gt;IDatabaseConnection&lt;/span&gt; connection, &lt;span style="color: #2b91af;"&gt;IDomainObject&lt;/span&gt; domainObject);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Update(&lt;span style="color: #2b91af;"&gt;IDomainObject&lt;/span&gt; domainObject);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;10&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Update(&lt;span style="color: #2b91af;"&gt;IDatabaseConnection&lt;/span&gt; connection, &lt;span style="color: #2b91af;"&gt;IDomainObject&lt;/span&gt; domainObject);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;11&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Delete(&lt;span style="color: #2b91af;"&gt;IDomainObject&lt;/span&gt; domainObject);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;12&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Delete(&lt;span style="color: #2b91af;"&gt;IDatabaseConnection&lt;/span&gt; connection, &lt;span style="color: #2b91af;"&gt;IDomainObject&lt;/span&gt; domainObject);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;13&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;14&lt;/span&gt;&amp;nbsp;}&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-8046318755113875921?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/8046318755113875921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=8046318755113875921' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/8046318755113875921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/8046318755113875921'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2007/03/unit-of-work-pattern-take-2.html' title='Unit of Work Pattern - Take 2'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-5533971607892857147</id><published>2007-03-12T20:10:00.000-06:00</published><updated>2007-03-12T20:12:43.078-06:00</updated><title type='text'>Yessssss</title><content type='html'>&lt;a href="http://cruisecontrolrb.thoughtworks.com/"&gt;http://cruisecontrolrb.thoughtworks.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-5533971607892857147?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/5533971607892857147/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=5533971607892857147' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/5533971607892857147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/5533971607892857147'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2007/03/yessssss.html' title='Yessssss'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-5429142350175305289</id><published>2007-03-11T17:14:00.000-06:00</published><updated>2007-03-11T17:26:22.787-06:00</updated><title type='text'>Castle Projects - Active Record</title><content type='html'>I don't know about you, but I'm really lazy with bustin' some SQL madness, data mapper tests are a pain, nhibernate .hbm.xml files are a pain!!!&lt;br /&gt;&lt;br /&gt;What can a simple developer do to quickly build up a data access layer, and still look pimp?&lt;br /&gt;&lt;br /&gt;I came across &lt;a href="http://www.castleproject.org/activerecord/index.html"&gt;ActiveRecord by CastleProjects&lt;/a&gt; a couple of months ago. It is using ofcourse the &lt;a href="http://www.martinfowler.com/eaaCatalog/activeRecord.html"&gt;active record&lt;/a&gt; pattern shown on that Fowler book about enterprise patterns. It uses nhibernate libraries without the pain of creating those damn hibernate files. It just uses System.Attribute&lt;br /&gt;&lt;br /&gt;Below is a sample code that I did up just to see how fast it was for me to create a dataaccess layer:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ofcourse we have to start with a Test...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;!--&lt;br /&gt;{\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;\red163\green21\blue21;}??\fs20 \cf1 using\cf0  cargo.domain;\par ??\cf1 using\cf0  MbUnit.Framework;\par ??\par ??\cf1 namespace\cf0  cargo.test\par ??\{\par ??    [\cf4 TestFixture\cf0 ]\par ??    \cf1 public\cf0  \cf1 class\cf0  \cf4 UserTest_DataAccess\par ??\cf0     \{\par ??        [\cf4 Test\cf0 ]\par ??        \cf1 public\cf0  \cf1 void\cf0  ShouldHandleActiveRecordFunctionality()\par ??        \{\par ??            \cf4 Company\cf0  company = \cf4 DomainObjectFactory\cf0 .CreateTestCompany();\par ??            company.Save();\par ??\par ??            \cf4 User\cf0  user = \cf1 new\cf0  \cf4 User\cf0 ();\par ??            user.UserName = \cf5 "jonas"\cf0 ;\par ??            user.Password = \cf5 "test"\cf0 ;\par ??            user.Company = company;\par ??\par ??            user.Save();\par ??\par ??            AssertUser(\cf4 User\cf0 .FindBy(user.UserName), user);\par ??\par ??            user.UserName = \cf5 "updated"\cf0 ;\par ??            user.Password = \cf5 "updated2"\cf0 ;\par ??\par ??            user.Update();\par ??\par ??            AssertUser(\cf4 User\cf0 .FindBy(user.Id), user);\par ??\par ??            user.Delete();\par ??\par ??            \cf4 Assert\cf0 .IsNotNull(\cf4 Company\cf0 .FindBy(company.Id));\par ??            company.Delete();\par ??            \cf4 Assert\cf0 .IsNull(\cf4 Company\cf0 .FindBy(company.Id));\par ??\par ??\par ??            \cf4 Assert\cf0 .AreEqual(0, \cf4 User\cf0 .FindAll().Length);\par ??        \}\par ??\par ??        \cf1 private\cf0  \cf1 static\cf0  \cf1 void\cf0  AssertUser(\cf4 User\cf0  result, \cf4 User\cf0  user)\par ??        \{\par ??            \cf4 Assert\cf0 .AreEqual(result.UserName, user.UserName);\par ??            \cf4 Assert\cf0 .AreEqual(result.Password, user.Password);\par ??        \}\par ??    \}\par ??\}}&lt;br /&gt;--&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; cargo.domain;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; MbUnit.Framework;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;namespace&lt;/span&gt; cargo.test&lt;/p&gt;&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; [&lt;span style="color: #2b91af;"&gt;TestFixture&lt;/span&gt;]&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;UserTest_DataAccess&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;span style="color: #2b91af;"&gt;Test&lt;/span&gt;]&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; ShouldHandleActiveRecordFunctionality()&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Company&lt;/span&gt; company = &lt;span style="color: #2b91af;"&gt;DomainObjectFactory&lt;/span&gt;.CreateTestCompany();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; company.Save();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;User&lt;/span&gt; user = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;User&lt;/span&gt;();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; user.UserName = &lt;span style="color: #a31515;"&gt;"jonas"&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; user.Password = &lt;span style="color: #a31515;"&gt;"test"&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; user.Company = company;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; user.Save();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; AssertUser(&lt;span style="color: #2b91af;"&gt;User&lt;/span&gt;.FindBy(user.UserName), user);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; user.UserName = &lt;span style="color: #a31515;"&gt;"updated"&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; user.Password = &lt;span style="color: #a31515;"&gt;"updated2"&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; user.Update();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; AssertUser(&lt;span style="color: #2b91af;"&gt;User&lt;/span&gt;.FindBy(user.Id), user);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; user.Delete();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Assert&lt;/span&gt;.IsNotNull(&lt;span style="color: #2b91af;"&gt;Company&lt;/span&gt;.FindBy(company.Id));&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; company.Delete();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Assert&lt;/span&gt;.IsNull(&lt;span style="color: #2b91af;"&gt;Company&lt;/span&gt;.FindBy(company.Id));&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(0, &lt;span style="color: #2b91af;"&gt;User&lt;/span&gt;.FindAll().Length);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; AssertUser(&lt;span style="color: #2b91af;"&gt;User&lt;/span&gt; result, &lt;span style="color: #2b91af;"&gt;User&lt;/span&gt; user)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(result.UserName, user.UserName);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(result.Password, user.Password);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- {\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;\red163\green21\blue21;}??\fs20 \cf1 using\cf0  cargo.domain;\par ??\cf1 using\cf0  MbUnit.Framework;\par ??\par ??\cf1 namespace\cf0  cargo.test\par ??\{\par ??    [\cf4 TestFixture\cf0 ]\par ??    \cf1 public\cf0  \cf1 class\cf0  \cf4 UserTest_DataAccess\par ??\cf0     \{\par ??        [\cf4 Test\cf0 ]\par ??        \cf1 public\cf0  \cf1 void\cf0  ShouldHandleActiveRecordFunctionality()\par ??        \{\par ??            \cf4 Company\cf0  company = \cf4 DomainObjectFactory\cf0 .CreateTestCompany();\par ??            company.Save();\par ??\par ??            \cf4 User\cf0  user = \cf1 new\cf0  \cf4 User\cf0 ();\par ??            user.UserName = \cf5 "jonas"\cf0 ;\par ??            user.Password = \cf5 "test"\cf0 ;\par ??            user.Company = company;\par ??\par ??            user.Save();\par ??\par ??            AssertUser(\cf4 User\cf0 .FindBy(user.UserName), user);\par ??\par ??            user.UserName = \cf5 "updated"\cf0 ;\par ??            user.Password = \cf5 "updated2"\cf0 ;\par ??\par ??            user.Update();\par ??\par ??            AssertUser(\cf4 User\cf0 .FindBy(user.Id), user);\par ??\par ??            user.Delete();\par ??\par ??            \cf4 Assert\cf0 .IsNotNull(\cf4 Company\cf0 .FindBy(company.Id));\par ??            company.Delete();\par ??            \cf4 Assert\cf0 .IsNull(\cf4 Company\cf0 .FindBy(company.Id));\par ??\par ??\par ??            \cf4 Assert\cf0 .AreEqual(0, \cf4 User\cf0 .FindAll().Length);\par ??        \}\par ??\par ??        \cf1 private\cf0  \cf1 static\cf0  \cf1 void\cf0  AssertUser(\cf4 User\cf0  result, \cf4 User\cf0  user)\par ??        \{\par ??            \cf4 Assert\cf0 .AreEqual(result.UserName, user.UserName);\par ??            \cf4 Assert\cf0 .AreEqual(result.Password, user.Password);\par ??        \}\par ??    \}\par ??\}} --&gt;&lt;br /&gt;&lt;div    style="background: white none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;font-family:Courier New;font-size:10pt;color:black;"&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;and now the code....&lt;/p&gt;&lt;br /&gt;&lt;!--&lt;br /&gt;{\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;\red163\green21\blue21;}??\fs20 \cf1 using\cf0  Castle.ActiveRecord;\par ??\cf1 using\cf0  NHibernate.Expression;\par ??\par ??\cf1 namespace\cf0  cargo.domain\par ??\{\par ??    [\cf4 ActiveRecord\cf0 (\cf5 "CARGO_USER"\cf0 )]\par ??    \cf1 public\cf0  \cf1 class\cf0  \cf4 User\cf0  : \cf4 ActiveRecordBase\cf0 &amp;lt;\cf4 User\cf0 &amp;gt;, \cf4 IUser\par ??\cf0     \{\par ??        \cf1 private\cf0  \cf1 int\cf0  id;\par ??        \cf1 private\cf0  \cf1 string\cf0  userName;\par ??        \cf1 private\cf0  \cf1 string\cf0  password;\par ??        \cf1 private\cf0  \cf1 int\cf0  status;\par ??        \cf1 private\cf0  \cf4 Company\cf0  company;\par ??\par ??        \cf1 public\cf0  User()\par ??        \{\par ??            \cf4 ActiveRecordInitializer\cf0 .Initialize(GetType().Assembly);\par ??        \}\par ??\par ??        \cf1 public\cf0  \cf1 static\cf0  \cf4 User\cf0  FindBy(\cf1 string\cf0  userName, \cf1 string\cf0  password)\par ??        \{\par ??            \cf1 return\cf0  FindOne(\cf4 Expression\cf0 .Eq(\cf5 "UserName"\cf0 , userName), \cf4 Expression\cf0 .Eq(\cf5 "Password"\cf0 , password));\par ??        \}\par ??\par ??        \cf1 public\cf0  \cf1 static\cf0  \cf4 User\cf0  FindBy(\cf1 string\cf0  userName)\par ??        \{\par ??            \cf1 return\cf0  FindOne(\cf4 Expression\cf0 .Eq(\cf5 "UserName"\cf0 , userName));\par ??        \}\par ??\par ??        \cf1 public\cf0  \cf1 static\cf0  \cf4 User\cf0  FindBy(\cf1 int\cf0  id)\par ??        \{\par ??            \cf1 return\cf0  FindOne(\cf4 Expression\cf0 .Eq(\cf5 "Id"\cf0 , id));\par ??        \}\par ??\par ??        [\cf4 PrimaryKey\cf0 (\cf4 PrimaryKeyType\cf0 .Native, \cf5 "user_id"\cf0 )]\par ??        \cf1 public\cf0  \cf1 int\cf0  Id\par ??        \{\par ??            \cf1 get\cf0  \{ \cf1 return\cf0  id; \}\par ??            \cf1 set\cf0  \{ id = \cf1 value\cf0 ; \}\par ??        \}\par ??\par ??        [\cf4 Property\cf0 (\cf5 "user_name"\cf0 )]\par ??        \cf1 public\cf0  \cf1 string\cf0  UserName\par ??        \{\par ??            \cf1 get\cf0  \{ \cf1 return\cf0  userName; \}\par ??            \cf1 set\cf0  \{ userName = \cf1 value\cf0 ; \}\par ??        \}\par ??\par ??        [\cf4 Property\cf0 (\cf5 "user_password"\cf0 )]\par ??        \cf1 public\cf0  \cf1 string\cf0  Password\par ??        \{\par ??            \cf1 get\cf0  \{ \cf1 return\cf0  password; \}\par ??            \cf1 set\cf0  \{ password = \cf1 value\cf0 ; \}\par ??        \}\par ??\par ??        [\cf4 Property\cf0 (\cf5 "user_status"\cf0 )]\par ??        \cf1 public\cf0  \cf1 int\cf0  Status\par ??        \{\par ??            \cf1 get\cf0  \{ \cf1 return\cf0  status; \}\par ??            \cf1 set\cf0  \{ status = \cf1 value\cf0 ; \}\par ??        \}\par ??\par ??        [\cf4 BelongsTo\cf0 (\cf5 "COMPANY_ID"\cf0 )]\par ??        \cf1 public\cf0  \cf4 Company\cf0  Company\par ??        \{\par ??            \cf1 get\cf0  \{ \cf1 return\cf0  company; \}\par ??            \cf1 set\cf0  \{ company = \cf1 value\cf0 ; \}\par ??        \}\par ??    \}\par ??\}}&lt;br /&gt;--&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; Castle.ActiveRecord;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; NHibernate.Expression;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;namespace&lt;/span&gt; cargo.domain&lt;/p&gt;&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; [&lt;span style="color: #2b91af;"&gt;ActiveRecord&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"CARGO_USER"&lt;/span&gt;)]&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;User&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;ActiveRecordBase&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;User&lt;/span&gt;&amp;gt;, &lt;span style="color: #2b91af;"&gt;IUser&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; id;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; userName;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; password;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; status;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Company&lt;/span&gt; company;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; User()&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;ActiveRecordInitializer&lt;/span&gt;.Initialize(GetType().Assembly);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;User&lt;/span&gt; FindBy(&lt;span style="color: blue;"&gt;string&lt;/span&gt; userName, &lt;span style="color: blue;"&gt;string&lt;/span&gt; password)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; FindOne(&lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt;.Eq(&lt;span style="color: #a31515;"&gt;"UserName"&lt;/span&gt;, userName), &lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt;.Eq(&lt;span style="color: #a31515;"&gt;"Password"&lt;/span&gt;, password));&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;User&lt;/span&gt; FindBy(&lt;span style="color: blue;"&gt;string&lt;/span&gt; userName)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; FindOne(&lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt;.Eq(&lt;span style="color: #a31515;"&gt;"UserName"&lt;/span&gt;, userName));&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;User&lt;/span&gt; FindBy(&lt;span style="color: blue;"&gt;int&lt;/span&gt; id)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; FindOne(&lt;span style="color: #2b91af;"&gt;Expression&lt;/span&gt;.Eq(&lt;span style="color: #a31515;"&gt;"Id"&lt;/span&gt;, id));&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;span style="color: #2b91af;"&gt;PrimaryKey&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;PrimaryKeyType&lt;/span&gt;.Native, &lt;span style="color: #a31515;"&gt;"user_id"&lt;/span&gt;)]&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; Id&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt; { &lt;span style="color: blue;"&gt;return&lt;/span&gt; id; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt; { id = &lt;span style="color: blue;"&gt;value&lt;/span&gt;; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;span style="color: #2b91af;"&gt;Property&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"user_name"&lt;/span&gt;)]&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; UserName&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt; { &lt;span style="color: blue;"&gt;return&lt;/span&gt; userName; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt; { userName = &lt;span style="color: blue;"&gt;value&lt;/span&gt;; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;span style="color: #2b91af;"&gt;Property&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"user_password"&lt;/span&gt;)]&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; Password&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt; { &lt;span style="color: blue;"&gt;return&lt;/span&gt; password; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt; { password = &lt;span style="color: blue;"&gt;value&lt;/span&gt;; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;span style="color: #2b91af;"&gt;Property&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"user_status"&lt;/span&gt;)]&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; Status&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt; { &lt;span style="color: blue;"&gt;return&lt;/span&gt; status; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt; { status = &lt;span style="color: blue;"&gt;value&lt;/span&gt;; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;span style="color: #2b91af;"&gt;BelongsTo&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"COMPANY_ID"&lt;/span&gt;)]&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Company&lt;/span&gt; Company&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt; { &lt;span style="color: blue;"&gt;return&lt;/span&gt; company; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt; { company = &lt;span style="color: blue;"&gt;value&lt;/span&gt;; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-5429142350175305289?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/5429142350175305289/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=5429142350175305289' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/5429142350175305289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/5429142350175305289'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2007/03/castle-projects-active-record.html' title='Castle Projects - Active Record'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-8903134551690138378</id><published>2007-03-10T12:54:00.000-07:00</published><updated>2008-12-10T21:59:30.326-07:00</updated><title type='text'>.Net Developer Kickin it with my MacBook Pro</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/_wL74_LjB1qo/RfNMYutHsAI/AAAAAAAAAAo/wfQojpzbet8/s1600-h/P3100042.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_wL74_LjB1qo/RfNMYutHsAI/AAAAAAAAAAo/wfQojpzbet8/s320/P3100042.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5040456395695566850" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've been using a Mac for almost a year now. Been using the 1st relase of the 15" MacBook Pro. What do I have to say about the experience? I love it! &lt;br /&gt;&lt;br /&gt;I decided to get out of the windows world because of one thing. I wanted to have an OS that does all the stuff that I need to do for personal stuff such as picture maintenance, movie making, music production, etc... since the mac has iLife and GarageBand, I was sold.&lt;br /&gt;&lt;br /&gt;Specs:&lt;br /&gt;MacBook Pro Core Duo 2.16 Ghz&lt;br /&gt;2 Gigs of RAM&lt;br /&gt;100GB HDD&lt;br /&gt;&lt;br /&gt;I was one of the people that purchased Parallels Desktop for $30 when it was still in Beta. Popped my XP CD, and been developing crazy apps on it.&lt;br /&gt;&lt;br /&gt;XP on Parallels Specs:&lt;br /&gt;XP Pro SP2&lt;br /&gt;1.1GB of Ram&lt;br /&gt;Coherence Mode&lt;br /&gt;SQL Server 2005 Standard&lt;br /&gt;Oracle 10g Standard&lt;br /&gt;Visual Studio 2005 with &lt;b&gt;Resharper&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;You may be asking "How do you like developing windows apps in Parallels?" It's kick ass! Definately separates my "work" with my "life" when it comes to systems. And parallels handles XP like nobody's business.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_wL74_LjB1qo/RfMNNOtHr_I/AAAAAAAAAAg/O9qK0qk4BpQ/s1600-h/Picture+3.png"&gt;&lt;img src="http://1.bp.blogspot.com/_wL74_LjB1qo/RfMNNOtHr_I/AAAAAAAAAAg/O9qK0qk4BpQ/s320/Picture+3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5040386928894521330" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;But then Windows Vista came along. I had Vista running in parallels for a little bit, but that damn OS is a resource HOG!!!&lt;br /&gt;&lt;br /&gt;I have been avoiding BootCamp because I don't like rebooting to another OS just to do a specific task. But Vista is a pain and plus trying to be in the bleeding edge in .net development with all the 3.0 framework stuff that is coming, I had to install vista on bootcamp.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_wL74_LjB1qo/RfNMZOtHsBI/AAAAAAAAAAw/_hlIxH12YwA/s1600-h/P3100043.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_wL74_LjB1qo/RfNMZOtHsBI/AAAAAAAAAAw/_hlIxH12YwA/s320/P3100043.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5040456404285501458" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Vista on bootcamp was a painless install. I dont want to discuss how I installed it. Just google "Bootcamp Vista" and there are a lot of tutorials how to pimpafy it up.&lt;br /&gt;&lt;br /&gt;Vista on Bootcamp Specs:&lt;br /&gt;Vista Ultimate&lt;br /&gt;SQL Server 2005 Std&lt;br /&gt;VS.Net 2005 with &lt;b&gt;Resharper&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So if you are a .Net developer and wants a change, would I recomend this Mac stuff? &lt;b&gt;HELL YES!!&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;**UPDATE: I do feel dirty running windows on my mac. But gotta pay the bills.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-8903134551690138378?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/8903134551690138378/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=8903134551690138378' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/8903134551690138378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/8903134551690138378'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2007/03/net-developer-kickin-it-with-my-macbook.html' title='.Net Developer Kickin it with my MacBook Pro'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_wL74_LjB1qo/RfNMYutHsAI/AAAAAAAAAAo/wfQojpzbet8/s72-c/P3100042.JPG' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-5657991886364177537</id><published>2007-02-25T22:11:00.000-07:00</published><updated>2007-02-26T22:10:20.178-07:00</updated><title type='text'>Developer Heirarchy in a Development Team</title><content type='html'>&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/NSIMeRtVebM"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/NSIMeRtVebM" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Lead Developer? Senior Developer? Junior Analyst? What does it all mean?&lt;br /&gt;&lt;br /&gt;Well below is my heirarchy:&lt;br /&gt;&lt;br /&gt;1) Developers&lt;br /&gt;&lt;br /&gt;**UPDATE: Thanks to Eric Liu for the link!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-5657991886364177537?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/5657991886364177537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=5657991886364177537' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/5657991886364177537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/5657991886364177537'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2007/02/developer-heirarchy-in-development-team.html' title='Developer Heirarchy in a Development Team'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-3131415195261576628</id><published>2007-02-24T22:05:00.000-07:00</published><updated>2007-02-24T22:11:04.576-07:00</updated><title type='text'>JP Boodhoo's Nothin But .Net Bootcamp</title><content type='html'>How was the training?&lt;br /&gt;- F*cking, f*cking, f*cking AWESOME!!... I forgot to have another f*cking right beside f*cking.&lt;br /&gt;&lt;br /&gt;For those people who missed out, what do you  have to say.&lt;br /&gt;- You f*cking missed out!&lt;br /&gt;&lt;br /&gt;I couldn't afford it.&lt;br /&gt;- Sell drugs. Don't even bother with weed.... Go blow, or even meth&lt;br /&gt;&lt;br /&gt;Would you go again?&lt;br /&gt;- Without a doubt&lt;br /&gt;&lt;br /&gt;What was your JP moment?&lt;br /&gt;- Friday - JP was just freestylin, spittin, bustin out crazy OO madness from 5PM - 11PM.&lt;br /&gt;&lt;br /&gt;What did you not like about the course?&lt;br /&gt;- Sitting right beside &lt;a href="http://www.igloocoder.com"&gt;IglooCoder&lt;/a&gt; , and right in front of &lt;a href="http://www.stevenrockarts.com"&gt;crazy legz&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;How many pizza's did you eat?&lt;br /&gt;- A lot&lt;br /&gt;&lt;br /&gt;Would you (me, Jonas) use what you have learned at work?&lt;br /&gt;- F*ck ya!&lt;br /&gt;&lt;br /&gt;So in &lt;a href="http://becomingagile.blogspot.com"&gt;Python&lt;/a&gt; calculation would you have to implement to rate this experience&lt;br /&gt;- Jonas + Nerding + NothinButDotNet bootcamp = happy happy happy ^ 8========D&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Again, thanks &lt;a href="http://www.jpboodhoo.com"&gt;JP&lt;/a&gt; for coming up to Edmonton!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-3131415195261576628?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/3131415195261576628/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=3131415195261576628' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/3131415195261576628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/3131415195261576628'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2007/02/jp-boodhoos-nothin-but-net-bootcamp.html' title='JP Boodhoo&apos;s Nothin But .Net Bootcamp'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-6458985869447833451</id><published>2007-02-09T23:01:00.000-07:00</published><updated>2007-02-07T10:26:51.087-07:00</updated><title type='text'>LINQ - Explicit Query</title><content type='html'>This is for &lt;a href="http://graysmatter.codivation.com/"&gt;Justice Gray&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I had to watch ALL the movies. Took 5 hours, and DAMN it was worth it! I actually just wanted to see the credits!&lt;br /&gt;&lt;br /&gt;&lt;!--&lt;br /&gt;{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red43\green145\blue175;\red0\green0\blue255;\red163\green21\blue21;\red0\green128\blue0;}??\fs20  [\cf3 Test\cf0 ]\par ??        \cf4 public\cf0  \cf4 void\cf0  ShouldFindUsingLINQ()\par ??        \{\par ??            \cf3 List\cf0 &amp;lt;\cf3 Movie\cf0 &amp;gt; movies = CreateMovie();\par ??\par ??            \cf4 var\cf0  results = \cf4 from\cf0  m \cf4 in\cf0  movies\par ??                          \cf4 from\cf0  a \cf4 in\cf0  m.Actors\par ??                          \cf4 where\cf0  a.FirstName == \cf5 "Hannah"\cf0  &amp;amp;&amp;amp;\par ??                               a.LastName == \cf5 "Harper"\par ??\cf0                             \cf4 select\cf0  \cf4 new\cf0  \{a.FirstName, m.Title, a.ScreenName\};\par ??\par ??            \cf4 foreach\cf0  (\cf4 var\cf0  result \cf4 in\cf0  results)\par ??            \{\par ??                \cf3 Console\cf0 .Out.WriteLine(\cf5 "\{0\} is an actress in the movie \{1\} and her screen name is \{2\}"\cf0 ,\par ??                                  result.FirstName, result.Title, result.ScreenName);\par ??            \}\par ??\par ??            \cf6 /*Output\par ??             *Hannah is an actress in the movie 8 Inches and her screen name is Enduro Girl\par ??             *Hannah is an actress in the movie Assploitations 4 and her screen name is Hanna \par ??             */\par ??\cf0         \}\par ??\par ??        \cf4 private\cf0  \cf4 static\cf0  \cf3 List\cf0 &amp;lt;\cf3 Movie\cf0 &amp;gt; CreateMovie()\par ??        \{\par ??            \cf3 List\cf0 &amp;lt;\cf3 Movie\cf0 &amp;gt; movies = \cf4 new\cf0  \cf3 List\cf0 &amp;lt;\cf3 Movie\cf0 &amp;gt;();\par ??            movies.Add(CreateMovie(\cf5 "8 Inches"\cf0 , \cf5 "Some chick that wished she swallowed 8 inches of wang "\cf0 ,\par ??                                   CreateActor(\cf5 "Hannah"\cf0 , \cf5 "Harper"\cf0 , \cf5 "Enduro Girl"\cf0 )));\par ??            movies.Add(CreateMovie(\cf5 "Internal Cumbustion 10"\cf0 , \cf4 string\cf0 .Empty,\par ??                                       CreateActor(\cf5 "Evelyne "\cf0 , \cf5 "Foxy"\cf0 , \cf5 "Evelyne"\cf0 ), \par ??                                       CreateActor(\cf5 "Jenna"\cf0 , \cf5 "Haze   "\cf0 , \cf5 "Jenna"\cf0 ),\par ??                                       CreateActor(\cf5 "Isabel"\cf0 , \cf5 "Ice"\cf0 , \cf5 "Isabel"\cf0 ),\par ??                                       CreateActor(\cf5 "Kid"\cf0 , \cf5 "Jamaica"\cf0 , \cf5 "Jamaica"\cf0 ),\par ??                                       CreateActor(\cf5 "Virginee "\cf0 , \cf4 string\cf0 .Empty, \cf5 "Virginee"\cf0 )));\par ??            movies.Add(CreateMovie(\cf5 "Assploitations 4"\cf0 , \cf4 string\cf0 .Empty,\par ??                                       CreateActor(\cf5 "Hannah"\cf0 , \cf5 "Harper"\cf0 , \cf5 "Hanna"\cf0 ), \par ??                                       CreateActor(\cf5 "Shayna"\cf0 , \cf5 "Knight       "\cf0 , \cf5 "Shayna"\cf0 ),\par ??                                       CreateActor(\cf5 "Lucy"\cf0 , \cf5 "Lee"\cf0 , \cf5 "Lucy"\cf0 ),\par ??                                       CreateActor(\cf5 "Lauren"\cf0 , \cf5 "Phoenix   "\cf0 , \cf5 "Lauren"\cf0 ),\par ??                                       CreateActor(\cf5 "Aurora "\cf0 , \cf5 "Snow"\cf0 , \cf5 "Aurora"\cf0 )));\par ??            \cf4 return\cf0  movies;\par ??        \}\par ??\par ??        \cf4 private\cf0  \cf4 static\cf0  \cf3 Actor\cf0  CreateActor(\cf4 string\cf0  firstName, \cf4 string\cf0  lastName, \cf4 string\cf0  screenName)\par ??        \{\par ??            \cf3 Actor\cf0  actor = \cf4 new\cf0  \cf3 Actor\cf0 ();\par ??            actor.FirstName = firstName;\par ??            actor.LastName = lastName;\par ??            actor.ScreenName = screenName;\par ??\par ??            \cf4 return\cf0  actor;\par ??        \}\par ??\par ??        \cf4 private\cf0  \cf4 static\cf0  \cf3 Movie\cf0  CreateMovie(\cf4 string\cf0  title, \cf4 string\cf0  description, \cf4 params\cf0  \cf3 Actor\cf0 [] actors)\par ??        \{\par ??            \cf3 Movie\cf0  movie = \cf4 new\cf0  \cf3 Movie\cf0 ();\par ??            movie.Title = title;\par ??            movie.Description = description;\par ??            movie.Actors = AddActors(actors);\par ??\par ??            \cf4 return\cf0  movie;\par ??        \}}&lt;br /&gt;--&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;[&lt;span style="color: #2b91af;"&gt;Test&lt;/span&gt;]&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; ShouldFindUsingLINQ()&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Movie&lt;/span&gt;&amp;gt; movies = CreateMovie();&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; results = &lt;span style="color: blue;"&gt;from&lt;/span&gt; m &lt;span style="color: blue;"&gt;in&lt;/span&gt; movies&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;from&lt;/span&gt; a &lt;span style="color: blue;"&gt;in&lt;/span&gt; m.Actors&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;where&lt;/span&gt; a.FirstName == &lt;span style="color: #a31515;"&gt;"Hannah"&lt;/span&gt; &amp;amp;&amp;amp;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  a.LastName == &lt;span style="color: #a31515;"&gt;"Harper"&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;select&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; {a.FirstName, m.Title, a.ScreenName};&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue;"&gt;var&lt;/span&gt; result &lt;span style="color: blue;"&gt;in&lt;/span&gt; results)&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.Out.WriteLine(&lt;span style="color: #a31515;"&gt;"{0} is an actress in the movie {1} and her screen name is {2}"&lt;/span&gt;,&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; result.FirstName, result.Title, result.ScreenName);&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: green;"&gt;/*Output&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  *Hannah is an actress in the movie 8 Inches and her screen name is Enduro Girl&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  *Hannah is an actress in the movie Assploitations 4 and her screen name is Hanna &lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: green;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  */&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Movie&lt;/span&gt;&amp;gt; CreateMovie()&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Movie&lt;/span&gt;&amp;gt; movies = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Movie&lt;/span&gt;&amp;gt;();&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; movies.Add(CreateMovie(&lt;span style="color: #a31515;"&gt;"8 Inches"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"Some chick that wished she swallowed 8 inches of wang "&lt;/span&gt;,&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  CreateActor(&lt;span style="color: #a31515;"&gt;"Hannah"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"Harper"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"Enduro Girl"&lt;/span&gt;)));&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; movies.Add(CreateMovie(&lt;span style="color: #a31515;"&gt;"Internal Cumbustion 10"&lt;/span&gt;, &lt;span style="color: blue;"&gt;string&lt;/span&gt;.Empty,&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  CreateActor(&lt;span style="color: #a31515;"&gt;"Evelyne "&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"Foxy"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"Evelyne"&lt;/span&gt;), &lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  CreateActor(&lt;span style="color: #a31515;"&gt;"Jenna"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"Haze&amp;nbsp;  "&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"Jenna"&lt;/span&gt;),&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  CreateActor(&lt;span style="color: #a31515;"&gt;"Isabel"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"Ice"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"Isabel"&lt;/span&gt;),&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  CreateActor(&lt;span style="color: #a31515;"&gt;"Kid"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"Jamaica"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"Jamaica"&lt;/span&gt;),&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  CreateActor(&lt;span style="color: #a31515;"&gt;"Virginee "&lt;/span&gt;, &lt;span style="color: blue;"&gt;string&lt;/span&gt;.Empty, &lt;span style="color: #a31515;"&gt;"Virginee"&lt;/span&gt;)));&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; movies.Add(CreateMovie(&lt;span style="color: #a31515;"&gt;"Assploitations 4"&lt;/span&gt;, &lt;span style="color: blue;"&gt;string&lt;/span&gt;.Empty,&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  CreateActor(&lt;span style="color: #a31515;"&gt;"Hannah"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"Harper"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"Hanna"&lt;/span&gt;), &lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  CreateActor(&lt;span style="color: #a31515;"&gt;"Shayna"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"Knight&amp;nbsp; &amp;nbsp; &amp;nbsp;  "&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"Shayna"&lt;/span&gt;),&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  CreateActor(&lt;span style="color: #a31515;"&gt;"Lucy"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"Lee"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"Lucy"&lt;/span&gt;),&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  CreateActor(&lt;span style="color: #a31515;"&gt;"Lauren"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"Phoenix&amp;nbsp;  "&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"Lauren"&lt;/span&gt;),&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  CreateActor(&lt;span style="color: #a31515;"&gt;"Aurora "&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"Snow"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"Aurora"&lt;/span&gt;)));&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; movies;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Actor&lt;/span&gt; CreateActor(&lt;span style="color: blue;"&gt;string&lt;/span&gt; firstName, &lt;span style="color: blue;"&gt;string&lt;/span&gt; lastName, &lt;span style="color: blue;"&gt;string&lt;/span&gt; screenName)&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Actor&lt;/span&gt; actor = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Actor&lt;/span&gt;();&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; actor.FirstName = firstName;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; actor.LastName = lastName;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; actor.ScreenName = screenName;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; actor;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Movie&lt;/span&gt; CreateMovie(&lt;span style="color: blue;"&gt;string&lt;/span&gt; title, &lt;span style="color: blue;"&gt;string&lt;/span&gt; description, &lt;span style="color: blue;"&gt;params&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Actor&lt;/span&gt;[] actors)&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Movie&lt;/span&gt; movie = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Movie&lt;/span&gt;();&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; movie.Title = title;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; movie.Description = description;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; movie.Actors = AddActors(actors);&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; movie;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-6458985869447833451?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/6458985869447833451/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=6458985869447833451' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/6458985869447833451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/6458985869447833451'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2007/02/linq-explicit-query.html' title='LINQ - Explicit Query'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-2805234329153777423</id><published>2007-02-06T21:36:00.001-07:00</published><updated>2007-02-06T21:36:55.107-07:00</updated><title type='text'>Mash it Up!</title><content type='html'>&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/A4uyN5rQbbU"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/A4uyN5rQbbU" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-2805234329153777423?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/2805234329153777423/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=2805234329153777423' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/2805234329153777423'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/2805234329153777423'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2007/02/mash-it-up.html' title='Mash it Up!'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-5158684176109444972</id><published>2007-02-04T22:26:00.000-07:00</published><updated>2007-02-04T22:38:38.904-07:00</updated><title type='text'>eZed.ca</title><content type='html'>I busted out the plastic, and bought myself &lt;a href="http://www.ezed.ca"&gt;http://www.ezed.ca&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Now, you can hit this blog up with ezed.ca!  Too bad some bastards are squatting on the .com &amp; .net... Ah well.&lt;br /&gt;&lt;br /&gt;Incase you are wondering what I am using to forward my www subdomain, I am using a FREE dns server. It is &lt;a href="http://afraid.org"&gt;afraid.org&lt;/a&gt;. I have been using this thing for years, and it's kick ass! Don't even bother with those dyndns crap.&lt;br /&gt;&lt;br /&gt;Woot Woot!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-5158684176109444972?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/5158684176109444972/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=5158684176109444972' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/5158684176109444972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/5158684176109444972'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2007/02/ezedca.html' title='eZed.ca'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-1570162809457704319</id><published>2007-02-01T22:02:00.000-07:00</published><updated>2007-02-01T22:07:35.517-07:00</updated><title type='text'>Winter... Sooo Awesome!</title><content type='html'>Here are some pics last weekend @ Lake Louise.... I'm the one skiing.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://farm1.static.flickr.com/126/377137558_84c1589ea7.jpg" width="500" height="375" alt="IMG_0200.JPG" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://farm1.static.flickr.com/186/377138021_cd7e2b27b5.jpg" width="500" height="375" alt="IMG_0203.JPG" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://farm1.static.flickr.com/167/377140825_1e61b85ea6.jpg" width="500" height="375" alt="IMG_0225.JPG" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://farm1.static.flickr.com/139/377136543_1bb3c33a69.jpg" width="500" height="375" alt="IMG_0193.JPG" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-1570162809457704319?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/1570162809457704319/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=1570162809457704319' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/1570162809457704319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/1570162809457704319'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2007/02/winter-sooo-awesome.html' title='Winter... Sooo Awesome!'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm1.static.flickr.com/126/377137558_84c1589ea7_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-1714110819570209335</id><published>2007-01-27T00:32:00.000-07:00</published><updated>2007-01-27T00:55:15.177-07:00</updated><title type='text'>Validation Application Block - EL3 Beta (yaknowhatimsayin!?!?!?!)</title><content type='html'>If you were wondering where I was for the past couple of weeks... It's winter! I snowboard, ski... not a lot of time for this programamamaming shtuff... That's when I'm bored out of my mind and have nothing "cool" to do. Don't get me wrong, I like programming... but not that much to take over my after work "activities".&lt;br /&gt;&lt;br /&gt;I think I was reading &lt;a href="http://www.davidhayden.com/davidhayden/default.aspx"&gt;david hayden's&lt;/a&gt; blog when I saw VAB for the very first time. I thought to my self, thats f***ing kick ass!&lt;br /&gt;&lt;br /&gt;Seriously, don't you just hate creating "default" validation items for objects you need to validate? How come it took this long to get something like this to come out? I shouldnt whine... I tell you... its good shit!&lt;br /&gt;&lt;br /&gt;Below is a sample code I whipped up for all ya suckahz out there that demonstrates not nullage, string lenghtage, and my custom validationage... Also you will notice a little bit of david hayden in the sample code. Mr. Hayden, if you are reading this, your sample was awesome!&lt;br /&gt;&lt;br /&gt;I also would like to let &lt;a href="http://www.becomingagile.blogspot.com/"&gt;Neil B.&lt;/a&gt; know that I STOLE his dog object that he used in his presentation @ Edmonton Code Camp 06. Take that FP!&lt;br /&gt;&lt;br /&gt;Let's start with the tests...&lt;br /&gt;&lt;br /&gt;&lt;!--&lt;br /&gt;{\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;\red163\green21\blue21;}??\fs20 \cf1 using\cf0  app.domain;\par ??\cf1 using\cf0  Microsoft.Practices.EnterpriseLibrary.Validation;\par ??\cf1 using\cf0  NUnit.Framework;\par ??\par ??\cf1 namespace\cf0  test.domaintest\par ??\{\par ??    [\cf4 TestFixture\cf0 ]\par ??    \cf1 public\cf0  \cf1 class\cf0  \cf4 DogTest\par ??\cf0     \{\par ??        [\cf4 Test\cf0 ]\par ??        \cf1 public\cf0  \cf1 void\cf0  ShouldHaveValidDog()\par ??        \{\par ??            \cf4 Dog\cf0  dog = CreateDog(\cf5 "Chiyo"\cf0 , \cf4 Breed\cf0 .GreatPyrenees, \cf4 Color\cf0 .White, \cf4 Gender\cf0 .Female);\par ??            \cf4 Assert\cf0 .IsNotNull(dog);\par ??            \cf4 Assert\cf0 .IsTrue(dog.IsValid());\par ??            \cf4 Assert\cf0 .IsTrue(dog.IsDirty);\par ??            \cf4 Assert\cf0 .IsTrue(dog.IsSavable());\par ??        \}\par ??\par ??        [\cf4 Test\cf0 ]\par ??        \cf1 public\cf0  \cf1 void\cf0  ShouldInvalidateNoName()\par ??        \{\par ??            \cf4 Dog\cf0  dog = CreateDog(\cf1 string\cf0 .Empty, \cf4 Breed\cf0 .GreatPyrenees, \cf4 Color\cf0 .White, \cf4 Gender\cf0 .Female);\par ??            \cf4 Assert\cf0 .IsNotNull(dog);\par ??\par ??            \cf4 ValidationResults\cf0  results = dog.Validate();\par ??            \cf4 Assert\cf0 .IsFalse(results.IsValid);\par ??            \cf1 foreach\cf0  (\cf4 ValidationResult\cf0  result \cf1 in\cf0  results)\par ??            \{\par ??                \cf4 Assert\cf0 .AreEqual(\cf4 Dog\cf0 .FIRST_NAME_LENGTH_ERROR_MESSAGE, result.Message);\par ??            \}\par ??\par ??            \cf4 Assert\cf0 .IsFalse(dog.IsValid());\par ??            \cf4 Assert\cf0 .IsTrue(dog.IsDirty);\par ??            \cf4 Assert\cf0 .IsFalse(dog.IsSavable());\par ??        \}\par ??\par ??        [\cf4 Test\cf0 ]\par ??        \cf1 public\cf0  \cf1 void\cf0  ShouldInvalidateNullBreed()\par ??        \{\par ??            \cf4 Dog\cf0  dog = CreateDog(\cf5 "Chiyo"\cf0 , \cf1 null\cf0 , \cf4 Color\cf0 .White, \cf4 Gender\cf0 .Female);\par ??            \cf4 Assert\cf0 .IsNotNull(dog);\par ??\par ??            \cf4 ValidationResults\cf0  results = dog.Validate();\par ??            \cf4 Assert\cf0 .IsFalse(results.IsValid);\par ??            \cf1 foreach\cf0  (\cf4 ValidationResult\cf0  result \cf1 in\cf0  results)\par ??            \{\par ??                \cf4 Assert\cf0 .AreEqual(\cf4 Dog\cf0 .BREED_ERROR_MESSAGE, result.Message);\par ??            \}\par ??\par ??            \cf4 Assert\cf0 .IsFalse(dog.IsValid());\par ??            \cf4 Assert\cf0 .IsTrue(dog.IsDirty);\par ??            \cf4 Assert\cf0 .IsFalse(dog.IsSavable());\par ??        \}\par ??\par ??        [\cf4 Test\cf0 ]\par ??        \cf1 public\cf0  \cf1 void\cf0  ShouldHaveANonDirtyDog()\par ??        \{\par ??            \cf4 Dog\cf0  dog = \cf1 new\cf0  \cf4 Dog\cf0 ();\par ??            \cf4 Assert\cf0 .IsFalse(dog.IsDirty);\par ??        \}\par ??\par ??        [\cf4 Test\cf0 ]\par ??        \cf1 public\cf0  \cf1 void\cf0  ChiyoShouldNotBeLesbian()\par ??        \{\par ??            \cf4 Dog\cf0  dog = CreateDog(\cf5 "Chiyo"\cf0 , \cf4 Breed\cf0 .GreatPyrenees, \cf4 Color\cf0 .White, \cf4 Gender\cf0 .Lesbian);\par ??            \cf4 Assert\cf0 .IsNotNull(dog);\par ??\par ??            \cf4 ValidationResults\cf0  results = dog.Validate();\par ??            \cf4 Assert\cf0 .IsFalse(results.IsValid);\par ??            \cf1 foreach\cf0  (\cf4 ValidationResult\cf0  result \cf1 in\cf0  results)\par ??            \{\par ??                \cf4 Assert\cf0 .AreEqual(\cf4 ChiyoIsNotLesbianValidator\cf0 .CHIYO_ERROR_MESSAGE, result.Message);\par ??            \}\par ??\par ??            \cf4 Assert\cf0 .IsFalse(dog.IsValid());\par ??            \cf4 Assert\cf0 .IsTrue(dog.IsDirty);\par ??            \cf4 Assert\cf0 .IsFalse(dog.IsSavable());\par ??        \}\par ??\par ??        \cf1 private\cf0  \cf1 static\cf0  \cf4 Dog\cf0  CreateDog(\cf1 string\cf0  name, \cf4 Breed\cf0  breed, \cf4 Color\cf0  color, \cf4 Gender\cf0  gender)\par ??        \{\par ??            \cf4 Dog\cf0  dog = \cf1 new\cf0  \cf4 Dog\cf0 ();\par ??            dog.Name = name;\par ??            dog.Breed = breed;\par ??            dog.Color = color;\par ??            dog.Gender = gender;\par ??\par ??            \cf1 return\cf0  dog;\par ??        \}\par ??    \}\par ??\}}&lt;br /&gt;--&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 8pt; color: black; background: white;"&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;using&lt;/span&gt; app.domain;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;using&lt;/span&gt; Microsoft.Practices.EnterpriseLibrary.Validation;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;using&lt;/span&gt; NUnit.Framework;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;namespace&lt;/span&gt; test.domaintest&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;{&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; [&lt;span style="color: #2b91af;"&gt;TestFixture&lt;/span&gt;]&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DogTest&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;10&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;span style="color: #2b91af;"&gt;Test&lt;/span&gt;]&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;11&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; ShouldHaveValidDog()&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;12&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;13&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Dog&lt;/span&gt; dog = CreateDog(&lt;span style="color: #a31515;"&gt;"Chiyo"&lt;/span&gt;, &lt;span style="color: #2b91af;"&gt;Breed&lt;/span&gt;.GreatPyrenees, &lt;span style="color: #2b91af;"&gt;Color&lt;/span&gt;.White, &lt;span style="color: #2b91af;"&gt;Gender&lt;/span&gt;.Female);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;14&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Assert&lt;/span&gt;.IsNotNull(dog);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;15&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Assert&lt;/span&gt;.IsTrue(dog.IsValid());&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;16&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Assert&lt;/span&gt;.IsTrue(dog.IsDirty);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;17&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Assert&lt;/span&gt;.IsTrue(dog.IsSavable());&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;18&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;19&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;20&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;span style="color: #2b91af;"&gt;Test&lt;/span&gt;]&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;21&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; ShouldInvalidateNoName()&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;22&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;23&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Dog&lt;/span&gt; dog = CreateDog(&lt;span style="color: blue;"&gt;string&lt;/span&gt;.Empty, &lt;span style="color: #2b91af;"&gt;Breed&lt;/span&gt;.GreatPyrenees, &lt;span style="color: #2b91af;"&gt;Color&lt;/span&gt;.White, &lt;span style="color: #2b91af;"&gt;Gender&lt;/span&gt;.Female);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;24&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Assert&lt;/span&gt;.IsNotNull(dog);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;25&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;26&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;ValidationResults&lt;/span&gt; results = dog.Validate();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;27&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Assert&lt;/span&gt;.IsFalse(results.IsValid);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;28&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;ValidationResult&lt;/span&gt; result &lt;span style="color: blue;"&gt;in&lt;/span&gt; results)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;29&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;30&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color: #2b91af;"&gt;Dog&lt;/span&gt;.FIRST_NAME_LENGTH_ERROR_MESSAGE, result.Message);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;31&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;32&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;33&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Assert&lt;/span&gt;.IsFalse(dog.IsValid());&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;34&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Assert&lt;/span&gt;.IsTrue(dog.IsDirty);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;35&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Assert&lt;/span&gt;.IsFalse(dog.IsSavable());&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;36&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;37&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;38&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;span style="color: #2b91af;"&gt;Test&lt;/span&gt;]&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;39&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; ShouldInvalidateNullBreed()&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;40&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;41&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Dog&lt;/span&gt; dog = CreateDog(&lt;span style="color: #a31515;"&gt;"Chiyo"&lt;/span&gt;, &lt;span style="color: blue;"&gt;null&lt;/span&gt;, &lt;span style="color: #2b91af;"&gt;Color&lt;/span&gt;.White, &lt;span style="color: #2b91af;"&gt;Gender&lt;/span&gt;.Female);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;42&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Assert&lt;/span&gt;.IsNotNull(dog);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;43&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;44&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;ValidationResults&lt;/span&gt; results = dog.Validate();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;45&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Assert&lt;/span&gt;.IsFalse(results.IsValid);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;46&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;ValidationResult&lt;/span&gt; result &lt;span style="color: blue;"&gt;in&lt;/span&gt; results)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;47&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;48&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color: #2b91af;"&gt;Dog&lt;/span&gt;.BREED_ERROR_MESSAGE, result.Message);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;49&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;50&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;51&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Assert&lt;/span&gt;.IsFalse(dog.IsValid());&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;52&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Assert&lt;/span&gt;.IsTrue(dog.IsDirty);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;53&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Assert&lt;/span&gt;.IsFalse(dog.IsSavable());&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;54&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;55&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;56&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;span style="color: #2b91af;"&gt;Test&lt;/span&gt;]&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;57&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; ShouldHaveANonDirtyDog()&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;58&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;59&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Dog&lt;/span&gt; dog = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Dog&lt;/span&gt;();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;60&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Assert&lt;/span&gt;.IsFalse(dog.IsDirty);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;61&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;62&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;63&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;span style="color: #2b91af;"&gt;Test&lt;/span&gt;]&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;64&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; ChiyoShouldNotBeLesbian()&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;65&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;66&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Dog&lt;/span&gt; dog = CreateDog(&lt;span style="color: #a31515;"&gt;"Chiyo"&lt;/span&gt;, &lt;span style="color: #2b91af;"&gt;Breed&lt;/span&gt;.GreatPyrenees, &lt;span style="color: #2b91af;"&gt;Color&lt;/span&gt;.White, &lt;span style="color: #2b91af;"&gt;Gender&lt;/span&gt;.Lesbian);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;67&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Assert&lt;/span&gt;.IsNotNull(dog);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;68&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;69&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;ValidationResults&lt;/span&gt; results = dog.Validate();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;70&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Assert&lt;/span&gt;.IsFalse(results.IsValid);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;71&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;ValidationResult&lt;/span&gt; result &lt;span style="color: blue;"&gt;in&lt;/span&gt; results)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;72&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;73&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color: #2b91af;"&gt;ChiyoIsNotLesbianValidator&lt;/span&gt;.CHIYO_ERROR_MESSAGE, result.Message);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;74&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;75&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;76&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Assert&lt;/span&gt;.IsFalse(dog.IsValid());&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;77&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Assert&lt;/span&gt;.IsTrue(dog.IsDirty);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;78&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Assert&lt;/span&gt;.IsFalse(dog.IsSavable());&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;79&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;80&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;81&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Dog&lt;/span&gt; CreateDog(&lt;span style="color: blue;"&gt;string&lt;/span&gt; name, &lt;span style="color: #2b91af;"&gt;Breed&lt;/span&gt; breed, &lt;span style="color: #2b91af;"&gt;Color&lt;/span&gt; color, &lt;span style="color: #2b91af;"&gt;Gender&lt;/span&gt; gender)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;82&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;83&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #2b91af;"&gt;Dog&lt;/span&gt; dog = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Dog&lt;/span&gt;();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;84&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dog.Name = name;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;85&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dog.Breed = breed;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;86&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dog.Color = color;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;87&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dog.Gender = gender;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;88&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;89&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; dog;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;90&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;91&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;92&lt;/span&gt;&amp;nbsp;}&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The Code...&lt;br /&gt;&lt;br /&gt;&lt;!--&lt;br /&gt;{\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;\red163\green21\blue21;}??\fs20 \cf1 using\cf0  System;\par ??\cf1 using\cf0  Microsoft.Practices.EnterpriseLibrary.Validation;\par ??\cf1 using\cf0  Microsoft.Practices.EnterpriseLibrary.Validation.Validators;\par ??\par ??\cf1 namespace\cf0  app.domain\par ??\{\par ??    [\cf4 ChiyoIsNotLesbianValidator\cf0 ]\par ??    \cf1 public\cf0  \cf1 class\cf0  \cf4 Dog\cf0  : \cf4 DomainObject\cf0 &amp;lt;\cf4 Dog\cf0 &amp;gt;, \cf4 IDomainObject\par ??\cf0     \{\par ??        \cf1 public\cf0  \cf1 const\cf0  \cf1 string\cf0  FIRST_NAME_ERROR_MESSAGE = \cf5 "Please enter first name"\cf0 ;\par ??        \cf1 public\cf0  \cf1 const\cf0  \cf1 string\cf0  FIRST_NAME_LENGTH_ERROR_MESSAGE = \cf5 "Dog's name must have a maximum length of 50"\cf0 ;\par ??        \cf1 public\cf0  \cf1 const\cf0  \cf1 string\cf0  BREED_ERROR_MESSAGE = \cf5 "Please select breed"\cf0 ;\par ??\par ??        \cf1 private\cf0  \cf1 string\cf0  name;\par ??        \cf1 private\cf0  \cf4 Breed\cf0  breed;\par ??        \cf1 private\cf0  \cf4 Color\cf0  color;\par ??        \cf1 private\cf0  \cf4 Gender\cf0  gender;\par ??\par ??\par ??        \cf1 public\cf0  Dog()\par ??        \{\par ??        \}\par ??\par ??        \cf1 public\cf0  Dog(\cf4 Validator\cf0  validationService) : \cf1 base\cf0 (validationService)\par ??        \{\par ??        \}\par ??\par ??        [\cf4 NotNullValidator\cf0 (MessageTemplate = FIRST_NAME_ERROR_MESSAGE)]\par ??        [\cf4 StringLengthValidator\cf0 (1, 50, MessageTemplate = FIRST_NAME_LENGTH_ERROR_MESSAGE)]\par ??        \cf1 public\cf0  \cf1 string\cf0  Name\par ??        \{\par ??            \cf1 get\cf0  \{ \cf1 return\cf0  name; \}\par ??            \cf1 set\par ??\cf0             \{\par ??                name = \cf1 value\cf0 ;\par ??                \cf1 base\cf0 .IsDirty = \cf1 true\cf0 ;\par ??            \}\par ??        \}\par ??\par ??        [\cf4 NotNullValidator\cf0 (MessageTemplate = BREED_ERROR_MESSAGE)]\par ??        \cf1 public\cf0  \cf4 Breed\cf0  Breed\par ??        \{\par ??            \cf1 get\cf0  \{ \cf1 return\cf0  breed; \}\par ??            \cf1 set\par ??\cf0             \{\par ??                breed = \cf1 value\cf0 ;\par ??                \cf1 base\cf0 .IsDirty = \cf1 true\cf0 ;\par ??            \}\par ??        \}\par ??\par ??        \cf1 public\cf0  \cf4 Color\cf0  Color\par ??        \{\par ??            \cf1 get\cf0  \{ \cf1 return\cf0  color; \}\par ??            \cf1 set\par ??\cf0             \{\par ??                color = \cf1 value\cf0 ;\par ??                \cf1 base\cf0 .IsDirty = \cf1 true\cf0 ;\par ??            \}\par ??        \}\par ??\par ??        \cf1 public\cf0  \cf4 Gender\cf0  Gender\par ??        \{\par ??            \cf1 get\cf0  \{ \cf1 return\cf0  gender; \}\par ??            \cf1 set\par ??\cf0             \{\par ??                gender = \cf1 value\cf0 ;\par ??                \cf1 base\cf0 .IsDirty = \cf1 true\cf0 ;\par ??            \}\par ??        \}\par ??    \}\par ??\}\par ??}&lt;br /&gt;--&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 8pt; color: black; background: white;"&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;using&lt;/span&gt; Microsoft.Practices.EnterpriseLibrary.Validation;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;using&lt;/span&gt; Microsoft.Practices.EnterpriseLibrary.Validation.Validators;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;namespace&lt;/span&gt; app.domain&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;{&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; [&lt;span style="color: #2b91af;"&gt;ChiyoIsNotLesbianValidator&lt;/span&gt;]&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Dog&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;DomainObject&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Dog&lt;/span&gt;&amp;gt;, &lt;span style="color: #2b91af;"&gt;IDomainObject&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;10&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;const&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; FIRST_NAME_ERROR_MESSAGE = &lt;span style="color: #a31515;"&gt;"Please enter first name"&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;11&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;const&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; FIRST_NAME_LENGTH_ERROR_MESSAGE = &lt;span style="color: #a31515;"&gt;"Dog's name must have a maximum length of 50"&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;12&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;const&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; BREED_ERROR_MESSAGE = &lt;span style="color: #a31515;"&gt;"Please select breed"&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;13&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;14&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; name;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;15&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Breed&lt;/span&gt; breed;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;16&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Color&lt;/span&gt; color;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;17&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Gender&lt;/span&gt; gender;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;18&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;19&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;20&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; Dog()&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;21&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;22&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;23&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;24&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; Dog(&lt;span style="color: #2b91af;"&gt;Validator&lt;/span&gt; validationService) : &lt;span style="color: blue;"&gt;base&lt;/span&gt;(validationService)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;25&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;26&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;27&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;28&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;span style="color: #2b91af;"&gt;NotNullValidator&lt;/span&gt;(MessageTemplate = FIRST_NAME_ERROR_MESSAGE)]&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;29&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;span style="color: #2b91af;"&gt;StringLengthValidator&lt;/span&gt;(1, 50, MessageTemplate = FIRST_NAME_LENGTH_ERROR_MESSAGE)]&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;30&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; Name&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;31&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;32&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt; { &lt;span style="color: blue;"&gt;return&lt;/span&gt; name; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;33&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;34&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;35&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; name = &lt;span style="color: blue;"&gt;value&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;36&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;base&lt;/span&gt;.IsDirty = &lt;span style="color: blue;"&gt;true&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;37&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;38&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;39&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;40&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;span style="color: #2b91af;"&gt;NotNullValidator&lt;/span&gt;(MessageTemplate = BREED_ERROR_MESSAGE)]&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;41&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Breed&lt;/span&gt; Breed&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;42&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;43&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt; { &lt;span style="color: blue;"&gt;return&lt;/span&gt; breed; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;44&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;45&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;46&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; breed = &lt;span style="color: blue;"&gt;value&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;47&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;base&lt;/span&gt;.IsDirty = &lt;span style="color: blue;"&gt;true&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;48&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;49&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;50&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;51&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Color&lt;/span&gt; Color&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;52&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;53&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt; { &lt;span style="color: blue;"&gt;return&lt;/span&gt; color; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;54&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;55&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;56&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; color = &lt;span style="color: blue;"&gt;value&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;57&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;base&lt;/span&gt;.IsDirty = &lt;span style="color: blue;"&gt;true&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;58&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;59&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;60&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;61&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Gender&lt;/span&gt; Gender&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;62&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;63&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt; { &lt;span style="color: blue;"&gt;return&lt;/span&gt; gender; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;64&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;65&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;66&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; gender = &lt;span style="color: blue;"&gt;value&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;67&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;base&lt;/span&gt;.IsDirty = &lt;span style="color: blue;"&gt;true&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;68&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;69&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;70&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;71&lt;/span&gt;&amp;nbsp;}&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;and here is my custom validator...&lt;br /&gt;&lt;br /&gt;&lt;!--&lt;br /&gt;{\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;\red163\green21\blue21;}??\fs20 \cf1 namespace\cf0  app.domain\par ??\{\par ??    \cf1 public\cf0  \cf1 class\cf0  \cf4 ChiyoIsNotLesbianValidatorAttribute\cf0  : \cf4 ValidatorAttribute\par ??\cf0     \{\par ??        \cf1 protected\cf0  \cf1 override\cf0  \cf4 Validator\cf0  DoCreateValidator(\cf4 Type\cf0  targetType)\par ??        \{\par ??            \cf1 return\cf0  \cf1 new\cf0  \cf4 ChiyoIsNotLesbianValidator\cf0 (GetMessageTemplate(), Tag);\par ??        \}\par ??    \}\par ??\par ??    \cf1 public\cf0  \cf1 class\cf0  \cf4 ChiyoIsNotLesbianValidator\cf0  : \cf4 Validator\cf0 &amp;lt;\cf4 Dog\cf0 &amp;gt;\par ??    \{\par ??        \cf1 public\cf0  \cf1 const\cf0  \cf1 string\cf0  CHIYO_ERROR_MESSAGE = \cf5 "Chiyo aint lesbian!"\cf0 ;\par ??        \cf1 private\cf0  \cf1 string\cf0  defaultMessageTemplate;\par ??\par ??        \cf1 public\cf0  ChiyoIsNotLesbianValidator(\cf1 string\cf0  template, \cf1 string\cf0  tag)\par ??            : \cf1 base\cf0 (template, tag)\par ??        \{\par ??            defaultMessageTemplate = CHIYO_ERROR_MESSAGE;\par ??        \}\par ??\par ??        \cf1 protected\cf0  \cf1 override\cf0  \cf1 void\cf0  DoValidate(\cf4 Dog\cf0  objectToValidate, \cf1 object\cf0  currentTarget, \cf1 string\cf0  key,\par ??                                           \cf4 ValidationResults\cf0  validationResults)\par ??        \{\par ??            \cf1 try\par ??\cf0             \{\par ??                \cf1 if\cf0  (objectToValidate.Gender == \cf4 Gender\cf0 .Lesbian &amp;amp;&amp;amp; objectToValidate.Name.ToLower() == \cf5 "chiyo"\cf0 )\par ??                    validationResults.AddResult(\par ??                        \cf1 new\cf0  \cf4 ValidationResult\cf0 (CHIYO_ERROR_MESSAGE, \cf1 string\cf0 .Empty, \cf1 string\cf0 .Empty, \cf1 string\cf0 .Empty, \cf1 this\cf0 ));\par ??            \}\par ??            \cf1 catch\par ??\cf0             \{\par ??                validationResults.AddResult(\par ??                    \cf1 new\cf0  \cf4 ValidationResult\cf0 (\cf5 "Something messed up."\cf0 , \cf1 string\cf0 .Empty, \cf1 string\cf0 .Empty, \cf1 string\cf0 .Empty, \cf1 this\cf0 ));\par ??            \}\par ??        \}\par ??\par ??        \cf1 protected\cf0  \cf1 override\cf0  \cf1 string\cf0  DefaultMessageTemplate\par ??        \{\par ??            \cf1 get\cf0  \{ \cf1 return\cf0  defaultMessageTemplate; \}\par ??        \}\par ??    \}\par ??\}}&lt;br /&gt;--&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 8pt; color: black; background: white;"&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;73&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;namespace&lt;/span&gt; app.domain&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;74&lt;/span&gt;&amp;nbsp;{&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;75&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ChiyoIsNotLesbianValidatorAttribute&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;ValidatorAttribute&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;76&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;77&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Validator&lt;/span&gt; DoCreateValidator(&lt;span style="color: #2b91af;"&gt;Type&lt;/span&gt; targetType)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;78&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;79&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ChiyoIsNotLesbianValidator&lt;/span&gt;(GetMessageTemplate(), Tag);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;80&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;81&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;82&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;83&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ChiyoIsNotLesbianValidator&lt;/span&gt; : &lt;span style="color: #2b91af;"&gt;Validator&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af;"&gt;Dog&lt;/span&gt;&amp;gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;84&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;85&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;const&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; CHIYO_ERROR_MESSAGE = &lt;span style="color: #a31515;"&gt;"Chiyo aint lesbian!"&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;86&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; defaultMessageTemplate;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;87&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;88&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; ChiyoIsNotLesbianValidator(&lt;span style="color: blue;"&gt;string&lt;/span&gt; template, &lt;span style="color: blue;"&gt;string&lt;/span&gt; tag)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;89&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : &lt;span style="color: blue;"&gt;base&lt;/span&gt;(template, tag)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;90&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;91&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; defaultMessageTemplate = CHIYO_ERROR_MESSAGE;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;92&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;93&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;94&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; DoValidate(&lt;span style="color: #2b91af;"&gt;Dog&lt;/span&gt; objectToValidate, &lt;span style="color: blue;"&gt;object&lt;/span&gt; currentTarget, &lt;span style="color: blue;"&gt;string&lt;/span&gt; key,&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;95&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  &lt;span style="color: #2b91af;"&gt;ValidationResults&lt;/span&gt; validationResults)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;96&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;97&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;try&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;98&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;99&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (objectToValidate.Gender == &lt;span style="color: #2b91af;"&gt;Gender&lt;/span&gt;.Lesbian &amp;amp;&amp;amp; objectToValidate.Name.ToLower() == &lt;span style="color: #a31515;"&gt;"chiyo"&lt;/span&gt;)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;100&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; validationResults.AddResult(&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;101&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ValidationResult&lt;/span&gt;(CHIYO_ERROR_MESSAGE, &lt;span style="color: blue;"&gt;string&lt;/span&gt;.Empty, &lt;span style="color: blue;"&gt;string&lt;/span&gt;.Empty, &lt;span style="color: blue;"&gt;string&lt;/span&gt;.Empty, &lt;span style="color: blue;"&gt;this&lt;/span&gt;));&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;102&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;103&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;catch&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;104&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;105&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; validationResults.AddResult(&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;106&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ValidationResult&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Something messed up."&lt;/span&gt;, &lt;span style="color: blue;"&gt;string&lt;/span&gt;.Empty, &lt;span style="color: blue;"&gt;string&lt;/span&gt;.Empty, &lt;span style="color: blue;"&gt;string&lt;/span&gt;.Empty, &lt;span style="color: blue;"&gt;this&lt;/span&gt;));&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;107&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;108&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;109&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;110&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; DefaultMessageTemplate&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;111&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;112&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt; { &lt;span style="color: blue;"&gt;return&lt;/span&gt; defaultMessageTemplate; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;113&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;114&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;115&lt;/span&gt;&amp;nbsp;}&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-1714110819570209335?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/1714110819570209335/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=1714110819570209335' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/1714110819570209335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/1714110819570209335'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2007/01/validation-application-block-el3-beta.html' title='Validation Application Block - EL3 Beta (yaknowhatimsayin!?!?!?!)'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-116469966926342438</id><published>2006-11-28T00:40:00.000-07:00</published><updated>2006-11-28T00:41:09.476-07:00</updated><title type='text'>Where the F**k is Jonas?</title><content type='html'>Since it's been snowing here in the 780, I have been busy with snowboarding, skiing, and fu*king shovelling snow.&lt;br /&gt;&lt;br /&gt;I should get back in to bustin some nyahhh, but that is one of the last things in my mind right now coz of the amount of the white stuff that has been dumped on us. But as for nyahhh, I have been bustin som .Net 3.0 sh*t like WCF (f*cking kick ass) &amp; WPF. I will post something on those two later... when I feel like it.&lt;br /&gt;&lt;br /&gt;So for now I will let all fellow readers watch the following kick ass youtube-age.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Z154yhLoS78"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/Z154yhLoS78" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;and this...&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/QdT06yjjbOg"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/QdT06yjjbOg" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-116469966926342438?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/116469966926342438/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=116469966926342438' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/116469966926342438'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/116469966926342438'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2006/11/where-fk-is-jonas.html' title='Where the F**k is Jonas?'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-116253950621014016</id><published>2006-11-03T00:28:00.000-07:00</published><updated>2006-11-03T14:21:10.313-07:00</updated><title type='text'>Nerdage...</title><content type='html'>I presented at work some cool NYAHHH about the Service Layer (not web service) and my &lt;a href="http://www.jwerx.com/blog"&gt;co-worker&lt;/a&gt; helped out with domain validation.&lt;br /&gt;&lt;br /&gt;I think the code that I wrote for this 15+ minute presentation was pretty kick ass, so might at well share it to everyone.&lt;br /&gt;&lt;br /&gt;Here are some of the patterns/OO design being used (a mix of GoF, and Fowler's PofEAA):&lt;br /&gt;- Factory&lt;br /&gt;- Domain Model&lt;br /&gt;- Service Layer&lt;br /&gt;- Unit of Work&lt;br /&gt;- Data Mapper&lt;br /&gt;- Dependendcy Injection&lt;br /&gt;- Dependendcy Inversion&lt;br /&gt;- Finder&lt;br /&gt;- Model View Presenter&lt;br /&gt;- etc...&lt;br /&gt;&lt;br /&gt;And here are some technologies used:&lt;br /&gt;- NHibernate&lt;br /&gt;- NMock2&lt;br /&gt;- NUnit&lt;br /&gt;&lt;br /&gt;And here's the link to the .zip [&lt;a href="http://jonas.ave.googlepages.com/BusinessLogicPatternsInAction.zip"&gt;download&lt;/a&gt;]&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Note:&lt;br /&gt;&lt;br /&gt;If you would like to run the application, download (1)Nhibernate, (2)NMock2, (3) SQL Server Express 2005 with (4)Northwind Database - here is the &lt;a href="http://www.codinghorror.com/blog/archives/000434.html"&gt;link&lt;/a&gt; on how to install the database.&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-116253950621014016?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/116253950621014016/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=116253950621014016' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/116253950621014016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/116253950621014016'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2006/11/nerdage.html' title='Nerdage...'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-116183132276725618</id><published>2006-10-25T20:53:00.000-06:00</published><updated>2006-10-25T20:55:23.056-06:00</updated><title type='text'>Party in my pants...</title><content type='html'>&lt;embed style="width:400px; height:326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=2744939550020516927&amp;hl=en-GB" flashvars=""&gt; &lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;Two words... Serious Poundage.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-116183132276725618?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/116183132276725618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=116183132276725618' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/116183132276725618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/116183132276725618'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2006/10/party-in-my-pants.html' title='Party in my pants...'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-116175872099663437</id><published>2006-10-25T00:38:00.002-06:00</published><updated>2006-10-25T00:53:15.113-06:00</updated><title type='text'>The Dudesons</title><content type='html'>&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/j8d467hiJds"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;embed src="http://www.youtube.com/v/j8d467hiJds" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Psoprg2Z9qE"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/Psoprg2Z9qE" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-116175872099663437?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/116175872099663437/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=116175872099663437' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/116175872099663437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/116175872099663437'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2006/10/dudesons.html' title='The Dudesons'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-116158339486639456</id><published>2006-10-22T23:56:00.000-06:00</published><updated>2006-10-23T00:03:15.120-06:00</updated><title type='text'>NMock2... Rhino.Mocks' Nemesis</title><content type='html'>I am a "Traditional" mocking guy... I write all my mocks, and got to the point that it has became very fast to implement. But sometimes I just wish that there is a good mocking tool out there.&lt;br /&gt;&lt;br /&gt;I have tried Rhino, and I may be stupid (which I am) but I can't figure the damn thing out... I wish there was something that was very straight forward.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;NMock2 to the rescue!&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;I have coded a quick Model View Presenter sample that uses NMock2. Enjoy.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;The Test&lt;/h3&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;[&lt;span style="color: teal;"&gt;TestFixture&lt;/span&gt;]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: teal;"&gt;DJInventoryPresenterTest&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: teal;"&gt;Mockery&lt;/span&gt; mocks;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: teal;"&gt;DJInventoryPresenter&lt;/span&gt; presenter;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: teal;"&gt;IDJInventoryTask&lt;/span&gt; task;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: teal;"&gt;IDJInventoryView&lt;/span&gt; view;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; [&lt;span style="color: teal;"&gt;SetUp&lt;/span&gt;]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; SetUp()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mocks = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;Mockery&lt;/span&gt;();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; task = mocks.NewMock&amp;lt;&lt;span style="color: teal;"&gt;IDJInventoryTask&lt;/span&gt;&amp;gt;();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; view = mocks.NewMock&amp;lt;&lt;span style="color: teal;"&gt;IDJInventoryView&lt;/span&gt;&amp;gt;();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; presenter = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;DJInventoryPresenter&lt;/span&gt;(view, task);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; [&lt;span style="color: teal;"&gt;TearDown&lt;/span&gt;]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; TearDown()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mocks.VerifyAllExpectationsHaveBeenMet();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; [&lt;span style="color: teal;"&gt;Test&lt;/span&gt;]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; ShouldAdd()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Expect&lt;/span&gt;.Once.On(view).GetProperty(&lt;span style="color: maroon;"&gt;"Name"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Expect&lt;/span&gt;.Once.On(view).GetProperty(&lt;span style="color: maroon;"&gt;"Description"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Expect&lt;/span&gt;.Once.On(view).SetProperty(&lt;span style="color: maroon;"&gt;"Id"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Expect&lt;/span&gt;.Once.On(task).Method(&lt;span style="color: maroon;"&gt;"Add"&lt;/span&gt;).Will(&lt;span style="color: teal;"&gt;Return&lt;/span&gt;.Value(1));&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; presenter.Add();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; [&lt;span style="color: teal;"&gt;Test&lt;/span&gt;]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; ShouldDelete()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Expect&lt;/span&gt;.Once.On(view).GetProperty(&lt;span style="color: maroon;"&gt;"Name"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Expect&lt;/span&gt;.Once.On(view).GetProperty(&lt;span style="color: maroon;"&gt;"Description"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Expect&lt;/span&gt;.Once.On(view).GetProperty(&lt;span style="color: maroon;"&gt;"Id"&lt;/span&gt;).Will(&lt;span style="color: teal;"&gt;Return&lt;/span&gt;.Value(1));&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Expect&lt;/span&gt;.Once.On(task).Method(&lt;span style="color: maroon;"&gt;"Delete"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; presenter.Delete();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; [&lt;span style="color: teal;"&gt;Test&lt;/span&gt;]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; ShouldUpdate()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Expect&lt;/span&gt;.Once.On(view).GetProperty(&lt;span style="color: maroon;"&gt;"Name"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Expect&lt;/span&gt;.Once.On(view).GetProperty(&lt;span style="color: maroon;"&gt;"Description"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Expect&lt;/span&gt;.Once.On(view).GetProperty(&lt;span style="color: maroon;"&gt;"Id"&lt;/span&gt;).Will(&lt;span style="color: teal;"&gt;Return&lt;/span&gt;.Value(1));&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Expect&lt;/span&gt;.Once.On(view).SetProperty(&lt;span style="color: maroon;"&gt;"IsUpdated"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Expect&lt;/span&gt;.Once.On(task).Method(&lt;span style="color: maroon;"&gt;"Edit"&lt;/span&gt;).Will(&lt;span style="color: teal;"&gt;Return&lt;/span&gt;.Value(&lt;span style="color: blue;"&gt;true&lt;/span&gt;));&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; presenter.Update();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; [&lt;span style="color: teal;"&gt;Test&lt;/span&gt;]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; ShouldGetById()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Expect&lt;/span&gt;.Once.On(view).SetProperty(&lt;span style="color: maroon;"&gt;"Name"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Expect&lt;/span&gt;.Once.On(view).SetProperty(&lt;span style="color: maroon;"&gt;"Description"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Expect&lt;/span&gt;.Once.On(view).GetProperty(&lt;span style="color: maroon;"&gt;"Id"&lt;/span&gt;).Will(&lt;span style="color: teal;"&gt;Return&lt;/span&gt;.Value(1));&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Expect&lt;/span&gt;.Once.On(task).Method(&lt;span style="color: maroon;"&gt;"GetDJInventoryById"&lt;/span&gt;).Will(&lt;span style="color: teal;"&gt;Return&lt;/span&gt;.Value(CreateDJInventory()));&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; presenter.GetDJInventoryById();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; [&lt;span style="color: teal;"&gt;Test&lt;/span&gt;]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; ShouldGetAll()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Expect&lt;/span&gt;.Once.On(view).SetProperty(&lt;span style="color: maroon;"&gt;"AllInventories"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Expect&lt;/span&gt;.Once.On(task).Method(&lt;span style="color: maroon;"&gt;"GetAllDJInventories"&lt;/span&gt;).Will(&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Return&lt;/span&gt;.Value(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;DJInventory&lt;/span&gt;[] {CreateDJInventory()}));&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; presenter.GetAllInventories();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: teal;"&gt;DJInventory&lt;/span&gt; CreateDJInventory()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;DJInventory&lt;/span&gt; inventory = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;DJInventory&lt;/span&gt;();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; inventory.Name = &lt;span style="color: maroon;"&gt;"Test"&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; inventory.Description = &lt;span style="color: maroon;"&gt;"Test Description"&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; inventory;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;The Presenter&lt;/h3&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: teal;"&gt;DJInventoryPresenter&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;readonly&lt;/span&gt; &lt;span style="color: teal;"&gt;IDJInventoryView&lt;/span&gt; view;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;readonly&lt;/span&gt; &lt;span style="color: teal;"&gt;IDJInventoryTask&lt;/span&gt; task;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; DJInventoryPresenter(&lt;span style="color: teal;"&gt;IDJInventoryView&lt;/span&gt; view, &lt;span style="color: teal;"&gt;IDJInventoryTask&lt;/span&gt; task)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.view = view;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.task = task;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Add()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;DJInventory&lt;/span&gt; inventory = CreateDJInventoryFromView(view, &lt;span style="color: blue;"&gt;true&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; view.Id = task.Add(inventory);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Delete()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; task.Delete(CreateDJInventoryFromView(view, &lt;span style="color: blue;"&gt;false&lt;/span&gt;));&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Update()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; view.IsUpdated = task.Edit(CreateDJInventoryFromView(view, &lt;span style="color: blue;"&gt;false&lt;/span&gt;));&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; GetDJInventoryById()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;DJInventory&lt;/span&gt; result = task.GetDJInventoryById(view.Id);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; view.Name = result.Name;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; view.Description = result.Description;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: teal;"&gt;DJInventory&lt;/span&gt; CreateDJInventoryFromView(&lt;span style="color: teal;"&gt;IDJInventoryView&lt;/span&gt; view, &lt;span style="color: blue;"&gt;bool&lt;/span&gt; ignoreId)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;DJInventory&lt;/span&gt; inventory = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;DJInventory&lt;/span&gt;();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; inventory.Name = view.Name;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; inventory.Description = view.Description;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (!ignoreId)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; inventory.Id = view.Id;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; inventory;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; GetAllInventories()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; view.AllInventories = CreateDataTable(task.GetAllDJInventories());&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: teal;"&gt;DataTable&lt;/span&gt; CreateDataTable(&lt;span style="color: teal;"&gt;DJInventory&lt;/span&gt;[] inventories)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;DataTable&lt;/span&gt; dt = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;DataTable&lt;/span&gt;();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CreateColumns(dt);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CreateRows(dt, inventories);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; dt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; CreateColumns(&lt;span style="color: teal;"&gt;DataTable&lt;/span&gt; dt)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dt.Columns.Add(&lt;span style="color: maroon;"&gt;"ID"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dt.Columns.Add(&lt;span style="color: maroon;"&gt;"Name"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dt.Columns.Add(&lt;span style="color: maroon;"&gt;"Description"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; CreateRows(&lt;span style="color: teal;"&gt;DataTable&lt;/span&gt; dt, &lt;span style="color: teal;"&gt;DJInventory&lt;/span&gt;[] inventories)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: teal;"&gt;DJInventory&lt;/span&gt; inventory &lt;span style="color: blue;"&gt;in&lt;/span&gt; inventories)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dt.Rows.Add(CreateRow(dt, inventory));&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: teal;"&gt;DataRow&lt;/span&gt; CreateRow(&lt;span style="color: teal;"&gt;DataTable&lt;/span&gt; dt, &lt;span style="color: teal;"&gt;DJInventory&lt;/span&gt; inventory)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;DataRow&lt;/span&gt; row = dt.NewRow();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; row[&lt;span style="color: maroon;"&gt;"ID"&lt;/span&gt;] = inventory.Id;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; row[&lt;span style="color: maroon;"&gt;"Name"&lt;/span&gt;] = inventory.Name;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; row[&lt;span style="color: maroon;"&gt;"Description"&lt;/span&gt;] = inventory.Description;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; row;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-116158339486639456?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/116158339486639456/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=116158339486639456' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/116158339486639456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/116158339486639456'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2006/10/nmock2-rhinomocks-nemesis.html' title='NMock2... Rhino.Mocks&apos; Nemesis'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-116157755931600138</id><published>2006-10-22T22:15:00.000-06:00</published><updated>2006-10-22T22:51:41.570-06:00</updated><title type='text'>Switch Statement = Ghetto... Enum = Ghetto</title><content type='html'>U like the title? Aww yeaa foo!&lt;br /&gt;&lt;br /&gt;I like bustin' some OOP nyahh all the time, and some of the developers I have paired with notice two things: (1) I don't do switch statements, (2) I rarely (never) use enums...&lt;br /&gt;&lt;br /&gt;Why you ask?&lt;br /&gt;&lt;br /&gt;Switch / Case: It's gay.&lt;br /&gt;Switch / Case: Too much code in the containing class.&lt;br /&gt;Switch / Case: Can become complex.&lt;br /&gt;Switch / Case: Containing class needs to be changed when a condition is added/changed.&lt;br /&gt;Switch / Case: A 'case' is hard coded "case IsUgly:"&lt;br /&gt;&lt;br /&gt;Enum: It's just a frigging int... &lt;br /&gt;Enum: It's gay.&lt;br /&gt;&lt;br /&gt;I will show you some cool tricks how to get rid of the nastyness...&lt;br /&gt;&lt;br /&gt;Okay... here is a test.&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;[&lt;span style="color: teal;"&gt;Test&lt;/span&gt;]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; ShouldDJ()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Person&lt;/span&gt; jonas = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;Person&lt;/span&gt;(&lt;span style="color: maroon;"&gt;"Jonas"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; jonas.Do(&lt;span style="color: teal;"&gt;DoSomething&lt;/span&gt;.DJ);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color: maroon;"&gt;"DJ"&lt;/span&gt;, jonas.IsDoing);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Okay, nothing fancy... we are verifying that Person is DJing. But now here comes the ugly.&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;enum&lt;/span&gt; &lt;span style="color: teal;"&gt;DoSomething&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; DJ = 1,&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; BMX = 2,&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; GetDrunk = 3&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;What the F**k is that!?!? That's the enum! we are just replacing numbers with something readable... So nasty!&lt;br /&gt;&lt;br /&gt;Here's the Person object:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: teal;"&gt;Person&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;readonly&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; name;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; isDoing;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; Person(&lt;span style="color: blue;"&gt;string&lt;/span&gt; name)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.name = name;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; Name&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt; { &lt;span style="color: blue;"&gt;return&lt;/span&gt; name; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Do(&lt;span style="color: teal;"&gt;DoSomething&lt;/span&gt; doStuff)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;switch&lt;/span&gt;(doStuff)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: teal;"&gt;DoSomething&lt;/span&gt;.DJ:&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; isDoing = &lt;span style="color: maroon;"&gt;"DJ"&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: teal;"&gt;DoSomething&lt;/span&gt;.BMX:&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; isDoing = &lt;span style="color: maroon;"&gt;"BMX"&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; &lt;span style="color: teal;"&gt;DoSomething&lt;/span&gt;.GetDrunk:&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; isDoing = &lt;span style="color: maroon;"&gt;"Aww yeaa foo!"&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; IsDoing&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt; { &lt;span style="color: blue;"&gt;return&lt;/span&gt; isDoing; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;I know I coded a switch for this sample (almost made me throw up).&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;So what is the big deal with using enums or switch?&lt;/h3&gt;&lt;br /&gt;Three words: Object Oriented Programming. You basically make objects to build your application. Yes, they make take longer to develop, but they are waaaay more maintainable. And if you programmed it so it can be readable, you can read your code like a story.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;How can we fix the code that you showed above?&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;First off, you will notice the Person() object has a method called "Do". What do you see very similar to what it's doing?... Yess they all set "IsDoing" property with a value which is a string.&lt;br /&gt;&lt;br /&gt;What we need to implement is a strategy pattern:&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;abstract&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: teal;"&gt;WhatToDoStrategy&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: teal;"&gt;WhatToDoStrategy&lt;/span&gt; DJ = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;DJStrategy&lt;/span&gt;();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: teal;"&gt;WhatToDoStrategy&lt;/span&gt; BMX = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;BMXStrategy&lt;/span&gt;();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: teal;"&gt;WhatToDoStrategy&lt;/span&gt; GET_DRUNK = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;GetDrunkStrategy&lt;/span&gt;();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;abstract&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; Do { &lt;span style="color: blue;"&gt;get&lt;/span&gt;; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: teal;"&gt;DJStrategy&lt;/span&gt; : &lt;span style="color: teal;"&gt;WhatToDoStrategy&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; Do&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt; { &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: maroon;"&gt;"DJ"&lt;/span&gt;; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: teal;"&gt;BMXStrategy&lt;/span&gt; : &lt;span style="color: teal;"&gt;WhatToDoStrategy&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; Do&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt; { &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: maroon;"&gt;"BMX"&lt;/span&gt;; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: teal;"&gt;GetDrunkStrategy&lt;/span&gt; : &lt;span style="color: teal;"&gt;WhatToDoStrategy&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; Do&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt; { &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: maroon;"&gt;"Aww yea foo!"&lt;/span&gt;; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;With the WhatToDoStrategy() strategy, our Person() object is now "naked" to all the logic when it comes to what it needs to do... it will simply just call an object.&lt;br /&gt;&lt;br /&gt;Sometimes, you may not want to call your strategy directly. As for this example, I created an interface called IStuffToDo that is taken in by Person() object.&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;interface&lt;/span&gt; &lt;span style="color: teal;"&gt;IStuffToDo&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;WhatToDoStrategy&lt;/span&gt; Doing();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: teal;"&gt;DJing&lt;/span&gt; : &lt;span style="color: teal;"&gt;IStuffToDo&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: teal;"&gt;WhatToDoStrategy&lt;/span&gt; Doing()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: teal;"&gt;WhatToDoStrategy&lt;/span&gt;.DJ;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: teal;"&gt;BMXing&lt;/span&gt; : &lt;span style="color: teal;"&gt;IStuffToDo&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: teal;"&gt;WhatToDoStrategy&lt;/span&gt; Doing()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: teal;"&gt;WhatToDoStrategy&lt;/span&gt;.BMX;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: teal;"&gt;GettingDrunk&lt;/span&gt; : &lt;span style="color: teal;"&gt;IStuffToDo&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: teal;"&gt;WhatToDoStrategy&lt;/span&gt; Doing()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: teal;"&gt;WhatToDoStrategy&lt;/span&gt;.GET_DRUNK;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The code above replaces the enum we had. This is wayyyyyy better. now when you look at the code for DJing(), you know it is calling the DJ strategy, not a fu*king number 1 which doesnt make any sense.&lt;br /&gt;&lt;br /&gt;Here is the modification to the Person() object:&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: teal;"&gt;Person&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: green;"&gt;//...&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Do(&lt;span style="color: teal;"&gt;IStuffToDo&lt;/span&gt; stuffToDo)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; isDoing = stuffToDo.Doing().Do;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: green;"&gt;//...&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Notice how it is taking in an IStuffToDo object, which in turn calls our strategy...&lt;br /&gt;&lt;br /&gt;Lastly, how do we verify if this code works? Tests!!!!&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;[&lt;span style="color: teal;"&gt;TestFixture&lt;/span&gt;]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: teal;"&gt;PersonTest&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; [&lt;span style="color: teal;"&gt;Test&lt;/span&gt;]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; ShouldDJ()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Person&lt;/span&gt; jonas = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;Person&lt;/span&gt;(&lt;span style="color: maroon;"&gt;"Jonas"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; jonas.Do(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;DJing&lt;/span&gt;());&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color: maroon;"&gt;"DJ"&lt;/span&gt;, jonas.IsDoing);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; [&lt;span style="color: teal;"&gt;Test&lt;/span&gt;]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; ShouldBMX()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Person&lt;/span&gt; jonas = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;Person&lt;/span&gt;(&lt;span style="color: maroon;"&gt;"Jonas"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; jonas.Do(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;BMXing&lt;/span&gt;());&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color: maroon;"&gt;"BMX"&lt;/span&gt;, jonas.IsDoing);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; [&lt;span style="color: teal;"&gt;Test&lt;/span&gt;]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; ShouldGetDrunk()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Person&lt;/span&gt; jonas = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;Person&lt;/span&gt;(&lt;span style="color: maroon;"&gt;"Jonas"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; jonas.Do(&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;GettingDrunk&lt;/span&gt;());&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color: maroon;"&gt;"Aww yea foo!"&lt;/span&gt;, jonas.IsDoing);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Nyahhh!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-116157755931600138?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/116157755931600138/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=116157755931600138' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/116157755931600138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/116157755931600138'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2006/10/switch-statement-ghetto-enum-ghetto.html' title='Switch Statement = Ghetto... Enum = Ghetto'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-116105887681851346</id><published>2006-10-16T22:16:00.000-06:00</published><updated>2006-10-16T22:22:25.430-06:00</updated><title type='text'>A Conversation While Contemplating Buying Skis using a Mediator Pattern</title><content type='html'>&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; NUnit.Framework;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;namespace&lt;/span&gt; jonas.patterns.behavioral.mediator&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; [&lt;span style="color: teal;"&gt;TestFixture&lt;/span&gt;]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: teal;"&gt;MediatorTest&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;span style="color: teal;"&gt;Test&lt;/span&gt;]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; ShouldBuySkis()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Store&lt;/span&gt; pacesetterSkiShop = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;Store&lt;/span&gt;();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Person&lt;/span&gt; suzie = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;SalesPerson&lt;/span&gt;(&lt;span style="color: maroon;"&gt;"Suzie"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Person&lt;/span&gt; jonas = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;Customer&lt;/span&gt;(&lt;span style="color: maroon;"&gt;"Jonas"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pacesetterSkiShop.Add(suzie);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pacesetterSkiShop.Add(jonas);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; suzie.Message = &lt;span style="color: maroon;"&gt;"Finding what you are looking for?"&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; suzie.Talk(jonas);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color: maroon;"&gt;"Sales Person Suzie says: Finding what you are looking for?"&lt;/span&gt;, jonas.Recieve(suzie));&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; jonas.Message = &lt;span style="color: maroon;"&gt;"I'm looking for skis. Can you help me out?"&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; jonas.Talk(suzie);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color: maroon;"&gt;"Customer Jonas says: I'm looking for skis. Can you help me out?"&lt;/span&gt;, suzie.Recieve(jonas));&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; suzie.Message = &lt;span style="color: maroon;"&gt;"Sure what kind are you looking at?"&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; suzie.Talk(jonas);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color: maroon;"&gt;"Sales Person Suzie says: Sure what kind are you looking at?"&lt;/span&gt;, jonas.Recieve(suzie));&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; jonas.Message = &lt;span style="color: maroon;"&gt;"Actually, I just want your number..."&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; jonas.Talk(suzie);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color: maroon;"&gt;"Customer Jonas says: Actually, I just want your number..."&lt;/span&gt;, suzie.Recieve(jonas));&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; suzie.Message = &lt;span style="color: maroon;"&gt;"Get the hell out of this store!"&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; suzie.Talk(jonas);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color: maroon;"&gt;"Sales Person Suzie says: Get the hell out of this store!"&lt;/span&gt;, jonas.Recieve(suzie));&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;internal&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: teal;"&gt;Customer&lt;/span&gt; : &lt;span style="color: teal;"&gt;Person&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; Customer(&lt;span style="color: blue;"&gt;string&lt;/span&gt; name) : &lt;span style="color: blue;"&gt;base&lt;/span&gt;(name)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; Recieve(&lt;span style="color: teal;"&gt;Person&lt;/span&gt; otherPerson)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color: maroon;"&gt;"Sales Person {0}"&lt;/span&gt;, &lt;span style="color: blue;"&gt;base&lt;/span&gt;.Recieve(otherPerson));&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;internal&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: teal;"&gt;SalesPerson&lt;/span&gt; : &lt;span style="color: teal;"&gt;Person&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; SalesPerson(&lt;span style="color: blue;"&gt;string&lt;/span&gt; name) : &lt;span style="color: blue;"&gt;base&lt;/span&gt;(name)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; Recieve(&lt;span style="color: teal;"&gt;Person&lt;/span&gt; otherPerson)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color: maroon;"&gt;"Customer {0}"&lt;/span&gt;, &lt;span style="color: blue;"&gt;base&lt;/span&gt;.Recieve(otherPerson));&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;internal&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: teal;"&gt;Person&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; name;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; message;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: teal;"&gt;Store&lt;/span&gt; store;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; Person(&lt;span style="color: blue;"&gt;string&lt;/span&gt; name)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;this&lt;/span&gt;.name = name;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; Name&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt; { &lt;span style="color: blue;"&gt;return&lt;/span&gt; name; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; Message&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;get&lt;/span&gt; { &lt;span style="color: blue;"&gt;return&lt;/span&gt; message; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt; { message = &lt;span style="color: blue;"&gt;value&lt;/span&gt;; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: teal;"&gt;Store&lt;/span&gt; Store&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;set&lt;/span&gt; { store = &lt;span style="color: blue;"&gt;value&lt;/span&gt;; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Talk(&lt;span style="color: teal;"&gt;Person&lt;/span&gt; otherPerson)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; store.Talk(otherPerson, &lt;span style="color: blue;"&gt;this&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;virtual&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt; Recieve(&lt;span style="color: teal;"&gt;Person&lt;/span&gt; otherPerson)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color: maroon;"&gt;"{0} says: {1}"&lt;/span&gt;, otherPerson.Name, otherPerson.Message);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;internal&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: teal;"&gt;Store&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: teal;"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;, &lt;span style="color: teal;"&gt;Person&lt;/span&gt;&amp;gt; people;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; Store()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; people = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;, &lt;span style="color: teal;"&gt;Person&lt;/span&gt;&amp;gt;();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Add(&lt;span style="color: teal;"&gt;Person&lt;/span&gt; person)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (!people.ContainsKey(person.Name))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; people.Add(person.Name, person);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; person.Store = &lt;span style="color: blue;"&gt;this&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Talk(&lt;span style="color: teal;"&gt;Person&lt;/span&gt; from, &lt;span style="color: teal;"&gt;Person&lt;/span&gt; to)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (people.ContainsKey(to.Name))&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; to.Recieve(from);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34047625-116105887681851346?l=blog.ezed.ca' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.ezed.ca/feeds/116105887681851346/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34047625&amp;postID=116105887681851346' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/116105887681851346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34047625/posts/default/116105887681851346'/><link rel='alternate' type='text/html' href='http://blog.ezed.ca/2006/10/conversation-while-contemplating.html' title='A Conversation While Contemplating Buying Skis using a Mediator Pattern'/><author><name>Jonas Avellana</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/2735/3746/200/Photo%2038.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34047625.post-116071125950075571</id><published>2006-10-12T21:42:00.000-06:00</published><updated>2006-10-13T02:09:21.410-06:00</updated><title type='text'>Unit of Work Pattern</title><content type='html'>What do you do after watching 12 episodes of The Office seasons 1 &amp; 2? &lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Some people may have smoke up&lt;/li&gt;&lt;br /&gt;&lt;li&gt;have a brew or two... okay fine... get gunned!&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Some people may DJ (I usually do that)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;As for me, this particular night was to post some sample code, some nyahhh and some tests for the &lt;a href="http://www.martinfowler.com/eaaCatalog/unitOfWork.html"&gt;Unit of Work pattern&lt;/a&gt; (UoW). I can't believe there is no sample code out there for this pattern. I'm just under the assumption that a lot of people that know about this pattern are not willing to share the love. So I ended up whipping up the pattern &lt;b&gt;with unit tests!&lt;/b&gt; This may be some uber nyahhh for some... Ah well.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What is Unit of Work?&lt;/b&gt;&lt;br /&gt;From kinda looking at the &lt;a href="http://www.amazon.ca/Patterns-Enterprise-Application-Architecture-Fowler/dp/0321127420/sr=8-1/qid=1160722361/ref=sr_1_1/701-6573272-1637904?ie=UTF8&amp;s=books"&gt;Fowler P of EAA book&lt;/a&gt;, it is more like an item that keeps track of objects (Domain Objects) for any changes whether it is a new object (an insert to the db), changes/modifications to any properties (update), or removing an item (delete). It does all of these changes as one big dump to the db.&lt;br /&gt;UoW seems to be pretty efficient when it comes to database calls. Instead of doing the usual the service layer calls some mapper to do an insert for one item (which is slow, depending on how you have set up your db transactions), UoW keeps track of all the business transaction that affects the db. A programmer does not have to explicitly call any data mappers for any database changes- UoW does it all for ya'll!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Lets see some code!!!&lt;/b&gt;&lt;br /&gt;Before we begin, I will warn all of you reading this, that there are no comments what so ever. I tried to make the Tests (busted some TDD stylez) speak for the pattern it self. If you can't read the test... learn TDD or even Unit Tests foo!&lt;br /&gt;&lt;br /&gt;&lt;h2&gt; The Test &lt;/h2&gt;&lt;br /&gt;Note: I instanciated "ExtendedUnitOfWork" (inherit from UnitOfWork class) in order to override my DatabaseConnection object to use a Mock.&lt;br /&gt;&lt;div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; NUnit.Framework;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; unitofworkspike;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;namespace&lt;/span&gt; UnitOfWorkTest&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; [&lt;span style="color: teal;"&gt;TestFixture&lt;/span&gt;]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: teal;"&gt;UnitOfWorkTest&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: teal;"&gt;MockMapper&lt;/span&gt; mapper;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;span style="color: teal;"&gt;TestFixtureSetUp&lt;/span&gt;]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; TestFixtureSetUp()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mapper = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;MockMapper&lt;/span&gt;();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;MapperFactory&lt;/span&gt;.Instance.AddMapper(&lt;span style="color: blue;"&gt;typeof&lt;/span&gt; (&lt;span style="color: teal;"&gt;SimpleObject&lt;/span&gt;), mapper);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;span style="color: teal;"&gt;TearDown&lt;/span&gt;]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; TearDown()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mapper.Reset();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;span style="color: teal;"&gt;Test&lt;/span&gt;]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; ShouldInsertSimpleObject()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;ExtendedUnitOfWork&lt;/span&gt; work = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;ExtendedUnitOfWork&lt;/span&gt;();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CreateNewSimpleObject(work);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; work.Commit();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.IsTrue(mapper.HasCalledInsert);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.IsFalse(mapper.HasCalledUpdate);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.IsFalse(mapper.HasCalledDelete);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.AreEqual(1, mapper.InsertCount);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.AreEqual(0, mapper.UpdateCount);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.AreEqual(0, mapper.DeleteCount);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;span style="color: teal;"&gt;Test&lt;/span&gt;]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; ShouldInsertMultipleSimpleObjects()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;ExtendedUnitOfWork&lt;/span&gt; work = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;ExtendedUnitOfWork&lt;/span&gt;();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CreateNewSimpleObjects(work, 5);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; work.Commit();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.IsTrue(mapper.HasCalledInsert);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.IsFalse(mapper.HasCalledUpdate);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.IsFalse(mapper.HasCalledDelete);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.AreEqual(5, mapper.InsertCount);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.AreEqual(0, mapper.UpdateCount);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.AreEqual(0, mapper.DeleteCount);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;span style="color: teal;"&gt;Test&lt;/span&gt;]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; ShouldUpdateOneSimpleObjectWithOneInsert()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;ExtendedUnitOfWork&lt;/span&gt; work = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;ExtendedUnitOfWork&lt;/span&gt;();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CreateNewSimpleObject(work);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CreateToEditSimpleObject(work, 1);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; work.Commit();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.IsTrue(mapper.HasCalledInsert);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.IsTrue(mapper.HasCalledUpdate);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.IsFalse(mapper.HasCalledDelete);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.AreEqual(1, mapper.InsertCount);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.AreEqual(1, mapper.UpdateCount);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.AreEqual(0, mapper.DeleteCount);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;span style="color: teal;"&gt;Test&lt;/span&gt;]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; ShouldUpdateMultipleSimpleObjects()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;ExtendedUnitOfWork&lt;/span&gt; work = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;ExtendedUnitOfWork&lt;/span&gt;();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CreateEditSimpleObjects(work, 4);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; work.Commit();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.IsFalse(mapper.HasCalledInsert);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.IsTrue(mapper.HasCalledUpdate);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.IsFalse(mapper.HasCalledDelete);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.AreEqual(0, mapper.InsertCount);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.AreEqual(4, mapper.UpdateCount);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.AreEqual(0, mapper.DeleteCount);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;span style="color: teal;"&gt;Test&lt;/span&gt;]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; ShouldRemoveSimpleObject()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;ExtendedUnitOfWork&lt;/span&gt; work = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;ExtendedUnitOfWork&lt;/span&gt;();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CreateToDeleteSimpleObject(work, 1);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; work.Commit();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.IsFalse(mapper.HasCalledInsert);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.IsFalse(mapper.HasCalledUpdate);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.IsTrue(mapper.HasCalledDelete);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.AreEqual(0, mapper.InsertCount);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.AreEqual(0, mapper.UpdateCount);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.AreEqual(1, mapper.DeleteCount);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;span style="color: teal;"&gt;Test&lt;/span&gt;]&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; ShouldRemoveMultipleSimpleObjects()&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;ExtendedUnitOfWork&lt;/span&gt; work = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;ExtendedUnitOfWork&lt;/span&gt;();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CreateToDeleteSimpleObjects(work, 7);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; work.Commit();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal;"&gt;Assert&lt;/span&gt;.IsFalse(mapper.HasCalledInsert);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&amp;nbsp; &amp;nbs
