<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:media="http://search.yahoo.com/mrss/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
<channel><title>Gut Instinct</title>
<link>http://www.gutgames.com/</link>
<description><![CDATA[Gut Instinct]]></description>
<language>en-us</language>
<copyright>Copyright 2012</copyright>
<webMaster />
<pubDate>D10, 10 Feb 2012 14:21:54</pubDate>
<itunes:explicit>no</itunes:explicit><itunes:subtitle>Gut Instinct</itunes:subtitle><itunes:summary><![CDATA[Gut Instinct]]></itunes:summary><docs>http://blogs.law.harvard.edu/tech/rss</docs>
<ttl>5</ttl>
<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/GutInstinct" /><feedburner:info uri="gutinstinct" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><title>Craigandrsquo;s Utility Library 3.0 Released</title>
<link>http://feedproxy.google.com/~r/GutInstinct/~3/y7uq_y_ZaIw/Craigrsquo3bs-Utility-Library-30-Released.aspx</link>
<author>James Craig</author>
<pubDate>Tue, 20 Dec 2011 21:37:44 GMT</pubDate>
<description>OK, so I should have uploaded this last week but I’ve been a bit lazy (I’m on vacation). That being said, the big news is that Craig’s Utility Library has a new version. However, it’s not 2.3 (which would be the next version sequentially) but 3.0. The reason for the jump is that this version is not exactly compatible with the older version. Much of the code has been reworked completely (much of the static methods are now extension methods, etc). Here is just the short list that they would let me put up on CodePlex:  Fixes     Added fix for length of columns when dealing with nvarchars in SQLServer class.    Added fix for Map objects that were set to cascade where ManyToMany and ManyToOne objects underneath were not cascading properly.    Added Any and All functions to ObjectBaseClass that accept SQL Commands/CommandTypes.    Fixed cascading saves for Mapped objects in ORM.    Added check in StringID and StringReference for -1 (max length), so that the validation actually works on update...    Added fix for ZipFile when calling AddFile (now creates the zip file correctly).    Added check to ORM code to make sure that load commands aren't overwritten with defaults.    Fixed issue with ObjectBaseClass if the instance returned by Any is null.    Fixed bug in DataMapper when using the AutoMap feature.    Fixed small bug in RGBHistogram's Equalize function as well as Equalize function in BitmapExtensions.    Fixed issue that allows unsafe code to be tested/run (seems to be related to updating to 4.0).    Fixed bug in Random class's NextColor function.    Fixed issue with ArgsParser code involving double quotes and reduced code a bit.    Fixed minor issues with RSAEncryption class.    Fixed minor issues/made code simpler for Conversion, Matrix, Set, and Vector3 classes.    Fixed a couple of bugs in vector class (initial size of items not set right, removing first item in list, etc.)    Fixed various issues/improved BinaryTree class   Changes  Most static functions have been moved to various extension methods and a number of functions have been added (too many to list here).   On top of that a number of changes have been made to various classes:     Added ability in ProfilerManager to get data for a specific function and made ProfilerInfo public    Changed the parameters of the Column DataClass (now has a generic default value, uses DbType instead of SqlDbType for the DataType property, etc)    Added ability to query list of users who logged into a machine (WMI code)    Added a ClearMappings function to MicroORM.    Updated SQLHelper's code (removed functions that are no longer used, instead keeping generic versions).    Merged AddParameter and AddOutputParameter into one function (and GetParameter and GetOutputParameter) and changed order of a couple parameters.    Updated ErrorManager code to use extension methods moved from the Web namespace (DumpCache, DumpApplicationState, etc).    Updated WebPageThumbnail code to use some default values to make things simpler.    Made TypeMapping class a bit more fluent to make adding mappings easier.    Simplified Validator code and added a number of functions for new validation rules.    Finished adding IoC code (very simple IoC container).    Rewrote LDAP code (simplified).    Reworked some of the Reflection.Emit classes (mostly to reduce redundant functions, replace wordy code, etc.)    Added GenericStringFormatter class (used by FormatString function in the StringExtensions class)    Moved NaiveBayes class to AI namespace.    Improved ListMapping functionality    Added functions to priority queue for adding items, improved Pop functionality.    Added DateSpan class.    Moved Cisco classes to FileFormats namespace   Also Items Have been removed due to the fact that they were either too difficult to maintain or simply not being used:     Removed Youtube code (will eventually replace this with Google API namespace.    Removed FOAF and APML helpers as neither format seem to be used...    Removed Speech namespace (wasn't really maintaining it)...    Removed Pair and Triple classes (not needed with addition of System.Tuple)   This doesn’t include the new list of extension methods:  Utilities.DataTypes.ExtensionMethods     Array extensions             Clear         Combine            DateTime extensions             DaysInMonth         DaysLeftInMonth         DaysLeftInYear         FirstDayOfMonth         FirstDayOfWeek         FromUnixTime (actually extension for int and long values)         IsInFuture         IsInPast         IsWeekDay         IsWeekEnd         LastDayOfMonth         LastDayOfWeek         ToUnix            Generic object extensions             If         NotIf         Return         Chain         Do         Execute            ICollection extensions             AddAndReturn         AddRange         AddIf         AddIfUnique         Remove         RemoveRange            IComparable extensions             Between            IDictionary extensions             Sort         SortByValue            IEnumerable extensions             Exists         For         ForEach         ForParallel         ForEachParallel         IsNullOrEmpty         RemoveDefaults         ToArray         ToString         TrueForAll         TryAll         TryAllParallel            MatchCollection extensions             Where            string extensions             Encode         FromBase64         Left         Right         ToBase64         ToByteArray         ToFirstCharacterUpperCase         ToSentenceCapitalize         ToTitleCase         NumberTimesOccurs         Reverse         FilterOutText         KeepFilterText         AlphaNumericOnly         AlphaCharactersOnly         NumericOnly         IsUnicode         FormatString         RegexFormat            Various type conversion/type checking extensions             FormatToString         IsNotDefault         IsDefault         IsNotNull         IsNull         IsNotNullOrDBNull         IsNullOrDBNull         NullCheck         ThrowIfDefault         ThrowIfNullOrEmpty         ThrowIfNullOrDBNull         ToSQLDbType         ToDbType         ToType         TryTo            Various value type extensions             ToBool (int)         ToInt (bool)         ToBase64String (byte array)         ToEncodedString (byte array)         IsUnicode (byte array)          Utilities.IO.ExtensionMethods     Serialization extensions             ToBinary         ToJSON         ToSOAP         ToXML         ToObject         JSONToObject         SOAPToObject         XMLToObject            Uri extensions             Read         ReadBinary            Math extensions             Betweek         Clamp         Factorial         Max         Median         Min         Mode         Pow         Round         StandardDeviation         Sqrt         Variance         Permute          Utilities.SQL.ExtensionMethods     DbCommand extensions             AddParameter         BeginTransaction         ClearParameters         Close         Commit         ExecuteDataSet         ExecuteScalar         GetOutputParameter         Open         Rollback            DbDataReader extensions             GetParameter          Utilities.Compression.ExtensionMethods     Compress (both byte arrays and strings)     Decompress (both byte arrays and strings)  Utilities.Encryption.ExtensionMethods     Hash (Now handles all hash algorithms in one function for both byte arrays and strings)     Encrypt (Handles any symmetric encryption algorithm inside .Net)     Decrypt (Handles any symmetric encryption algorithm inside .Net)  Utilities.IO.ExtensionMethods     DirectoryInfo extensions             CopyTo         DeleteAll         DeleteFiles         DeleteFilesNewerThan         DeleteFilesOlderThan         Size         SetAttribute            FileInfo extensions             Append         CompareTo         Read         ReadBinary         Save         SaveAsync         SetAttributes            String extensions             RemoveIllegalDirectoryNameCharacters         RemoveIllegalFileNameCharacters          Utilities.Web.ExtensionMethods     Web related extensions             AbsoluteRoot         AddScriptFile         ContainsHTML         HTTPCompress         IsEncodingAccepted         RelativeRoot         RemoveURLIllegalCharacters         SetEncoding         StripHTML            IPAddress extensions             GetHostName            Minification             Combine (can be used for HTML,JavaScript, or CSS)         Minify (can be used for HTML, JavaScript, or CSS)            HttpRequest extensions             IsMobile          Utilities.Image.ExtensionMethods     All Bitmap functions were moved             Added ToBase64 extension method         Added DrawRoundedRectangle extension            Screen extensions             TakeScreenShot          Utilities.Error.ExtensionMethods     Various error related extensions             DumpApplicationState         DumpCache         DumpCookies         DumpRequestVariable         DumpResponseVariable         DumpServerVars         DumpSession          Utilities.Reflection.ExtensionMethods     Various reflection related extensions             CallMethod         CreateInstance         DumpProperties         GetAttribute         GetAttributes         GetName         GetObjects         GetProperty         GetPropertyGetter         GetPropertyName         GetPropertyType         GetPropertySetter         GetTypes         IsIEnumerable         IsOfType         Load         LoadAssemblies         MarkedWith         MakeShallowCopy         SetProperty         ToLongVersionString         ToShortVersionString          Utilities.Environment.ExtensionMethods     Process related extensions             KillProcessAsync         GetInformation           I know that’s a long list, but this isn’t everything that has been updated. On top of all of that, there is now a set of tests that is available with the code. And I’m working on getting a nightly build going. With the nightly build, I’m going to automatically publish to NuGet. So if you’re using NuGet to get it, you’re going to be getting the nightly build. Anyway, that’s it for this post. So download the code, leave comments, and happy coding.
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/9KuZ9TWPpfG8JrX7EjJcEByt93g/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9KuZ9TWPpfG8JrX7EjJcEByt93g/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/9KuZ9TWPpfG8JrX7EjJcEByt93g/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9KuZ9TWPpfG8JrX7EjJcEByt93g/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GutInstinct/~4/y7uq_y_ZaIw" height="1" width="1"/&gt;</description>
<itunes:subtitle>Craigandrsquo;s Utility Library 3.0 Released</itunes:subtitle><itunes:summary><![CDATA[OK, so I should have uploaded this last week but I’ve been a bit lazy (I’m on vacation). That being said, the big news is that Craig’s Utility Library has a new version. However, it’s not 2.3 (which would be the next version sequentially) but 3.0. The reason for the jump is that this version is not exactly compatible with the older version. Much of the code has been reworked completely (much of the static methods are now extension methods, etc). Here is just the short list that they would let me put up on CodePlex:  Fixes     Added fix for length of columns when dealing with nvarchars in SQLServer class.    Added fix for Map objects that were set to cascade where ManyToMany and ManyToOne objects underneath were not cascading properly.    Added Any and All functions to ObjectBaseClass that accept SQL Commands/CommandTypes.    Fixed cascading saves for Mapped objects in ORM.    Added check in StringID and StringReference for -1 (max length), so that the validation actually works on update...    Added fix for ZipFile when calling AddFile (now creates the zip file correctly).    Added check to ORM code to make sure that load commands aren't overwritten with defaults.    Fixed issue with ObjectBaseClass if the instance returned by Any is null.    Fixed bug in DataMapper when using the AutoMap feature.    Fixed small bug in RGBHistogram's Equalize function as well as Equalize function in BitmapExtensions.    Fixed issue that allows unsafe code to be tested/run (seems to be related to updating to 4.0).    Fixed bug in Random class's NextColor function.    Fixed issue with ArgsParser code involving double quotes and reduced code a bit.    Fixed minor issues with RSAEncryption class.    Fixed minor issues/made code simpler for Conversion, Matrix, Set, and Vector3 classes.    Fixed a couple of bugs in vector class (initial size of items not set right, removing first item in list, etc.)    Fixed various issues/improved BinaryTree class   Changes  Most static functions have been moved to various extension methods and a number of functions have been added (too many to list here).   On top of that a number of changes have been made to various classes:     Added ability in ProfilerManager to get data for a specific function and made ProfilerInfo public    Changed the parameters of the Column DataClass (now has a generic default value, uses DbType instead of SqlDbType for the DataType property, etc)    Added ability to query list of users who logged into a machine (WMI code)    Added a ClearMappings function to MicroORM.    Updated SQLHelper's code (removed functions that are no longer used, instead keeping generic versions).    Merged AddParameter and AddOutputParameter into one function (and GetParameter and GetOutputParameter) and changed order of a couple parameters.    Updated ErrorManager code to use extension methods moved from the Web namespace (DumpCache, DumpApplicationState, etc).    Updated WebPageThumbnail code to use some default values to make things simpler.    Made TypeMapping class a bit more fluent to make adding mappings easier.    Simplified Validator code and added a number of functions for new validation rules.    Finished adding IoC code (very simple IoC container).    Rewrote LDAP code (simplified).    Reworked some of the Reflection.Emit classes (mostly to reduce redundant functions, replace wordy code, etc.)    Added GenericStringFormatter class (used by FormatString function in the StringExtensions class)    Moved NaiveBayes class to AI namespace.    Improved ListMapping functionality    Added functions to priority queue for adding items, improved Pop functionality.    Added DateSpan class.    Moved Cisco classes to FileFormats namespace   Also Items Have been removed due to the fact that they were either too difficult to maintain or simply not being used:     Removed Youtube code (will eventually replace this with Google API namespace.    Removed FOAF and APML helpers as neither format seem to be used...    Removed Speech namespace (wasn't really maintaining it)...    Removed Pair and Triple classes (not needed with addition of System.Tuple)   This doesn’t include the new list of extension methods:  Utilities.DataTypes.ExtensionMethods     Array extensions             Clear         Combine            DateTime extensions             DaysInMonth         DaysLeftInMonth         DaysLeftInYear         FirstDayOfMonth         FirstDayOfWeek         FromUnixTime (actually extension for int and long values)         IsInFuture         IsInPast         IsWeekDay         IsWeekEnd         LastDayOfMonth         LastDayOfWeek         ToUnix            Generic object extensions             If         NotIf         Return         Chain         Do         Execute            ICollection extensions             AddAndReturn         AddRange         AddIf         AddIfUnique         Remove         RemoveRange            IComparable extensions             Between            IDictionary extensions             Sort         SortByValue            IEnumerable extensions             Exists         For         ForEach         ForParallel         ForEachParallel         IsNullOrEmpty         RemoveDefaults         ToArray         ToString         TrueForAll         TryAll         TryAllParallel            MatchCollection extensions             Where            string extensions             Encode         FromBase64         Left         Right         ToBase64         ToByteArray         ToFirstCharacterUpperCase         ToSentenceCapitalize         ToTitleCase         NumberTimesOccurs         Reverse         FilterOutText         KeepFilterText         AlphaNumericOnly         AlphaCharactersOnly         NumericOnly         IsUnicode         FormatString         RegexFormat            Various type conversion/type checking extensions             FormatToString         IsNotDefault         IsDefault         IsNotNull         IsNull         IsNotNullOrDBNull         IsNullOrDBNull         NullCheck         ThrowIfDefault         ThrowIfNullOrEmpty         ThrowIfNullOrDBNull         ToSQLDbType         ToDbType         ToType         TryTo            Various value type extensions             ToBool (int)         ToInt (bool)         ToBase64String (byte array)         ToEncodedString (byte array)         IsUnicode (byte array)          Utilities.IO.ExtensionMethods     Serialization extensions             ToBinary         ToJSON         ToSOAP         ToXML         ToObject         JSONToObject         SOAPToObject         XMLToObject            Uri extensions             Read         ReadBinary            Math extensions             Betweek         Clamp         Factorial         Max         Median         Min         Mode         Pow         Round         StandardDeviation         Sqrt         Variance         Permute          Utilities.SQL.ExtensionMethods     DbCommand extensions             AddParameter         BeginTransaction         ClearParameters         Close         Commit         ExecuteDataSet         ExecuteScalar         GetOutputParameter         Open         Rollback            DbDataReader extensions             GetParameter          Utilities.Compression.ExtensionMethods     Compress (both byte arrays and strings)     Decompress (both byte arrays and strings)  Utilities.Encryption.ExtensionMethods     Hash (Now handles all hash algorithms in one function for both byte arrays and strings)     Encrypt (Handles any symmetric encryption algorithm inside .Net)     Decrypt (Handles any symmetric encryption algorithm inside .Net)  Utilities.IO.ExtensionMethods     DirectoryInfo extensions             CopyTo         DeleteAll         DeleteFiles         DeleteFilesNewerThan         DeleteFilesOlderThan         Size         SetAttribute            FileInfo extensions             Append         CompareTo         Read         ReadBinary         Save         SaveAsync         SetAttributes            String extensions             RemoveIllegalDirectoryNameCharacters         RemoveIllegalFileNameCharacters          Utilities.Web.ExtensionMethods     Web related extensions             AbsoluteRoot         AddScriptFile         ContainsHTML         HTTPCompress         IsEncodingAccepted         RelativeRoot         RemoveURLIllegalCharacters         SetEncoding         StripHTML            IPAddress extensions             GetHostName            Minification             Combine (can be used for HTML,JavaScript, or CSS)         Minify (can be used for HTML, JavaScript, or CSS)            HttpRequest extensions             IsMobile          Utilities.Image.ExtensionMethods     All Bitmap functions were moved             Added ToBase64 extension method         Added DrawRoundedRectangle extension            Screen extensions             TakeScreenShot          Utilities.Error.ExtensionMethods     Various error related extensions             DumpApplicationState         DumpCache         DumpCookies         DumpRequestVariable         DumpResponseVariable         DumpServerVars         DumpSession          Utilities.Reflection.ExtensionMethods     Various reflection related extensions             CallMethod         CreateInstance         DumpProperties         GetAttribute         GetAttributes         GetName         GetObjects         GetProperty         GetPropertyGetter         GetPropertyName         GetPropertyType         GetPropertySetter         GetTypes         IsIEnumerable         IsOfType         Load         LoadAssemblies         MarkedWith         MakeShallowCopy         SetProperty         ToLongVersionString         ToShortVersionString          Utilities.Environment.ExtensionMethods     Process related extensions             KillProcessAsync         GetInformation           I know that’s a long list, but this isn’t everything that has been updated. On top of all of that, there is now a set of tests that is available with the code. And I’m working on getting a nightly build going. With the nightly build, I’m going to automatically publish to NuGet. So if you’re using NuGet to get it, you’re going to be getting the nightly build. Anyway, that’s it for this post. So download the code, leave comments, and happy coding.]]></itunes:summary><feedburner:origLink>http://www.gutgames.com/post/Craigrsquo3bs-Utility-Library-30-Released.aspx</feedburner:origLink></item>
<item><title>Building an DI Container</title>
<link>http://feedproxy.google.com/~r/GutInstinct/~3/UXWZXW9YdUY/Building-an-DI-Container.aspx</link>
<author>James Craig</author>
<pubDate>Sun, 13 Nov 2011 16:51:57 GMT</pubDate>
<description>It has been a while since I’ve written anything. To say the least things are hectic. Most of which, I can’t really talk about at this point (let’s just say that I’m working on a product for a sector of the business world. I think I can say that much, but not much more until it gets closer to release). Anyway, today I’m finally getting around to talking about one more item that I’ve added to my utility library. Specifically I’ve added a basic DI container (dependency injection).  Note that this next section is an over simplification and I’m tired so if it’s wrong, feel free to say so. Anyway, Dependency injection is a specific form of inversion of control. Inversion of control is when you invert the flow of a system. Instead of one central bit of code deciding how everything is run, it’s up to the individual pieces to know how to do the actual work. For instance, if I call an object factory to create a database connection for me, I don’t care how it’s created or how the connection is doing anything as long as it gets done. And dependency injection is just a specific form of IoC. Instead of hard coding our dependencies in each individual class, we allow someone to pass in the component that they want to use. You can actually do this manually (using a factory pattern, etc.) and still have a form of dependency injection. However you can also automate this process using one of the many dependency injectors out there (I personally like Ninject and based the code below on it). But where’s the fun in using someone else’s when all we have to do is spend an afternoon and build our own.             1: /*&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       2: Copyright (c) 2011 andlt;a href=andquot;http://www.gutgames.comandquot;andgt;James Craigandlt;/aandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       3: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       4: Permission is hereby granted, free of charge, to any person obtaining a copy&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       5: of this software and associated documentation files (the andquot;Softwareandquot;), to deal&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       6: in the Software without restriction, including without limitation the rights&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       7: to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       8: copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       9: furnished to do so, subject to the following conditions:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      10: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      11: The above copyright notice and this permission notice shall be included in&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      12: all copies or substantial portions of the Software.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      13: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      14: THE SOFTWARE IS PROVIDED andquot;AS ISandquot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      15: IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      16: FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      17: AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      18: LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      19: OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      20: THE SOFTWARE.*/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      21: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      22: #region Usings&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      23: using System;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      24: using System.Collections.Generic;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      25: using System.Linq;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      26: using System.Text;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      27: using Utilities.IoC.Providers;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      28: using Utilities.IoC.Mappings;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      29: using Utilities.IoC.Mappings.Interfaces;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      30: using System.Reflection;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      31: using System.IO;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      32: using Utilities.IO.ExtensionMethods;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      33: using Utilities.Reflection.ExtensionMethods;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      34: using Utilities.DataTypes.ExtensionMethods;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      35: #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      36: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      37: namespace Utilities.IoC&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      38: {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      39:     /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      40:     /// Manager class&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      41:     /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      42:     public class Manager&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      43:     {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      44:         #region Constructor&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      45: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      46:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      47:         /// Constructor&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      48:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      49:         public Manager()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      50:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      51:             if (ProviderManager.IsNull())&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      52:                 ProviderManager = new ProviderManager();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      53:             if (MappingManager.IsNull())&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      54:                 MappingManager = new MappingManager(ProviderManager);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      55:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      56: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      57:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      58: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      59:         #region Functions&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      60: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      61:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      62:         /// Loads all mapping modules found within the assembly&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      63:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      64:         /// andlt;param name=andquot;ModuleAssemblyandquot;andgt;Module assemblyandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      65:         public void Setup(Assembly ModuleAssembly)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      66:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      67:             ProviderManager.Setup(ModuleAssembly);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      68:             MappingManager.Setup(ModuleAssembly);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      69:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      70: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      71:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      72:         /// Loads all mapping modules found within the assemblies&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      73:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      74:         /// andlt;param name=andquot;ModuleAssembliesandquot;andgt;Module assembliesandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      75:         public void Setup(IEnumerableandlt;Assemblyandgt; ModuleAssemblies)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      76:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      77:             ModuleAssemblies.ForEach(x =andgt; Setup(x));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      78:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      79: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      80:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      81:         /// Loads all mapping modules found within a specific directory&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      82:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      83:         /// andlt;param name=andquot;Directoryandquot;andgt;Directory to scan for modulesandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      84:         /// andlt;param name=andquot;RecursiveScanandquot;andgt;Determines if sub directories should be scannedandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      85:         public void Setup(string Directory, bool ScanSubDirectories = true)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      86:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      87:             Setup(new DirectoryInfo(Directory).LoadAssemblies(ScanSubDirectories));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      88:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      89: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      90:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      91:         /// Creates an object of the specified type&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      92:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      93:         /// andlt;typeparam name=andquot;ServiceTypeandquot;andgt;Service typeandlt;/typeparamandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      94:         /// andlt;returnsandgt;An object of the specified typeandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      95:         public ServiceType Getandlt;ServiceTypeandgt;()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      96:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      97:             return (ServiceType)Get(typeof(ServiceType));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      98:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      99: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     100:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     101:         /// Creates an object of the specified type associated with the attribute type&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     102:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     103:         /// andlt;typeparam name=andquot;ServiceTypeandquot;andgt;Service typeandlt;/typeparamandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     104:         /// andlt;typeparam name=andquot;AttributeTypeandquot;andgt;Attribute typeandlt;/typeparamandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     105:         /// andlt;returnsandgt;An object of the specified typeandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     106:         public ServiceType Getandlt;ServiceType, AttributeTypeandgt;()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     107:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     108:             return (ServiceType)Get(typeof(ServiceType), typeof(AttributeType));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     109:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     110: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     111:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     112:         /// Creates an object of the specified type&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     113:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     114:         /// andlt;param name=andquot;ServiceTypeandquot;andgt;Service typeandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     115:         /// andlt;returnsandgt;An object of the specified typeandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     116:         public object Get(Type ServiceType)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     117:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     118:             IMapping Mapping = MappingManager.GetMapping(ServiceType);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     119:             if (Mapping.IsNull())&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     120:                 throw new ArgumentException(andquot;ServiceType not found in mappingsandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     121:             return Mapping.Implementation.Create();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     122:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     123: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     124:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     125:         /// Creates an object of the specified type associated with the attribute type&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     126:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     127:         /// andlt;param name=andquot;ServiceTypeandquot;andgt;Service typeandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     128:         /// andlt;param name=andquot;AttributeTypeandquot;andgt;Attribute typeandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     129:         /// andlt;returnsandgt;An object of the specified typeandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     130:         public object Get(Type ServiceType, Type AttributeType)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     131:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     132:             IMapping Mapping = MappingManager.GetMapping(ServiceType, AttributeType);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     133:             if (Mapping.IsNull())&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     134:                 throw new ArgumentException(andquot;ServiceType not found in mappingsandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     135:             return Mapping.Implementation.Create();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     136:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     137: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     138:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     139: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     140:         #region Properties&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     141: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     142:         protected static ProviderManager ProviderManager { get; set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     143:         protected static MappingManager MappingManager { get; set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     144: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     145:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     146:     }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     147: }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This is our main point of code that we are going to use to get our objects. We set it up, call Get, and it will return to us our object (with the appropriate items injected). One thing that you’ll notice is that there are a couple nonstandard C# calls in there (specifically the ForEach on the IEnumerable, IsNull, etc). These are all functions from the new utility library that I’m working on. I’ve been adding quite a bit to it, tons of extension methods, etc. So go and check out the repository as all of my code on here uses it (or at least the code on here uses a version of it). Plus any updates to the code can be found there also as I tend to forget the pages on this site. Anyway another thing you may notice is there isn’t much code here. Most of the actual work is going to be done in the ProviderManager and MappingManager.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;       1: /*&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       2: Copyright (c) 2011 andlt;a href=andquot;http://www.gutgames.comandquot;andgt;James Craigandlt;/aandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       3: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       4: Permission is hereby granted, free of charge, to any person obtaining a copy&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       5: of this software and associated documentation files (the andquot;Softwareandquot;), to deal&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       6: in the Software without restriction, including without limitation the rights&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       7: to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       8: copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       9: furnished to do so, subject to the following conditions:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      10: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      11: The above copyright notice and this permission notice shall be included in&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      12: all copies or substantial portions of the Software.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      13: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      14: THE SOFTWARE IS PROVIDED andquot;AS ISandquot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      15: IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      16: FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      17: AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      18: LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      19: OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      20: THE SOFTWARE.*/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      21: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      22: #region Usings&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      23: using System;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      24: using System.Collections.Generic;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      25: using System.Linq;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      26: using System.Text;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      27: using Utilities.IoC.Providers.Interfaces;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      28: using Utilities.IoC.Providers.Scope;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      29: using Utilities.Reflection;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      30: using Utilities.Reflection.ExtensionMethods;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      31: using Utilities.DataTypes.ExtensionMethods;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      32: using System.Reflection;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      33: #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      34: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      35: namespace Utilities.IoC.Providers&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      36: {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      37:     /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      38:     /// Provider manager&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      39:     /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      40:     public class ProviderManager&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      41:     {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      42:         #region Constructor&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      43: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      44:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      45:         /// Constructor&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      46:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      47:         public ProviderManager()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      48:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      49:             Providers = new Listandlt;IProviderandgt;();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      50:             Providers.AddRange(typeof(ProviderManager).Assembly.GetObjectsandlt;IProviderandgt;());&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      51:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      52: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      53:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      54: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      55:         #region Functions&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      56: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      57:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      58:         /// Sets up all providers found within the assembly specified&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      59:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      60:         /// andlt;param name=andquot;Assemblyandquot;andgt;Assembly to scanandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      61:         public void Setup(Assembly Assembly)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      62:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      63:             Providers.AddRange(Assembly.GetObjectsandlt;IProviderandgt;());&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      64:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      65: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      66:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      67:         /// Gets the specified provider based on the scope specified&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      68:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      69:         /// andlt;param name=andquot;Scopeandquot;andgt;Scopeandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      70:         /// andlt;returnsandgt;The specified providerandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      71:         public IProvider GetProvider(BaseScope Scope)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      72:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      73:             return Providers.FirstOrDefault(x =andgt; x.ProviderScope.Equals(Scope));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      74:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      75: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      76:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      77: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      78:         #region Properties&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      79: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      80:         protected virtual Listandlt;IProviderandgt; Providers { get; set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      81: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      82:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      83:     }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      84: }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The ProviderManager above holds a list of providers. These providers determine how to handle an implementation when you provide the system with one. The implementations actually determine how something is created. For instance, the code base only has one provider at present called Standard.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;       1: /*&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       2: Copyright (c) 2011 andlt;a href=andquot;http://www.gutgames.comandquot;andgt;James Craigandlt;/aandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       3: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       4: Permission is hereby granted, free of charge, to any person obtaining a copy&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       5: of this software and associated documentation files (the andquot;Softwareandquot;), to deal&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       6: in the Software without restriction, including without limitation the rights&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       7: to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       8: copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       9: furnished to do so, subject to the following conditions:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      10: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      11: The above copyright notice and this permission notice shall be included in&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      12: all copies or substantial portions of the Software.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      13: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      14: THE SOFTWARE IS PROVIDED andquot;AS ISandquot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      15: IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      16: FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      17: AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      18: LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      19: OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      20: THE SOFTWARE.*/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      21: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      22: #region Usings&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      23: using System;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      24: using System.Collections.Generic;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      25: using System.Linq;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      26: using System.Text;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      27: using Utilities.IoC.Providers.Scope;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      28: using Utilities.IoC.Providers.Interfaces;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      29: using Utilities.IoC.Mappings;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      30: using Utilities.IoC.Providers.Implementations;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      31: #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      32: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      33: namespace Utilities.IoC.Providers.DefaultProviders&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      34: {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      35:     /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      36:     /// Standard provider&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      37:     /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      38:     public class Standard : IProvider&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      39:     {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      40:         public IImplementation CreateImplementation(Type ImplementationType, MappingManager MappingManager)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      41:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      42:             return new Implementations.Standard(ImplementationType, MappingManager);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      43:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      44: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      45: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      46:         public BaseScope ProviderScope&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      47:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      48:             get { return new StandardScope(); }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      49:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      50: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      51:         public IImplementation CreateImplementation(IImplementation Implementation, MappingManager MappingManager)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      52:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      53:             return CreateImplementation(Implementation.ReturnType, MappingManager);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      54:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      55: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      56:         public IImplementation CreateImplementationandlt;ImplementationTypeandgt;(Funcandlt;ImplementationTypeandgt; Implementation)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      57:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      58:             return new Delegateandlt;ImplementationTypeandgt;(Implementation);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      59:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      60:     }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      61: }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This provider just creates a new implementation object (either a Delegate or Standard implementation depending) each time it’s fed anything. However we could have a provider called Singleton or something and have it return its own implementation types. We determine which provider to use in the ProviderManager based on something called Scopes:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;       1: /*&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       2: Copyright (c) 2011 andlt;a href=andquot;http://www.gutgames.comandquot;andgt;James Craigandlt;/aandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       3: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       4: Permission is hereby granted, free of charge, to any person obtaining a copy&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       5: of this software and associated documentation files (the andquot;Softwareandquot;), to deal&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       6: in the Software without restriction, including without limitation the rights&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       7: to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       8: copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       9: furnished to do so, subject to the following conditions:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      10: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      11: The above copyright notice and this permission notice shall be included in&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      12: all copies or substantial portions of the Software.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      13: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      14: THE SOFTWARE IS PROVIDED andquot;AS ISandquot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      15: IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      16: FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      17: AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      18: LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      19: OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      20: THE SOFTWARE.*/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      21: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      22: #region Usings&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      23: using System;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      24: using System.Collections.Generic;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      25: using System.Linq;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      26: using System.Text;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      27: #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      28: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      29: namespace Utilities.IoC.Providers.Scope&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      30: {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      31:     /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      32:     /// Standard scope&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      33:     /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      34:     public class StandardScope : BaseScope&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      35:     {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      36:         #region Constructor&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      37: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      38:         public StandardScope()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      39:             : base()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      40:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      41:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      42: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      43:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      44: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      45:         #region Properties&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      46: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      47:         public override string Name { get { return andquot;Standardandquot;; } }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      48: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      49:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      50:     }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      51: }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As you can see, it’s just a holder of info. So for our Singleton provider example, we would need to create a Singleton scope and have it return that value so we know which to use. Anyway, the next bit is the actual implementations:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;       1: /*&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       2: Copyright (c) 2011 andlt;a href=andquot;http://www.gutgames.comandquot;andgt;James Craigandlt;/aandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       3: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       4: Permission is hereby granted, free of charge, to any person obtaining a copy&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       5: of this software and associated documentation files (the andquot;Softwareandquot;), to deal&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       6: in the Software without restriction, including without limitation the rights&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       7: to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       8: copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       9: furnished to do so, subject to the following conditions:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      10: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      11: The above copyright notice and this permission notice shall be included in&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      12: all copies or substantial portions of the Software.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      13: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      14: THE SOFTWARE IS PROVIDED andquot;AS ISandquot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      15: IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      16: FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      17: AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      18: LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      19: OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      20: THE SOFTWARE.*/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      21: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      22: #region Usings&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      23: using System;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      24: using System.Collections.Generic;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      25: using System.Linq;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      26: using System.Text;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      27: using Utilities.IoC.Mappings;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      28: using Utilities.IoC.Mappings.Interfaces;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      29: using System.Reflection;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      30: using Utilities.IoC.Mappings.Attributes;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      31: using Utilities.IoC.Providers.BaseClasses;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      32: using Utilities.DataTypes.ExtensionMethods;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      33: using Utilities.Reflection.ExtensionMethods;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      34: #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      35: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      36: namespace Utilities.IoC.Providers.Implementations&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      37: {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      38:     /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      39:     /// Standard implementation class&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      40:     /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      41:     public class Standard : BaseImplementation&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      42:     {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      43:         #region Constructor&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      44: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      45:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      46:         /// Constructor&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      47:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      48:         /// andlt;param name=andquot;ImplementationTypeandquot;andgt;Implementation typeandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      49:         /// andlt;param name=andquot;MappingManagerandquot;andgt;Mapping managerandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      50:         public Standard(Type ImplementationType, MappingManager MappingManager)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      51:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      52:             this.ReturnType = ImplementationType;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      53:             this.MappingManager = MappingManager;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      54:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      55: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      56:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      57: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      58:         #region Functions&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      59: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      60:         #region Create&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      61: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      62:         public override object Create()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      63:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      64:             ConstructorInfo Constructor = Utils.ConstructorList.ChooseConstructor(ReturnType, MappingManager);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      65:             object Instance = CreateInstance(Constructor);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      66:             SetupProperties(Instance);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      67:             SetupMethods(Instance);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      68:             return Instance;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      69:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      70: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      71:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      72: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      73:         #region SetupMethods&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      74: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      75:         private void SetupMethods(object Instance)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      76:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      77:             if (Instance.IsNull())&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      78:                 return;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      79:             foreach (MethodInfo Method in Instance.GetType().GetMethods().Where(x =andgt; IsInjectable(x)))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      80:                 Method.Invoke(Instance, Method.GetParameters().ForEach(x =andgt; CreateInstance(x)).ToArray());&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      81:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      82: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      83:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      84: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      85:         #region SetupProperties&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      86: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      87:         private void SetupProperties(object Instance)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      88:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      89:             if (Instance.IsNull())&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      90:                 return;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      91:             Instance.GetType()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      92:                 .GetProperties()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      93:                 .Where(x =andgt; IsInjectable(x))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      94:                 .ForEachandlt;PropertyInfoandgt;(x =andgt; Instance.SetProperty(x, CreateInstance(x)));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      95:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      96: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      97:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      98: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      99:         #region IsInjectable&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     100: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     101:         private bool IsInjectable(MethodInfo Method)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     102:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     103:             return IsInjectable(Method.GetCustomAttributes(false));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     104:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     105: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     106:         private bool IsInjectable(PropertyInfo Property)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     107:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     108:             return IsInjectable(Property.GetCustomAttributes(false));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     109:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     110: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     111:         private bool IsInjectable(object[] Attributes)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     112:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     113:             return Attributes.OfTypeandlt;Injectandgt;().Count() andgt; 0;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     114:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     115: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     116:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     117: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     118:         #region CreateInstance&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     119: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     120:         private object CreateInstance(ConstructorInfo Constructor)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     121:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     122:             if (Constructor.IsNull() || MappingManager.IsNull())&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     123:                 return null;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     124:             Listandlt;objectandgt; ParameterValues = new Listandlt;objectandgt;();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     125:             Constructor.GetParameters().ForEachandlt;ParameterInfoandgt;(x =andgt; ParameterValues.Add(CreateInstance(x)));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     126:             return Constructor.Invoke(ParameterValues.ToArray());&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     127:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     128: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     129:         private object CreateInstance(ParameterInfo Parameter)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     130:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     131:             return CreateInstance(Parameter.GetCustomAttributes(false), Parameter.ParameterType);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     132:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     133: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     134:         private object CreateInstance(PropertyInfo Property)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     135:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     136:             return CreateInstance(Property.GetCustomAttributes(false), Property.PropertyType);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     137:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     138: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     139:         private object CreateInstance(object[] Attributes, Type Type)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     140:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     141:             if (Attributes.Length andgt; 0)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     142:             {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     143:                 foreach (Attribute Attribute in Attributes)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     144:                 {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     145:                     object TempObject = GetObject(Type, Attribute.GetType());&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     146:                     if (!TempObject.IsNull())&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     147:                         return TempObject;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     148:                 }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     149:             }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     150:             return GetObject(Type);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     151:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     152: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     153:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     154: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     155:         #region GetObject&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     156: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     157:         private object GetObject(Type Type)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     158:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     159:             IMapping Mapping = MappingManager.GetMapping(Type);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     160:             return Mapping.IsNull() ? null : Mapping.Implementation.Create();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     161:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     162: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     163:         private object GetObject(Type Type, Type AttributeType)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     164:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     165:             IMapping Mapping = MappingManager.GetMapping(Type, AttributeType);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     166:             return Mapping.IsNull() ? null : Mapping.Implementation.Create();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     167:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     168: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     169:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     170: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     171:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     172: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     173:         #region Properties&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     174: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     175:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     176:         /// Mapping manager&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     177:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     178:         protected virtual MappingManager MappingManager { get; set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     179: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     180:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     181:     }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     182: }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;       1: /*&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       2: Copyright (c) 2011 andlt;a href=andquot;http://www.gutgames.comandquot;andgt;James Craigandlt;/aandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       3: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       4: Permission is hereby granted, free of charge, to any person obtaining a copy&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       5: of this software and associated documentation files (the andquot;Softwareandquot;), to deal&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       6: in the Software without restriction, including without limitation the rights&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       7: to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       8: copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       9: furnished to do so, subject to the following conditions:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      10: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      11: The above copyright notice and this permission notice shall be included in&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      12: all copies or substantial portions of the Software.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      13: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      14: THE SOFTWARE IS PROVIDED andquot;AS ISandquot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      15: IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      16: FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      17: AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      18: LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      19: OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      20: THE SOFTWARE.*/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      21: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      22: #region Usings&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      23: using System;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      24: using System.Collections.Generic;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      25: using System.Linq;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      26: using System.Text;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      27: using Utilities.IoC.Providers.BaseClasses;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      28: #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      29: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      30: namespace Utilities.IoC.Providers.Implementations&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      31: {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      32:     /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      33:     /// Delegate implementation&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      34:     /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      35:     /// andlt;typeparam name=andquot;Tandquot;andgt;Return type of the delegateandlt;/typeparamandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      36:     public class Delegateandlt;Tandgt; : BaseImplementation&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      37:     {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      38:         #region Constructor&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      39: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      40:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      41:         /// Constructor&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      42:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      43:         /// andlt;param name=andquot;Implementationandquot;andgt;Implementation delegateandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      44:         public Delegate(Funcandlt;Tandgt; Implementation)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      45:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      46:             this.Implementation = Implementation;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      47:             ReturnType = typeof(T);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      48:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      49: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      50:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      51: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      52:         #region Functions&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      53: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      54:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      55:         /// Creates an object based on a delegate&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      56:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      57:         /// andlt;returnsandgt;An objectandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      58:         public override object Create()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      59:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      60:             return Implementation();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      61:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      62: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      63:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      64: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      65:         #region Properties&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      66: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      67:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      68:         /// Delegate used to create objects&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      69:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      70:         protected virtual Funcandlt;Tandgt; Implementation { get; set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      71: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      72:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      73:     }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      74: }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You’ll notice that the Delegate implementation is a bit simpler. In this case you provide a Func and we just assume you know how you want an item created so we just return it. The standard implementation though is a bit more complicated.&lt;br /&gt;&lt;br /&gt;When we call the standard implementation’s Create function, it calls this little utility to determine which constructor to use:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;       1: /*&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       2: Copyright (c) 2011 andlt;a href=andquot;http://www.gutgames.comandquot;andgt;James Craigandlt;/aandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       3: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       4: Permission is hereby granted, free of charge, to any person obtaining a copy&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       5: of this software and associated documentation files (the andquot;Softwareandquot;), to deal&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       6: in the Software without restriction, including without limitation the rights&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       7: to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       8: copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       9: furnished to do so, subject to the following conditions:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      10: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      11: The above copyright notice and this permission notice shall be included in&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      12: all copies or substantial portions of the Software.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      13: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      14: THE SOFTWARE IS PROVIDED andquot;AS ISandquot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      15: IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      16: FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      17: AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      18: LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      19: OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      20: THE SOFTWARE.*/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      21: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      22: #region Usings&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      23: using System;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      24: using System.Collections.Generic;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      25: using System.Linq;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      26: using System.Text;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      27: using System.Reflection;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      28: using Utilities.IoC.Mappings;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      29: #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      30: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      31: namespace Utilities.IoC.Utils&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      32: {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      33:     public static class ConstructorList&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      34:     {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      35:         public static ConstructorInfo ChooseConstructor(Type ImplementationType, MappingManager MappingManager)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      36:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      37:             ConstructorInfo[] Constructors = ImplementationType.GetConstructors();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      38:             int MaxValue = int.MinValue;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      39:             ConstructorInfo CurrentConstructor = null;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      40:             foreach (ConstructorInfo Constructor in Constructors)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      41:             {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      42:                 int Count = GetParameterCount(Constructor, MappingManager);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      43:                 if (Count andgt; MaxValue)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      44:                 {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      45:                     CurrentConstructor = Constructor;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      46:                     MaxValue = Count;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      47:                 }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      48:             }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      49:             return CurrentConstructor;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      50:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      51: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      52:         private static int GetParameterCount(ConstructorInfo Constructor, MappingManager MappingManager)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      53:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      54:             int Count = 0;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      55:             ParameterInfo[] Parameters = Constructor.GetParameters();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      56:             foreach (ParameterInfo Parameter in Parameters)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      57:             {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      58:                 bool Inject = true;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      59:                 object[] Attributes = Parameter.GetCustomAttributes(false);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      60:                 if (Attributes.Length andgt; 0)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      61:                 {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      62:                     foreach (Attribute Attribute in Attributes)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      63:                     {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      64:                         if (MappingManager.GetMapping(Parameter.ParameterType, Attribute.GetType()) != null)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      65:                         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      66:                             ++Count;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      67:                             Inject = false;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      68:                             break;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      69:                         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      70:                     }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      71:                 }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      72:                 if (Inject)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      73:                 {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      74:                     if (MappingManager.GetMapping(Parameter.ParameterType) != null)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      75:                         ++Count;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      76:                 }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      77:             }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      78:             if (Count == Parameters.Length)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      79:                 return Count;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      80:             return int.MinValue;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      81:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      82:     }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      83: }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This bit of code simply determines which constructor has the most items that we know how to create and returns it. The Standard.Create function then takes that constructor and calls CreateInstance. This call determines the parameters of the constructor, and creates each one in turn using the MappingManager (we’ll get to that later). It then feeds the newly created items into the constructor and creates the object. After that it searches each method and each property to determine if they have been marked for injection also (note that this is done using an attribute called Inject). If it finds anything, it creates more objects in the same manner as the parameters for the constructor. Once it’s done with that, it returns the newly created object.&lt;br /&gt;&lt;br /&gt;So at this point we have our code to actually create our objects but we have nothing mapping it to anything. We can create but we don’t know when and we don’t know why. That’s where the MappingManager comes in.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;       1: /*&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       2: Copyright (c) 2011 andlt;a href=andquot;http://www.gutgames.comandquot;andgt;James Craigandlt;/aandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       3: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       4: Permission is hereby granted, free of charge, to any person obtaining a copy&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       5: of this software and associated documentation files (the andquot;Softwareandquot;), to deal&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       6: in the Software without restriction, including without limitation the rights&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       7: to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       8: copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       9: furnished to do so, subject to the following conditions:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      10: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      11: The above copyright notice and this permission notice shall be included in&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      12: all copies or substantial portions of the Software.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      13: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      14: THE SOFTWARE IS PROVIDED andquot;AS ISandquot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      15: IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      16: FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      17: AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      18: LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      19: OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      20: THE SOFTWARE.*/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      21: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      22: #region Usings&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      23: using System;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      24: using System.Collections.Generic;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      25: using System.Linq;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      26: using System.Text;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      27: using Utilities.IoC.Mappings.Interfaces;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      28: using System.Reflection;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      29: using Utilities.IoC.Providers;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      30: using Utilities.Reflection.ExtensionMethods;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      31: using Utilities.IoC.Mappings.Internal_Classes;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      32: using Utilities.IoC.Mappings.BaseClasses;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      33: #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      34: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      35: namespace Utilities.IoC.Mappings&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      36: {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      37:     /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      38:     /// Mapping manager&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      39:     /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      40:     public class MappingManager&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      41:     {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      42:         #region Constructor&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      43: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      44:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      45:         /// Constructor&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      46:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      47:         public MappingManager(ProviderManager ProviderManager)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      48:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      49:             Modules = new Listandlt;IModuleandgt;();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      50:             Mappings = new Listandlt;IMappingandgt;();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      51:             this.ProviderManager = ProviderManager;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      52:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      53: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      54:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      55: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      56:         #region Functions&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      57: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      58:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      59:         /// Scans the assembly for mapping modules and creates them&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      60:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      61:         /// andlt;param name=andquot;ModuleAssemblyandquot;andgt;andlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      62:         public void Setup(Assembly ModuleAssembly)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      63:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      64:             IEnumerableandlt;Typeandgt; Modules = ModuleAssembly.GetTypes(typeof(IModule));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      65:             Listandlt;IModuleandgt; TempModules = new Listandlt;IModuleandgt;();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      66:             foreach (Type Module in Modules)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      67:             {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      68:                 if (!Module.IsInterface andamp;andamp; !Module.IsAbstract)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      69:                     TempModules.Add((IModule)Module.Assembly.CreateInstance(Module.FullName));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      70:             }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      71:             foreach (IModule Module in TempModules)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      72:             {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      73:                 Module.Manager = this;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      74:                 Module.Setup();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      75:             }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      76:             this.Modules.AddRange(TempModules);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      77:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      78: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      79:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      80:         /// Creates a mapping object&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      81:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      82:         /// andlt;param name=andquot;ServiceTypeandquot;andgt;Service typeandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      83:         /// andlt;returnsandgt;a mapping objectandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      84:         public IMapping CreateMapping(Type ServiceType)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      85:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      86:             IMapping Mapping = new Mapping(ServiceType, ProviderManager, this);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      87:             Mappings.Add(Mapping);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      88:             return Mapping;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      89:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      90: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      91:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      92:         /// Creates a mapping object&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      93:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      94:         /// andlt;param name=andquot;ServiceTypeandquot;andgt;Service typeandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      95:         /// andlt;param name=andquot;AttributeTypeandquot;andgt;Attribute typeandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      96:         /// andlt;returnsandgt;A mapping objectandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      97:         public IMapping CreateMapping(Type ServiceType, Type AttributeType)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      98:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      99:             IMapping Mapping = new Mapping(ServiceType, AttributeType, ProviderManager, this);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     100:             Mappings.Add(Mapping);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     101:             return Mapping;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     102:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     103: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     104:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     105:         /// Gets the mapping that matches this service type&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     106:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     107:         /// andlt;param name=andquot;ServiceTypeandquot;andgt;Service typeandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     108:         /// andlt;returnsandgt;The mapping associated with this service typeandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     109:         public IMapping GetMapping(Type ServiceType)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     110:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     111:             MappingKey Key = new MappingKey(ServiceType, null, ProviderManager, this);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     112:             return Mappings.Find(x =andgt; x.Equals(Key));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     113:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     114: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     115:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     116:         /// Gets the mapping that matches this service type and attribute type&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     117:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     118:         /// andlt;param name=andquot;ServiceTypeandquot;andgt;Service typeandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     119:         /// andlt;param name=andquot;AttributeTypeandquot;andgt;Attribute typeandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     120:         /// andlt;returnsandgt;The mapping associated with this service type and attribute typeandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     121:         public IMapping GetMapping(Type ServiceType, Type AttributeType)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     122:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     123:             MappingKey Key = new MappingKey(ServiceType, AttributeType, ProviderManager, this);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     124:             return Mappings.Find(x =andgt; x.Equals(Key));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     125:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     126: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     127:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     128: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     129:         #region Properties&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     130: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     131:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     132:         /// Modules listing&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     133:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     134:         protected virtual Listandlt;IModuleandgt; Modules { get; set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     135: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     136:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     137:         /// Mapping listing&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     138:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     139:         protected virtual Listandlt;IMappingandgt; Mappings { get; set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     140: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     141:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     142:         /// Provider manager&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     143:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     144:         protected virtual ProviderManager ProviderManager { get; set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     145: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     146:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     147:     }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     148: }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The MappingManager is also a bit bare on implementation. All it does is holds a series of mappings and modules and creates them/returns them as necessary. A module is actually not defined inside the system itself. It’s what the end user would use to let the system know what mappings to use. It uses the following interface and base class:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;       1: /*&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       2: Copyright (c) 2011 andlt;a href=andquot;http://www.gutgames.comandquot;andgt;James Craigandlt;/aandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       3: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       4: Permission is hereby granted, free of charge, to any person obtaining a copy&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       5: of this software and associated documentation files (the andquot;Softwareandquot;), to deal&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       6: in the Software without restriction, including without limitation the rights&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       7: to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       8: copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       9: furnished to do so, subject to the following conditions:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      10: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      11: The above copyright notice and this permission notice shall be included in&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      12: all copies or substantial portions of the Software.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      13: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      14: THE SOFTWARE IS PROVIDED andquot;AS ISandquot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      15: IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      16: FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      17: AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      18: LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      19: OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      20: THE SOFTWARE.*/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      21: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      22: #region Usings&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      23: using System;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      24: using System.Collections.Generic;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      25: using System.Linq;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      26: using System.Text;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      27: #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      28: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      29: namespace Utilities.IoC.Mappings.Interfaces&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      30: {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      31:     /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      32:     /// Mapping module interface&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      33:     /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      34:     public interface IModule&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      35:     {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      36:         #region Functions&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      37: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      38:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      39:         /// Called to setup the module (actual mapping occurs here)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      40:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      41:         void Setup();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      42: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      43:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      44: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      45:         #region Properties&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      46: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      47:         MappingManager Manager { get; set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      48: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      49:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      50:     }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      51: }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;       1: /*&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       2: Copyright (c) 2011 andlt;a href=andquot;http://www.gutgames.comandquot;andgt;James Craigandlt;/aandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       3: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       4: Permission is hereby granted, free of charge, to any person obtaining a copy&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       5: of this software and associated documentation files (the andquot;Softwareandquot;), to deal&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       6: in the Software without restriction, including without limitation the rights&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       7: to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       8: copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       9: furnished to do so, subject to the following conditions:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      10: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      11: The above copyright notice and this permission notice shall be included in&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      12: all copies or substantial portions of the Software.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      13: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      14: THE SOFTWARE IS PROVIDED andquot;AS ISandquot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      15: IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      16: FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      17: AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      18: LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      19: OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      20: THE SOFTWARE.*/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      21: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      22: #region Usings&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      23: using System;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      24: using System.Collections.Generic;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      25: using System.Linq;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      26: using System.Text;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      27: using Utilities.IoC.Mappings.Interfaces;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      28: #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      29: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      30: namespace Utilities.IoC.Mappings.BaseClasses&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      31: {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      32:     /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      33:     /// Base module class&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      34:     /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      35:     public abstract class BaseModule : IModule&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      36:     {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      37:         #region Functions&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      38: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      39:         public abstract void Setup();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      40: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      41:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      42:         /// Creates a mapping using a specific service type&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      43:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      44:         /// andlt;typeparam name=andquot;ServiceTypeandquot;andgt;Service typeandlt;/typeparamandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      45:         /// andlt;returnsandgt;A mapping objectandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      46:         public virtual IMapping Mapandlt;ServiceTypeandgt;()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      47:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      48:             return Map(typeof(ServiceType));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      49:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      50: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      51:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      52:         /// Creates a mapping using a specific service type and attribute type&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      53:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      54:         /// andlt;typeparam name=andquot;ServiceTypeandquot;andgt;Service typeandlt;/typeparamandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      55:         /// andlt;typeparam name=andquot;AttributeTypeandquot;andgt;Attribute typeandlt;/typeparamandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      56:         /// andlt;returnsandgt;A mapping objectandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      57:         public virtual IMapping Mapandlt;ServiceType, AttributeTypeandgt;()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      58:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      59:             return Map(typeof(ServiceType), typeof(AttributeType));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      60:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      61: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      62:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      63:         /// Creates a mapping using a specific service type&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      64:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      65:         /// andlt;param name=andquot;ServiceTypeandquot;andgt;Service typeandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      66:         /// andlt;param name=andquot;AttributeTypeandquot;andgt;Attribute typeandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      67:         /// andlt;returnsandgt;A mapping objectandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      68:         public virtual IMapping Map(Type ServiceType, Type AttributeType = null)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      69:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      70:             return Manager.CreateMapping(ServiceType, AttributeType);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      71:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      72: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      73:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      74: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      75:         #region Properties&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      76: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      77:         public virtual MappingManager Manager { get; set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      78: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      79:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      80:     }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      81: }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;For example, in your code, you would define a module like this:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;       1: public class Module : BaseModule&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       2: {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       3:     public override void Setup()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       4:     {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       5:         Mapandlt;ITestInterfaceandgt;().Toandlt;TestClass1andgt;().SetScope(new StandardScope());&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       6:         Mapandlt;TestClass1andgt;().Toandlt;TestClass1andgt;(() =andgt; new TestClass1());&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       7:         Mapandlt;ITestInterface, MyAttributeandgt;().To(new TestImplementation());&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       8:         Mapandlt;TestClass2andgt;().Toandlt;TestClass2andgt;();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       9:     }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      10: }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This module defines four mappings that the system can use. A mapping is, as the name suggests, a mapping between a key type and what should be created when it encounters that type. For instance whenever I hit the interface ITestInterface, we return a TestClass1 object. The module can also define the scope for the object and sets the implementation used. In the example above the first item maps ITestInterface to TestClass1 and sets the scope to StandardScope. The third item maps ITestInterface items that have the MyAttribute attribute to the TestImplementation implementation. Whenever you call Map in a module, it creates and returns a Mapping class:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;       1: /*&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       2: Copyright (c) 2011 andlt;a href=andquot;http://www.gutgames.comandquot;andgt;James Craigandlt;/aandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       3: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       4: Permission is hereby granted, free of charge, to any person obtaining a copy&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       5: of this software and associated documentation files (the andquot;Softwareandquot;), to deal&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       6: in the Software without restriction, including without limitation the rights&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       7: to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       8: copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       9: furnished to do so, subject to the following conditions:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      10: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      11: The above copyright notice and this permission notice shall be included in&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      12: all copies or substantial portions of the Software.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      13: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      14: THE SOFTWARE IS PROVIDED andquot;AS ISandquot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      15: IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      16: FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      17: AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      18: LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      19: OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      20: THE SOFTWARE.*/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      21: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      22: #region Usings&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      23: using System;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      24: using System.Collections.Generic;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      25: using System.Linq;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      26: using System.Text;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      27: using Utilities.IoC.Mappings.BaseClasses;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      28: using Utilities.IoC.Providers;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      29: #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      30: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      31: namespace Utilities.IoC.Mappings.Internal_Classes&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      32: {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      33:     /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      34:     /// Mapping class&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      35:     /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      36:     public class Mapping : MappingKey&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      37:     {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      38:         #region Constructors&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      39: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      40:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      41:         /// Constructor&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      42:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      43:         /// andlt;param name=andquot;ServiceTypeandquot;andgt;Service typeandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      44:         public Mapping(Type ServiceType, ProviderManager ProviderManager, MappingManager MappingManager)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      45:             : base(ServiceType, null, ProviderManager, MappingManager)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      46:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      47:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      48: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      49:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      50:         /// Constructor&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      51:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      52:         /// andlt;param name=andquot;ServiceTypeandquot;andgt;Service typeandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      53:         /// andlt;param name=andquot;AttributeTypeandquot;andgt;Attribute typeandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      54:         public Mapping(Type ServiceType, Type AttributeType, ProviderManager ProviderManager, MappingManager MappingManager)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      55:             : base(ServiceType, AttributeType, ProviderManager, MappingManager)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      56:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      57:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      58: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      59:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      60:     }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      61: }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;       1: /*&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       2: Copyright (c) 2011 andlt;a href=andquot;http://www.gutgames.comandquot;andgt;James Craigandlt;/aandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       3: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       4: Permission is hereby granted, free of charge, to any person obtaining a copy&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       5: of this software and associated documentation files (the andquot;Softwareandquot;), to deal&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       6: in the Software without restriction, including without limitation the rights&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       7: to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       8: copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       9: furnished to do so, subject to the following conditions:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      10: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      11: The above copyright notice and this permission notice shall be included in&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      12: all copies or substantial portions of the Software.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      13: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      14: THE SOFTWARE IS PROVIDED andquot;AS ISandquot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      15: IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      16: FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      17: AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      18: LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      19: OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      20: THE SOFTWARE.*/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      21: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      22: #region Usings&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      23: using System;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      24: using System.Collections.Generic;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      25: using System.Linq;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      26: using System.Text;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      27: using Utilities.IoC.Mappings.Interfaces;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      28: using Utilities.IoC.Providers;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      29: #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      30: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      31: namespace Utilities.IoC.Mappings.BaseClasses&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      32: {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      33:     /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      34:     /// Mapping key&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      35:     /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      36:     public class MappingKey : BaseMapping&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      37:     {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      38:         #region Constructor&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      39: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      40:         public MappingKey(Type ServiceType, Type AttributeType, ProviderManager ProviderManager, MappingManager MappingManager)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      41:             : base(ServiceType, AttributeType, ProviderManager, MappingManager)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      42:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      43:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      44: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      45:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      46: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      47:         #region Functions&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      48: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      49:         public override bool Equals(object obj)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      50:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      51:             if (!(obj is IMapping))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      52:                 return false;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      53:             IMapping ObjectMapping = (IMapping)obj;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      54:             return ObjectMapping.AttributeType == AttributeType&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      55:                 andamp;andamp; ObjectMapping.ServiceType == ServiceType;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      56:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      57: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      58:         public override int GetHashCode()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      59:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      60:             int AttributeHash = AttributeType == null ? 1 : AttributeType.GetHashCode();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      61:             int ServiceHash = ServiceType == null ? 1 : ServiceType.GetHashCode();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      62:             return ServiceHash * AttributeHash;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      63:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      64: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      65:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      66:     }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      67: }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;       1: /*&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       2: Copyright (c) 2011 andlt;a href=andquot;http://www.gutgames.comandquot;andgt;James Craigandlt;/aandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       3: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       4: Permission is hereby granted, free of charge, to any person obtaining a copy&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       5: of this software and associated documentation files (the andquot;Softwareandquot;), to deal&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       6: in the Software without restriction, including without limitation the rights&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       7: to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       8: copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       9: furnished to do so, subject to the following conditions:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      10: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      11: The above copyright notice and this permission notice shall be included in&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      12: all copies or substantial portions of the Software.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      13: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      14: THE SOFTWARE IS PROVIDED andquot;AS ISandquot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      15: IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      16: FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      17: AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      18: LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      19: OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      20: THE SOFTWARE.*/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      21: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      22: #region Usings&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      23: using System;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      24: using System.Collections.Generic;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      25: using System.Linq;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      26: using System.Text;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      27: using Utilities.IoC.Mappings.Interfaces;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      28: using Utilities.IoC.Providers;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      29: using Utilities.IoC.Providers.Scope;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      30: using Utilities.IoC.Providers.Interfaces;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      31: #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      32: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      33: namespace Utilities.IoC.Mappings.BaseClasses&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      34: {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      35:     /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      36:     /// Base mapping&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      37:     /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      38:     public class BaseMapping : IMapping&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      39:     {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      40:         #region Constructor&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      41: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      42:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      43:         /// Constructor&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      44:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      45:         /// andlt;param name=andquot;ServiceTypeandquot;andgt;Service typeandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      46:         /// andlt;param name=andquot;AttributeTypeandquot;andgt;Attribute typeandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      47:         public BaseMapping(Type ServiceType, Type AttributeType, ProviderManager ProviderManager, MappingManager MappingManager)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      48:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      49:             this.ServiceType = ServiceType;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      50:             this.AttributeType = AttributeType;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      51:             this.ProviderManager = ProviderManager;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      52:             this.MappingManager = MappingManager;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      53:             this.Scope = new StandardScope();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      54:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      55: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      56:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      57: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      58:         #region Functions&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      59: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      60:         public virtual IMapping Toandlt;ImplementationTypeandgt;()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      61:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      62:             return To(typeof(ImplementationType));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      63:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      64: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      65:         public virtual IMapping To(Type ImplementationType)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      66:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      67:             Implementation = ProviderManager.GetProvider(Scope).CreateImplementation(ImplementationType, MappingManager);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      68:             return this;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      69:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      70: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      71:         public virtual IMapping Toandlt;ImplementationTypeandgt;(Funcandlt;ImplementationTypeandgt; Implementation)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      72:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      73:             this.Implementation = ProviderManager.GetProvider(Scope).CreateImplementation(Implementation);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      74:             return this;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      75:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      76: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      77:         public virtual IMapping To(Providers.Interfaces.IImplementation Implementation)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      78:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      79:             this.Implementation = Implementation;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      80:             return this;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      81:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      82: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      83:         public virtual IMapping SetScope(BaseScope Scope)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      84:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      85:             this.Scope = Scope;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      86:             Implementation = ProviderManager.GetProvider(Scope).CreateImplementation(Implementation, MappingManager);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      87:             return this;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      88:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      89: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      90:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      91: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      92:         #region Properties&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      93: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      94:         public virtual Type ServiceType { get; protected set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      95:         public virtual Type AttributeType { get; protected set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      96:         public virtual BaseScope Scope { get; protected set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      97:         public virtual IImplementation Implementation { get; protected set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      98:         protected virtual ProviderManager ProviderManager { get; set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      99:         protected virtual MappingManager MappingManager { get; set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     100: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     101:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     102:     }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     103: }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The Mapping class is rather empty, the MappingKey actually defines the functions needed to determine which mapping is which. And the BaseMapping class holds the functions that set the scope, set the implementation, etc. And with that we’re done.&lt;br /&gt;&lt;br /&gt;We create our modules, which sets our mappings, which the system holds for us until we tell the manager to get us a specific object type. Once we do that, it assembles our object for us. It’s not that complicated really and not that much code either (the largest file tops out at 189 lines of code including comments). And with that we have ourselves a simple DI container.&lt;br /&gt;&lt;br /&gt;If you want updates, or find bugs, etc. check out the repository for the utility library (this is currently under the Utilities.IoC namespace). I’m terrible about updating my site but I update the code there whenever a bug is found. And hopefully I’ll finish my huge update to that library before too long (and it is going to contain a number of changes and additions). Anyway, take a look at the code and happy coding.
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/E5BkcXnJrQuL0Sjyge5k1-miD-Q/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/E5BkcXnJrQuL0Sjyge5k1-miD-Q/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/E5BkcXnJrQuL0Sjyge5k1-miD-Q/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/E5BkcXnJrQuL0Sjyge5k1-miD-Q/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GutInstinct/~4/UXWZXW9YdUY" height="1" width="1"/&gt;</description>
<itunes:subtitle>Building an DI Container</itunes:subtitle><itunes:summary><![CDATA[It has been a while since I’ve written anything. To say the least things are hectic. Most of which, I can’t really talk about at this point (let’s just say that I’m working on a product for a sector of the business world. I think I can say that much, but not much more until it gets closer to release). Anyway, today I’m finally getting around to talking about one more item that I’ve added to my utility library. Specifically I’ve added a basic DI container (dependency injection).  Note that this next section is an over simplification and I’m tired so if it’s wrong, feel free to say so. Anyway, Dependency injection is a specific form of inversion of control. Inversion of control is when you invert the flow of a system. Instead of one central bit of code deciding how everything is run, it’s up to the individual pieces to know how to do the actual work. For instance, if I call an object factory to create a database connection for me, I don’t care how it’s created or how the connection is doing anything as long as it gets done. And dependency injection is just a specific form of IoC. Instead of hard coding our dependencies in each individual class, we allow someone to pass in the component that they want to use. You can actually do this manually (using a factory pattern, etc.) and still have a form of dependency injection. However you can also automate this process using one of the many dependency injectors out there (I personally like Ninject and based the code below on it). But where’s the fun in using someone else’s when all we have to do is spend an afternoon and build our own.             1: /*<br /><br /><br />       2: Copyright (c) 2011 andlt;a href=andquot;http://www.gutgames.comandquot;andgt;James Craigandlt;/aandgt;<br /><br /><br />       3: <br /><br /><br />       4: Permission is hereby granted, free of charge, to any person obtaining a copy<br /><br /><br />       5: of this software and associated documentation files (the andquot;Softwareandquot;), to deal<br /><br /><br />       6: in the Software without restriction, including without limitation the rights<br /><br /><br />       7: to use, copy, modify, merge, publish, distribute, sublicense, and/or sell<br /><br /><br />       8: copies of the Software, and to permit persons to whom the Software is<br /><br /><br />       9: furnished to do so, subject to the following conditions:<br /><br /><br />      10: <br /><br /><br />      11: The above copyright notice and this permission notice shall be included in<br /><br /><br />      12: all copies or substantial portions of the Software.<br /><br /><br />      13: <br /><br /><br />      14: THE SOFTWARE IS PROVIDED andquot;AS ISandquot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br /><br /><br />      15: IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br /><br /><br />      16: FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE<br /><br /><br />      17: AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER<br /><br /><br />      18: LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,<br /><br /><br />      19: OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN<br /><br /><br />      20: THE SOFTWARE.*/<br /><br /><br />      21: <br /><br /><br />      22: #region Usings<br /><br /><br />      23: using System;<br /><br /><br />      24: using System.Collections.Generic;<br /><br /><br />      25: using System.Linq;<br /><br /><br />      26: using System.Text;<br /><br /><br />      27: using Utilities.IoC.Providers;<br /><br /><br />      28: using Utilities.IoC.Mappings;<br /><br /><br />      29: using Utilities.IoC.Mappings.Interfaces;<br /><br /><br />      30: using System.Reflection;<br /><br /><br />      31: using System.IO;<br /><br /><br />      32: using Utilities.IO.ExtensionMethods;<br /><br /><br />      33: using Utilities.Reflection.ExtensionMethods;<br /><br /><br />      34: using Utilities.DataTypes.ExtensionMethods;<br /><br /><br />      35: #endregion<br /><br /><br />      36: <br /><br /><br />      37: namespace Utilities.IoC<br /><br /><br />      38: {<br /><br /><br />      39:     /// andlt;summaryandgt;<br /><br /><br />      40:     /// Manager class<br /><br /><br />      41:     /// andlt;/summaryandgt;<br /><br /><br />      42:     public class Manager<br /><br /><br />      43:     {<br /><br /><br />      44:         #region Constructor<br /><br /><br />      45: <br /><br /><br />      46:         /// andlt;summaryandgt;<br /><br /><br />      47:         /// Constructor<br /><br /><br />      48:         /// andlt;/summaryandgt;<br /><br /><br />      49:         public Manager()<br /><br /><br />      50:         {<br /><br /><br />      51:             if (ProviderManager.IsNull())<br /><br /><br />      52:                 ProviderManager = new ProviderManager();<br /><br /><br />      53:             if (MappingManager.IsNull())<br /><br /><br />      54:                 MappingManager = new MappingManager(ProviderManager);<br /><br /><br />      55:         }<br /><br /><br />      56: <br /><br /><br />      57:         #endregion<br /><br /><br />      58: <br /><br /><br />      59:         #region Functions<br /><br /><br />      60: <br /><br /><br />      61:         /// andlt;summaryandgt;<br /><br /><br />      62:         /// Loads all mapping modules found within the assembly<br /><br /><br />      63:         /// andlt;/summaryandgt;<br /><br /><br />      64:         /// andlt;param name=andquot;ModuleAssemblyandquot;andgt;Module assemblyandlt;/paramandgt;<br /><br /><br />      65:         public void Setup(Assembly ModuleAssembly)<br /><br /><br />      66:         {<br /><br /><br />      67:             ProviderManager.Setup(ModuleAssembly);<br /><br /><br />      68:             MappingManager.Setup(ModuleAssembly);<br /><br /><br />      69:         }<br /><br /><br />      70: <br /><br /><br />      71:         /// andlt;summaryandgt;<br /><br /><br />      72:         /// Loads all mapping modules found within the assemblies<br /><br /><br />      73:         /// andlt;/summaryandgt;<br /><br /><br />      74:         /// andlt;param name=andquot;ModuleAssembliesandquot;andgt;Module assembliesandlt;/paramandgt;<br /><br /><br />      75:         public void Setup(IEnumerableandlt;Assemblyandgt; ModuleAssemblies)<br /><br /><br />      76:         {<br /><br /><br />      77:             ModuleAssemblies.ForEach(x =andgt; Setup(x));<br /><br /><br />      78:         }<br /><br /><br />      79: <br /><br /><br />      80:         /// andlt;summaryandgt;<br /><br /><br />      81:         /// Loads all mapping modules found within a specific directory<br /><br /><br />      82:         /// andlt;/summaryandgt;<br /><br /><br />      83:         /// andlt;param name=andquot;Directoryandquot;andgt;Directory to scan for modulesandlt;/paramandgt;<br /><br /><br />      84:         /// andlt;param name=andquot;RecursiveScanandquot;andgt;Determines if sub directories should be scannedandlt;/paramandgt;<br /><br /><br />      85:         public void Setup(string Directory, bool ScanSubDirectories = true)<br /><br /><br />      86:         {<br /><br /><br />      87:             Setup(new DirectoryInfo(Directory).LoadAssemblies(ScanSubDirectories));<br /><br /><br />      88:         }<br /><br /><br />      89: <br /><br /><br />      90:         /// andlt;summaryandgt;<br /><br /><br />      91:         /// Creates an object of the specified type<br /><br /><br />      92:         /// andlt;/summaryandgt;<br /><br /><br />      93:         /// andlt;typeparam name=andquot;ServiceTypeandquot;andgt;Service typeandlt;/typeparamandgt;<br /><br /><br />      94:         /// andlt;returnsandgt;An object of the specified typeandlt;/returnsandgt;<br /><br /><br />      95:         public ServiceType Getandlt;ServiceTypeandgt;()<br /><br /><br />      96:         {<br /><br /><br />      97:             return (ServiceType)Get(typeof(ServiceType));<br /><br /><br />      98:         }<br /><br /><br />      99: <br /><br /><br />     100:         /// andlt;summaryandgt;<br /><br /><br />     101:         /// Creates an object of the specified type associated with the attribute type<br /><br /><br />     102:         /// andlt;/summaryandgt;<br /><br /><br />     103:         /// andlt;typeparam name=andquot;ServiceTypeandquot;andgt;Service typeandlt;/typeparamandgt;<br /><br /><br />     104:         /// andlt;typeparam name=andquot;AttributeTypeandquot;andgt;Attribute typeandlt;/typeparamandgt;<br /><br /><br />     105:         /// andlt;returnsandgt;An object of the specified typeandlt;/returnsandgt;<br /><br /><br />     106:         public ServiceType Getandlt;ServiceType, AttributeTypeandgt;()<br /><br /><br />     107:         {<br /><br /><br />     108:             return (ServiceType)Get(typeof(ServiceType), typeof(AttributeType));<br /><br /><br />     109:         }<br /><br /><br />     110: <br /><br /><br />     111:         /// andlt;summaryandgt;<br /><br /><br />     112:         /// Creates an object of the specified type<br /><br /><br />     113:         /// andlt;/summaryandgt;<br /><br /><br />     114:         /// andlt;param name=andquot;ServiceTypeandquot;andgt;Service typeandlt;/paramandgt;<br /><br /><br />     115:         /// andlt;returnsandgt;An object of the specified typeandlt;/returnsandgt;<br /><br /><br />     116:         public object Get(Type ServiceType)<br /><br /><br />     117:         {<br /><br /><br />     118:             IMapping Mapping = MappingManager.GetMapping(ServiceType);<br /><br /><br />     119:             if (Mapping.IsNull())<br /><br /><br />     120:                 throw new ArgumentException(andquot;ServiceType not found in mappingsandquot;);<br /><br /><br />     121:             return Mapping.Implementation.Create();<br /><br /><br />     122:         }<br /><br /><br />     123: <br /><br /><br />     124:         /// andlt;summaryandgt;<br /><br /><br />     125:         /// Creates an object of the specified type associated with the attribute type<br /><br /><br />     126:         /// andlt;/summaryandgt;<br /><br /><br />     127:         /// andlt;param name=andquot;ServiceTypeandquot;andgt;Service typeandlt;/paramandgt;<br /><br /><br />     128:         /// andlt;param name=andquot;AttributeTypeandquot;andgt;Attribute typeandlt;/paramandgt;<br /><br /><br />     129:         /// andlt;returnsandgt;An object of the specified typeandlt;/returnsandgt;<br /><br /><br />     130:         public object Get(Type ServiceType, Type AttributeType)<br /><br /><br />     131:         {<br /><br /><br />     132:             IMapping Mapping = MappingManager.GetMapping(ServiceType, AttributeType);<br /><br /><br />     133:             if (Mapping.IsNull())<br /><br /><br />     134:                 throw new ArgumentException(andquot;ServiceType not found in mappingsandquot;);<br /><br /><br />     135:             return Mapping.Implementation.Create();<br /><br /><br />     136:         }<br /><br /><br />     137: <br /><br /><br />     138:         #endregion<br /><br /><br />     139: <br /><br /><br />     140:         #region Properties<br /><br /><br />     141: <br /><br /><br />     142:         protected static ProviderManager ProviderManager { get; set; }<br /><br /><br />     143:         protected static MappingManager MappingManager { get; set; }<br /><br /><br />     144: <br /><br /><br />     145:         #endregion<br /><br /><br />     146:     }<br /><br /><br />     147: }<br /><br /><br /><br />This is our main point of code that we are going to use to get our objects. We set it up, call Get, and it will return to us our object (with the appropriate items injected). One thing that you’ll notice is that there are a couple nonstandard C# calls in there (specifically the ForEach on the IEnumerable, IsNull, etc). These are all functions from the new utility library that I’m working on. I’ve been adding quite a bit to it, tons of extension methods, etc. So go and check out the repository as all of my code on here uses it (or at least the code on here uses a version of it). Plus any updates to the code can be found there also as I tend to forget the pages on this site. Anyway another thing you may notice is there isn’t much code here. Most of the actual work is going to be done in the ProviderManager and MappingManager.<br /><br /><br />  <br />       1: /*<br /><br /><br />       2: Copyright (c) 2011 andlt;a href=andquot;http://www.gutgames.comandquot;andgt;James Craigandlt;/aandgt;<br /><br /><br />       3: <br /><br /><br />       4: Permission is hereby granted, free of charge, to any person obtaining a copy<br /><br /><br />       5: of this software and associated documentation files (the andquot;Softwareandquot;), to deal<br /><br /><br />       6: in the Software without restriction, including without limitation the rights<br /><br /><br />       7: to use, copy, modify, merge, publish, distribute, sublicense, and/or sell<br /><br /><br />       8: copies of the Software, and to permit persons to whom the Software is<br /><br /><br />       9: furnished to do so, subject to the following conditions:<br /><br /><br />      10: <br /><br /><br />      11: The above copyright notice and this permission notice shall be included in<br /><br /><br />      12: all copies or substantial portions of the Software.<br /><br /><br />      13: <br /><br /><br />      14: THE SOFTWARE IS PROVIDED andquot;AS ISandquot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br /><br /><br />      15: IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br /><br /><br />      16: FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE<br /><br /><br />      17: AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER<br /><br /><br />      18: LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,<br /><br /><br />      19: OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN<br /><br /><br />      20: THE SOFTWARE.*/<br /><br /><br />      21: <br /><br /><br />      22: #region Usings<br /><br /><br />      23: using System;<br /><br /><br />      24: using System.Collections.Generic;<br /><br /><br />      25: using System.Linq;<br /><br /><br />      26: using System.Text;<br /><br /><br />      27: using Utilities.IoC.Providers.Interfaces;<br /><br /><br />      28: using Utilities.IoC.Providers.Scope;<br /><br /><br />      29: using Utilities.Reflection;<br /><br /><br />      30: using Utilities.Reflection.ExtensionMethods;<br /><br /><br />      31: using Utilities.DataTypes.ExtensionMethods;<br /><br /><br />      32: using System.Reflection;<br /><br /><br />      33: #endregion<br /><br /><br />      34: <br /><br /><br />      35: namespace Utilities.IoC.Providers<br /><br /><br />      36: {<br /><br /><br />      37:     /// andlt;summaryandgt;<br /><br /><br />      38:     /// Provider manager<br /><br /><br />      39:     /// andlt;/summaryandgt;<br /><br /><br />      40:     public class ProviderManager<br /><br /><br />      41:     {<br /><br /><br />      42:         #region Constructor<br /><br /><br />      43: <br /><br /><br />      44:         /// andlt;summaryandgt;<br /><br /><br />      45:         /// Constructor<br /><br /><br />      46:         /// andlt;/summaryandgt;<br /><br /><br />      47:         public ProviderManager()<br /><br /><br />      48:         {<br /><br /><br />      49:             Providers = new Listandlt;IProviderandgt;();<br /><br /><br />      50:             Providers.AddRange(typeof(ProviderManager).Assembly.GetObjectsandlt;IProviderandgt;());<br /><br /><br />      51:         }<br /><br /><br />      52: <br /><br /><br />      53:         #endregion<br /><br /><br />      54: <br /><br /><br />      55:         #region Functions<br /><br /><br />      56: <br /><br /><br />      57:         /// andlt;summaryandgt;<br /><br /><br />      58:         /// Sets up all providers found within the assembly specified<br /><br /><br />      59:         /// andlt;/summaryandgt;<br /><br /><br />      60:         /// andlt;param name=andquot;Assemblyandquot;andgt;Assembly to scanandlt;/paramandgt;<br /><br /><br />      61:         public void Setup(Assembly Assembly)<br /><br /><br />      62:         {<br /><br /><br />      63:             Providers.AddRange(Assembly.GetObjectsandlt;IProviderandgt;());<br /><br /><br />      64:         }<br /><br /><br />      65: <br /><br /><br />      66:         /// andlt;summaryandgt;<br /><br /><br />      67:         /// Gets the specified provider based on the scope specified<br /><br /><br />      68:         /// andlt;/summaryandgt;<br /><br /><br />      69:         /// andlt;param name=andquot;Scopeandquot;andgt;Scopeandlt;/paramandgt;<br /><br /><br />      70:         /// andlt;returnsandgt;The specified providerandlt;/returnsandgt;<br /><br /><br />      71:         public IProvider GetProvider(BaseScope Scope)<br /><br /><br />      72:         {<br /><br /><br />      73:             return Providers.FirstOrDefault(x =andgt; x.ProviderScope.Equals(Scope));<br /><br /><br />      74:         }<br /><br /><br />      75: <br /><br /><br />      76:         #endregion<br /><br /><br />      77: <br /><br /><br />      78:         #region Properties<br /><br /><br />      79: <br /><br /><br />      80:         protected virtual Listandlt;IProviderandgt; Providers { get; set; }<br /><br /><br />      81: <br /><br /><br />      82:         #endregion<br /><br /><br />      83:     }<br /><br /><br />      84: }<br /><br /><br /><br />The ProviderManager above holds a list of providers. These providers determine how to handle an implementation when you provide the system with one. The implementations actually determine how something is created. For instance, the code base only has one provider at present called Standard.<br /><br /><br />  <br />       1: /*<br /><br /><br />       2: Copyright (c) 2011 andlt;a href=andquot;http://www.gutgames.comandquot;andgt;James Craigandlt;/aandgt;<br /><br /><br />       3: <br /><br /><br />       4: Permission is hereby granted, free of charge, to any person obtaining a copy<br /><br /><br />       5: of this software and associated documentation files (the andquot;Softwareandquot;), to deal<br /><br /><br />       6: in the Software without restriction, including without limitation the rights<br /><br /><br />       7: to use, copy, modify, merge, publish, distribute, sublicense, and/or sell<br /><br /><br />       8: copies of the Software, and to permit persons to whom the Software is<br /><br /><br />       9: furnished to do so, subject to the following conditions:<br /><br /><br />      10: <br /><br /><br />      11: The above copyright notice and this permission notice shall be included in<br /><br /><br />      12: all copies or substantial portions of the Software.<br /><br /><br />      13: <br /><br /><br />      14: THE SOFTWARE IS PROVIDED andquot;AS ISandquot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br /><br /><br />      15: IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br /><br /><br />      16: FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE<br /><br /><br />      17: AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER<br /><br /><br />      18: LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,<br /><br /><br />      19: OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN<br /><br /><br />      20: THE SOFTWARE.*/<br /><br /><br />      21: <br /><br /><br />      22: #region Usings<br /><br /><br />      23: using System;<br /><br /><br />      24: using System.Collections.Generic;<br /><br /><br />      25: using System.Linq;<br /><br /><br />      26: using System.Text;<br /><br /><br />      27: using Utilities.IoC.Providers.Scope;<br /><br /><br />      28: using Utilities.IoC.Providers.Interfaces;<br /><br /><br />      29: using Utilities.IoC.Mappings;<br /><br /><br />      30: using Utilities.IoC.Providers.Implementations;<br /><br /><br />      31: #endregion<br /><br /><br />      32: <br /><br /><br />      33: namespace Utilities.IoC.Providers.DefaultProviders<br /><br /><br />      34: {<br /><br /><br />      35:     /// andlt;summaryandgt;<br /><br /><br />      36:     /// Standard provider<br /><br /><br />      37:     /// andlt;/summaryandgt;<br /><br /><br />      38:     public class Standard : IProvider<br /><br /><br />      39:     {<br /><br /><br />      40:         public IImplementation CreateImplementation(Type ImplementationType, MappingManager MappingManager)<br /><br /><br />      41:         {<br /><br /><br />      42:             return new Implementations.Standard(ImplementationType, MappingManager);<br /><br /><br />      43:         }<br /><br /><br />      44: <br /><br /><br />      45: <br /><br /><br />      46:         public BaseScope ProviderScope<br /><br /><br />      47:         {<br /><br /><br />      48:             get { return new StandardScope(); }<br /><br /><br />      49:         }<br /><br /><br />      50: <br /><br /><br />      51:         public IImplementation CreateImplementation(IImplementation Implementation, MappingManager MappingManager)<br /><br /><br />      52:         {<br /><br /><br />      53:             return CreateImplementation(Implementation.ReturnType, MappingManager);<br /><br /><br />      54:         }<br /><br /><br />      55: <br /><br /><br />      56:         public IImplementation CreateImplementationandlt;ImplementationTypeandgt;(Funcandlt;ImplementationTypeandgt; Implementation)<br /><br /><br />      57:         {<br /><br /><br />      58:             return new Delegateandlt;ImplementationTypeandgt;(Implementation);<br /><br /><br />      59:         }<br /><br /><br />      60:     }<br /><br /><br />      61: }<br /><br /><br /><br />This provider just creates a new implementation object (either a Delegate or Standard implementation depending) each time it’s fed anything. However we could have a provider called Singleton or something and have it return its own implementation types. We determine which provider to use in the ProviderManager based on something called Scopes:<br /><br /><br />  <br />       1: /*<br /><br /><br />       2: Copyright (c) 2011 andlt;a href=andquot;http://www.gutgames.comandquot;andgt;James Craigandlt;/aandgt;<br /><br /><br />       3: <br /><br /><br />       4: Permission is hereby granted, free of charge, to any person obtaining a copy<br /><br /><br />       5: of this software and associated documentation files (the andquot;Softwareandquot;), to deal<br /><br /><br />       6: in the Software without restriction, including without limitation the rights<br /><br /><br />       7: to use, copy, modify, merge, publish, distribute, sublicense, and/or sell<br /><br /><br />       8: copies of the Software, and to permit persons to whom the Software is<br /><br /><br />       9: furnished to do so, subject to the following conditions:<br /><br /><br />      10: <br /><br /><br />      11: The above copyright notice and this permission notice shall be included in<br /><br /><br />      12: all copies or substantial portions of the Software.<br /><br /><br />      13: <br /><br /><br />      14: THE SOFTWARE IS PROVIDED andquot;AS ISandquot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br /><br /><br />      15: IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br /><br /><br />      16: FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE<br /><br /><br />      17: AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER<br /><br /><br />      18: LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,<br /><br /><br />      19: OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN<br /><br /><br />      20: THE SOFTWARE.*/<br /><br /><br />      21: <br /><br /><br />      22: #region Usings<br /><br /><br />      23: using System;<br /><br /><br />      24: using System.Collections.Generic;<br /><br /><br />      25: using System.Linq;<br /><br /><br />      26: using System.Text;<br /><br /><br />      27: #endregion<br /><br /><br />      28: <br /><br /><br />      29: namespace Utilities.IoC.Providers.Scope<br /><br /><br />      30: {<br /><br /><br />      31:     /// andlt;summaryandgt;<br /><br /><br />      32:     /// Standard scope<br /><br /><br />      33:     /// andlt;/summaryandgt;<br /><br /><br />      34:     public class StandardScope : BaseScope<br /><br /><br />      35:     {<br /><br /><br />      36:         #region Constructor<br /><br /><br />      37: <br /><br /><br />      38:         public StandardScope()<br /><br /><br />      39:             : base()<br /><br /><br />      40:         {<br /><br /><br />      41:         }<br /><br /><br />      42: <br /><br /><br />      43:         #endregion<br /><br /><br />      44: <br /><br /><br />      45:         #region Properties<br /><br /><br />      46: <br /><br /><br />      47:         public override string Name { get { return andquot;Standardandquot;; } }<br /><br /><br />      48: <br /><br /><br />      49:         #endregion<br /><br /><br />      50:     }<br /><br /><br />      51: }<br /><br /><br /><br />As you can see, it’s just a holder of info. So for our Singleton provider example, we would need to create a Singleton scope and have it return that value so we know which to use. Anyway, the next bit is the actual implementations:<br /><br /><br />  <br />       1: /*<br /><br /><br />       2: Copyright (c) 2011 andlt;a href=andquot;http://www.gutgames.comandquot;andgt;James Craigandlt;/aandgt;<br /><br /><br />       3: <br /><br /><br />       4: Permission is hereby granted, free of charge, to any person obtaining a copy<br /><br /><br />       5: of this software and associated documentation files (the andquot;Softwareandquot;), to deal<br /><br /><br />       6: in the Software without restriction, including without limitation the rights<br /><br /><br />       7: to use, copy, modify, merge, publish, distribute, sublicense, and/or sell<br /><br /><br />       8: copies of the Software, and to permit persons to whom the Software is<br /><br /><br />       9: furnished to do so, subject to the following conditions:<br /><br /><br />      10: <br /><br /><br />      11: The above copyright notice and this permission notice shall be included in<br /><br /><br />      12: all copies or substantial portions of the Software.<br /><br /><br />      13: <br /><br /><br />      14: THE SOFTWARE IS PROVIDED andquot;AS ISandquot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br /><br /><br />      15: IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br /><br /><br />      16: FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE<br /><br /><br />      17: AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER<br /><br /><br />      18: LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,<br /><br /><br />      19: OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN<br /><br /><br />      20: THE SOFTWARE.*/<br /><br /><br />      21: <br /><br /><br />      22: #region Usings<br /><br /><br />      23: using System;<br /><br /><br />      24: using System.Collections.Generic;<br /><br /><br />      25: using System.Linq;<br /><br /><br />      26: using System.Text;<br /><br /><br />      27: using Utilities.IoC.Mappings;<br /><br /><br />      28: using Utilities.IoC.Mappings.Interfaces;<br /><br /><br />      29: using System.Reflection;<br /><br /><br />      30: using Utilities.IoC.Mappings.Attributes;<br /><br /><br />      31: using Utilities.IoC.Providers.BaseClasses;<br /><br /><br />      32: using Utilities.DataTypes.ExtensionMethods;<br /><br /><br />      33: using Utilities.Reflection.ExtensionMethods;<br /><br /><br />      34: #endregion<br /><br /><br />      35: <br /><br /><br />      36: namespace Utilities.IoC.Providers.Implementations<br /><br /><br />      37: {<br /><br /><br />      38:     /// andlt;summaryandgt;<br /><br /><br />      39:     /// Standard implementation class<br /><br /><br />      40:     /// andlt;/summaryandgt;<br /><br /><br />      41:     public class Standard : BaseImplementation<br /><br /><br />      42:     {<br /><br /><br />      43:         #region Constructor<br /><br /><br />      44: <br /><br /><br />      45:         /// andlt;summaryandgt;<br /><br /><br />      46:         /// Constructor<br /><br /><br />      47:         /// andlt;/summaryandgt;<br /><br /><br />      48:         /// andlt;param name=andquot;ImplementationTypeandquot;andgt;Implementation typeandlt;/paramandgt;<br /><br /><br />      49:         /// andlt;param name=andquot;MappingManagerandquot;andgt;Mapping managerandlt;/paramandgt;<br /><br /><br />      50:         public Standard(Type ImplementationType, MappingManager MappingManager)<br /><br /><br />      51:         {<br /><br /><br />      52:             this.ReturnType = ImplementationType;<br /><br /><br />      53:             this.MappingManager = MappingManager;<br /><br /><br />      54:         }<br /><br /><br />      55: <br /><br /><br />      56:         #endregion<br /><br /><br />      57: <br /><br /><br />      58:         #region Functions<br /><br /><br />      59: <br /><br /><br />      60:         #region Create<br /><br /><br />      61: <br /><br /><br />      62:         public override object Create()<br /><br /><br />      63:         {<br /><br /><br />      64:             ConstructorInfo Constructor = Utils.ConstructorList.ChooseConstructor(ReturnType, MappingManager);<br /><br /><br />      65:             object Instance = CreateInstance(Constructor);<br /><br /><br />      66:             SetupProperties(Instance);<br /><br /><br />      67:             SetupMethods(Instance);<br /><br /><br />      68:             return Instance;<br /><br /><br />      69:         }<br /><br /><br />      70: <br /><br /><br />      71:         #endregion<br /><br /><br />      72: <br /><br /><br />      73:         #region SetupMethods<br /><br /><br />      74: <br /><br /><br />      75:         private void SetupMethods(object Instance)<br /><br /><br />      76:         {<br /><br /><br />      77:             if (Instance.IsNull())<br /><br /><br />      78:                 return;<br /><br /><br />      79:             foreach (MethodInfo Method in Instance.GetType().GetMethods().Where(x =andgt; IsInjectable(x)))<br /><br /><br />      80:                 Method.Invoke(Instance, Method.GetParameters().ForEach(x =andgt; CreateInstance(x)).ToArray());<br /><br /><br />      81:         }<br /><br /><br />      82: <br /><br /><br />      83:         #endregion<br /><br /><br />      84: <br /><br /><br />      85:         #region SetupProperties<br /><br /><br />      86: <br /><br /><br />      87:         private void SetupProperties(object Instance)<br /><br /><br />      88:         {<br /><br /><br />      89:             if (Instance.IsNull())<br /><br /><br />      90:                 return;<br /><br /><br />      91:             Instance.GetType()<br /><br /><br />      92:                 .GetProperties()<br /><br /><br />      93:                 .Where(x =andgt; IsInjectable(x))<br /><br /><br />      94:                 .ForEachandlt;PropertyInfoandgt;(x =andgt; Instance.SetProperty(x, CreateInstance(x)));<br /><br /><br />      95:         }<br /><br /><br />      96: <br /><br /><br />      97:         #endregion<br /><br /><br />      98: <br /><br /><br />      99:         #region IsInjectable<br /><br /><br />     100: <br /><br /><br />     101:         private bool IsInjectable(MethodInfo Method)<br /><br /><br />     102:         {<br /><br /><br />     103:             return IsInjectable(Method.GetCustomAttributes(false));<br /><br /><br />     104:         }<br /><br /><br />     105: <br /><br /><br />     106:         private bool IsInjectable(PropertyInfo Property)<br /><br /><br />     107:         {<br /><br /><br />     108:             return IsInjectable(Property.GetCustomAttributes(false));<br /><br /><br />     109:         }<br /><br /><br />     110: <br /><br /><br />     111:         private bool IsInjectable(object[] Attributes)<br /><br /><br />     112:         {<br /><br /><br />     113:             return Attributes.OfTypeandlt;Injectandgt;().Count() andgt; 0;<br /><br /><br />     114:         }<br /><br /><br />     115: <br /><br /><br />     116:         #endregion<br /><br /><br />     117: <br /><br /><br />     118:         #region CreateInstance<br /><br /><br />     119: <br /><br /><br />     120:         private object CreateInstance(ConstructorInfo Constructor)<br /><br /><br />     121:         {<br /><br /><br />     122:             if (Constructor.IsNull() || MappingManager.IsNull())<br /><br /><br />     123:                 return null;<br /><br /><br />     124:             Listandlt;objectandgt; ParameterValues = new Listandlt;objectandgt;();<br /><br /><br />     125:             Constructor.GetParameters().ForEachandlt;ParameterInfoandgt;(x =andgt; ParameterValues.Add(CreateInstance(x)));<br /><br /><br />     126:             return Constructor.Invoke(ParameterValues.ToArray());<br /><br /><br />     127:         }<br /><br /><br />     128: <br /><br /><br />     129:         private object CreateInstance(ParameterInfo Parameter)<br /><br /><br />     130:         {<br /><br /><br />     131:             return CreateInstance(Parameter.GetCustomAttributes(false), Parameter.ParameterType);<br /><br /><br />     132:         }<br /><br /><br />     133: <br /><br /><br />     134:         private object CreateInstance(PropertyInfo Property)<br /><br /><br />     135:         {<br /><br /><br />     136:             return CreateInstance(Property.GetCustomAttributes(false), Property.PropertyType);<br /><br /><br />     137:         }<br /><br /><br />     138: <br /><br /><br />     139:         private object CreateInstance(object[] Attributes, Type Type)<br /><br /><br />     140:         {<br /><br /><br />     141:             if (Attributes.Length andgt; 0)<br /><br /><br />     142:             {<br /><br /><br />     143:                 foreach (Attribute Attribute in Attributes)<br /><br /><br />     144:                 {<br /><br /><br />     145:                     object TempObject = GetObject(Type, Attribute.GetType());<br /><br /><br />     146:                     if (!TempObject.IsNull())<br /><br /><br />     147:                         return TempObject;<br /><br /><br />     148:                 }<br /><br /><br />     149:             }<br /><br /><br />     150:             return GetObject(Type);<br /><br /><br />     151:         }<br /><br /><br />     152: <br /><br /><br />     153:         #endregion<br /><br /><br />     154: <br /><br /><br />     155:         #region GetObject<br /><br /><br />     156: <br /><br /><br />     157:         private object GetObject(Type Type)<br /><br /><br />     158:         {<br /><br /><br />     159:             IMapping Mapping = MappingManager.GetMapping(Type);<br /><br /><br />     160:             return Mapping.IsNull() ? null : Mapping.Implementation.Create();<br /><br /><br />     161:         }<br /><br /><br />     162: <br /><br /><br />     163:         private object GetObject(Type Type, Type AttributeType)<br /><br /><br />     164:         {<br /><br /><br />     165:             IMapping Mapping = MappingManager.GetMapping(Type, AttributeType);<br /><br /><br />     166:             return Mapping.IsNull() ? null : Mapping.Implementation.Create();<br /><br /><br />     167:         }<br /><br /><br />     168: <br /><br /><br />     169:         #endregion<br /><br /><br />     170: <br /><br /><br />     171:         #endregion<br /><br /><br />     172: <br /><br /><br />     173:         #region Properties<br /><br /><br />     174: <br /><br /><br />     175:         /// andlt;summaryandgt;<br /><br /><br />     176:         /// Mapping manager<br /><br /><br />     177:         /// andlt;/summaryandgt;<br /><br /><br />     178:         protected virtual MappingManager MappingManager { get; set; }<br /><br /><br />     179: <br /><br /><br />     180:         #endregion<br /><br /><br />     181:     }<br /><br /><br />     182: }<br /><br /><br /><br /><br />  <br />       1: /*<br /><br /><br />       2: Copyright (c) 2011 andlt;a href=andquot;http://www.gutgames.comandquot;andgt;James Craigandlt;/aandgt;<br /><br /><br />       3: <br /><br /><br />       4: Permission is hereby granted, free of charge, to any person obtaining a copy<br /><br /><br />       5: of this software and associated documentation files (the andquot;Softwareandquot;), to deal<br /><br /><br />       6: in the Software without restriction, including without limitation the rights<br /><br /><br />       7: to use, copy, modify, merge, publish, distribute, sublicense, and/or sell<br /><br /><br />       8: copies of the Software, and to permit persons to whom the Software is<br /><br /><br />       9: furnished to do so, subject to the following conditions:<br /><br /><br />      10: <br /><br /><br />      11: The above copyright notice and this permission notice shall be included in<br /><br /><br />      12: all copies or substantial portions of the Software.<br /><br /><br />      13: <br /><br /><br />      14: THE SOFTWARE IS PROVIDED andquot;AS ISandquot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br /><br /><br />      15: IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br /><br /><br />      16: FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE<br /><br /><br />      17: AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER<br /><br /><br />      18: LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,<br /><br /><br />      19: OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN<br /><br /><br />      20: THE SOFTWARE.*/<br /><br /><br />      21: <br /><br /><br />      22: #region Usings<br /><br /><br />      23: using System;<br /><br /><br />      24: using System.Collections.Generic;<br /><br /><br />      25: using System.Linq;<br /><br /><br />      26: using System.Text;<br /><br /><br />      27: using Utilities.IoC.Providers.BaseClasses;<br /><br /><br />      28: #endregion<br /><br /><br />      29: <br /><br /><br />      30: namespace Utilities.IoC.Providers.Implementations<br /><br /><br />      31: {<br /><br /><br />      32:     /// andlt;summaryandgt;<br /><br /><br />      33:     /// Delegate implementation<br /><br /><br />      34:     /// andlt;/summaryandgt;<br /><br /><br />      35:     /// andlt;typeparam name=andquot;Tandquot;andgt;Return type of the delegateandlt;/typeparamandgt;<br /><br /><br />      36:     public class Delegateandlt;Tandgt; : BaseImplementation<br /><br /><br />      37:     {<br /><br /><br />      38:         #region Constructor<br /><br /><br />      39: <br /><br /><br />      40:         /// andlt;summaryandgt;<br /><br /><br />      41:         /// Constructor<br /><br /><br />      42:         /// andlt;/summaryandgt;<br /><br /><br />      43:         /// andlt;param name=andquot;Implementationandquot;andgt;Implementation delegateandlt;/paramandgt;<br /><br /><br />      44:         public Delegate(Funcandlt;Tandgt; Implementation)<br /><br /><br />      45:         {<br /><br /><br />      46:             this.Implementation = Implementation;<br /><br /><br />      47:             ReturnType = typeof(T);<br /><br /><br />      48:         }<br /><br /><br />      49: <br /><br /><br />      50:         #endregion<br /><br /><br />      51: <br /><br /><br />      52:         #region Functions<br /><br /><br />      53: <br /><br /><br />      54:         /// andlt;summaryandgt;<br /><br /><br />      55:         /// Creates an object based on a delegate<br /><br /><br />      56:         /// andlt;/summaryandgt;<br /><br /><br />      57:         /// andlt;returnsandgt;An objectandlt;/returnsandgt;<br /><br /><br />      58:         public override object Create()<br /><br /><br />      59:         {<br /><br /><br />      60:             return Implementation();<br /><br /><br />      61:         }<br /><br /><br />      62: <br /><br /><br />      63:         #endregion<br /><br /><br />      64: <br /><br /><br />      65:         #region Properties<br /><br /><br />      66: <br /><br /><br />      67:         /// andlt;summaryandgt;<br /><br /><br />      68:         /// Delegate used to create objects<br /><br /><br />      69:         /// andlt;/summaryandgt;<br /><br /><br />      70:         protected virtual Funcandlt;Tandgt; Implementation { get; set; }<br /><br /><br />      71: <br /><br /><br />      72:         #endregion<br /><br /><br />      73:     }<br /><br /><br />      74: }<br /><br /><br /><br />You’ll notice that the Delegate implementation is a bit simpler. In this case you provide a Func and we just assume you know how you want an item created so we just return it. The standard implementation though is a bit more complicated.<br /><br />When we call the standard implementation’s Create function, it calls this little utility to determine which constructor to use:<br /><br /><br />  <br />       1: /*<br /><br /><br />       2: Copyright (c) 2011 andlt;a href=andquot;http://www.gutgames.comandquot;andgt;James Craigandlt;/aandgt;<br /><br /><br />       3: <br /><br /><br />       4: Permission is hereby granted, free of charge, to any person obtaining a copy<br /><br /><br />       5: of this software and associated documentation files (the andquot;Softwareandquot;), to deal<br /><br /><br />       6: in the Software without restriction, including without limitation the rights<br /><br /><br />       7: to use, copy, modify, merge, publish, distribute, sublicense, and/or sell<br /><br /><br />       8: copies of the Software, and to permit persons to whom the Software is<br /><br /><br />       9: furnished to do so, subject to the following conditions:<br /><br /><br />      10: <br /><br /><br />      11: The above copyright notice and this permission notice shall be included in<br /><br /><br />      12: all copies or substantial portions of the Software.<br /><br /><br />      13: <br /><br /><br />      14: THE SOFTWARE IS PROVIDED andquot;AS ISandquot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br /><br /><br />      15: IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br /><br /><br />      16: FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE<br /><br /><br />      17: AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER<br /><br /><br />      18: LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,<br /><br /><br />      19: OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN<br /><br /><br />      20: THE SOFTWARE.*/<br /><br /><br />      21: <br /><br /><br />      22: #region Usings<br /><br /><br />      23: using System;<br /><br /><br />      24: using System.Collections.Generic;<br /><br /><br />      25: using System.Linq;<br /><br /><br />      26: using System.Text;<br /><br /><br />      27: using System.Reflection;<br /><br /><br />      28: using Utilities.IoC.Mappings;<br /><br /><br />      29: #endregion<br /><br /><br />      30: <br /><br /><br />      31: namespace Utilities.IoC.Utils<br /><br /><br />      32: {<br /><br /><br />      33:     public static class ConstructorList<br /><br /><br />      34:     {<br /><br /><br />      35:         public static ConstructorInfo ChooseConstructor(Type ImplementationType, MappingManager MappingManager)<br /><br /><br />      36:         {<br /><br /><br />      37:             ConstructorInfo[] Constructors = ImplementationType.GetConstructors();<br /><br /><br />      38:             int MaxValue = int.MinValue;<br /><br /><br />      39:             ConstructorInfo CurrentConstructor = null;<br /><br /><br />      40:             foreach (ConstructorInfo Constructor in Constructors)<br /><br /><br />      41:             {<br /><br /><br />      42:                 int Count = GetParameterCount(Constructor, MappingManager);<br /><br /><br />      43:                 if (Count andgt; MaxValue)<br /><br /><br />      44:                 {<br /><br /><br />      45:                     CurrentConstructor = Constructor;<br /><br /><br />      46:                     MaxValue = Count;<br /><br /><br />      47:                 }<br /><br /><br />      48:             }<br /><br /><br />      49:             return CurrentConstructor;<br /><br /><br />      50:         }<br /><br /><br />      51: <br /><br /><br />      52:         private static int GetParameterCount(ConstructorInfo Constructor, MappingManager MappingManager)<br /><br /><br />      53:         {<br /><br /><br />      54:             int Count = 0;<br /><br /><br />      55:             ParameterInfo[] Parameters = Constructor.GetParameters();<br /><br /><br />      56:             foreach (ParameterInfo Parameter in Parameters)<br /><br /><br />      57:             {<br /><br /><br />      58:                 bool Inject = true;<br /><br /><br />      59:                 object[] Attributes = Parameter.GetCustomAttributes(false);<br /><br /><br />      60:                 if (Attributes.Length andgt; 0)<br /><br /><br />      61:                 {<br /><br /><br />      62:                     foreach (Attribute Attribute in Attributes)<br /><br /><br />      63:                     {<br /><br /><br />      64:                         if (MappingManager.GetMapping(Parameter.ParameterType, Attribute.GetType()) != null)<br /><br /><br />      65:                         {<br /><br /><br />      66:                             ++Count;<br /><br /><br />      67:                             Inject = false;<br /><br /><br />      68:                             break;<br /><br /><br />      69:                         }<br /><br /><br />      70:                     }<br /><br /><br />      71:                 }<br /><br /><br />      72:                 if (Inject)<br /><br /><br />      73:                 {<br /><br /><br />      74:                     if (MappingManager.GetMapping(Parameter.ParameterType) != null)<br /><br /><br />      75:                         ++Count;<br /><br /><br />      76:                 }<br /><br /><br />      77:             }<br /><br /><br />      78:             if (Count == Parameters.Length)<br /><br /><br />      79:                 return Count;<br /><br /><br />      80:             return int.MinValue;<br /><br /><br />      81:         }<br /><br /><br />      82:     }<br /><br /><br />      83: }<br /><br /><br /><br />This bit of code simply determines which constructor has the most items that we know how to create and returns it. The Standard.Create function then takes that constructor and calls CreateInstance. This call determines the parameters of the constructor, and creates each one in turn using the MappingManager (we’ll get to that later). It then feeds the newly created items into the constructor and creates the object. After that it searches each method and each property to determine if they have been marked for injection also (note that this is done using an attribute called Inject). If it finds anything, it creates more objects in the same manner as the parameters for the constructor. Once it’s done with that, it returns the newly created object.<br /><br />So at this point we have our code to actually create our objects but we have nothing mapping it to anything. We can create but we don’t know when and we don’t know why. That’s where the MappingManager comes in.<br /><br /><br />  <br />       1: /*<br /><br /><br />       2: Copyright (c) 2011 andlt;a href=andquot;http://www.gutgames.comandquot;andgt;James Craigandlt;/aandgt;<br /><br /><br />       3: <br /><br /><br />       4: Permission is hereby granted, free of charge, to any person obtaining a copy<br /><br /><br />       5: of this software and associated documentation files (the andquot;Softwareandquot;), to deal<br /><br /><br />       6: in the Software without restriction, including without limitation the rights<br /><br /><br />       7: to use, copy, modify, merge, publish, distribute, sublicense, and/or sell<br /><br /><br />       8: copies of the Software, and to permit persons to whom the Software is<br /><br /><br />       9: furnished to do so, subject to the following conditions:<br /><br /><br />      10: <br /><br /><br />      11: The above copyright notice and this permission notice shall be included in<br /><br /><br />      12: all copies or substantial portions of the Software.<br /><br /><br />      13: <br /><br /><br />      14: THE SOFTWARE IS PROVIDED andquot;AS ISandquot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br /><br /><br />      15: IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br /><br /><br />      16: FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE<br /><br /><br />      17: AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER<br /><br /><br />      18: LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,<br /><br /><br />      19: OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN<br /><br /><br />      20: THE SOFTWARE.*/<br /><br /><br />      21: <br /><br /><br />      22: #region Usings<br /><br /><br />      23: using System;<br /><br /><br />      24: using System.Collections.Generic;<br /><br /><br />      25: using System.Linq;<br /><br /><br />      26: using System.Text;<br /><br /><br />      27: using Utilities.IoC.Mappings.Interfaces;<br /><br /><br />      28: using System.Reflection;<br /><br /><br />      29: using Utilities.IoC.Providers;<br /><br /><br />      30: using Utilities.Reflection.ExtensionMethods;<br /><br /><br />      31: using Utilities.IoC.Mappings.Internal_Classes;<br /><br /><br />      32: using Utilities.IoC.Mappings.BaseClasses;<br /><br /><br />      33: #endregion<br /><br /><br />      34: <br /><br /><br />      35: namespace Utilities.IoC.Mappings<br /><br /><br />      36: {<br /><br /><br />      37:     /// andlt;summaryandgt;<br /><br /><br />      38:     /// Mapping manager<br /><br /><br />      39:     /// andlt;/summaryandgt;<br /><br /><br />      40:     public class MappingManager<br /><br /><br />      41:     {<br /><br /><br />      42:         #region Constructor<br /><br /><br />      43: <br /><br /><br />      44:         /// andlt;summaryandgt;<br /><br /><br />      45:         /// Constructor<br /><br /><br />      46:         /// andlt;/summaryandgt;<br /><br /><br />      47:         public MappingManager(ProviderManager ProviderManager)<br /><br /><br />      48:         {<br /><br /><br />      49:             Modules = new Listandlt;IModuleandgt;();<br /><br /><br />      50:             Mappings = new Listandlt;IMappingandgt;();<br /><br /><br />      51:             this.ProviderManager = ProviderManager;<br /><br /><br />      52:         }<br /><br /><br />      53: <br /><br /><br />      54:         #endregion<br /><br /><br />      55: <br /><br /><br />      56:         #region Functions<br /><br /><br />      57: <br /><br /><br />      58:         /// andlt;summaryandgt;<br /><br /><br />      59:         /// Scans the assembly for mapping modules and creates them<br /><br /><br />      60:         /// andlt;/summaryandgt;<br /><br /><br />      61:         /// andlt;param name=andquot;ModuleAssemblyandquot;andgt;andlt;/paramandgt;<br /><br /><br />      62:         public void Setup(Assembly ModuleAssembly)<br /><br /><br />      63:         {<br /><br /><br />      64:             IEnumerableandlt;Typeandgt; Modules = ModuleAssembly.GetTypes(typeof(IModule));<br /><br /><br />      65:             Listandlt;IModuleandgt; TempModules = new Listandlt;IModuleandgt;();<br /><br /><br />      66:             foreach (Type Module in Modules)<br /><br /><br />      67:             {<br /><br /><br />      68:                 if (!Module.IsInterface andamp;andamp; !Module.IsAbstract)<br /><br /><br />      69:                     TempModules.Add((IModule)Module.Assembly.CreateInstance(Module.FullName));<br /><br /><br />      70:             }<br /><br /><br />      71:             foreach (IModule Module in TempModules)<br /><br /><br />      72:             {<br /><br /><br />      73:                 Module.Manager = this;<br /><br /><br />      74:                 Module.Setup();<br /><br /><br />      75:             }<br /><br /><br />      76:             this.Modules.AddRange(TempModules);<br /><br /><br />      77:         }<br /><br /><br />      78: <br /><br /><br />      79:         /// andlt;summaryandgt;<br /><br /><br />      80:         /// Creates a mapping object<br /><br /><br />      81:         /// andlt;/summaryandgt;<br /><br /><br />      82:         /// andlt;param name=andquot;ServiceTypeandquot;andgt;Service typeandlt;/paramandgt;<br /><br /><br />      83:         /// andlt;returnsandgt;a mapping objectandlt;/returnsandgt;<br /><br /><br />      84:         public IMapping CreateMapping(Type ServiceType)<br /><br /><br />      85:         {<br /><br /><br />      86:             IMapping Mapping = new Mapping(ServiceType, ProviderManager, this);<br /><br /><br />      87:             Mappings.Add(Mapping);<br /><br /><br />      88:             return Mapping;<br /><br /><br />      89:         }<br /><br /><br />      90: <br /><br /><br />      91:         /// andlt;summaryandgt;<br /><br /><br />      92:         /// Creates a mapping object<br /><br /><br />      93:         /// andlt;/summaryandgt;<br /><br /><br />      94:         /// andlt;param name=andquot;ServiceTypeandquot;andgt;Service typeandlt;/paramandgt;<br /><br /><br />      95:         /// andlt;param name=andquot;AttributeTypeandquot;andgt;Attribute typeandlt;/paramandgt;<br /><br /><br />      96:         /// andlt;returnsandgt;A mapping objectandlt;/returnsandgt;<br /><br /><br />      97:         public IMapping CreateMapping(Type ServiceType, Type AttributeType)<br /><br /><br />      98:         {<br /><br /><br />      99:             IMapping Mapping = new Mapping(ServiceType, AttributeType, ProviderManager, this);<br /><br /><br />     100:             Mappings.Add(Mapping);<br /><br /><br />     101:             return Mapping;<br /><br /><br />     102:         }<br /><br /><br />     103: <br /><br /><br />     104:         /// andlt;summaryandgt;<br /><br /><br />     105:         /// Gets the mapping that matches this service type<br /><br /><br />     106:         /// andlt;/summaryandgt;<br /><br /><br />     107:         /// andlt;param name=andquot;ServiceTypeandquot;andgt;Service typeandlt;/paramandgt;<br /><br /><br />     108:         /// andlt;returnsandgt;The mapping associated with this service typeandlt;/returnsandgt;<br /><br /><br />     109:         public IMapping GetMapping(Type ServiceType)<br /><br /><br />     110:         {<br /><br /><br />     111:             MappingKey Key = new MappingKey(ServiceType, null, ProviderManager, this);<br /><br /><br />     112:             return Mappings.Find(x =andgt; x.Equals(Key));<br /><br /><br />     113:         }<br /><br /><br />     114: <br /><br /><br />     115:         /// andlt;summaryandgt;<br /><br /><br />     116:         /// Gets the mapping that matches this service type and attribute type<br /><br /><br />     117:         /// andlt;/summaryandgt;<br /><br /><br />     118:         /// andlt;param name=andquot;ServiceTypeandquot;andgt;Service typeandlt;/paramandgt;<br /><br /><br />     119:         /// andlt;param name=andquot;AttributeTypeandquot;andgt;Attribute typeandlt;/paramandgt;<br /><br /><br />     120:         /// andlt;returnsandgt;The mapping associated with this service type and attribute typeandlt;/returnsandgt;<br /><br /><br />     121:         public IMapping GetMapping(Type ServiceType, Type AttributeType)<br /><br /><br />     122:         {<br /><br /><br />     123:             MappingKey Key = new MappingKey(ServiceType, AttributeType, ProviderManager, this);<br /><br /><br />     124:             return Mappings.Find(x =andgt; x.Equals(Key));<br /><br /><br />     125:         }<br /><br /><br />     126: <br /><br /><br />     127:         #endregion<br /><br /><br />     128: <br /><br /><br />     129:         #region Properties<br /><br /><br />     130: <br /><br /><br />     131:         /// andlt;summaryandgt;<br /><br /><br />     132:         /// Modules listing<br /><br /><br />     133:         /// andlt;/summaryandgt;<br /><br /><br />     134:         protected virtual Listandlt;IModuleandgt; Modules { get; set; }<br /><br /><br />     135: <br /><br /><br />     136:         /// andlt;summaryandgt;<br /><br /><br />     137:         /// Mapping listing<br /><br /><br />     138:         /// andlt;/summaryandgt;<br /><br /><br />     139:         protected virtual Listandlt;IMappingandgt; Mappings { get; set; }<br /><br /><br />     140: <br /><br /><br />     141:         /// andlt;summaryandgt;<br /><br /><br />     142:         /// Provider manager<br /><br /><br />     143:         /// andlt;/summaryandgt;<br /><br /><br />     144:         protected virtual ProviderManager ProviderManager { get; set; }<br /><br /><br />     145: <br /><br /><br />     146:         #endregion<br /><br /><br />     147:     }<br /><br /><br />     148: }<br /><br /><br /><br />The MappingManager is also a bit bare on implementation. All it does is holds a series of mappings and modules and creates them/returns them as necessary. A module is actually not defined inside the system itself. It’s what the end user would use to let the system know what mappings to use. It uses the following interface and base class:<br /><br /><br />  <br />       1: /*<br /><br /><br />       2: Copyright (c) 2011 andlt;a href=andquot;http://www.gutgames.comandquot;andgt;James Craigandlt;/aandgt;<br /><br /><br />       3: <br /><br /><br />       4: Permission is hereby granted, free of charge, to any person obtaining a copy<br /><br /><br />       5: of this software and associated documentation files (the andquot;Softwareandquot;), to deal<br /><br /><br />       6: in the Software without restriction, including without limitation the rights<br /><br /><br />       7: to use, copy, modify, merge, publish, distribute, sublicense, and/or sell<br /><br /><br />       8: copies of the Software, and to permit persons to whom the Software is<br /><br /><br />       9: furnished to do so, subject to the following conditions:<br /><br /><br />      10: <br /><br /><br />      11: The above copyright notice and this permission notice shall be included in<br /><br /><br />      12: all copies or substantial portions of the Software.<br /><br /><br />      13: <br /><br /><br />      14: THE SOFTWARE IS PROVIDED andquot;AS ISandquot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br /><br /><br />      15: IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br /><br /><br />      16: FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE<br /><br /><br />      17: AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER<br /><br /><br />      18: LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,<br /><br /><br />      19: OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN<br /><br /><br />      20: THE SOFTWARE.*/<br /><br /><br />      21: <br /><br /><br />      22: #region Usings<br /><br /><br />      23: using System;<br /><br /><br />      24: using System.Collections.Generic;<br /><br /><br />      25: using System.Linq;<br /><br /><br />      26: using System.Text;<br /><br /><br />      27: #endregion<br /><br /><br />      28: <br /><br /><br />      29: namespace Utilities.IoC.Mappings.Interfaces<br /><br /><br />      30: {<br /><br /><br />      31:     /// andlt;summaryandgt;<br /><br /><br />      32:     /// Mapping module interface<br /><br /><br />      33:     /// andlt;/summaryandgt;<br /><br /><br />      34:     public interface IModule<br /><br /><br />      35:     {<br /><br /><br />      36:         #region Functions<br /><br /><br />      37: <br /><br /><br />      38:         /// andlt;summaryandgt;<br /><br /><br />      39:         /// Called to setup the module (actual mapping occurs here)<br /><br /><br />      40:         /// andlt;/summaryandgt;<br /><br /><br />      41:         void Setup();<br /><br /><br />      42: <br /><br /><br />      43:         #endregion<br /><br /><br />      44: <br /><br /><br />      45:         #region Properties<br /><br /><br />      46: <br /><br /><br />      47:         MappingManager Manager { get; set; }<br /><br /><br />      48: <br /><br /><br />      49:         #endregion<br /><br /><br />      50:     }<br /><br /><br />      51: }<br /><br /><br /><br /><br />  <br />       1: /*<br /><br /><br />       2: Copyright (c) 2011 andlt;a href=andquot;http://www.gutgames.comandquot;andgt;James Craigandlt;/aandgt;<br /><br /><br />       3: <br /><br /><br />       4: Permission is hereby granted, free of charge, to any person obtaining a copy<br /><br /><br />       5: of this software and associated documentation files (the andquot;Softwareandquot;), to deal<br /><br /><br />       6: in the Software without restriction, including without limitation the rights<br /><br /><br />       7: to use, copy, modify, merge, publish, distribute, sublicense, and/or sell<br /><br /><br />       8: copies of the Software, and to permit persons to whom the Software is<br /><br /><br />       9: furnished to do so, subject to the following conditions:<br /><br /><br />      10: <br /><br /><br />      11: The above copyright notice and this permission notice shall be included in<br /><br /><br />      12: all copies or substantial portions of the Software.<br /><br /><br />      13: <br /><br /><br />      14: THE SOFTWARE IS PROVIDED andquot;AS ISandquot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br /><br /><br />      15: IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br /><br /><br />      16: FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE<br /><br /><br />      17: AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER<br /><br /><br />      18: LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,<br /><br /><br />      19: OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN<br /><br /><br />      20: THE SOFTWARE.*/<br /><br /><br />      21: <br /><br /><br />      22: #region Usings<br /><br /><br />      23: using System;<br /><br /><br />      24: using System.Collections.Generic;<br /><br /><br />      25: using System.Linq;<br /><br /><br />      26: using System.Text;<br /><br /><br />      27: using Utilities.IoC.Mappings.Interfaces;<br /><br /><br />      28: #endregion<br /><br /><br />      29: <br /><br /><br />      30: namespace Utilities.IoC.Mappings.BaseClasses<br /><br /><br />      31: {<br /><br /><br />      32:     /// andlt;summaryandgt;<br /><br /><br />      33:     /// Base module class<br /><br /><br />      34:     /// andlt;/summaryandgt;<br /><br /><br />      35:     public abstract class BaseModule : IModule<br /><br /><br />      36:     {<br /><br /><br />      37:         #region Functions<br /><br /><br />      38: <br /><br /><br />      39:         public abstract void Setup();<br /><br /><br />      40: <br /><br /><br />      41:         /// andlt;summaryandgt;<br /><br /><br />      42:         /// Creates a mapping using a specific service type<br /><br /><br />      43:         /// andlt;/summaryandgt;<br /><br /><br />      44:         /// andlt;typeparam name=andquot;ServiceTypeandquot;andgt;Service typeandlt;/typeparamandgt;<br /><br /><br />      45:         /// andlt;returnsandgt;A mapping objectandlt;/returnsandgt;<br /><br /><br />      46:         public virtual IMapping Mapandlt;ServiceTypeandgt;()<br /><br /><br />      47:         {<br /><br /><br />      48:             return Map(typeof(ServiceType));<br /><br /><br />      49:         }<br /><br /><br />      50: <br /><br /><br />      51:         /// andlt;summaryandgt;<br /><br /><br />      52:         /// Creates a mapping using a specific service type and attribute type<br /><br /><br />      53:         /// andlt;/summaryandgt;<br /><br /><br />      54:         /// andlt;typeparam name=andquot;ServiceTypeandquot;andgt;Service typeandlt;/typeparamandgt;<br /><br /><br />      55:         /// andlt;typeparam name=andquot;AttributeTypeandquot;andgt;Attribute typeandlt;/typeparamandgt;<br /><br /><br />      56:         /// andlt;returnsandgt;A mapping objectandlt;/returnsandgt;<br /><br /><br />      57:         public virtual IMapping Mapandlt;ServiceType, AttributeTypeandgt;()<br /><br /><br />      58:         {<br /><br /><br />      59:             return Map(typeof(ServiceType), typeof(AttributeType));<br /><br /><br />      60:         }<br /><br /><br />      61: <br /><br /><br />      62:         /// andlt;summaryandgt;<br /><br /><br />      63:         /// Creates a mapping using a specific service type<br /><br /><br />      64:         /// andlt;/summaryandgt;<br /><br /><br />      65:         /// andlt;param name=andquot;ServiceTypeandquot;andgt;Service typeandlt;/paramandgt;<br /><br /><br />      66:         /// andlt;param name=andquot;AttributeTypeandquot;andgt;Attribute typeandlt;/paramandgt;<br /><br /><br />      67:         /// andlt;returnsandgt;A mapping objectandlt;/returnsandgt;<br /><br /><br />      68:         public virtual IMapping Map(Type ServiceType, Type AttributeType = null)<br /><br /><br />      69:         {<br /><br /><br />      70:             return Manager.CreateMapping(ServiceType, AttributeType);<br /><br /><br />      71:         }<br /><br /><br />      72: <br /><br /><br />      73:         #endregion<br /><br /><br />      74: <br /><br /><br />      75:         #region Properties<br /><br /><br />      76: <br /><br /><br />      77:         public virtual MappingManager Manager { get; set; }<br /><br /><br />      78: <br /><br /><br />      79:         #endregion<br /><br /><br />      80:     }<br /><br /><br />      81: }<br /><br /><br /><br />For example, in your code, you would define a module like this:<br /><br /><br />  <br />       1: public class Module : BaseModule<br /><br /><br />       2: {<br /><br /><br />       3:     public override void Setup()<br /><br /><br />       4:     {<br /><br /><br />       5:         Mapandlt;ITestInterfaceandgt;().Toandlt;TestClass1andgt;().SetScope(new StandardScope());<br /><br /><br />       6:         Mapandlt;TestClass1andgt;().Toandlt;TestClass1andgt;(() =andgt; new TestClass1());<br /><br /><br />       7:         Mapandlt;ITestInterface, MyAttributeandgt;().To(new TestImplementation());<br /><br /><br />       8:         Mapandlt;TestClass2andgt;().Toandlt;TestClass2andgt;();<br /><br /><br />       9:     }<br /><br /><br />      10: }<br /><br /><br /><br />This module defines four mappings that the system can use. A mapping is, as the name suggests, a mapping between a key type and what should be created when it encounters that type. For instance whenever I hit the interface ITestInterface, we return a TestClass1 object. The module can also define the scope for the object and sets the implementation used. In the example above the first item maps ITestInterface to TestClass1 and sets the scope to StandardScope. The third item maps ITestInterface items that have the MyAttribute attribute to the TestImplementation implementation. Whenever you call Map in a module, it creates and returns a Mapping class:<br /><br /><br />  <br />       1: /*<br /><br /><br />       2: Copyright (c) 2011 andlt;a href=andquot;http://www.gutgames.comandquot;andgt;James Craigandlt;/aandgt;<br /><br /><br />       3: <br /><br /><br />       4: Permission is hereby granted, free of charge, to any person obtaining a copy<br /><br /><br />       5: of this software and associated documentation files (the andquot;Softwareandquot;), to deal<br /><br /><br />       6: in the Software without restriction, including without limitation the rights<br /><br /><br />       7: to use, copy, modify, merge, publish, distribute, sublicense, and/or sell<br /><br /><br />       8: copies of the Software, and to permit persons to whom the Software is<br /><br /><br />       9: furnished to do so, subject to the following conditions:<br /><br /><br />      10: <br /><br /><br />      11: The above copyright notice and this permission notice shall be included in<br /><br /><br />      12: all copies or substantial portions of the Software.<br /><br /><br />      13: <br /><br /><br />      14: THE SOFTWARE IS PROVIDED andquot;AS ISandquot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br /><br /><br />      15: IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br /><br /><br />      16: FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE<br /><br /><br />      17: AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER<br /><br /><br />      18: LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,<br /><br /><br />      19: OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN<br /><br /><br />      20: THE SOFTWARE.*/<br /><br /><br />      21: <br /><br /><br />      22: #region Usings<br /><br /><br />      23: using System;<br /><br /><br />      24: using System.Collections.Generic;<br /><br /><br />      25: using System.Linq;<br /><br /><br />      26: using System.Text;<br /><br /><br />      27: using Utilities.IoC.Mappings.BaseClasses;<br /><br /><br />      28: using Utilities.IoC.Providers;<br /><br /><br />      29: #endregion<br /><br /><br />      30: <br /><br /><br />      31: namespace Utilities.IoC.Mappings.Internal_Classes<br /><br /><br />      32: {<br /><br /><br />      33:     /// andlt;summaryandgt;<br /><br /><br />      34:     /// Mapping class<br /><br /><br />      35:     /// andlt;/summaryandgt;<br /><br /><br />      36:     public class Mapping : MappingKey<br /><br /><br />      37:     {<br /><br /><br />      38:         #region Constructors<br /><br /><br />      39: <br /><br /><br />      40:         /// andlt;summaryandgt;<br /><br /><br />      41:         /// Constructor<br /><br /><br />      42:         /// andlt;/summaryandgt;<br /><br /><br />      43:         /// andlt;param name=andquot;ServiceTypeandquot;andgt;Service typeandlt;/paramandgt;<br /><br /><br />      44:         public Mapping(Type ServiceType, ProviderManager ProviderManager, MappingManager MappingManager)<br /><br /><br />      45:             : base(ServiceType, null, ProviderManager, MappingManager)<br /><br /><br />      46:         {<br /><br /><br />      47:         }<br /><br /><br />      48: <br /><br /><br />      49:         /// andlt;summaryandgt;<br /><br /><br />      50:         /// Constructor<br /><br /><br />      51:         /// andlt;/summaryandgt;<br /><br /><br />      52:         /// andlt;param name=andquot;ServiceTypeandquot;andgt;Service typeandlt;/paramandgt;<br /><br /><br />      53:         /// andlt;param name=andquot;AttributeTypeandquot;andgt;Attribute typeandlt;/paramandgt;<br /><br /><br />      54:         public Mapping(Type ServiceType, Type AttributeType, ProviderManager ProviderManager, MappingManager MappingManager)<br /><br /><br />      55:             : base(ServiceType, AttributeType, ProviderManager, MappingManager)<br /><br /><br />      56:         {<br /><br /><br />      57:         }<br /><br /><br />      58: <br /><br /><br />      59:         #endregion<br /><br /><br />      60:     }<br /><br /><br />      61: }<br /><br /><br /><br /><br />  <br />       1: /*<br /><br /><br />       2: Copyright (c) 2011 andlt;a href=andquot;http://www.gutgames.comandquot;andgt;James Craigandlt;/aandgt;<br /><br /><br />       3: <br /><br /><br />       4: Permission is hereby granted, free of charge, to any person obtaining a copy<br /><br /><br />       5: of this software and associated documentation files (the andquot;Softwareandquot;), to deal<br /><br /><br />       6: in the Software without restriction, including without limitation the rights<br /><br /><br />       7: to use, copy, modify, merge, publish, distribute, sublicense, and/or sell<br /><br /><br />       8: copies of the Software, and to permit persons to whom the Software is<br /><br /><br />       9: furnished to do so, subject to the following conditions:<br /><br /><br />      10: <br /><br /><br />      11: The above copyright notice and this permission notice shall be included in<br /><br /><br />      12: all copies or substantial portions of the Software.<br /><br /><br />      13: <br /><br /><br />      14: THE SOFTWARE IS PROVIDED andquot;AS ISandquot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br /><br /><br />      15: IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br /><br /><br />      16: FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE<br /><br /><br />      17: AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER<br /><br /><br />      18: LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,<br /><br /><br />      19: OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN<br /><br /><br />      20: THE SOFTWARE.*/<br /><br /><br />      21: <br /><br /><br />      22: #region Usings<br /><br /><br />      23: using System;<br /><br /><br />      24: using System.Collections.Generic;<br /><br /><br />      25: using System.Linq;<br /><br /><br />      26: using System.Text;<br /><br /><br />      27: using Utilities.IoC.Mappings.Interfaces;<br /><br /><br />      28: using Utilities.IoC.Providers;<br /><br /><br />      29: #endregion<br /><br /><br />      30: <br /><br /><br />      31: namespace Utilities.IoC.Mappings.BaseClasses<br /><br /><br />      32: {<br /><br /><br />      33:     /// andlt;summaryandgt;<br /><br /><br />      34:     /// Mapping key<br /><br /><br />      35:     /// andlt;/summaryandgt;<br /><br /><br />      36:     public class MappingKey : BaseMapping<br /><br /><br />      37:     {<br /><br /><br />      38:         #region Constructor<br /><br /><br />      39: <br /><br /><br />      40:         public MappingKey(Type ServiceType, Type AttributeType, ProviderManager ProviderManager, MappingManager MappingManager)<br /><br /><br />      41:             : base(ServiceType, AttributeType, ProviderManager, MappingManager)<br /><br /><br />      42:         {<br /><br /><br />      43:         }<br /><br /><br />      44: <br /><br /><br />      45:         #endregion<br /><br /><br />      46: <br /><br /><br />      47:         #region Functions<br /><br /><br />      48: <br /><br /><br />      49:         public override bool Equals(object obj)<br /><br /><br />      50:         {<br /><br /><br />      51:             if (!(obj is IMapping))<br /><br /><br />      52:                 return false;<br /><br /><br />      53:             IMapping ObjectMapping = (IMapping)obj;<br /><br /><br />      54:             return ObjectMapping.AttributeType == AttributeType<br /><br /><br />      55:                 andamp;andamp; ObjectMapping.ServiceType == ServiceType;<br /><br /><br />      56:         }<br /><br /><br />      57: <br /><br /><br />      58:         public override int GetHashCode()<br /><br /><br />      59:         {<br /><br /><br />      60:             int AttributeHash = AttributeType == null ? 1 : AttributeType.GetHashCode();<br /><br /><br />      61:             int ServiceHash = ServiceType == null ? 1 : ServiceType.GetHashCode();<br /><br /><br />      62:             return ServiceHash * AttributeHash;<br /><br /><br />      63:         }<br /><br /><br />      64: <br /><br /><br />      65:         #endregion<br /><br /><br />      66:     }<br /><br /><br />      67: }<br /><br /><br /><br /><br />  <br />       1: /*<br /><br /><br />       2: Copyright (c) 2011 andlt;a href=andquot;http://www.gutgames.comandquot;andgt;James Craigandlt;/aandgt;<br /><br /><br />       3: <br /><br /><br />       4: Permission is hereby granted, free of charge, to any person obtaining a copy<br /><br /><br />       5: of this software and associated documentation files (the andquot;Softwareandquot;), to deal<br /><br /><br />       6: in the Software without restriction, including without limitation the rights<br /><br /><br />       7: to use, copy, modify, merge, publish, distribute, sublicense, and/or sell<br /><br /><br />       8: copies of the Software, and to permit persons to whom the Software is<br /><br /><br />       9: furnished to do so, subject to the following conditions:<br /><br /><br />      10: <br /><br /><br />      11: The above copyright notice and this permission notice shall be included in<br /><br /><br />      12: all copies or substantial portions of the Software.<br /><br /><br />      13: <br /><br /><br />      14: THE SOFTWARE IS PROVIDED andquot;AS ISandquot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br /><br /><br />      15: IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br /><br /><br />      16: FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE<br /><br /><br />      17: AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER<br /><br /><br />      18: LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,<br /><br /><br />      19: OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN<br /><br /><br />      20: THE SOFTWARE.*/<br /><br /><br />      21: <br /><br /><br />      22: #region Usings<br /><br /><br />      23: using System;<br /><br /><br />      24: using System.Collections.Generic;<br /><br /><br />      25: using System.Linq;<br /><br /><br />      26: using System.Text;<br /><br /><br />      27: using Utilities.IoC.Mappings.Interfaces;<br /><br /><br />      28: using Utilities.IoC.Providers;<br /><br /><br />      29: using Utilities.IoC.Providers.Scope;<br /><br /><br />      30: using Utilities.IoC.Providers.Interfaces;<br /><br /><br />      31: #endregion<br /><br /><br />      32: <br /><br /><br />      33: namespace Utilities.IoC.Mappings.BaseClasses<br /><br /><br />      34: {<br /><br /><br />      35:     /// andlt;summaryandgt;<br /><br /><br />      36:     /// Base mapping<br /><br /><br />      37:     /// andlt;/summaryandgt;<br /><br /><br />      38:     public class BaseMapping : IMapping<br /><br /><br />      39:     {<br /><br /><br />      40:         #region Constructor<br /><br /><br />      41: <br /><br /><br />      42:         /// andlt;summaryandgt;<br /><br /><br />      43:         /// Constructor<br /><br /><br />      44:         /// andlt;/summaryandgt;<br /><br /><br />      45:         /// andlt;param name=andquot;ServiceTypeandquot;andgt;Service typeandlt;/paramandgt;<br /><br /><br />      46:         /// andlt;param name=andquot;AttributeTypeandquot;andgt;Attribute typeandlt;/paramandgt;<br /><br /><br />      47:         public BaseMapping(Type ServiceType, Type AttributeType, ProviderManager ProviderManager, MappingManager MappingManager)<br /><br /><br />      48:         {<br /><br /><br />      49:             this.ServiceType = ServiceType;<br /><br /><br />      50:             this.AttributeType = AttributeType;<br /><br /><br />      51:             this.ProviderManager = ProviderManager;<br /><br /><br />      52:             this.MappingManager = MappingManager;<br /><br /><br />      53:             this.Scope = new StandardScope();<br /><br /><br />      54:         }<br /><br /><br />      55: <br /><br /><br />      56:         #endregion<br /><br /><br />      57: <br /><br /><br />      58:         #region Functions<br /><br /><br />      59: <br /><br /><br />      60:         public virtual IMapping Toandlt;ImplementationTypeandgt;()<br /><br /><br />      61:         {<br /><br /><br />      62:             return To(typeof(ImplementationType));<br /><br /><br />      63:         }<br /><br /><br />      64: <br /><br /><br />      65:         public virtual IMapping To(Type ImplementationType)<br /><br /><br />      66:         {<br /><br /><br />      67:             Implementation = ProviderManager.GetProvider(Scope).CreateImplementation(ImplementationType, MappingManager);<br /><br /><br />      68:             return this;<br /><br /><br />      69:         }<br /><br /><br />      70: <br /><br /><br />      71:         public virtual IMapping Toandlt;ImplementationTypeandgt;(Funcandlt;ImplementationTypeandgt; Implementation)<br /><br /><br />      72:         {<br /><br /><br />      73:             this.Implementation = ProviderManager.GetProvider(Scope).CreateImplementation(Implementation);<br /><br /><br />      74:             return this;<br /><br /><br />      75:         }<br /><br /><br />      76: <br /><br /><br />      77:         public virtual IMapping To(Providers.Interfaces.IImplementation Implementation)<br /><br /><br />      78:         {<br /><br /><br />      79:             this.Implementation = Implementation;<br /><br /><br />      80:             return this;<br /><br /><br />      81:         }<br /><br /><br />      82: <br /><br /><br />      83:         public virtual IMapping SetScope(BaseScope Scope)<br /><br /><br />      84:         {<br /><br /><br />      85:             this.Scope = Scope;<br /><br /><br />      86:             Implementation = ProviderManager.GetProvider(Scope).CreateImplementation(Implementation, MappingManager);<br /><br /><br />      87:             return this;<br /><br /><br />      88:         }<br /><br /><br />      89: <br /><br /><br />      90:         #endregion<br /><br /><br />      91: <br /><br /><br />      92:         #region Properties<br /><br /><br />      93: <br /><br /><br />      94:         public virtual Type ServiceType { get; protected set; }<br /><br /><br />      95:         public virtual Type AttributeType { get; protected set; }<br /><br /><br />      96:         public virtual BaseScope Scope { get; protected set; }<br /><br /><br />      97:         public virtual IImplementation Implementation { get; protected set; }<br /><br /><br />      98:         protected virtual ProviderManager ProviderManager { get; set; }<br /><br /><br />      99:         protected virtual MappingManager MappingManager { get; set; }<br /><br /><br />     100: <br /><br /><br />     101:         #endregion<br /><br /><br />     102:     }<br /><br /><br />     103: }<br /><br /><br /><br />The Mapping class is rather empty, the MappingKey actually defines the functions needed to determine which mapping is which. And the BaseMapping class holds the functions that set the scope, set the implementation, etc. And with that we’re done.<br /><br />We create our modules, which sets our mappings, which the system holds for us until we tell the manager to get us a specific object type. Once we do that, it assembles our object for us. It’s not that complicated really and not that much code either (the largest file tops out at 189 lines of code including comments). And with that we have ourselves a simple DI container.<br /><br />If you want updates, or find bugs, etc. check out the repository for the utility library (this is currently under the Utilities.IoC namespace). I’m terrible about updating my site but I update the code there whenever a bug is found. And hopefully I’ll finish my huge update to that library before too long (and it is going to contain a number of changes and additions). Anyway, take a look at the code and happy coding.]]></itunes:summary><feedburner:origLink>http://www.gutgames.com/post/Building-an-DI-Container.aspx</feedburner:origLink></item>
<item><title>Utility Library Progress</title>
<link>http://feedproxy.google.com/~r/GutInstinct/~3/ves4ko550b8/Utility-Library-Progress.aspx</link>
<author>James Craig</author>
<pubDate>Thu, 08 Sep 2011 21:38:08 GMT</pubDate>
<description>Between losing power for a week, being without internet for another week, and having family in town for yet another week, I’ve had no chance to post this. Nor have I had a chance to post a number of things that I’ve been meaning to. Hopefully that will change here. So if you've been following my utility library's progress, you'll know that I'm doing a major rework of a number of classes, I've been going in and rewriting my private unit tests so I can actually release them to everyone, and I've been clearing out old code that I no longer use or plan to maintain. This means that if you plan on going from the current 2.2 to what will become 3.0, you'll need to make some changes to your code.  For example, let's look at some encryption code. Before if you wanted to encrypt something you would have to call the static function Utilities.Encryption.AESEncryption.Encrypt. It only took in a string and would only encrypt it using AES:             1: /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       2: /// Encrypts a string&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       3: /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       4: /// andlt;param name=andquot;PlainTextandquot;andgt;Text to be encryptedandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       5: /// andlt;param name=andquot;Passwordandquot;andgt;Password to encrypt withandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       6: /// andlt;param name=andquot;Saltandquot;andgt;Salt to encrypt withandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       7: /// andlt;param name=andquot;HashAlgorithmandquot;andgt;Can be either SHA1 or MD5andlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       8: /// andlt;param name=andquot;PasswordIterationsandquot;andgt;Number of iterations to doandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       9: /// andlt;param name=andquot;InitialVectorandquot;andgt;Needs to be 16 ASCII characters longandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      10: /// andlt;param name=andquot;KeySizeandquot;andgt;Can be 128, 192, or 256andlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      11: /// andlt;returnsandgt;An encrypted stringandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      12: public static string Encrypt(string PlainText, string Password,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      13:     string Salt = andquot;Kosherandquot;, string HashAlgorithm = andquot;SHA1andquot;,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      14:     int PasswordIterations = 2, string InitialVector = andquot;OFRna73m*aze01xYandquot;,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      15:     int KeySize = 256)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      16: {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      17:     if (string.IsNullOrEmpty(PlainText))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      18:         return andquot;andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      19:     if (string.IsNullOrEmpty(Password))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      20:         throw new ArgumentNullException(andquot;Passwordandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      21:     if(string.IsNullOrEmpty(Salt))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      22:         throw new ArgumentNullException(andquot;Saltandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      23:     if(string.IsNullOrEmpty(HashAlgorithm))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      24:         throw new ArgumentNullException(andquot;HashAlgorithmandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      25:     if (string.IsNullOrEmpty(InitialVector))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      26:         throw new ArgumentNullException(andquot;InitialVectorandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      27:     byte[] InitialVectorBytes = Encoding.ASCII.GetBytes(InitialVector);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      28:     byte[] SaltValueBytes = Encoding.ASCII.GetBytes(Salt);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      29:     byte[] PlainTextBytes = Encoding.UTF8.GetBytes(PlainText);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      30:     PasswordDeriveBytes DerivedPassword = new PasswordDeriveBytes(Password, SaltValueBytes, HashAlgorithm, PasswordIterations);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      31:     byte[] KeyBytes = DerivedPassword.GetBytes(KeySize / 8);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      32:     RijndaelManaged SymmetricKey = new RijndaelManaged();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      33:     SymmetricKey.Mode = CipherMode.CBC;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      34:     byte[] CipherTextBytes = null;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      35:     using (ICryptoTransform Encryptor = SymmetricKey.CreateEncryptor(KeyBytes, InitialVectorBytes))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      36:     {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      37:         using (MemoryStream MemStream = new MemoryStream())&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      38:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      39:             using (CryptoStream CryptoStream = new CryptoStream(MemStream, Encryptor, CryptoStreamMode.Write))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      40:             {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      41:                 CryptoStream.Write(PlainTextBytes, 0, PlainTextBytes.Length);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      42:                 CryptoStream.FlushFinalBlock();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      43:                 CipherTextBytes = MemStream.ToArray();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      44:                 MemStream.Close();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      45:                 CryptoStream.Close();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      46:             }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      47:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      48:     }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      49:     SymmetricKey.Clear();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      50:     return Convert.ToBase64String(CipherTextBytes);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      51: }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In fact you had to use different static functions to use other encryption standards (DES, TripleDES, etc). And each of those functions took in different parameters:&lt;br /&gt;&lt;br /&gt;DES:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;       1: public static string Encrypt(string Input, string Key)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;vs AES:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;       1: public static string Encrypt(string PlainText, string Password,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       2:             string Salt = andquot;Kosherandquot;, string HashAlgorithm = andquot;SHA1andquot;,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       3:             int PasswordIterations = 2, string InitialVector = andquot;OFRna73m*aze01xYandquot;,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       4:             int KeySize = 256)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;With the newer code though things are different. Instead you can encrypt a string doing this:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;       1: string Data = andquot;This is a test of the system.andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       2: Data=Data.Encrypt(andquot;Babysfirstkeyandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Using this function:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;       1: /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       2: /// Encrypts a string&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       3: /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       4: /// andlt;param name=andquot;Dataandquot;andgt;Text to be encryptedandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       5: /// andlt;param name=andquot;Keyandquot;andgt;Password to encrypt withandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       6: /// andlt;param name=andquot;AlgorithmUsingandquot;andgt;Algorithm to use for encryption (defaults to AES)andlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       7: /// andlt;param name=andquot;Saltandquot;andgt;Salt to encrypt withandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       8: /// andlt;param name=andquot;HashAlgorithmandquot;andgt;Can be either SHA1 or MD5andlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       9: /// andlt;param name=andquot;PasswordIterationsandquot;andgt;Number of iterations to doandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      10: /// andlt;param name=andquot;InitialVectorandquot;andgt;Needs to be 16 ASCII characters longandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      11: /// andlt;param name=andquot;KeySizeandquot;andgt;Can be 64 (DES only), 128 (AES), 192 (AES and Triple DES), or 256 (AES)andlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      12: /// andlt;param name=andquot;EncodingUsingandquot;andgt;Encoding that the original string is using (defaults to UTF8)andlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      13: /// andlt;returnsandgt;An encrypted string (Base 64 string)andlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      14: public static string Encrypt(this string Data, string Key,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      15:     Encoding EncodingUsing = null,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      16:     SymmetricAlgorithm AlgorithmUsing = null, string Salt = andquot;Kosherandquot;,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      17:     string HashAlgorithm = andquot;SHA1andquot;, int PasswordIterations = 2,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      18:     string InitialVector = andquot;OFRna73m*aze01xYandquot;, int KeySize = 256)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      19: {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      20:     if (string.IsNullOrEmpty(Data))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      21:         return andquot;andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      22:     return Data.ToByteArray(EncodingUsing).Encrypt(Key, AlgorithmUsing, Salt, HashAlgorithm, PasswordIterations, InitialVector, KeySize).ToBase64String();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      23: }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      24: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      25: /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      26: /// Encrypts a byte array&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      27: /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      28: /// andlt;param name=andquot;Dataandquot;andgt;Data to be encryptedandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      29: /// andlt;param name=andquot;Keyandquot;andgt;Password to encrypt withandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      30: /// andlt;param name=andquot;AlgorithmUsingandquot;andgt;Algorithm to use for encryption (defaults to AES)andlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      31: /// andlt;param name=andquot;Saltandquot;andgt;Salt to encrypt withandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      32: /// andlt;param name=andquot;HashAlgorithmandquot;andgt;Can be either SHA1 or MD5andlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      33: /// andlt;param name=andquot;PasswordIterationsandquot;andgt;Number of iterations to doandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      34: /// andlt;param name=andquot;InitialVectorandquot;andgt;Needs to be 16 ASCII characters longandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      35: /// andlt;param name=andquot;KeySizeandquot;andgt;Can be 64 (DES only), 128 (AES), 192 (AES and Triple DES), or 256 (AES)andlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      36: /// andlt;returnsandgt;An encrypted byte arrayandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      37: public static byte[] Encrypt(this byte[] Data, string Key,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      38:     SymmetricAlgorithm AlgorithmUsing = null, string Salt = andquot;Kosherandquot;,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      39:     string HashAlgorithm = andquot;SHA1andquot;, int PasswordIterations = 2,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      40:     string InitialVector = andquot;OFRna73m*aze01xYandquot;, int KeySize = 256)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      41: {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      42:     if (Data == null)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      43:         return null;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      44:     if (AlgorithmUsing == null)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      45:         AlgorithmUsing = new RijndaelManaged();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      46:     if (string.IsNullOrEmpty(Key))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      47:         throw new ArgumentNullException(andquot;Keyandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      48:     if (string.IsNullOrEmpty(Salt))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      49:         throw new ArgumentNullException(andquot;Saltandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      50:     if (string.IsNullOrEmpty(HashAlgorithm))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      51:         throw new ArgumentNullException(andquot;HashAlgorithmandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      52:     if (string.IsNullOrEmpty(InitialVector))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      53:         throw new ArgumentNullException(andquot;InitialVectorandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      54:     using (PasswordDeriveBytes DerivedPassword = new PasswordDeriveBytes(Key, Salt.ToByteArray(), HashAlgorithm, PasswordIterations))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      55:     {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      56:         using (SymmetricAlgorithm SymmetricKey = AlgorithmUsing)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      57:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      58:             SymmetricKey.Mode = CipherMode.CBC;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      59:             byte[] CipherTextBytes = null;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      60:             using (ICryptoTransform Encryptor = SymmetricKey.CreateEncryptor(DerivedPassword.GetBytes(KeySize / 8), InitialVector.ToByteArray()))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      61:             {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      62:                 using (MemoryStream MemStream = new MemoryStream())&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      63:                 {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      64:                     using (CryptoStream CryptoStream = new CryptoStream(MemStream, Encryptor, CryptoStreamMode.Write))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      65:                     {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      66:                         CryptoStream.Write(Data, 0, Data.Length);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      67:                         CryptoStream.FlushFinalBlock();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      68:                         CipherTextBytes = MemStream.ToArray();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      69:                         MemStream.Close();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      70:                         CryptoStream.Close();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      71:                     }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      72:                 }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      73:             }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      74:             SymmetricKey.Clear();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      75:             return CipherTextBytes;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      76:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      77:     }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      78: }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Well, in reality 2 functions, plus there are a number of calls to other extension methods that I’ve added called through out. Anyway, with the newer code most of the static functions have been moved to being extension methods (where it makes sense anyway). On top of that many of the functions now work on multiple data types (the encryption functions now work on strings and byte arrays for example). I've also tried to give decent default values for everything (when I can) and tried to make things a bit more generic. For instance the one encryption method above does AES, DES, and TripleDES (along with RC2 and any other class that inherits from SymmetricAlgorithm). All you do is pass in the algorithm class you want to use and it handles the rest (and if you don't pass in anything it defaults to AES). This should make using the code much simpler and more succinct than it was in the past.&lt;br /&gt;&lt;br /&gt;The same thing is going on for a number of classes (FileManager is now a series of extensions for the FileInfo and DirectoryInfo classes, Serialization class is now extension methods added onto byte arrays, XmlDocuments, etc). And in each of these instances I'm trying to reduce the amount of code that you will need to write. At least for me it's easier to write:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;       1: TestClass TestItem=new TestClass();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       2: TestItem.ToXML(@andquot;.\Testing\Test.xmlandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;than&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;       1: TestClass TestObject=new TestClass();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       2: Utilities.IO.Serialization.ObjectToXML(TestObject,@andquot;.\Testing\Test.xmlandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Plus it gives it a nicer fluent interface feel which is easier to follow as I try to make sure that everything returns some value that you can act on. Anyway, if you're at all interested in influencing the direction that I go with this then drop into the CodePlex site and let me know your opinion in the discussions section and next time I'll be starting a series on building a Dependency Injection library.
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Uxo1_NXPJAAVAipMptpsOUGtcSk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Uxo1_NXPJAAVAipMptpsOUGtcSk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Uxo1_NXPJAAVAipMptpsOUGtcSk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Uxo1_NXPJAAVAipMptpsOUGtcSk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GutInstinct/~4/ves4ko550b8" height="1" width="1"/&gt;</description>
<itunes:subtitle>Utility Library Progress</itunes:subtitle><itunes:summary><![CDATA[Between losing power for a week, being without internet for another week, and having family in town for yet another week, I’ve had no chance to post this. Nor have I had a chance to post a number of things that I’ve been meaning to. Hopefully that will change here. So if you've been following my utility library's progress, you'll know that I'm doing a major rework of a number of classes, I've been going in and rewriting my private unit tests so I can actually release them to everyone, and I've been clearing out old code that I no longer use or plan to maintain. This means that if you plan on going from the current 2.2 to what will become 3.0, you'll need to make some changes to your code.  For example, let's look at some encryption code. Before if you wanted to encrypt something you would have to call the static function Utilities.Encryption.AESEncryption.Encrypt. It only took in a string and would only encrypt it using AES:             1: /// andlt;summaryandgt;<br /><br /><br />       2: /// Encrypts a string<br /><br /><br />       3: /// andlt;/summaryandgt;<br /><br /><br />       4: /// andlt;param name=andquot;PlainTextandquot;andgt;Text to be encryptedandlt;/paramandgt;<br /><br /><br />       5: /// andlt;param name=andquot;Passwordandquot;andgt;Password to encrypt withandlt;/paramandgt;<br /><br /><br />       6: /// andlt;param name=andquot;Saltandquot;andgt;Salt to encrypt withandlt;/paramandgt;<br /><br /><br />       7: /// andlt;param name=andquot;HashAlgorithmandquot;andgt;Can be either SHA1 or MD5andlt;/paramandgt;<br /><br /><br />       8: /// andlt;param name=andquot;PasswordIterationsandquot;andgt;Number of iterations to doandlt;/paramandgt;<br /><br /><br />       9: /// andlt;param name=andquot;InitialVectorandquot;andgt;Needs to be 16 ASCII characters longandlt;/paramandgt;<br /><br /><br />      10: /// andlt;param name=andquot;KeySizeandquot;andgt;Can be 128, 192, or 256andlt;/paramandgt;<br /><br /><br />      11: /// andlt;returnsandgt;An encrypted stringandlt;/returnsandgt;<br /><br /><br />      12: public static string Encrypt(string PlainText, string Password,<br /><br /><br />      13:     string Salt = andquot;Kosherandquot;, string HashAlgorithm = andquot;SHA1andquot;,<br /><br /><br />      14:     int PasswordIterations = 2, string InitialVector = andquot;OFRna73m*aze01xYandquot;,<br /><br /><br />      15:     int KeySize = 256)<br /><br /><br />      16: {<br /><br /><br />      17:     if (string.IsNullOrEmpty(PlainText))<br /><br /><br />      18:         return andquot;andquot;;<br /><br /><br />      19:     if (string.IsNullOrEmpty(Password))<br /><br /><br />      20:         throw new ArgumentNullException(andquot;Passwordandquot;);<br /><br /><br />      21:     if(string.IsNullOrEmpty(Salt))<br /><br /><br />      22:         throw new ArgumentNullException(andquot;Saltandquot;);<br /><br /><br />      23:     if(string.IsNullOrEmpty(HashAlgorithm))<br /><br /><br />      24:         throw new ArgumentNullException(andquot;HashAlgorithmandquot;);<br /><br /><br />      25:     if (string.IsNullOrEmpty(InitialVector))<br /><br /><br />      26:         throw new ArgumentNullException(andquot;InitialVectorandquot;);<br /><br /><br />      27:     byte[] InitialVectorBytes = Encoding.ASCII.GetBytes(InitialVector);<br /><br /><br />      28:     byte[] SaltValueBytes = Encoding.ASCII.GetBytes(Salt);<br /><br /><br />      29:     byte[] PlainTextBytes = Encoding.UTF8.GetBytes(PlainText);<br /><br /><br />      30:     PasswordDeriveBytes DerivedPassword = new PasswordDeriveBytes(Password, SaltValueBytes, HashAlgorithm, PasswordIterations);<br /><br /><br />      31:     byte[] KeyBytes = DerivedPassword.GetBytes(KeySize / 8);<br /><br /><br />      32:     RijndaelManaged SymmetricKey = new RijndaelManaged();<br /><br /><br />      33:     SymmetricKey.Mode = CipherMode.CBC;<br /><br /><br />      34:     byte[] CipherTextBytes = null;<br /><br /><br />      35:     using (ICryptoTransform Encryptor = SymmetricKey.CreateEncryptor(KeyBytes, InitialVectorBytes))<br /><br /><br />      36:     {<br /><br /><br />      37:         using (MemoryStream MemStream = new MemoryStream())<br /><br /><br />      38:         {<br /><br /><br />      39:             using (CryptoStream CryptoStream = new CryptoStream(MemStream, Encryptor, CryptoStreamMode.Write))<br /><br /><br />      40:             {<br /><br /><br />      41:                 CryptoStream.Write(PlainTextBytes, 0, PlainTextBytes.Length);<br /><br /><br />      42:                 CryptoStream.FlushFinalBlock();<br /><br /><br />      43:                 CipherTextBytes = MemStream.ToArray();<br /><br /><br />      44:                 MemStream.Close();<br /><br /><br />      45:                 CryptoStream.Close();<br /><br /><br />      46:             }<br /><br /><br />      47:         }<br /><br /><br />      48:     }<br /><br /><br />      49:     SymmetricKey.Clear();<br /><br /><br />      50:     return Convert.ToBase64String(CipherTextBytes);<br /><br /><br />      51: }<br /><br /><br /><br />In fact you had to use different static functions to use other encryption standards (DES, TripleDES, etc). And each of those functions took in different parameters:<br /><br />DES:<br /><br /><br />  <br />       1: public static string Encrypt(string Input, string Key)<br /><br /><br /><br />vs AES:<br /><br /><br />  <br />       1: public static string Encrypt(string PlainText, string Password,<br /><br /><br />       2:             string Salt = andquot;Kosherandquot;, string HashAlgorithm = andquot;SHA1andquot;,<br /><br /><br />       3:             int PasswordIterations = 2, string InitialVector = andquot;OFRna73m*aze01xYandquot;,<br /><br /><br />       4:             int KeySize = 256)<br /><br /><br /><br />With the newer code though things are different. Instead you can encrypt a string doing this:<br /><br /><br />  <br />       1: string Data = andquot;This is a test of the system.andquot;;<br /><br /><br />       2: Data=Data.Encrypt(andquot;Babysfirstkeyandquot;);<br /><br /><br /><br />Using this function:<br /><br /><br />  <br />       1: /// andlt;summaryandgt;<br /><br /><br />       2: /// Encrypts a string<br /><br /><br />       3: /// andlt;/summaryandgt;<br /><br /><br />       4: /// andlt;param name=andquot;Dataandquot;andgt;Text to be encryptedandlt;/paramandgt;<br /><br /><br />       5: /// andlt;param name=andquot;Keyandquot;andgt;Password to encrypt withandlt;/paramandgt;<br /><br /><br />       6: /// andlt;param name=andquot;AlgorithmUsingandquot;andgt;Algorithm to use for encryption (defaults to AES)andlt;/paramandgt;<br /><br /><br />       7: /// andlt;param name=andquot;Saltandquot;andgt;Salt to encrypt withandlt;/paramandgt;<br /><br /><br />       8: /// andlt;param name=andquot;HashAlgorithmandquot;andgt;Can be either SHA1 or MD5andlt;/paramandgt;<br /><br /><br />       9: /// andlt;param name=andquot;PasswordIterationsandquot;andgt;Number of iterations to doandlt;/paramandgt;<br /><br /><br />      10: /// andlt;param name=andquot;InitialVectorandquot;andgt;Needs to be 16 ASCII characters longandlt;/paramandgt;<br /><br /><br />      11: /// andlt;param name=andquot;KeySizeandquot;andgt;Can be 64 (DES only), 128 (AES), 192 (AES and Triple DES), or 256 (AES)andlt;/paramandgt;<br /><br /><br />      12: /// andlt;param name=andquot;EncodingUsingandquot;andgt;Encoding that the original string is using (defaults to UTF8)andlt;/paramandgt;<br /><br /><br />      13: /// andlt;returnsandgt;An encrypted string (Base 64 string)andlt;/returnsandgt;<br /><br /><br />      14: public static string Encrypt(this string Data, string Key,<br /><br /><br />      15:     Encoding EncodingUsing = null,<br /><br /><br />      16:     SymmetricAlgorithm AlgorithmUsing = null, string Salt = andquot;Kosherandquot;,<br /><br /><br />      17:     string HashAlgorithm = andquot;SHA1andquot;, int PasswordIterations = 2,<br /><br /><br />      18:     string InitialVector = andquot;OFRna73m*aze01xYandquot;, int KeySize = 256)<br /><br /><br />      19: {<br /><br /><br />      20:     if (string.IsNullOrEmpty(Data))<br /><br /><br />      21:         return andquot;andquot;;<br /><br /><br />      22:     return Data.ToByteArray(EncodingUsing).Encrypt(Key, AlgorithmUsing, Salt, HashAlgorithm, PasswordIterations, InitialVector, KeySize).ToBase64String();<br /><br /><br />      23: }<br /><br /><br />      24: <br /><br /><br />      25: /// andlt;summaryandgt;<br /><br /><br />      26: /// Encrypts a byte array<br /><br /><br />      27: /// andlt;/summaryandgt;<br /><br /><br />      28: /// andlt;param name=andquot;Dataandquot;andgt;Data to be encryptedandlt;/paramandgt;<br /><br /><br />      29: /// andlt;param name=andquot;Keyandquot;andgt;Password to encrypt withandlt;/paramandgt;<br /><br /><br />      30: /// andlt;param name=andquot;AlgorithmUsingandquot;andgt;Algorithm to use for encryption (defaults to AES)andlt;/paramandgt;<br /><br /><br />      31: /// andlt;param name=andquot;Saltandquot;andgt;Salt to encrypt withandlt;/paramandgt;<br /><br /><br />      32: /// andlt;param name=andquot;HashAlgorithmandquot;andgt;Can be either SHA1 or MD5andlt;/paramandgt;<br /><br /><br />      33: /// andlt;param name=andquot;PasswordIterationsandquot;andgt;Number of iterations to doandlt;/paramandgt;<br /><br /><br />      34: /// andlt;param name=andquot;InitialVectorandquot;andgt;Needs to be 16 ASCII characters longandlt;/paramandgt;<br /><br /><br />      35: /// andlt;param name=andquot;KeySizeandquot;andgt;Can be 64 (DES only), 128 (AES), 192 (AES and Triple DES), or 256 (AES)andlt;/paramandgt;<br /><br /><br />      36: /// andlt;returnsandgt;An encrypted byte arrayandlt;/returnsandgt;<br /><br /><br />      37: public static byte[] Encrypt(this byte[] Data, string Key,<br /><br /><br />      38:     SymmetricAlgorithm AlgorithmUsing = null, string Salt = andquot;Kosherandquot;,<br /><br /><br />      39:     string HashAlgorithm = andquot;SHA1andquot;, int PasswordIterations = 2,<br /><br /><br />      40:     string InitialVector = andquot;OFRna73m*aze01xYandquot;, int KeySize = 256)<br /><br /><br />      41: {<br /><br /><br />      42:     if (Data == null)<br /><br /><br />      43:         return null;<br /><br /><br />      44:     if (AlgorithmUsing == null)<br /><br /><br />      45:         AlgorithmUsing = new RijndaelManaged();<br /><br /><br />      46:     if (string.IsNullOrEmpty(Key))<br /><br /><br />      47:         throw new ArgumentNullException(andquot;Keyandquot;);<br /><br /><br />      48:     if (string.IsNullOrEmpty(Salt))<br /><br /><br />      49:         throw new ArgumentNullException(andquot;Saltandquot;);<br /><br /><br />      50:     if (string.IsNullOrEmpty(HashAlgorithm))<br /><br /><br />      51:         throw new ArgumentNullException(andquot;HashAlgorithmandquot;);<br /><br /><br />      52:     if (string.IsNullOrEmpty(InitialVector))<br /><br /><br />      53:         throw new ArgumentNullException(andquot;InitialVectorandquot;);<br /><br /><br />      54:     using (PasswordDeriveBytes DerivedPassword = new PasswordDeriveBytes(Key, Salt.ToByteArray(), HashAlgorithm, PasswordIterations))<br /><br /><br />      55:     {<br /><br /><br />      56:         using (SymmetricAlgorithm SymmetricKey = AlgorithmUsing)<br /><br /><br />      57:         {<br /><br /><br />      58:             SymmetricKey.Mode = CipherMode.CBC;<br /><br /><br />      59:             byte[] CipherTextBytes = null;<br /><br /><br />      60:             using (ICryptoTransform Encryptor = SymmetricKey.CreateEncryptor(DerivedPassword.GetBytes(KeySize / 8), InitialVector.ToByteArray()))<br /><br /><br />      61:             {<br /><br /><br />      62:                 using (MemoryStream MemStream = new MemoryStream())<br /><br /><br />      63:                 {<br /><br /><br />      64:                     using (CryptoStream CryptoStream = new CryptoStream(MemStream, Encryptor, CryptoStreamMode.Write))<br /><br /><br />      65:                     {<br /><br /><br />      66:                         CryptoStream.Write(Data, 0, Data.Length);<br /><br /><br />      67:                         CryptoStream.FlushFinalBlock();<br /><br /><br />      68:                         CipherTextBytes = MemStream.ToArray();<br /><br /><br />      69:                         MemStream.Close();<br /><br /><br />      70:                         CryptoStream.Close();<br /><br /><br />      71:                     }<br /><br /><br />      72:                 }<br /><br /><br />      73:             }<br /><br /><br />      74:             SymmetricKey.Clear();<br /><br /><br />      75:             return CipherTextBytes;<br /><br /><br />      76:         }<br /><br /><br />      77:     }<br /><br /><br />      78: }<br /><br /><br /><br />Well, in reality 2 functions, plus there are a number of calls to other extension methods that I’ve added called through out. Anyway, with the newer code most of the static functions have been moved to being extension methods (where it makes sense anyway). On top of that many of the functions now work on multiple data types (the encryption functions now work on strings and byte arrays for example). I've also tried to give decent default values for everything (when I can) and tried to make things a bit more generic. For instance the one encryption method above does AES, DES, and TripleDES (along with RC2 and any other class that inherits from SymmetricAlgorithm). All you do is pass in the algorithm class you want to use and it handles the rest (and if you don't pass in anything it defaults to AES). This should make using the code much simpler and more succinct than it was in the past.<br /><br />The same thing is going on for a number of classes (FileManager is now a series of extensions for the FileInfo and DirectoryInfo classes, Serialization class is now extension methods added onto byte arrays, XmlDocuments, etc). And in each of these instances I'm trying to reduce the amount of code that you will need to write. At least for me it's easier to write:<br /><br /><br />  <br />       1: TestClass TestItem=new TestClass();<br /><br /><br />       2: TestItem.ToXML(@andquot;.\Testing\Test.xmlandquot;);<br /><br /><br /><br />than<br /><br /><br />  <br />       1: TestClass TestObject=new TestClass();<br /><br /><br />       2: Utilities.IO.Serialization.ObjectToXML(TestObject,@andquot;.\Testing\Test.xmlandquot;);<br /><br /><br /><br />Plus it gives it a nicer fluent interface feel which is easier to follow as I try to make sure that everything returns some value that you can act on. Anyway, if you're at all interested in influencing the direction that I go with this then drop into the CodePlex site and let me know your opinion in the discussions section and next time I'll be starting a series on building a Dependency Injection library.]]></itunes:summary><feedburner:origLink>http://www.gutgames.com/post/Utility-Library-Progress.aspx</feedburner:origLink></item>
<item><title>Why You Should Sign Your DLLs</title>
<link>http://feedproxy.google.com/~r/GutInstinct/~3/hSvwPMn7bPw/Why-You-Should-Sign-Your-DLLs.aspx</link>
<author>James Craig</author>
<pubDate>Sun, 07 Aug 2011 21:26:19 GMT</pubDate>
<description>Generally speaking I do not deal with security issues much. I mean I can set up SSL, set up a form based authentication, etc. the basic stuff. But one thing that I almost always do in my applications is sign the DLLs. The main reason I do this is because of a former coworker of mine.  You see, years ago I worked with a guy who liked to mess with people. He liked to put new hires through a “hazing” ritual. Specifically he had this application that he wrote that would analyze a DLL, find the class/functions that were available in the DLL, and generate some default classes with the same names (basically he generated stubs). He would do this with one of the third party DLLs that we were using, slip it onto your machine, and come over and tell you that whatever app you had just shipped wasn’t working correctly. You’d start up the app and nothing would work. It would start up fine, but everything from the one DLL would return null/default values.  The reason he was able to do this was because the way that DLLs are loaded is dumb. I don’t mean it’s done in a stupid way, well it is sort of. When you link to a DLL that is named MyDLLs.dll, it will load anything as long as it has the same name by default. As an example, let’s assume that I have an app called TestApp:             1: using System;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       2: using System.Collections.Generic;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       3: using System.Linq;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       4: using System.Text;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       5: using Utilities.DataTypes.Patterns;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       6: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       7: namespace TestApp&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       8: {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       9:     class Program&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      10:     {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      11:         static void Main(string[] args)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      12:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      13:             Factoryandlt;string, stringandgt; Factory = new Factoryandlt;string, stringandgt;();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      14:             Factory.Register(andquot;Aandquot;, andquot;Bandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      15:             Console.WriteLine(Factory.Create(andquot;Aandquot;));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      16:             Console.ReadLine();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      17:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      18:     }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      19: }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It’s simple enough, all it’s doing is using the default System DLLs and one extra DLL called Utilities (and yes, it’s a class from my utility library but let’s assume that it’s not). The Utilities DLL has a class called Factory:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;       1: using System;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       2: using System.Collections.Generic;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       3: using System.Linq;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       4: using System.Text;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       5: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       6: namespace Utilities.DataTypes.Patterns&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       7: {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       8:     public class Factoryandlt;Key, Tandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       9:     {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      10:         #region Constructors&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      11: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      12:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      13:         /// Constructor&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      14:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      15:         public Factory()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      16:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      17:             Constructors = new Dictionaryandlt;Key, Funcandlt;Tandgt;andgt;();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      18:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      19: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      20:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      21: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      22:         #region Protected Variables&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      23: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      24:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      25:         /// List of constructors/initializers&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      26:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      27:         protected virtual Dictionaryandlt;Key, Funcandlt;Tandgt;andgt; Constructors { get; set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      28: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      29:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      30: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      31:         #region Public Functions&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      32: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      33:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      34:         /// Registers an item&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      35:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      36:         /// andlt;param name=andquot;Keyandquot;andgt;Item to registerandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      37:         /// andlt;param name=andquot;Resultandquot;andgt;The object to be returnedandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      38:         public virtual void Register(Key Key, T Result)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      39:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      40:             if (Exists(Key))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      41:                 Constructors[Key] = new Funcandlt;Tandgt;(() =andgt; Result);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      42:             else&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      43:                 Constructors.Add(Key, new Funcandlt;Tandgt;(() =andgt; Result));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      44:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      45: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      46:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      47:         /// Registers an item&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      48:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      49:         /// andlt;param name=andquot;Keyandquot;andgt;Item to registerandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      50:         /// andlt;param name=andquot;Constructorandquot;andgt;The function to call when creating the itemandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      51:         public virtual void Register(Key Key, Funcandlt;Tandgt; Constructor)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      52:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      53:             if (Exists(Key))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      54:                 Constructors[Key] = Constructor;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      55:             else&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      56:                 Constructors.Add(Key, Constructor);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      57:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      58: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      59:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      60:         /// Creates an instance associated with the key&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      61:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      62:         /// andlt;param name=andquot;Keyandquot;andgt;Registered itemandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      63:         /// andlt;returnsandgt;The type returned by the initializerandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      64:         public virtual T Create(Key Key)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      65:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      66:             if (Exists(Key))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      67:                 return Constructors[Key]();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      68:             return default(T);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      69:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      70: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      71:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      72:         /// Determines if a key has been registered&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      73:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      74:         /// andlt;param name=andquot;Keyandquot;andgt;Key to checkandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      75:         /// andlt;returnsandgt;True if it exists, false otherwiseandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      76:         public virtual bool Exists(Key Key)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      77:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      78:             return Constructors.ContainsKey(Key);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      79:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      80: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      81:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      82:     }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      83: }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If we compile, we get a line on the screen that just says “B”. Now let’s assume we create another DLL, called Utilities.DLL, with a class called Factory, but instead had it look like this:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;       1: using System;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       2: using System.Collections.Generic;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       3: using System.Linq;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       4: using System.Text;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       5: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       6: namespace Utilities.DataTypes.Patterns&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       7: {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       8:     public class Factoryandlt;Key, Tandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       9:     {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      10:         #region Constructors&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      11: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      12:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      13:         /// Constructor&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      14:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      15:         public Factory()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      16:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      17:             Constructors = new Dictionaryandlt;Key, Funcandlt;Tandgt;andgt;();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      18:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      19: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      20:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      21: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      22:         #region Protected Variables&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      23: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      24:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      25:         /// List of constructors/initializers&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      26:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      27:         protected virtual Dictionaryandlt;Key, Funcandlt;Tandgt;andgt; Constructors { get; set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      28: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      29:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      30: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      31:         #region Public Functions&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      32: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      33:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      34:         /// Registers an item&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      35:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      36:         /// andlt;param name=andquot;Keyandquot;andgt;Item to registerandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      37:         /// andlt;param name=andquot;Resultandquot;andgt;The object to be returnedandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      38:         public virtual void Register(Key Key, T Result)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      39:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      40:             if (Exists(Key))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      41:                 Constructors[Key] = () =andgt; MyFunction();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      42:             else&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      43:                 Constructors.Add(Key, () =andgt; MyFunction());&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      44:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      45: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      46:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      47:         /// Registers an item&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      48:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      49:         /// andlt;param name=andquot;Keyandquot;andgt;Item to registerandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      50:         /// andlt;param name=andquot;Constructorandquot;andgt;The function to call when creating the itemandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      51:         public virtual void Register(Key Key, Funcandlt;Tandgt; Constructor)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      52:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      53:             if (Exists(Key))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      54:                 Constructors[Key] = () =andgt; MyFunction();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      55:             else&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      56:                 Constructors.Add(Key, () =andgt; MyFunction());&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      57:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      58: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      59:         private T MyFunction()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      60:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      61:             Console.Write(andquot;I deleted something importantandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      62:             return default(T);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      63:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      64: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      65:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      66:         /// Creates an instance associated with the key&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      67:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      68:         /// andlt;param name=andquot;Keyandquot;andgt;Registered itemandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      69:         /// andlt;returnsandgt;The type returned by the initializerandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      70:         public virtual T Create(Key Key)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      71:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      72:             if (Exists(Key))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      73:                 return Constructors[Key]();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      74:             return default(T);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      75:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      76: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      77:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      78:         /// Determines if a key has been registered&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      79:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      80:         /// andlt;param name=andquot;Keyandquot;andgt;Key to checkandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      81:         /// andlt;returnsandgt;True if it exists, false otherwiseandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      82:         public virtual bool Exists(Key Key)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      83:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      84:             return Constructors.ContainsKey(Key);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      85:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      86: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      87:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      88:     }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      89: }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Instead of having a line that says simply “B”, we’re going to get “I deleted something important”. If I copy this second Utilities.DLL into the location of the first, TestApp will load it without thinking twice. That should make you worry right about now because what if instead of saying “I deleted something important”, I actually went ahead and deleted something important? Now if you sign a DLL (and the other person doesn’t have access to the key), you will not get this issue. Instead you will get a nice error that is thrown saying “can’t load XXXXX.DLL”. If the public keys don’t match, it’s not loaded. If the third party DLLs had been signed my first week at that job would have been a lot easier. So to make things easier on new hires (and to prevent the possibility of some more nefarious possibilities), please sign your DLLs.
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/2Cq7l18UHIjrJmGtx_E7C80iJSI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2Cq7l18UHIjrJmGtx_E7C80iJSI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/2Cq7l18UHIjrJmGtx_E7C80iJSI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2Cq7l18UHIjrJmGtx_E7C80iJSI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GutInstinct/~4/hSvwPMn7bPw" height="1" width="1"/&gt;</description>
<itunes:subtitle>Why You Should Sign Your DLLs</itunes:subtitle><itunes:summary><![CDATA[Generally speaking I do not deal with security issues much. I mean I can set up SSL, set up a form based authentication, etc. the basic stuff. But one thing that I almost always do in my applications is sign the DLLs. The main reason I do this is because of a former coworker of mine.  You see, years ago I worked with a guy who liked to mess with people. He liked to put new hires through a “hazing” ritual. Specifically he had this application that he wrote that would analyze a DLL, find the class/functions that were available in the DLL, and generate some default classes with the same names (basically he generated stubs). He would do this with one of the third party DLLs that we were using, slip it onto your machine, and come over and tell you that whatever app you had just shipped wasn’t working correctly. You’d start up the app and nothing would work. It would start up fine, but everything from the one DLL would return null/default values.  The reason he was able to do this was because the way that DLLs are loaded is dumb. I don’t mean it’s done in a stupid way, well it is sort of. When you link to a DLL that is named MyDLLs.dll, it will load anything as long as it has the same name by default. As an example, let’s assume that I have an app called TestApp:             1: using System;<br /><br /><br />       2: using System.Collections.Generic;<br /><br /><br />       3: using System.Linq;<br /><br /><br />       4: using System.Text;<br /><br /><br />       5: using Utilities.DataTypes.Patterns;<br /><br /><br />       6: <br /><br /><br />       7: namespace TestApp<br /><br /><br />       8: {<br /><br /><br />       9:     class Program<br /><br /><br />      10:     {<br /><br /><br />      11:         static void Main(string[] args)<br /><br /><br />      12:         {<br /><br /><br />      13:             Factoryandlt;string, stringandgt; Factory = new Factoryandlt;string, stringandgt;();<br /><br /><br />      14:             Factory.Register(andquot;Aandquot;, andquot;Bandquot;);<br /><br /><br />      15:             Console.WriteLine(Factory.Create(andquot;Aandquot;));<br /><br /><br />      16:             Console.ReadLine();<br /><br /><br />      17:         }<br /><br /><br />      18:     }<br /><br /><br />      19: }<br /><br /><br /><br />It’s simple enough, all it’s doing is using the default System DLLs and one extra DLL called Utilities (and yes, it’s a class from my utility library but let’s assume that it’s not). The Utilities DLL has a class called Factory:<br /><br /><br />  <br />       1: using System;<br /><br /><br />       2: using System.Collections.Generic;<br /><br /><br />       3: using System.Linq;<br /><br /><br />       4: using System.Text;<br /><br /><br />       5: <br /><br /><br />       6: namespace Utilities.DataTypes.Patterns<br /><br /><br />       7: {<br /><br /><br />       8:     public class Factoryandlt;Key, Tandgt;<br /><br /><br />       9:     {<br /><br /><br />      10:         #region Constructors<br /><br /><br />      11: <br /><br /><br />      12:         /// andlt;summaryandgt;<br /><br /><br />      13:         /// Constructor<br /><br /><br />      14:         /// andlt;/summaryandgt;<br /><br /><br />      15:         public Factory()<br /><br /><br />      16:         {<br /><br /><br />      17:             Constructors = new Dictionaryandlt;Key, Funcandlt;Tandgt;andgt;();<br /><br /><br />      18:         }<br /><br /><br />      19: <br /><br /><br />      20:         #endregion<br /><br /><br />      21: <br /><br /><br />      22:         #region Protected Variables<br /><br /><br />      23: <br /><br /><br />      24:         /// andlt;summaryandgt;<br /><br /><br />      25:         /// List of constructors/initializers<br /><br /><br />      26:         /// andlt;/summaryandgt;<br /><br /><br />      27:         protected virtual Dictionaryandlt;Key, Funcandlt;Tandgt;andgt; Constructors { get; set; }<br /><br /><br />      28: <br /><br /><br />      29:         #endregion<br /><br /><br />      30: <br /><br /><br />      31:         #region Public Functions<br /><br /><br />      32: <br /><br /><br />      33:         /// andlt;summaryandgt;<br /><br /><br />      34:         /// Registers an item<br /><br /><br />      35:         /// andlt;/summaryandgt;<br /><br /><br />      36:         /// andlt;param name=andquot;Keyandquot;andgt;Item to registerandlt;/paramandgt;<br /><br /><br />      37:         /// andlt;param name=andquot;Resultandquot;andgt;The object to be returnedandlt;/paramandgt;<br /><br /><br />      38:         public virtual void Register(Key Key, T Result)<br /><br /><br />      39:         {<br /><br /><br />      40:             if (Exists(Key))<br /><br /><br />      41:                 Constructors[Key] = new Funcandlt;Tandgt;(() =andgt; Result);<br /><br /><br />      42:             else<br /><br /><br />      43:                 Constructors.Add(Key, new Funcandlt;Tandgt;(() =andgt; Result));<br /><br /><br />      44:         }<br /><br /><br />      45: <br /><br /><br />      46:         /// andlt;summaryandgt;<br /><br /><br />      47:         /// Registers an item<br /><br /><br />      48:         /// andlt;/summaryandgt;<br /><br /><br />      49:         /// andlt;param name=andquot;Keyandquot;andgt;Item to registerandlt;/paramandgt;<br /><br /><br />      50:         /// andlt;param name=andquot;Constructorandquot;andgt;The function to call when creating the itemandlt;/paramandgt;<br /><br /><br />      51:         public virtual void Register(Key Key, Funcandlt;Tandgt; Constructor)<br /><br /><br />      52:         {<br /><br /><br />      53:             if (Exists(Key))<br /><br /><br />      54:                 Constructors[Key] = Constructor;<br /><br /><br />      55:             else<br /><br /><br />      56:                 Constructors.Add(Key, Constructor);<br /><br /><br />      57:         }<br /><br /><br />      58: <br /><br /><br />      59:         /// andlt;summaryandgt;<br /><br /><br />      60:         /// Creates an instance associated with the key<br /><br /><br />      61:         /// andlt;/summaryandgt;<br /><br /><br />      62:         /// andlt;param name=andquot;Keyandquot;andgt;Registered itemandlt;/paramandgt;<br /><br /><br />      63:         /// andlt;returnsandgt;The type returned by the initializerandlt;/returnsandgt;<br /><br /><br />      64:         public virtual T Create(Key Key)<br /><br /><br />      65:         {<br /><br /><br />      66:             if (Exists(Key))<br /><br /><br />      67:                 return Constructors[Key]();<br /><br /><br />      68:             return default(T);<br /><br /><br />      69:         }<br /><br /><br />      70: <br /><br /><br />      71:         /// andlt;summaryandgt;<br /><br /><br />      72:         /// Determines if a key has been registered<br /><br /><br />      73:         /// andlt;/summaryandgt;<br /><br /><br />      74:         /// andlt;param name=andquot;Keyandquot;andgt;Key to checkandlt;/paramandgt;<br /><br /><br />      75:         /// andlt;returnsandgt;True if it exists, false otherwiseandlt;/returnsandgt;<br /><br /><br />      76:         public virtual bool Exists(Key Key)<br /><br /><br />      77:         {<br /><br /><br />      78:             return Constructors.ContainsKey(Key);<br /><br /><br />      79:         }<br /><br /><br />      80: <br /><br /><br />      81:         #endregion<br /><br /><br />      82:     }<br /><br /><br />      83: }<br /><br /><br /><br /><br /><br />If we compile, we get a line on the screen that just says “B”. Now let’s assume we create another DLL, called Utilities.DLL, with a class called Factory, but instead had it look like this:<br /><br /><br />  <br />       1: using System;<br /><br /><br />       2: using System.Collections.Generic;<br /><br /><br />       3: using System.Linq;<br /><br /><br />       4: using System.Text;<br /><br /><br />       5: <br /><br /><br />       6: namespace Utilities.DataTypes.Patterns<br /><br /><br />       7: {<br /><br /><br />       8:     public class Factoryandlt;Key, Tandgt;<br /><br /><br />       9:     {<br /><br /><br />      10:         #region Constructors<br /><br /><br />      11: <br /><br /><br />      12:         /// andlt;summaryandgt;<br /><br /><br />      13:         /// Constructor<br /><br /><br />      14:         /// andlt;/summaryandgt;<br /><br /><br />      15:         public Factory()<br /><br /><br />      16:         {<br /><br /><br />      17:             Constructors = new Dictionaryandlt;Key, Funcandlt;Tandgt;andgt;();<br /><br /><br />      18:         }<br /><br /><br />      19: <br /><br /><br />      20:         #endregion<br /><br /><br />      21: <br /><br /><br />      22:         #region Protected Variables<br /><br /><br />      23: <br /><br /><br />      24:         /// andlt;summaryandgt;<br /><br /><br />      25:         /// List of constructors/initializers<br /><br /><br />      26:         /// andlt;/summaryandgt;<br /><br /><br />      27:         protected virtual Dictionaryandlt;Key, Funcandlt;Tandgt;andgt; Constructors { get; set; }<br /><br /><br />      28: <br /><br /><br />      29:         #endregion<br /><br /><br />      30: <br /><br /><br />      31:         #region Public Functions<br /><br /><br />      32: <br /><br /><br />      33:         /// andlt;summaryandgt;<br /><br /><br />      34:         /// Registers an item<br /><br /><br />      35:         /// andlt;/summaryandgt;<br /><br /><br />      36:         /// andlt;param name=andquot;Keyandquot;andgt;Item to registerandlt;/paramandgt;<br /><br /><br />      37:         /// andlt;param name=andquot;Resultandquot;andgt;The object to be returnedandlt;/paramandgt;<br /><br /><br />      38:         public virtual void Register(Key Key, T Result)<br /><br /><br />      39:         {<br /><br /><br />      40:             if (Exists(Key))<br /><br /><br />      41:                 Constructors[Key] = () =andgt; MyFunction();<br /><br /><br />      42:             else<br /><br /><br />      43:                 Constructors.Add(Key, () =andgt; MyFunction());<br /><br /><br />      44:         }<br /><br /><br />      45: <br /><br /><br />      46:         /// andlt;summaryandgt;<br /><br /><br />      47:         /// Registers an item<br /><br /><br />      48:         /// andlt;/summaryandgt;<br /><br /><br />      49:         /// andlt;param name=andquot;Keyandquot;andgt;Item to registerandlt;/paramandgt;<br /><br /><br />      50:         /// andlt;param name=andquot;Constructorandquot;andgt;The function to call when creating the itemandlt;/paramandgt;<br /><br /><br />      51:         public virtual void Register(Key Key, Funcandlt;Tandgt; Constructor)<br /><br /><br />      52:         {<br /><br /><br />      53:             if (Exists(Key))<br /><br /><br />      54:                 Constructors[Key] = () =andgt; MyFunction();<br /><br /><br />      55:             else<br /><br /><br />      56:                 Constructors.Add(Key, () =andgt; MyFunction());<br /><br /><br />      57:         }<br /><br /><br />      58: <br /><br /><br />      59:         private T MyFunction()<br /><br /><br />      60:         {<br /><br /><br />      61:             Console.Write(andquot;I deleted something importantandquot;);<br /><br /><br />      62:             return default(T);<br /><br /><br />      63:         }<br /><br /><br />      64: <br /><br /><br />      65:         /// andlt;summaryandgt;<br /><br /><br />      66:         /// Creates an instance associated with the key<br /><br /><br />      67:         /// andlt;/summaryandgt;<br /><br /><br />      68:         /// andlt;param name=andquot;Keyandquot;andgt;Registered itemandlt;/paramandgt;<br /><br /><br />      69:         /// andlt;returnsandgt;The type returned by the initializerandlt;/returnsandgt;<br /><br /><br />      70:         public virtual T Create(Key Key)<br /><br /><br />      71:         {<br /><br /><br />      72:             if (Exists(Key))<br /><br /><br />      73:                 return Constructors[Key]();<br /><br /><br />      74:             return default(T);<br /><br /><br />      75:         }<br /><br /><br />      76: <br /><br /><br />      77:         /// andlt;summaryandgt;<br /><br /><br />      78:         /// Determines if a key has been registered<br /><br /><br />      79:         /// andlt;/summaryandgt;<br /><br /><br />      80:         /// andlt;param name=andquot;Keyandquot;andgt;Key to checkandlt;/paramandgt;<br /><br /><br />      81:         /// andlt;returnsandgt;True if it exists, false otherwiseandlt;/returnsandgt;<br /><br /><br />      82:         public virtual bool Exists(Key Key)<br /><br /><br />      83:         {<br /><br /><br />      84:             return Constructors.ContainsKey(Key);<br /><br /><br />      85:         }<br /><br /><br />      86: <br /><br /><br />      87:         #endregion<br /><br /><br />      88:     }<br /><br /><br />      89: }<br /><br /><br /><br /><br />Instead of having a line that says simply “B”, we’re going to get “I deleted something important”. If I copy this second Utilities.DLL into the location of the first, TestApp will load it without thinking twice. That should make you worry right about now because what if instead of saying “I deleted something important”, I actually went ahead and deleted something important? Now if you sign a DLL (and the other person doesn’t have access to the key), you will not get this issue. Instead you will get a nice error that is thrown saying “can’t load XXXXX.DLL”. If the public keys don’t match, it’s not loaded. If the third party DLLs had been signed my first week at that job would have been a lot easier. So to make things easier on new hires (and to prevent the possibility of some more nefarious possibilities), please sign your DLLs.]]></itunes:summary><feedburner:origLink>http://www.gutgames.com/post/Why-You-Should-Sign-Your-DLLs.aspx</feedburner:origLink></item>
<item><title>Setting Up Hg-Git</title>
<link>http://feedproxy.google.com/~r/GutInstinct/~3/j3XAcaJqXwM/Setting-Up-Hg-Git.aspx</link>
<author>James Craig</author>
<pubDate>Thu, 28 Jul 2011 22:22:23 GMT</pubDate>
<description>So apparently it takes the people at CodePlex a little while to make the switch to Mercury from SVN because, as I go to the site now, my code repository is coming up Subversion. It’s only been eight days though since Wade from Chinasoft (who apparently does their tech support) contacted me, and this would fall under low priority, so I’ll give it a little more time but seriously someone needs to automate that process. In the mean time I’ve set up both a bitbucket and github site. Now the bitbucket setup was simple, install TortoiseHg and I’m done. Setting up github was a bit more in depth. I mean I could just set up git, but I hate the command line. Give me a GUI and I’m happy (I know, I’m odd for a programmer). So instead I decided to set up Hg-Git.  Hg-Git is a plugin for mercury that allows you to connect to git repositories and it’s kind of a pain to set up. Well not really. It only takes a couple of steps:     Install TortoiseHg – It’s here    Install Hg-Git – you can use TortoiseHg to get the latest version from the repository here. All you have to do is download it, it’s a bunch of python code so nothing to install.    Now we set it up – Open up TortoiseHg’s Hg Workbench, go to File-andgt;Settings-andgt;Edit File (it’s a button on the upper right side). From there we enter the following and save it:   [extensions]   hggit = Location that you saved Hg-Git to  hgext.bookmarks =  [ui]   ssh = andquot;C:\Program Files\TortoiseHg\TortoisePlink.exeandquot;       Once we do that we need to create a public/private key pair. I used PuTTY for this. Just install it and run the PuTTYgen app, hit Generate, and save the public and private key to your hard drive.    Once the keys are generated, we need to add our key to github. If you go into your Account Settings, there is a link that says SSH Public Keys on the left side. Once there the middle portion should say Add another public key. Copy and paste the public key that you saved earlier into there and hit save.    Now we just need to setup Pageant (it’s installed already at this point). Add a shortcut to the Startup folder with the following:   andquot;C:\Program Files\TortoiseHg\Pageant.exeandquot; andquot;Location of the private key that you saved earlierandquot;&lt;br /&gt;&lt;br /&gt;From here on you should be able to clone your repository and start pushing code. However I’ve learned that I need to set the master bookmark to whatever I actually want to push for some odd reason. That doesn’t seem like something I should have to do but it is what it is. Anyway, that’s what I went through to get it up and running. For now I’ll be updating the code on those two pages and not the CodePlex page (that will change once they actually update my repository there). So choose whichever you like more and happy coding. Oh and I’ve set it up to link to the Twitter account (sorry for spamming the tests earlier today), so if you want to keep up to date with both my site here and updates as I push them to github/bitbucket you will be able to do that now.&lt;br /&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/R0bljzQXrIUDZcOZjnA0lJJy1pE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/R0bljzQXrIUDZcOZjnA0lJJy1pE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/R0bljzQXrIUDZcOZjnA0lJJy1pE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/R0bljzQXrIUDZcOZjnA0lJJy1pE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GutInstinct/~4/j3XAcaJqXwM" height="1" width="1"/&gt;</description>
<itunes:subtitle>Setting Up Hg-Git</itunes:subtitle><itunes:summary><![CDATA[So apparently it takes the people at CodePlex a little while to make the switch to Mercury from SVN because, as I go to the site now, my code repository is coming up Subversion. It’s only been eight days though since Wade from Chinasoft (who apparently does their tech support) contacted me, and this would fall under low priority, so I’ll give it a little more time but seriously someone needs to automate that process. In the mean time I’ve set up both a bitbucket and github site. Now the bitbucket setup was simple, install TortoiseHg and I’m done. Setting up github was a bit more in depth. I mean I could just set up git, but I hate the command line. Give me a GUI and I’m happy (I know, I’m odd for a programmer). So instead I decided to set up Hg-Git.  Hg-Git is a plugin for mercury that allows you to connect to git repositories and it’s kind of a pain to set up. Well not really. It only takes a couple of steps:     Install TortoiseHg – It’s here    Install Hg-Git – you can use TortoiseHg to get the latest version from the repository here. All you have to do is download it, it’s a bunch of python code so nothing to install.    Now we set it up – Open up TortoiseHg’s Hg Workbench, go to File-andgt;Settings-andgt;Edit File (it’s a button on the upper right side). From there we enter the following and save it:   [extensions]   hggit = Location that you saved Hg-Git to  hgext.bookmarks =  [ui]   ssh = andquot;C:\Program Files\TortoiseHg\TortoisePlink.exeandquot;       Once we do that we need to create a public/private key pair. I used PuTTY for this. Just install it and run the PuTTYgen app, hit Generate, and save the public and private key to your hard drive.    Once the keys are generated, we need to add our key to github. If you go into your Account Settings, there is a link that says SSH Public Keys on the left side. Once there the middle portion should say Add another public key. Copy and paste the public key that you saved earlier into there and hit save.    Now we just need to setup Pageant (it’s installed already at this point). Add a shortcut to the Startup folder with the following:   andquot;C:\Program Files\TortoiseHg\Pageant.exeandquot; andquot;Location of the private key that you saved earlierandquot;<br /><br />From here on you should be able to clone your repository and start pushing code. However I’ve learned that I need to set the master bookmark to whatever I actually want to push for some odd reason. That doesn’t seem like something I should have to do but it is what it is. Anyway, that’s what I went through to get it up and running. For now I’ll be updating the code on those two pages and not the CodePlex page (that will change once they actually update my repository there). So choose whichever you like more and happy coding. Oh and I’ve set it up to link to the Twitter account (sorry for spamming the tests earlier today), so if you want to keep up to date with both my site here and updates as I push them to github/bitbucket you will be able to do that now.<br />]]></itunes:summary><feedburner:origLink>http://www.gutgames.com/post/Setting-Up-Hg-Git.aspx</feedburner:origLink></item>
<item><title>Basic Shortcuts in Visual Studio That I Use</title>
<link>http://feedproxy.google.com/~r/GutInstinct/~3/B0GTlLVsLIY/Basic-Shortcuts-in-Visual-Studio-That-I-Use.aspx</link>
<author>James Craig</author>
<pubDate>Sat, 23 Jul 2011 15:22:19 GMT</pubDate>
<description>So apparently a couple of people have complained about the fact that I have line numbers in the code that I show. Apparently people have been going line by line and deleting the numbers. My first response was “Wow, that’s inefficient… Wait do they not know about column selection?” You see Visual Studio has this little feature that lets you select a column (really a block) of data. All you do is hold down the alt key when selecting something and you can select a column of data. So you do that, select the numbers before my code, and hit delete and you have usable code. And if these guys didn’t know about that little trick, maybe they didn’t know a couple of others in Visual Studio:     Hold Alt while selecting = column select mode (don't need to continue holding).    ctrl+K, ctrl+C = comment out a section    ctrl+K, ctrl+U = uncomment a section    ctrl+M, ctrl+O = collapses all regions (functions, etc.)    ctrl+M, ctrl+L = shows all regions (functions, etc.)    ctrl+. (dot) = Show smart menu (whenever you see that weird blue underline, it brings up a menu of options related)    ctrl+N = New file dialog    Shift+Alt+Enter = Full screen mode (I only use this when I'm trying to show code to people on a projector or something)    ctrl+tab = goes between child windows and brings up the nice andquot;active filesandquot; window so you can pick the file you want (at least in 2010 anyway).    F5 = debug (also in break mode causes the execution to continue, but if you don’t know that, that’s rather worrisome)    Ctrl+F5 = compiles and runs the app (no debug)    Shift+F5 = kills debugging session    F4 = displays the properties window    ctrl+K,ctrl+D = formats the code in the window    Shift+del = deletes a row    F12 = Go to definition   Those are the ones that I use frequently enough anyway. Or at least ones that I can remember off the top of my head. Anyway hopefully this helps someone out. Try them out and happy coding.
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/O8xLOL2Ss9uUXLSE0UpkqXFLiYY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/O8xLOL2Ss9uUXLSE0UpkqXFLiYY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/O8xLOL2Ss9uUXLSE0UpkqXFLiYY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/O8xLOL2Ss9uUXLSE0UpkqXFLiYY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GutInstinct/~4/B0GTlLVsLIY" height="1" width="1"/&gt;</description>
<itunes:subtitle>Basic Shortcuts in Visual Studio That I Use</itunes:subtitle><itunes:summary><![CDATA[So apparently a couple of people have complained about the fact that I have line numbers in the code that I show. Apparently people have been going line by line and deleting the numbers. My first response was “Wow, that’s inefficient… Wait do they not know about column selection?” You see Visual Studio has this little feature that lets you select a column (really a block) of data. All you do is hold down the alt key when selecting something and you can select a column of data. So you do that, select the numbers before my code, and hit delete and you have usable code. And if these guys didn’t know about that little trick, maybe they didn’t know a couple of others in Visual Studio:     Hold Alt while selecting = column select mode (don't need to continue holding).    ctrl+K, ctrl+C = comment out a section    ctrl+K, ctrl+U = uncomment a section    ctrl+M, ctrl+O = collapses all regions (functions, etc.)    ctrl+M, ctrl+L = shows all regions (functions, etc.)    ctrl+. (dot) = Show smart menu (whenever you see that weird blue underline, it brings up a menu of options related)    ctrl+N = New file dialog    Shift+Alt+Enter = Full screen mode (I only use this when I'm trying to show code to people on a projector or something)    ctrl+tab = goes between child windows and brings up the nice andquot;active filesandquot; window so you can pick the file you want (at least in 2010 anyway).    F5 = debug (also in break mode causes the execution to continue, but if you don’t know that, that’s rather worrisome)    Ctrl+F5 = compiles and runs the app (no debug)    Shift+F5 = kills debugging session    F4 = displays the properties window    ctrl+K,ctrl+D = formats the code in the window    Shift+del = deletes a row    F12 = Go to definition   Those are the ones that I use frequently enough anyway. Or at least ones that I can remember off the top of my head. Anyway hopefully this helps someone out. Try them out and happy coding.]]></itunes:summary><feedburner:origLink>http://www.gutgames.com/post/Basic-Shortcuts-in-Visual-Studio-That-I-Use.aspx</feedburner:origLink></item>
<item><title>Craigandrsquo;s Utility Library 2.2 Released</title>
<link>http://feedproxy.google.com/~r/GutInstinct/~3/X-rz0kl7peM/Craigrsquo3bs-Utility-Library-22-Released.aspx</link>
<author>James Craig</author>
<pubDate>Wed, 20 Jul 2011 21:49:53 GMT</pubDate>
<description>Today is another release of my utility library. This one contains a number of new additions along with a number of fixes:  Additions:   1) CodeGen namespace, which helps with templated text/code generation.    2) Added ability to set free/busy status of appointments.    3) Added IsOfType function to tell if a specific type is a subtype of an interface/base class.    4) Added GetPropertyName function that does a better job when the data type of the property is known.    5) Added basic functions to DataTypeConversion class to convert between SqlDbType to .Net types and vice versa.    6) Added IFluentInterface interface that can be used to hide the ToString, etc. functions.    7) Added MicroORM set of classes, which acts as a simple object to relational mapper (similar to Dapper).    8) Added the ability to run multiple queries in one go in SQLHelper with the NextResult function (skips to the next result set).    9) Added ExecuteDataSet and ExecuteXmlReader functions for SQLHelper (to bring it more in line with the old SqlHelper class that Microsoft put out a while back).    10) Added DbTypeToNetType and NetTypeToDbType functions that convert from DbType to .Net types and vice versa. (also added DbTypeToSqlDbType and SqlDbTypeToDbType to convert between SqlDbType and DbType)    11) Simplified and merged ObjectCartographer project code. Now is housed in the Utilities.DataMapper namespace.    12) Added GetPropertySetter and GetPropertyGetter functions to generate Func and Actions on the fly for a property.    13) Added GetProperty function when type not known at compile time.    14) Added ; as separator in EmailSender class.    15) Added JSON serialization.    16) Merged YABOV project code. Now is housed in the Utilities.Validation namespace.    17) Merged Blammo.Net project code. Now is housed in the Utilities.IO.Logging namespace.    18) Merged Gestalt.Net project code. Now is housed in the Utilities.Configuration namespace.    19) Added function to FileManager that allows for setting attributes on a directory/files within it.    20) Added function to Reflection class that creates one instance of all classes that it finds of a specific interface/base class.    21) Added functions to load assemblies from a directory and create objects from a directory.    22) Added ability to search for file types in FileManager.    23) Merged Aspectus project code. Now housed in the Utilities.Reflection.AOP namespace.    24) Merged DotCache project code. Now housed in the Utilities.Caching namespace.    25) Merged Hateraide project code. Now housed in the Utilities.ORM namespace.    26) Added generic version of ExecuteScaler function in SQLHelper.     Fixes/Improvements:    1) Fixed minor issues with CSS StripWhitespace function.    2) Fixed minor issues with Javascript Minify function (now respects special comments as described by Yahoo Compressor documentation: http://developer.yahoo.com/yui/compressor/css.html).    3) Fixed issue with delimited files containing $.    4) Fixed issue in EmailSender if email addresses are empty/blank.    5) Improved the IsIEnumerable function to remove redundant code.    6) Rewrote SQLHelper class. Now uses DbFactories so more than just SQL Server is supported.    7) Added better parameter handling to SQLHelper.    8) Improved GetPropertyName function.    9) Added automatic opening/closing of a connection on functions where it is required (SQLHelper)    10) Added checks to SQLHelper for opening/closing a connection.    11) Added check in SQLHelper that if a field wasn't returned that the default value is instead returned.    12) Fixed various issues in SQLServer class.  And that’s just the stuff that I was able to remember. I’m pretty sure that there is even more in this release. And that’s not the end of my news. You see I’ve also finally sent in the request to CodePlex to switch the repository over to Mercury from SVN. Once that actually goes through I’ll be adding it to BitBucket, Google Code, etc. as mirror sites. I’ve also merged a number of my projects in with this release (so if you were using them, you should probably take a look at the utility library as it was probably moved there).  This leads me to the future of this project. This release is going to be the last in the 2.0 line. The reason is not that I’m abandoning the project. It’s sort of the opposite in that I plan to rewrite a good chunk of it. For instance the Image class is huge, static, etc. It needs to be simplified. The same goes for a number of classes. On top of that much of the initial code was written prior to .Net 3.0 being out. Many changes to C# have been added and I’ve been unable to keep up with all of it in regard to the library. Sadly as time is going on it’s becoming more difficult to update/maintain. On top of that you may have noticed but there are no unit tests with the code. Up until recently the unit tests that I use are related to my work (the main reason I wrote most of the code was for my job so it makes sense). Since that was the case I couldn’t release them. I want to change that. Also up until now the code’s been a bit closed off to contributions, once again I want to change that also (hence I’m switching to Hg, which is a bit more conducive to that). In the coming days I plan to put up a few more details on the CodePlex site with regard to actual changes that I have planned, but for now download the code, leave feedback, and happy coding.
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/R7l6RDERis1zHPGG4AZ6liA1TMY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/R7l6RDERis1zHPGG4AZ6liA1TMY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/R7l6RDERis1zHPGG4AZ6liA1TMY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/R7l6RDERis1zHPGG4AZ6liA1TMY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GutInstinct/~4/X-rz0kl7peM" height="1" width="1"/&gt;</description>
<itunes:subtitle>Craigandrsquo;s Utility Library 2.2 Released</itunes:subtitle><itunes:summary><![CDATA[Today is another release of my utility library. This one contains a number of new additions along with a number of fixes:  Additions:   1) CodeGen namespace, which helps with templated text/code generation.    2) Added ability to set free/busy status of appointments.    3) Added IsOfType function to tell if a specific type is a subtype of an interface/base class.    4) Added GetPropertyName function that does a better job when the data type of the property is known.    5) Added basic functions to DataTypeConversion class to convert between SqlDbType to .Net types and vice versa.    6) Added IFluentInterface interface that can be used to hide the ToString, etc. functions.    7) Added MicroORM set of classes, which acts as a simple object to relational mapper (similar to Dapper).    8) Added the ability to run multiple queries in one go in SQLHelper with the NextResult function (skips to the next result set).    9) Added ExecuteDataSet and ExecuteXmlReader functions for SQLHelper (to bring it more in line with the old SqlHelper class that Microsoft put out a while back).    10) Added DbTypeToNetType and NetTypeToDbType functions that convert from DbType to .Net types and vice versa. (also added DbTypeToSqlDbType and SqlDbTypeToDbType to convert between SqlDbType and DbType)    11) Simplified and merged ObjectCartographer project code. Now is housed in the Utilities.DataMapper namespace.    12) Added GetPropertySetter and GetPropertyGetter functions to generate Func and Actions on the fly for a property.    13) Added GetProperty function when type not known at compile time.    14) Added ; as separator in EmailSender class.    15) Added JSON serialization.    16) Merged YABOV project code. Now is housed in the Utilities.Validation namespace.    17) Merged Blammo.Net project code. Now is housed in the Utilities.IO.Logging namespace.    18) Merged Gestalt.Net project code. Now is housed in the Utilities.Configuration namespace.    19) Added function to FileManager that allows for setting attributes on a directory/files within it.    20) Added function to Reflection class that creates one instance of all classes that it finds of a specific interface/base class.    21) Added functions to load assemblies from a directory and create objects from a directory.    22) Added ability to search for file types in FileManager.    23) Merged Aspectus project code. Now housed in the Utilities.Reflection.AOP namespace.    24) Merged DotCache project code. Now housed in the Utilities.Caching namespace.    25) Merged Hateraide project code. Now housed in the Utilities.ORM namespace.    26) Added generic version of ExecuteScaler function in SQLHelper.     Fixes/Improvements:    1) Fixed minor issues with CSS StripWhitespace function.    2) Fixed minor issues with Javascript Minify function (now respects special comments as described by Yahoo Compressor documentation: http://developer.yahoo.com/yui/compressor/css.html).    3) Fixed issue with delimited files containing $.    4) Fixed issue in EmailSender if email addresses are empty/blank.    5) Improved the IsIEnumerable function to remove redundant code.    6) Rewrote SQLHelper class. Now uses DbFactories so more than just SQL Server is supported.    7) Added better parameter handling to SQLHelper.    8) Improved GetPropertyName function.    9) Added automatic opening/closing of a connection on functions where it is required (SQLHelper)    10) Added checks to SQLHelper for opening/closing a connection.    11) Added check in SQLHelper that if a field wasn't returned that the default value is instead returned.    12) Fixed various issues in SQLServer class.  And that’s just the stuff that I was able to remember. I’m pretty sure that there is even more in this release. And that’s not the end of my news. You see I’ve also finally sent in the request to CodePlex to switch the repository over to Mercury from SVN. Once that actually goes through I’ll be adding it to BitBucket, Google Code, etc. as mirror sites. I’ve also merged a number of my projects in with this release (so if you were using them, you should probably take a look at the utility library as it was probably moved there).  This leads me to the future of this project. This release is going to be the last in the 2.0 line. The reason is not that I’m abandoning the project. It’s sort of the opposite in that I plan to rewrite a good chunk of it. For instance the Image class is huge, static, etc. It needs to be simplified. The same goes for a number of classes. On top of that much of the initial code was written prior to .Net 3.0 being out. Many changes to C# have been added and I’ve been unable to keep up with all of it in regard to the library. Sadly as time is going on it’s becoming more difficult to update/maintain. On top of that you may have noticed but there are no unit tests with the code. Up until recently the unit tests that I use are related to my work (the main reason I wrote most of the code was for my job so it makes sense). Since that was the case I couldn’t release them. I want to change that. Also up until now the code’s been a bit closed off to contributions, once again I want to change that also (hence I’m switching to Hg, which is a bit more conducive to that). In the coming days I plan to put up a few more details on the CodePlex site with regard to actual changes that I have planned, but for now download the code, leave feedback, and happy coding.]]></itunes:summary><feedburner:origLink>http://www.gutgames.com/post/Craigrsquo3bs-Utility-Library-22-Released.aspx</feedburner:origLink></item>
<item><title>Web Page to Get Basic Information from SharePoint</title>
<link>http://feedproxy.google.com/~r/GutInstinct/~3/pEk7THEl-RE/Web-Page-to-Get-Basic-Information-from-SharePoint.aspx</link>
<author>James Craig</author>
<pubDate>Sun, 03 Jul 2011 18:54:34 GMT</pubDate>
<description>As of late I’ve been working mostly on a SharePoint install at work. We use it for our extranet already and we’re just planning on switching our intranet over to it. One of the biggest issues that we’ve run into with the extranet is simply figuring out what the heck we had out there. I had access to log into the server along with a couple of other admins but when our help desk would get a call, they’d be out of luck. So I made a small app to give them basic information about any site collection that someone might call about. Since it’s generic enough, I figured I might as well share it with the world:             1: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       2: andlt;html xmlns=andquot;http://www.w3.org/1999/xhtmlandquot;andgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       3: andlt;head runat=andquot;serverandquot;andgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       4:     andlt;titleandgt;SharePoint Manager Overviewandlt;/titleandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       5: andlt;/headandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       6: andlt;bodyandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       7:     andlt;form id=andquot;form1andquot; runat=andquot;serverandquot;andgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       8:         andlt;tableandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       9:             andlt;theadandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      10:                 andlt;trandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      11:                     andlt;thandgt;Site Collectionsandlt;/thandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      12:                     andlt;thandgt;Web Sitesandlt;/thandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      13:                 andlt;/trandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      14:             andlt;/theadandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      15:             andlt;tbodyandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      16:                 andlt;trandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      17:                     andlt;tdandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      18:                         andlt;asp:DropDownList ID=andquot;Sitesandquot; runat=andquot;serverandquot; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      19:                             onselectedindexchanged=andquot;Sites_SelectedIndexChangedandquot; autopostback=andquot;trueandquot;andgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      20:                         andlt;/asp:DropDownListandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      21:                     andlt;/tdandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      22:                     andlt;tdandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      23:                         andlt;asp:DropDownList ID=andquot;SubSitesandquot; runat=andquot;serverandquot; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      24:                             onselectedindexchanged=andquot;SubSites_SelectedIndexChangedandquot; autopostback=andquot;trueandquot;andgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      25:                         andlt;/asp:DropDownListandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      26:                     andlt;/tdandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      27:                 andlt;/trandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      28:             andlt;/tbodyandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      29:         andlt;/tableandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      30:         andlt;tableandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      31:             andlt;theadandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      32:                 andlt;trandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      33:                     andlt;thandgt;Basic Informationandlt;/thandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      34:                 andlt;/trandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      35:             andlt;/theadandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      36:             andlt;tbodyandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      37:                 andlt;trandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      38:                     andlt;tdandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      39:                         andlt;div id=andquot;Testandquot; runat=andquot;serverandquot;andgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      40:     &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      41:                         andlt;/divandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      42:                     andlt;/tdandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      43:                 andlt;/trandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      44:             andlt;/tbodyandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      45:         andlt;/tableandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      46:         andlt;tableandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      47:             andlt;theadandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      48:                 andlt;trandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      49:                     andlt;thandgt;Unused Sitesandlt;/thandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      50:                 andlt;/trandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      51:             andlt;/theadandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      52:             andlt;tbodyandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      53:                 andlt;trandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      54:                     andlt;tdandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      55:                         andlt;div id=andquot;Unusedandquot; runat=andquot;serverandquot;andgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      56:     &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      57:                         andlt;/divandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      58:                     andlt;/tdandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      59:                 andlt;/trandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      60:             andlt;/tbodyandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      61:         andlt;/tableandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      62:     &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      63:     andlt;/formandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      64: andlt;/bodyandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      65: andlt;/htmlandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;And along with that, we have a bit of code behind:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;       1: using System;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       2: using System.Collections.Generic;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       3: using System.Linq;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       4: using System.Web;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       5: using System.Web.UI;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       6: using System.Web.UI.WebControls;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       7: using Microsoft.SharePoint;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       8: using Microsoft.SharePoint.Administration;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       9: using System.Data;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      10: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      11: namespace SiteInfo&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      12: {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      13:     public partial class _Default : System.Web.UI.Page&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      14:     {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      15:         protected void Page_Load(object sender, EventArgs e)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      16:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      17:             if (!Page.IsPostBack)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      18:                 LoadLists();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      19:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      20: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      21:         private void LoadLists()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      22:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      23:             try&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      24:             {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      25:                 Sites.Items.Clear();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      26:                 Sites.Items.Add(new ListItem(andquot; andquot;, andquot;andquot;));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      27:                 using (SPSite WebSite = new SPSite(andquot;LOCAL SITE LOCATIONandquot;))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      28:                 {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      29:                     foreach (SPSite TempSite in WebSite.WebApplication.Sites)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      30:                     {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      31:                         Sites.Items.Add(new ListItem(TempSite.Url, TempSite.ID.ToString()));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      32:                         if (TempSite.LastContentModifiedDate.CompareTo(DateTime.Now.AddDays(-30)) andlt; 0)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      33:                             Unused.InnerHtml += andquot;andlt;a href=\andquot;andquot; + TempSite.Url + andquot;\andquot;andgt;andquot; + TempSite.Url + andquot;andlt;/aandgt;andlt;br /andgt;andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      34:                     }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      35:                 }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      36:             }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      37:             catch (Exception a) { Test.InnerHtml = a.ToString(); }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      38:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      39: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      40:         protected void Sites_SelectedIndexChanged(object sender, EventArgs e)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      41:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      42:             try&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      43:             {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      44:                 SubSites.Items.Clear();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      45:                 SubSites.Items.Add(new ListItem(andquot; andquot;, andquot;andquot;));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      46:                 if (string.IsNullOrEmpty(Sites.SelectedValue))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      47:                     return;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      48:                 using (SPSite TempSite = new SPSite(Guid.Parse(Sites.SelectedValue)))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      49:                 {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      50:                     foreach (SPWeb Web in TempSite.AllWebs)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      51:                     {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      52:                         if (Web != null)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      53:                         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      54:                             SubSites.Items.Add(new ListItem(Web.Title, Web.ID.ToString()));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      55:                         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      56:                     }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      57:                 }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      58:             }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      59:             catch (Exception a) { Test.InnerHtml = a.ToString(); }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      60:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      61: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      62:         protected void SubSites_SelectedIndexChanged(object sender, EventArgs e)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      63:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      64:             try&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      65:             {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      66:                 if (string.IsNullOrEmpty(Sites.SelectedValue))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      67:                     return;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      68:                 if (string.IsNullOrEmpty(SubSites.SelectedValue))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      69:                     return;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      70:                 Guid TempGuid = Guid.Parse(SubSites.SelectedValue);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      71:                 using (SPSite TempSite = new SPSite(Guid.Parse(Sites.SelectedValue)))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      72:                 {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      73:                     Test.InnerHtml = andquot;andlt;tableandgt;andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      74:                     Test.InnerHtml += andquot;andlt;trandgt;andlt;tdandgt;Site collection URL: andlt;/tdandgt;andlt;tdandgt;andlt;a href=\andquot;andquot; + TempSite.Url + andquot;\andquot;andgt;andquot; + TempSite.Url + andquot;andlt;/aandgt;andlt;/tdandgt;andlt;/trandgt;andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      75:                     Test.InnerHtml += andquot;andlt;trandgt;andlt;tdandgt;Site collection owner: andlt;/tdandgt;andlt;tdandgt;andquot; + TempSite.Owner.Name + andquot;andlt;/tdandgt;andlt;/trandgt;andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      76:                     Test.InnerHtml += andquot;andlt;trandgt;andlt;tdandgt;Site collection last modified: andlt;/tdandgt;andlt;tdandgt;andquot; + TempSite.LastContentModifiedDate + andquot;andlt;/tdandgt;andlt;/trandgt;andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      77:                     Test.InnerHtml += andquot;andlt;trandgt;andlt;tdandgt;Site collection size (in MB): andlt;/tdandgt;andlt;tdandgt;andquot; + (TempSite.Usage.Storage / 1048576).ToString() + andquot;andlt;/tdandgt;andlt;/trandgt;andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      78:                     using (SPWeb Web = TempSite.OpenWeb(TempGuid))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      79:                     {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      80:                         if (Web != null)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      81:                         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      82:                             Test.InnerHtml += andquot;andlt;trandgt;andlt;tdandgt;Web site title: andlt;/tdandgt;andlt;tdandgt;andquot; + Web.Title + andquot;andlt;/tdandgt;andlt;/trandgt;andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      83:                             Test.InnerHtml += andquot;andlt;trandgt;andlt;tdandgt;Web site URL: andlt;/tdandgt;andlt;tdandgt;andlt;a href=\andquot;andquot; + Web.Url + andquot;\andquot;andgt;andquot; + Web.Url + andquot;andlt;/aandgt;andlt;/tdandgt;andlt;/trandgt;andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      84:                             Test.InnerHtml += andquot;andlt;trandgt;andlt;tdandgt;Web site description: andlt;/tdandgt;andlt;tdandgt;andquot; + Web.Description + andquot;andlt;/tdandgt;andlt;/trandgt;andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      85:                             Test.InnerHtml += andquot;andlt;trandgt;andlt;tdandgt;Web site date created: andlt;/tdandgt;andlt;tdandgt;andquot; + Web.Created + andquot;andlt;/tdandgt;andlt;/trandgt;andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      86:                             Test.InnerHtml += andquot;andlt;trandgt;andlt;td colspan=\andquot;2\andquot;andgt;andlt;bandgt;Users: andlt;/bandgt;andlt;/tdandgt;andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      87:                             foreach (SPUser User in Web.AllUsers)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      88:                             {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      89:                                 Test.InnerHtml += andquot;andlt;trandgt;andlt;td colspan=\andquot;2\andquot;andgt;andlt;a href=\andquot;mailto:andquot; + User.Email + andquot;\andquot;andgt;andquot; + User.Name + andquot;andlt;/aandgt;andlt;/tdandgt;andlt;/trandgt;andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      90:                             }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      91:                             Test.InnerHtml += andquot;andlt;trandgt;andlt;td colspan=\andquot;2\andquot;andgt;andlt;bandgt;Properties: andlt;/bandgt;andlt;/tdandgt;andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      92:                             foreach (object Key in Web.AllProperties.Keys)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      93:                             {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      94:                                 Test.InnerHtml += andquot;andlt;trandgt;andlt;tdandgt;andquot; + Key.ToString() + andquot;andlt;/tdandgt;andlt;tdandgt;andquot; + Web.AllProperties[Key].ToString() + andquot;andlt;/tdandgt;andlt;/trandgt;andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      95:                             }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      96:                         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      97:                     }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      98:                     Test.InnerHtml += andquot;andlt;/tableandgt;andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      99:                 }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     100:             }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     101:             catch (Exception a) { Test.InnerHtml = a.ToString(); }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     102:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     103:     }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     104: }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;And that was all there was to it. With a minimal amount of code I was able to give our help desk at least a decent amount of info to help them with any calls that they get. So try it out, leave feedback, and happy coding.
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/eJMMlei1AbdaZoLTVXvu5PlFqxM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eJMMlei1AbdaZoLTVXvu5PlFqxM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/eJMMlei1AbdaZoLTVXvu5PlFqxM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eJMMlei1AbdaZoLTVXvu5PlFqxM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GutInstinct/~4/pEk7THEl-RE" height="1" width="1"/&gt;</description>
<itunes:subtitle>Web Page to Get Basic Information from SharePoint</itunes:subtitle><itunes:summary><![CDATA[As of late I’ve been working mostly on a SharePoint install at work. We use it for our extranet already and we’re just planning on switching our intranet over to it. One of the biggest issues that we’ve run into with the extranet is simply figuring out what the heck we had out there. I had access to log into the server along with a couple of other admins but when our help desk would get a call, they’d be out of luck. So I made a small app to give them basic information about any site collection that someone might call about. Since it’s generic enough, I figured I might as well share it with the world:             1: <br /><br /><br />       2: andlt;html xmlns=andquot;http://www.w3.org/1999/xhtmlandquot;andgt;<br /><br /><br />       3: andlt;head runat=andquot;serverandquot;andgt;<br /><br /><br />       4:     andlt;titleandgt;SharePoint Manager Overviewandlt;/titleandgt;<br /><br /><br />       5: andlt;/headandgt;<br /><br /><br />       6: andlt;bodyandgt;<br /><br /><br />       7:     andlt;form id=andquot;form1andquot; runat=andquot;serverandquot;andgt;<br /><br /><br />       8:         andlt;tableandgt;<br /><br /><br />       9:             andlt;theadandgt;<br /><br /><br />      10:                 andlt;trandgt;<br /><br /><br />      11:                     andlt;thandgt;Site Collectionsandlt;/thandgt;<br /><br /><br />      12:                     andlt;thandgt;Web Sitesandlt;/thandgt;<br /><br /><br />      13:                 andlt;/trandgt;<br /><br /><br />      14:             andlt;/theadandgt;<br /><br /><br />      15:             andlt;tbodyandgt;<br /><br /><br />      16:                 andlt;trandgt;<br /><br /><br />      17:                     andlt;tdandgt;<br /><br /><br />      18:                         andlt;asp:DropDownList ID=andquot;Sitesandquot; runat=andquot;serverandquot; <br /><br /><br />      19:                             onselectedindexchanged=andquot;Sites_SelectedIndexChangedandquot; autopostback=andquot;trueandquot;andgt;<br /><br /><br />      20:                         andlt;/asp:DropDownListandgt;<br /><br /><br />      21:                     andlt;/tdandgt;<br /><br /><br />      22:                     andlt;tdandgt;<br /><br /><br />      23:                         andlt;asp:DropDownList ID=andquot;SubSitesandquot; runat=andquot;serverandquot; <br /><br /><br />      24:                             onselectedindexchanged=andquot;SubSites_SelectedIndexChangedandquot; autopostback=andquot;trueandquot;andgt;<br /><br /><br />      25:                         andlt;/asp:DropDownListandgt;<br /><br /><br />      26:                     andlt;/tdandgt;<br /><br /><br />      27:                 andlt;/trandgt;<br /><br /><br />      28:             andlt;/tbodyandgt;<br /><br /><br />      29:         andlt;/tableandgt;<br /><br /><br />      30:         andlt;tableandgt;<br /><br /><br />      31:             andlt;theadandgt;<br /><br /><br />      32:                 andlt;trandgt;<br /><br /><br />      33:                     andlt;thandgt;Basic Informationandlt;/thandgt;<br /><br /><br />      34:                 andlt;/trandgt;<br /><br /><br />      35:             andlt;/theadandgt;<br /><br /><br />      36:             andlt;tbodyandgt;<br /><br /><br />      37:                 andlt;trandgt;<br /><br /><br />      38:                     andlt;tdandgt;<br /><br /><br />      39:                         andlt;div id=andquot;Testandquot; runat=andquot;serverandquot;andgt;<br /><br /><br />      40:     <br /><br /><br />      41:                         andlt;/divandgt;<br /><br /><br />      42:                     andlt;/tdandgt;<br /><br /><br />      43:                 andlt;/trandgt;<br /><br /><br />      44:             andlt;/tbodyandgt;<br /><br /><br />      45:         andlt;/tableandgt;<br /><br /><br />      46:         andlt;tableandgt;<br /><br /><br />      47:             andlt;theadandgt;<br /><br /><br />      48:                 andlt;trandgt;<br /><br /><br />      49:                     andlt;thandgt;Unused Sitesandlt;/thandgt;<br /><br /><br />      50:                 andlt;/trandgt;<br /><br /><br />      51:             andlt;/theadandgt;<br /><br /><br />      52:             andlt;tbodyandgt;<br /><br /><br />      53:                 andlt;trandgt;<br /><br /><br />      54:                     andlt;tdandgt;<br /><br /><br />      55:                         andlt;div id=andquot;Unusedandquot; runat=andquot;serverandquot;andgt;<br /><br /><br />      56:     <br /><br /><br />      57:                         andlt;/divandgt;<br /><br /><br />      58:                     andlt;/tdandgt;<br /><br /><br />      59:                 andlt;/trandgt;<br /><br /><br />      60:             andlt;/tbodyandgt;<br /><br /><br />      61:         andlt;/tableandgt;<br /><br /><br />      62:     <br /><br /><br />      63:     andlt;/formandgt;<br /><br /><br />      64: andlt;/bodyandgt;<br /><br /><br />      65: andlt;/htmlandgt;<br /><br /><br /><br />And along with that, we have a bit of code behind:<br /><br /><br />  <br />       1: using System;<br /><br /><br />       2: using System.Collections.Generic;<br /><br /><br />       3: using System.Linq;<br /><br /><br />       4: using System.Web;<br /><br /><br />       5: using System.Web.UI;<br /><br /><br />       6: using System.Web.UI.WebControls;<br /><br /><br />       7: using Microsoft.SharePoint;<br /><br /><br />       8: using Microsoft.SharePoint.Administration;<br /><br /><br />       9: using System.Data;<br /><br /><br />      10: <br /><br /><br />      11: namespace SiteInfo<br /><br /><br />      12: {<br /><br /><br />      13:     public partial class _Default : System.Web.UI.Page<br /><br /><br />      14:     {<br /><br /><br />      15:         protected void Page_Load(object sender, EventArgs e)<br /><br /><br />      16:         {<br /><br /><br />      17:             if (!Page.IsPostBack)<br /><br /><br />      18:                 LoadLists();<br /><br /><br />      19:         }<br /><br /><br />      20: <br /><br /><br />      21:         private void LoadLists()<br /><br /><br />      22:         {<br /><br /><br />      23:             try<br /><br /><br />      24:             {<br /><br /><br />      25:                 Sites.Items.Clear();<br /><br /><br />      26:                 Sites.Items.Add(new ListItem(andquot; andquot;, andquot;andquot;));<br /><br /><br />      27:                 using (SPSite WebSite = new SPSite(andquot;LOCAL SITE LOCATIONandquot;))<br /><br /><br />      28:                 {<br /><br /><br />      29:                     foreach (SPSite TempSite in WebSite.WebApplication.Sites)<br /><br /><br />      30:                     {<br /><br /><br />      31:                         Sites.Items.Add(new ListItem(TempSite.Url, TempSite.ID.ToString()));<br /><br /><br />      32:                         if (TempSite.LastContentModifiedDate.CompareTo(DateTime.Now.AddDays(-30)) andlt; 0)<br /><br /><br />      33:                             Unused.InnerHtml += andquot;andlt;a href=\andquot;andquot; + TempSite.Url + andquot;\andquot;andgt;andquot; + TempSite.Url + andquot;andlt;/aandgt;andlt;br /andgt;andquot;;<br /><br /><br />      34:                     }<br /><br /><br />      35:                 }<br /><br /><br />      36:             }<br /><br /><br />      37:             catch (Exception a) { Test.InnerHtml = a.ToString(); }<br /><br /><br />      38:         }<br /><br /><br />      39: <br /><br /><br />      40:         protected void Sites_SelectedIndexChanged(object sender, EventArgs e)<br /><br /><br />      41:         {<br /><br /><br />      42:             try<br /><br /><br />      43:             {<br /><br /><br />      44:                 SubSites.Items.Clear();<br /><br /><br />      45:                 SubSites.Items.Add(new ListItem(andquot; andquot;, andquot;andquot;));<br /><br /><br />      46:                 if (string.IsNullOrEmpty(Sites.SelectedValue))<br /><br /><br />      47:                     return;<br /><br /><br />      48:                 using (SPSite TempSite = new SPSite(Guid.Parse(Sites.SelectedValue)))<br /><br /><br />      49:                 {<br /><br /><br />      50:                     foreach (SPWeb Web in TempSite.AllWebs)<br /><br /><br />      51:                     {<br /><br /><br />      52:                         if (Web != null)<br /><br /><br />      53:                         {<br /><br /><br />      54:                             SubSites.Items.Add(new ListItem(Web.Title, Web.ID.ToString()));<br /><br /><br />      55:                         }<br /><br /><br />      56:                     }<br /><br /><br />      57:                 }<br /><br /><br />      58:             }<br /><br /><br />      59:             catch (Exception a) { Test.InnerHtml = a.ToString(); }<br /><br /><br />      60:         }<br /><br /><br />      61: <br /><br /><br />      62:         protected void SubSites_SelectedIndexChanged(object sender, EventArgs e)<br /><br /><br />      63:         {<br /><br /><br />      64:             try<br /><br /><br />      65:             {<br /><br /><br />      66:                 if (string.IsNullOrEmpty(Sites.SelectedValue))<br /><br /><br />      67:                     return;<br /><br /><br />      68:                 if (string.IsNullOrEmpty(SubSites.SelectedValue))<br /><br /><br />      69:                     return;<br /><br /><br />      70:                 Guid TempGuid = Guid.Parse(SubSites.SelectedValue);<br /><br /><br />      71:                 using (SPSite TempSite = new SPSite(Guid.Parse(Sites.SelectedValue)))<br /><br /><br />      72:                 {<br /><br /><br />      73:                     Test.InnerHtml = andquot;andlt;tableandgt;andquot;;<br /><br /><br />      74:                     Test.InnerHtml += andquot;andlt;trandgt;andlt;tdandgt;Site collection URL: andlt;/tdandgt;andlt;tdandgt;andlt;a href=\andquot;andquot; + TempSite.Url + andquot;\andquot;andgt;andquot; + TempSite.Url + andquot;andlt;/aandgt;andlt;/tdandgt;andlt;/trandgt;andquot;;<br /><br /><br />      75:                     Test.InnerHtml += andquot;andlt;trandgt;andlt;tdandgt;Site collection owner: andlt;/tdandgt;andlt;tdandgt;andquot; + TempSite.Owner.Name + andquot;andlt;/tdandgt;andlt;/trandgt;andquot;;<br /><br /><br />      76:                     Test.InnerHtml += andquot;andlt;trandgt;andlt;tdandgt;Site collection last modified: andlt;/tdandgt;andlt;tdandgt;andquot; + TempSite.LastContentModifiedDate + andquot;andlt;/tdandgt;andlt;/trandgt;andquot;;<br /><br /><br />      77:                     Test.InnerHtml += andquot;andlt;trandgt;andlt;tdandgt;Site collection size (in MB): andlt;/tdandgt;andlt;tdandgt;andquot; + (TempSite.Usage.Storage / 1048576).ToString() + andquot;andlt;/tdandgt;andlt;/trandgt;andquot;;<br /><br /><br />      78:                     using (SPWeb Web = TempSite.OpenWeb(TempGuid))<br /><br /><br />      79:                     {<br /><br /><br />      80:                         if (Web != null)<br /><br /><br />      81:                         {<br /><br /><br />      82:                             Test.InnerHtml += andquot;andlt;trandgt;andlt;tdandgt;Web site title: andlt;/tdandgt;andlt;tdandgt;andquot; + Web.Title + andquot;andlt;/tdandgt;andlt;/trandgt;andquot;;<br /><br /><br />      83:                             Test.InnerHtml += andquot;andlt;trandgt;andlt;tdandgt;Web site URL: andlt;/tdandgt;andlt;tdandgt;andlt;a href=\andquot;andquot; + Web.Url + andquot;\andquot;andgt;andquot; + Web.Url + andquot;andlt;/aandgt;andlt;/tdandgt;andlt;/trandgt;andquot;;<br /><br /><br />      84:                             Test.InnerHtml += andquot;andlt;trandgt;andlt;tdandgt;Web site description: andlt;/tdandgt;andlt;tdandgt;andquot; + Web.Description + andquot;andlt;/tdandgt;andlt;/trandgt;andquot;;<br /><br /><br />      85:                             Test.InnerHtml += andquot;andlt;trandgt;andlt;tdandgt;Web site date created: andlt;/tdandgt;andlt;tdandgt;andquot; + Web.Created + andquot;andlt;/tdandgt;andlt;/trandgt;andquot;;<br /><br /><br />      86:                             Test.InnerHtml += andquot;andlt;trandgt;andlt;td colspan=\andquot;2\andquot;andgt;andlt;bandgt;Users: andlt;/bandgt;andlt;/tdandgt;andquot;;<br /><br /><br />      87:                             foreach (SPUser User in Web.AllUsers)<br /><br /><br />      88:                             {<br /><br /><br />      89:                                 Test.InnerHtml += andquot;andlt;trandgt;andlt;td colspan=\andquot;2\andquot;andgt;andlt;a href=\andquot;mailto:andquot; + User.Email + andquot;\andquot;andgt;andquot; + User.Name + andquot;andlt;/aandgt;andlt;/tdandgt;andlt;/trandgt;andquot;;<br /><br /><br />      90:                             }<br /><br /><br />      91:                             Test.InnerHtml += andquot;andlt;trandgt;andlt;td colspan=\andquot;2\andquot;andgt;andlt;bandgt;Properties: andlt;/bandgt;andlt;/tdandgt;andquot;;<br /><br /><br />      92:                             foreach (object Key in Web.AllProperties.Keys)<br /><br /><br />      93:                             {<br /><br /><br />      94:                                 Test.InnerHtml += andquot;andlt;trandgt;andlt;tdandgt;andquot; + Key.ToString() + andquot;andlt;/tdandgt;andlt;tdandgt;andquot; + Web.AllProperties[Key].ToString() + andquot;andlt;/tdandgt;andlt;/trandgt;andquot;;<br /><br /><br />      95:                             }<br /><br /><br />      96:                         }<br /><br /><br />      97:                     }<br /><br /><br />      98:                     Test.InnerHtml += andquot;andlt;/tableandgt;andquot;;<br /><br /><br />      99:                 }<br /><br /><br />     100:             }<br /><br /><br />     101:             catch (Exception a) { Test.InnerHtml = a.ToString(); }<br /><br /><br />     102:         }<br /><br /><br />     103:     }<br /><br /><br />     104: }<br /><br /><br /><br />And that was all there was to it. With a minimal amount of code I was able to give our help desk at least a decent amount of info to help them with any calls that they get. So try it out, leave feedback, and happy coding.]]></itunes:summary><feedburner:origLink>http://www.gutgames.com/post/Web-Page-to-Get-Basic-Information-from-SharePoint.aspx</feedburner:origLink></item>
<item><title>Major Rework Happening</title>
<link>http://feedproxy.google.com/~r/GutInstinct/~3/e0zWiQY34G4/Major-Rework-Happening.aspx</link>
<author>James Craig</author>
<pubDate>Mon, 27 Jun 2011 20:56:07 GMT</pubDate>
<description>So apparently working nonstop on a SharePoint deployment gives me little time to code (other than a function here, a fix there)... In the mean time I've come to one conclusion, namely that I have too many projects. If I look at my Libraries folder (which contains a number of items that I've released on CodePlex, SourceForge, etc. and a number of items that I haven't released), I see 67 projects.  That's 67 various projects that I've used in one form or another, not including their unit tests (which I usually separate out in another project), and I usually have a test app that I use for testing the concept for the library. I have a tendency to start coding based on my notes, try using it in a mini app, and if it feels awkward I refactor, etc. Anyway, when you add it all up we're looking at about 139 projects... I’m not even going to get into the number of lines of code, but let’s just say it takes a while to compile things (even longer if I do a batch build of debug and release). I have an IoC container, a library for procedurally generated textures, a web framework, etc. None of them made it out to the public, but they’re there.  Since this is the case, I've decided to get rid of my various libraries. Well, not get rid of, but instead I'm going to merge anything that I find of interest in with my utility library (with the exception of MoonUnit and Optimizer Prime). Once everything is merged, I'm going to do a release. After that, I'm going to rework my utility library a bit. You see I started work on the utility library just before .Net 3.0 came out. So a number of classes are a bit dated. Plus I have classes that aren’t needed/used any more that I plan on getting rid of. Also I finally (it only took a year) got approval to move things to Mercurial. So if you like SVN that's bad news. If you like Hg, it's good news.  So there you have it, I haven't posted anything because work hasn't been giving me anything interesting and I'm stuck in a bit of a rewrite on my own projects (but I'm nearing completion on both, so hopefully things will pick up).
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/NfZPgbuz-hUE0IXAuqpHQKRdM6M/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NfZPgbuz-hUE0IXAuqpHQKRdM6M/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/NfZPgbuz-hUE0IXAuqpHQKRdM6M/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NfZPgbuz-hUE0IXAuqpHQKRdM6M/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GutInstinct/~4/e0zWiQY34G4" height="1" width="1"/&gt;</description>
<itunes:subtitle>Major Rework Happening</itunes:subtitle><itunes:summary><![CDATA[So apparently working nonstop on a SharePoint deployment gives me little time to code (other than a function here, a fix there)... In the mean time I've come to one conclusion, namely that I have too many projects. If I look at my Libraries folder (which contains a number of items that I've released on CodePlex, SourceForge, etc. and a number of items that I haven't released), I see 67 projects.  That's 67 various projects that I've used in one form or another, not including their unit tests (which I usually separate out in another project), and I usually have a test app that I use for testing the concept for the library. I have a tendency to start coding based on my notes, try using it in a mini app, and if it feels awkward I refactor, etc. Anyway, when you add it all up we're looking at about 139 projects... I’m not even going to get into the number of lines of code, but let’s just say it takes a while to compile things (even longer if I do a batch build of debug and release). I have an IoC container, a library for procedurally generated textures, a web framework, etc. None of them made it out to the public, but they’re there.  Since this is the case, I've decided to get rid of my various libraries. Well, not get rid of, but instead I'm going to merge anything that I find of interest in with my utility library (with the exception of MoonUnit and Optimizer Prime). Once everything is merged, I'm going to do a release. After that, I'm going to rework my utility library a bit. You see I started work on the utility library just before .Net 3.0 came out. So a number of classes are a bit dated. Plus I have classes that aren’t needed/used any more that I plan on getting rid of. Also I finally (it only took a year) got approval to move things to Mercurial. So if you like SVN that's bad news. If you like Hg, it's good news.  So there you have it, I haven't posted anything because work hasn't been giving me anything interesting and I'm stuck in a bit of a rewrite on my own projects (but I'm nearing completion on both, so hopefully things will pick up).]]></itunes:summary><feedburner:origLink>http://www.gutgames.com/post/Major-Rework-Happening.aspx</feedburner:origLink></item>
<item><title>Creating an ORM in C# Revisited andndash; Part 2</title>
<link>http://feedproxy.google.com/~r/GutInstinct/~3/Y7hpyXL4cFo/Creating-an-ORM-in-C-Revisited-ndash3b-Part-2.aspx</link>
<author>James Craig</author>
<pubDate>Fri, 03 Jun 2011 09:15:50 GMT</pubDate>
<description>Apparently this didn't actually get uploaded, so here's the second part of this a bit late along with the third. Anyway, last time I talked about coming up with a simple object to object mapper to help speed up and simplify the ORM. In this post we're going to worry about actually connecting to the database. In Dapper and Massive, they simply uses extension methods to DBConnections. I could easily do that but for a while now I've been using a class called SQLHelper to simplify connecting to a database (not Microsoft's SQLHelper, it's my own class). For me, it simplifies things quite a bit (I can set up the connection in one line instead of ten), so I'll be using that instead:             1: /*&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       2: Copyright (c) 2011 andlt;a href=andquot;http://www.gutgames.comandquot;andgt;James Craigandlt;/aandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       3: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       4: Permission is hereby granted, free of charge, to any person obtaining a copy&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       5: of this software and associated documentation files (the andquot;Softwareandquot;), to deal&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       6: in the Software without restriction, including without limitation the rights&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       7: to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       8: copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       9: furnished to do so, subject to the following conditions:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      10: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      11: The above copyright notice and this permission notice shall be included in&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      12: all copies or substantial portions of the Software.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      13: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      14: THE SOFTWARE IS PROVIDED andquot;AS ISandquot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      15: IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      16: FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      17: AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      18: LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      19: OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      20: THE SOFTWARE.*/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      21: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      22: #region Usings&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      23: using System;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      24: using System.Data;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      25: using System.Data.SqlClient;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      26: using System.Xml;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      27: using System.Data.Common;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      28: #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      29: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      30: namespace Utilities.SQL&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      31: {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      32:     /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      33:     /// SQL Helper class&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      34:     /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      35:     public class SQLHelper : IDisposable&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      36:     {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      37:         #region Constructors&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      38: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      39:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      40:         /// Constructor&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      41:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      42:         /// andlt;param name=andquot;Commandandquot;andgt;Stored procedure/SQL Text to useandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      43:         /// andlt;param name=andquot;ConnectionUsingandquot;andgt;The connection string to userandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      44:         /// andlt;param name=andquot;CommandTypeandquot;andgt;The command type of the command sent inandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      45:         public SQLHelper(string Command, string ConnectionUsing, CommandType CommandType, string DbType = andquot;System.Data.SqlClientandquot;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      46:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      47:             Factory = DbProviderFactories.GetFactory(DbType);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      48:             Connection = Factory.CreateConnection();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      49:             Connection.ConnectionString = ConnectionUsing;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      50:             _Command = Command;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      51:             _CommandType = CommandType;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      52:             ExecutableCommand = Factory.CreateCommand();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      53:             ExecutableCommand.CommandText = _Command;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      54:             ExecutableCommand.Connection = Connection;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      55:             ExecutableCommand.CommandType = CommandType;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      56:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      57: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      58:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      59: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      60:         #region Properties&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      61: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      62:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      63:         /// Db provider factory (creates connections, etc.)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      64:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      65:         protected virtual DbProviderFactory Factory { get; set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      66: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      67:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      68:         /// Connection to the database&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      69:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      70:         protected virtual DbConnection Connection { get; set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      71: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      72:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      73:         /// The executable command&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      74:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      75:         protected DbCommand ExecutableCommand { get; set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      76: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      77:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      78:         /// The data reader for the query&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      79:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      80:         protected DbDataReader Reader { get; set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      81: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      82:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      83:         /// The transaction associated with the query&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      84:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      85:         protected DbTransaction Transaction { get; set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      86: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      87:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      88:         /// Stored procedure's name or SQL Text&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      89:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      90:         public virtual string Command&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      91:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      92:             get { return _Command; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      93:             set&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      94:             {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      95:                 _Command = value;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      96:                 RecreateConnection();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      97:             }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      98:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      99: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     100:         private string _Command = null;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     101: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     102: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     103:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     104:         /// Command Type&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     105:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     106:         public virtual CommandType CommandType&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     107:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     108:             get { return _CommandType; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     109:             set&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     110:             {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     111:                 _CommandType = value;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     112:                 RecreateConnection();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     113:             }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     114:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     115:         private CommandType _CommandType;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     116: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     117:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     118: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     119:         #region Functions&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     120: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     121:         #region AddOutputParameter&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     122: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     123:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     124:         /// Adds an output parameter&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     125:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     126:         /// andlt;param name=andquot;IDandquot;andgt;Name of the parameterandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     127:         /// andlt;param name=andquot;Typeandquot;andgt;SQL type of the parameterandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     128:         public virtual void AddOutputParameter(string ID, SqlDbType Type)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     129:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     130:             AddOutputParameter(ID, Utilities.DataTypes.DataTypeConversion.SqlDbTypeToDbType(Type));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     131:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     132: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     133:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     134:         /// Adds an output parameter&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     135:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     136:         /// andlt;param name=andquot;IDandquot;andgt;Name of the parameterandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     137:         /// andlt;param name=andquot;Typeandquot;andgt;SQL type of the parameterandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     138:         public virtual void AddOutputParameter(string ID, DbType Type)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     139:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     140:             if (ExecutableCommand != null)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     141:             {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     142:                 DbParameter Parameter = null;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     143:                 if (ExecutableCommand.Parameters.Contains(ID))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     144:                     Parameter = ExecutableCommand.Parameters[ID];&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     145:                 else&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     146:                 {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     147:                     Parameter = ExecutableCommand.CreateParameter();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     148:                     ExecutableCommand.Parameters.Add(Parameter);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     149:                 }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     150:                 Parameter.ParameterName = ID;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     151:                 Parameter.Value = null;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     152:                 Parameter.DbType = Type;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     153:                 Parameter.Direction = ParameterDirection.Output;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     154:             }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     155:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     156: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     157:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     158:         /// Adds an output parameter&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     159:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     160:         /// andlt;typeparam name=andquot;DataTypeandquot;andgt;Data type of the parameterandlt;/typeparamandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     161:         /// andlt;param name=andquot;IDandquot;andgt;ID associated with the output parameterandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     162:         public virtual void AddOutputParameterandlt;DataTypeandgt;(string ID)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     163:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     164:             AddOutputParameter(ID, Utilities.DataTypes.DataTypeConversion.NetTypeToDbType(typeof(DataType)));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     165:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     166: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     167:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     168:         /// Adds an output parameter&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     169:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     170:         /// andlt;param name=andquot;IDandquot;andgt;Name of the parameterandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     171:         /// andlt;param name=andquot;Lengthandquot;andgt;Length of the string (either -1 or 5000 should be used to indicate nvarchar(max))andlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     172:         public virtual void AddOutputParameter(string ID, int Length)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     173:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     174:             if (Length == 5000)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     175:                 Length = -1;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     176:             if (ExecutableCommand != null)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     177:             {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     178:                 DbParameter Parameter = null;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     179:                 if (ExecutableCommand.Parameters.Contains(ID))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     180:                     Parameter = ExecutableCommand.Parameters[ID];&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     181:                 else&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     182:                 {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     183:                     Parameter = ExecutableCommand.CreateParameter();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     184:                     ExecutableCommand.Parameters.Add(Parameter);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     185:                 }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     186:                 Parameter.ParameterName = ID;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     187:                 Parameter.Value = null;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     188:                 Parameter.DbType = Utilities.DataTypes.DataTypeConversion.NetTypeToDbType(typeof(string));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     189:                 Parameter.Direction = ParameterDirection.Output;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     190:                 Parameter.Size = Length;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     191:             }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     192:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     193: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     194:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     195: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     196:         #region AddParameter&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     197: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     198:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     199:         /// Adds a parameter to the call (for strings only)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     200:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     201:         /// andlt;param name=andquot;IDandquot;andgt;Name of the parameterandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     202:         /// andlt;param name=andquot;Valueandquot;andgt;Value to addandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     203:         /// andlt;param name=andquot;Lengthandquot;andgt;Size of the string(either -1 or 5000 should be used to indicate nvarchar(max))andlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     204:         public virtual void AddParameter(string ID, string Value, int Length)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     205:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     206:             if (Length == 5000)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     207:                 Length = -1;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     208:             if (ExecutableCommand != null)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     209:             {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     210:                 DbParameter Parameter = null;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     211:                 if (ExecutableCommand.Parameters.Contains(ID))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     212:                     Parameter = ExecutableCommand.Parameters[ID];&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     213:                 else&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     214:                 {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     215:                     Parameter = ExecutableCommand.CreateParameter();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     216:                     ExecutableCommand.Parameters.Add(Parameter);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     217:                 }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     218:                 Parameter.ParameterName = ID;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     219:                 Parameter.Value = (string.IsNullOrEmpty(Value)) ? System.DBNull.Value : (object)Value;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     220:                 Parameter.IsNullable = (string.IsNullOrEmpty(Value));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     221:                 Parameter.DbType = Utilities.DataTypes.DataTypeConversion.NetTypeToDbType(typeof(string));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     222:                 Parameter.Direction = ParameterDirection.Input;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     223:                 Parameter.Size = Length;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     224:             }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     225:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     226: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     227:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     228:         /// Adds a parameter to the call (for all types other than strings)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     229:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     230:         /// andlt;param name=andquot;IDandquot;andgt;Name of the parameterandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     231:         /// andlt;param name=andquot;Valueandquot;andgt;Value to addandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     232:         /// andlt;param name=andquot;Typeandquot;andgt;SQL type of the parameterandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     233:         public virtual void AddParameter(string ID, object Value, SqlDbType Type)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     234:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     235:             AddParameter(ID, Value, Utilities.DataTypes.DataTypeConversion.SqlDbTypeToDbType(Type));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     236:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     237: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     238:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     239:         /// Adds a parameter to the call (for all types other than strings)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     240:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     241:         /// andlt;typeparam name=andquot;DataTypeandquot;andgt;Data type of the parameterandlt;/typeparamandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     242:         /// andlt;param name=andquot;IDandquot;andgt;Name of the parameterandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     243:         /// andlt;param name=andquot;Valueandquot;andgt;Value to addandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     244:         public virtual void AddParameterandlt;DataTypeandgt;(string ID, DataType Value)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     245:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     246:             AddParameter(ID, Value, Utilities.DataTypes.DataTypeConversion.NetTypeToDbType(Value.GetType()));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     247:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     248: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     249:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     250:         /// Adds a parameter to the call (for all types other than strings)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     251:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     252:         /// andlt;param name=andquot;IDandquot;andgt;Name of the parameterandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     253:         /// andlt;param name=andquot;Valueandquot;andgt;Value to addandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     254:         /// andlt;param name=andquot;Typeandquot;andgt;SQL type of the parameterandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     255:         public virtual void AddParameter(string ID, object Value, DbType Type)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     256:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     257:             if (ExecutableCommand != null)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     258:             {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     259:                 DbParameter Parameter = null;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     260:                 if (ExecutableCommand.Parameters.Contains(ID))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     261:                     Parameter = ExecutableCommand.Parameters[ID];&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     262:                 else&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     263:                 {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     264:                     Parameter = ExecutableCommand.CreateParameter();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     265:                     ExecutableCommand.Parameters.Add(Parameter);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     266:                 }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     267:                 Parameter.ParameterName = ID;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     268:                 Parameter.Value = (Value == null) ? System.DBNull.Value : Value;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     269:                 Parameter.IsNullable = (Value == null);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     270:                 Parameter.DbType = Type;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     271:                 Parameter.Direction = ParameterDirection.Input;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     272:             }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     273:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     274: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     275:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     276: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     277:         #region BeginTransaction&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     278: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     279:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     280:         /// Begins a transaction&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     281:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     282:         public virtual void BeginTransaction()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     283:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     284:             Open();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     285:             Transaction = Connection.BeginTransaction();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     286:             Command = _Command;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     287:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     288: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     289:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     290: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     291:         #region ClearParameters&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     292: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     293:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     294:         /// Clears the parameters&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     295:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     296:         public virtual void ClearParameters()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     297:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     298:             if (ExecutableCommand != null)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     299:                 ExecutableCommand.Parameters.Clear();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     300:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     301: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     302:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     303: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     304:         #region Close&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     305: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     306:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     307:         /// Closes the connection&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     308:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     309:         public virtual void Close()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     310:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     311:             if (ExecutableCommand != null&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     312:                 andamp;andamp; ExecutableCommand.Connection != null&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     313:                 andamp;andamp; ExecutableCommand.Connection.State != ConnectionState.Closed)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     314:                 ExecutableCommand.Connection.Close();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     315:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     316: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     317:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     318: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     319:         #region Commit&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     320: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     321:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     322:         /// Commits a transaction&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     323:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     324:         public virtual void Commit()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     325:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     326:             if (Transaction != null)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     327:                 Transaction.Commit();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     328:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     329: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     330:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     331: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     332:         #region ExecuteDataSet&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     333: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     334:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     335:         /// Executes the query and returns a data set&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     336:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     337:         /// andlt;returnsandgt;A dataset filled with the results of the queryandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     338:         public virtual DataSet ExecuteDataSet()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     339:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     340:             Open();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     341:             if (ExecutableCommand != null)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     342:             {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     343:                 DbDataAdapter Adapter = Factory.CreateDataAdapter();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     344:                 Adapter.SelectCommand = ExecutableCommand;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     345:                 DataSet ReturnSet = new DataSet();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     346:                 Adapter.Fill(ReturnSet);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     347:                 return ReturnSet;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     348:             }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     349:             return null;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     350:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     351: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     352:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     353: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     354:         #region ExecuteNonQuery&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     355: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     356:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     357:         /// Executes the stored procedure as a non query&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     358:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     359:         /// andlt;returnsandgt;Number of rows effectedandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     360:         public virtual int ExecuteNonQuery()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     361:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     362:             Open();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     363:             if (ExecutableCommand != null)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     364:                 return ExecutableCommand.ExecuteNonQuery();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     365:             return 0;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     366:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     367: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     368:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     369: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     370:         #region ExecuteReader&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     371: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     372:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     373:         /// Executes the stored procedure and returns a reader object&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     374:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     375:         public virtual void ExecuteReader()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     376:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     377:             Open();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     378:             if (ExecutableCommand != null)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     379:                 Reader = ExecutableCommand.ExecuteReader();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     380:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     381: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     382:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     383: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     384:         #region ExecuteScalar&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     385: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     386:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     387:         /// Executes the stored procedure as a scalar query&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     388:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     389:         /// andlt;returnsandgt;The object of the first row and first columnandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     390:         public virtual object ExecuteScalar()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     391:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     392:             Open();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     393:             if (ExecutableCommand != null)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     394:                 return ExecutableCommand.ExecuteScalar();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     395:             return null;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     396:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     397: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     398:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     399: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     400:         #region ExecuteXmlReader&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     401: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     402:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     403:         /// Executes the query and returns an XmlReader&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     404:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     405:         /// andlt;returnsandgt;The XmlReader filled with the data from the queryandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     406:         public virtual XmlReader ExecuteXmlReader()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     407:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     408:             Open();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     409:             if (ExecutableCommand != null andamp;andamp; ExecutableCommand is SqlCommand)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     410:                 return ((SqlCommand)ExecutableCommand).ExecuteXmlReader();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     411:             return null;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     412:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     413: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     414:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     415: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     416:         #region GetParameter&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     417: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     418:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     419:         /// Returns a parameter's value&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     420:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     421:         /// andlt;param name=andquot;IDandquot;andgt;Parameter nameandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     422:         /// andlt;param name=andquot;Defaultandquot;andgt;Default value for the parameterandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     423:         /// andlt;returnsandgt;if the parameter exists (and isn't null or empty), it returns the parameter's value. Otherwise the default value is returned.andlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     424:         public virtual object GetParameter(string ID, object Default)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     425:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     426:             if (Reader != null andamp;andamp; !Convert.IsDBNull(Reader[ID]))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     427:                 return Reader[ID];&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     428:             return Default;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     429:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     430: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     431:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     432:         /// Returns a parameter's value&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     433:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     434:         /// andlt;typeparam name=andquot;DataTypeandquot;andgt;Data type of the objectandlt;/typeparamandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     435:         /// andlt;param name=andquot;IDandquot;andgt;Parameter nameandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     436:         /// andlt;param name=andquot;Defaultandquot;andgt;Default value for the parameterandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     437:         /// andlt;returnsandgt;if the parameter exists (and isn't null or empty), it returns the parameter's value. Otherwise the default value is returned.andlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     438:         public virtual DataType GetParameterandlt;DataTypeandgt;(string ID, DataType Default)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     439:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     440:             if (Reader != null andamp;andamp; !Convert.IsDBNull(Reader[ID]))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     441:                 return (DataType)Convert.ChangeType(Reader[ID], typeof(DataType));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     442:             return Default;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     443:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     444: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     445:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     446:         /// Returns a parameter's value&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     447:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     448:         /// andlt;param name=andquot;Positionandquot;andgt;Position in the rowandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     449:         /// andlt;param name=andquot;Defaultandquot;andgt;Default value for the parameterandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     450:         /// andlt;returnsandgt;if the parameter exists (and isn't null or empty), it returns the parameter's value. Otherwise the default value is returned.andlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     451:         public virtual object GetParameter(int Position, object Default)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     452:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     453:             if (Reader != null andamp;andamp; !Convert.IsDBNull(Reader[Position]))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     454:                 return Reader[Position];&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     455:             return Default;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     456:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     457: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     458:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     459:         /// Returns a parameter's value&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     460:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     461:         /// andlt;typeparam name=andquot;DataTypeandquot;andgt;Data type of the objectandlt;/typeparamandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     462:         /// andlt;param name=andquot;Positionandquot;andgt;Position in the rowandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     463:         /// andlt;param name=andquot;Defaultandquot;andgt;Default value for the parameterandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     464:         /// andlt;returnsandgt;if the parameter exists (and isn't null or empty), it returns the parameter's value. Otherwise the default value is returned.andlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     465:         public virtual DataType GetParameterandlt;DataTypeandgt;(int Position, DataType Default)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     466:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     467:             if (Reader != null andamp;andamp; !Convert.IsDBNull(Reader[Position]))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     468:                 return (DataType)Convert.ChangeType(Reader[Position], typeof(DataType));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     469:             return Default;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     470:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     471: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     472:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     473: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     474:         #region GetOutputParameter&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     475: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     476:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     477:         /// Returns an output parameter's value&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     478:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     479:         /// andlt;param name=andquot;IDandquot;andgt;Parameter nameandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     480:         /// andlt;param name=andquot;Defaultandquot;andgt;Default value for the parameterandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     481:         /// andlt;returnsandgt;if the parameter exists (and isn't null or empty), it returns the parameter's value. Otherwise the default value is returned.andlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     482:         public virtual object GetOutputParameter(string ID, object Default)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     483:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     484:             if (ExecutableCommand != null andamp;andamp; !Convert.IsDBNull(ExecutableCommand.Parameters[ID]))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     485:                 return ExecutableCommand.Parameters[ID].Value;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     486:             return Default;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     487:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     488: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     489:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     490:         /// Returns an output parameter's value&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     491:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     492:         /// andlt;typeparam name=andquot;DataTypeandquot;andgt;Data type of the objectandlt;/typeparamandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     493:         /// andlt;param name=andquot;IDandquot;andgt;Parameter nameandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     494:         /// andlt;param name=andquot;Defaultandquot;andgt;Default value for the parameterandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     495:         /// andlt;returnsandgt;if the parameter exists (and isn't null or empty), it returns the parameter's value. Otherwise the default value is returned.andlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     496:         public virtual DataType GetOutputParameterandlt;DataTypeandgt;(string ID, DataType Default)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     497:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     498:             if (ExecutableCommand != null andamp;andamp; !Convert.IsDBNull(ExecutableCommand.Parameters[ID]))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     499:                 return (DataType)Convert.ChangeType(ExecutableCommand.Parameters[ID].Value, typeof(DataType));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     500:             return Default;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     501:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     502: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     503:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     504: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     505:         #region NextResult&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     506: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     507:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     508:         /// Goes to the next result set (used if multiple queries are sent in)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     509:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     510:         public virtual void NextResult()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     511:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     512:             if (Reader != null)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     513:                 Reader.NextResult();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     514:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     515: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     516:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     517: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     518:         #region Open&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     519: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     520:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     521:         /// Opens the connection&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     522:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     523:         public virtual void Open()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     524:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     525:             if (ExecutableCommand != null &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     526:                 andamp;andamp; ExecutableCommand.Connection != null &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     527:                 andamp;andamp; ExecutableCommand.Connection.State != ConnectionState.Open)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     528:                 ExecutableCommand.Connection.Open();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     529:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     530: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     531:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     532: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     533:         #region Read&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     534: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     535:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     536:         /// Is there more information?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     537:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     538:         /// andlt;returnsandgt;True if there is more rows, false otherwiseandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     539:         public virtual bool Read()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     540:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     541:             return (Reader != null) ? Reader.Read() : false;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     542:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     543: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     544:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     545: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     546:         #region RecreateConnection&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     547: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     548:         private void RecreateConnection()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     549:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     550:             if (Reader != null)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     551:             {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     552:                 Reader.Close();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     553:                 Reader.Dispose();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     554:                 Reader = null;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     555:             }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     556:             if (ExecutableCommand != null)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     557:             {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     558:                 ExecutableCommand.Dispose();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     559:                 ExecutableCommand = null;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     560:             }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     561:             ExecutableCommand = Factory.CreateCommand();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     562:             ExecutableCommand.CommandText = _Command;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     563:             ExecutableCommand.Connection = Connection;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     564:             ExecutableCommand.CommandType = CommandType;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     565:             if (Transaction != null)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     566:                 ExecutableCommand.Transaction = Transaction;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     567:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     568: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     569:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     570: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     571:         #region Rollback&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     572: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     573:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     574:         /// Rolls back a transaction&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     575:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     576:         public virtual void Rollback()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     577:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     578:             if (Transaction != null)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     579:                 Transaction.Rollback();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     580:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     581: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     582:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     583: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     584:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     585: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     586:         #region IDisposable Members&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     587: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     588:         public virtual void Dispose()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     589:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     590:             Close();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     591:             if (Connection != null)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     592:             {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     593:                 Connection.Dispose();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     594:                 Connection = null;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     595:             }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     596:             if (Transaction != null)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     597:             {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     598:                 Transaction.Dispose();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     599:                 Transaction = null;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     600:             }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     601:             if (ExecutableCommand != null)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     602:             {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     603:                 ExecutableCommand.Dispose();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     604:                 ExecutableCommand = null;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     605:             }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     606:             if (Reader != null)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     607:             {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     608:                 Reader.Dispose();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     609:                 Reader = null;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     610:             }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     611:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     612: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     613:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     614:     }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     615: }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Note that you don't have to use something like this, you can simply add extension methods to DBConnection (like Massive/Dapper). This is just a bit of code to help make things easier for me. The next bit of code that is needed is a way to map the various properties of the business object to the database:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;       1: #region Map&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       2: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       3: /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       4: /// Maps a property to a database property name (required to actually get data from the database)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       5: /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       6: /// andlt;typeparam name=andquot;DataTypeandquot;andgt;Data type of the propertyandlt;/typeparamandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       7: /// andlt;param name=andquot;Propertyandquot;andgt;Property to add a mapping forandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       8: /// andlt;param name=andquot;DatabasePropertyNameandquot;andgt;Property nameandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       9: public virtual Mappingandlt;ClassTypeandgt; Mapandlt;DataTypeandgt;(Expressionandlt;Funcandlt;ClassType, DataTypeandgt;andgt; Property, string DatabasePropertyName)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      10: {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      11:     Check(Property, andquot;Propertyandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      12:     Check(DatabasePropertyName, andquot;DatabasePropertyNameandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      13:     Check(Mappings, andquot;Mappingsandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      14:     Expression Convert = Expression.Convert(Property.Body, typeof(object));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      15:     Expressionandlt;Funcandlt;ClassType, objectandgt;andgt; PropertyExpression = Expression.Lambdaandlt;Funcandlt;ClassType, objectandgt;andgt;(Convert, Property.Parameters);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      16:     Mappings.AddMapping(PropertyExpression,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      17:         new Funcandlt;SQLHelper, objectandgt;((x) =andgt; x.GetParameter(DatabasePropertyName, default(DataType))),&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      18:         new Actionandlt;SQLHelper, objectandgt;((x, y) =andgt; x.AddParameter(DatabasePropertyName, y)));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      19:     ParameterNames.Add(DatabasePropertyName);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      20:     return this;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      21: }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      22: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      23: /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      24: /// Maps a property to a database property name (required to actually get data from the database)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      25: /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      26: /// andlt;param name=andquot;Propertyandquot;andgt;Property to add a mapping forandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      27: /// andlt;param name=andquot;DatabasePropertyNameandquot;andgt;Property nameandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      28: /// andlt;param name=andquot;Lengthandquot;andgt;Max length of the stringandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      29: public virtual Mappingandlt;ClassTypeandgt; Map(Expressionandlt;Funcandlt;ClassType, stringandgt;andgt; Property, string DatabasePropertyName, int Length)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      30: {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      31:     Check(Property, andquot;Propertyandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      32:     Check(DatabasePropertyName, andquot;DatabasePropertyNameandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      33:     Check(Mappings, andquot;Mappingsandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      34:     Expression Convert = Expression.Convert(Property.Body, typeof(object));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      35:     Expressionandlt;Funcandlt;ClassType, objectandgt;andgt; PropertyExpression = Expression.Lambdaandlt;Funcandlt;ClassType, objectandgt;andgt;(Convert, Property.Parameters);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      36:     Mappings.AddMapping(PropertyExpression,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      37:         new Funcandlt;SQLHelper, objectandgt;((x) =andgt; x.GetParameter(DatabasePropertyName, andquot;andquot;)),&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      38:         new Actionandlt;SQLHelper, objectandgt;((x, y) =andgt; x.AddParameter(DatabasePropertyName, (string)y, Length)));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      39:     ParameterNames.Add(DatabasePropertyName);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      40:     return this;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      41: }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      42: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      43: #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This code comes from a class called Mapping, which will hold our data and make our calls to the database. These functions simply map our properties to database properties. As you can see, it takes in an expression and the name of the parameter (database side). It in turn uses that expression and our object to object mapper from the previous post to create a mapping between the SQLHelper (the GetParameter/AddParameter calls). This isn't perfect as it doesn't deal with IEnumerables that well but we're only going to deal with simple items for now (int, string, etc.). Also it returns this so we can do a nice, simple fluent interface. So now that we've seen the small bit of code that handles the mapping of the data, lets look at everything else:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;       1: /*&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       2: Copyright (c) 2011 andlt;a href=andquot;http://www.gutgames.comandquot;andgt;James Craigandlt;/aandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       3: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       4: Permission is hereby granted, free of charge, to any person obtaining a copy&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       5: of this software and associated documentation files (the andquot;Softwareandquot;), to deal&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       6: in the Software without restriction, including without limitation the rights&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       7: to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       8: copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       9: furnished to do so, subject to the following conditions:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      10: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      11: The above copyright notice and this permission notice shall be included in&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      12: all copies or substantial portions of the Software.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      13: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      14: THE SOFTWARE IS PROVIDED andquot;AS ISandquot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      15: IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      16: FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      17: AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      18: LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      19: OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      20: THE SOFTWARE.*/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      21: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      22: #region Usings&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      23: using System;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      24: using System.Collections.Generic;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      25: using System.Linq;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      26: using System.Text;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      27: using Utilities.DataMapper;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      28: using System.Linq.Expressions;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      29: using Utilities.SQL.MicroORM.Interfaces;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      30: using System.Data;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      31: #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      32: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      33: namespace Utilities.SQL.MicroORM&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      34: {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      35:     /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      36:     /// Class that acts as a mapping within the micro ORM&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      37:     /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      38:     /// andlt;typeparam name=andquot;ClassTypeandquot;andgt;Class type that this will acceptandlt;/typeparamandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      39:     public class Mappingandlt;ClassTypeandgt; : IMapping where ClassType : class,new()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      40:     {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      41:         #region Constructors&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      42: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      43:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      44:         /// Constructor&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      45:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      46:         /// andlt;param name=andquot;Connectionandquot;andgt;Connection stringandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      47:         /// andlt;param name=andquot;TableNameandquot;andgt;Table nameandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      48:         /// andlt;param name=andquot;PrimaryKeyandquot;andgt;Primary key in the tableandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      49:         /// andlt;param name=andquot;AutoIncrementandquot;andgt;Is the primary key set to auto increment?andlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      50:         /// andlt;param name=andquot;ParameterStarterandquot;andgt;What the database expects as the&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      51:         /// parameter starting string (andquot;@andquot; for SQL Server, andquot;:andquot; for Oracle, etc.)andlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      52:         /// andlt;param name=andquot;DbTypeandquot;andgt;DbType for this connectionandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      53:         public Mapping(string Connection, string TableName, string PrimaryKey, bool AutoIncrement = true, string ParameterStarter = andquot;@andquot;, string DbType = andquot;System.Data.SqlClientandquot;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      54:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      55:             Helper = new SQLHelper(andquot;andquot;, Connection, System.Data.CommandType.Text, DbType);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      56:             Mappings = new TypeMappingandlt;ClassType, SQLHelperandgt;();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      57:             ParameterNames = new Listandlt;stringandgt;();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      58:             this.TableName = TableName;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      59:             this.PrimaryKey = PrimaryKey;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      60:             this.AutoIncrement = AutoIncrement;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      61:             this.ParameterStarter = ParameterStarter;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      62:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      63: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      64:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      65:         /// Constructor (can be used if supplying own SQLHelper)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      66:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      67:         /// andlt;param name=andquot;TableNameandquot;andgt;Table nameandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      68:         /// andlt;param name=andquot;PrimaryKeyandquot;andgt;Primary keyandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      69:         /// andlt;param name=andquot;AutoIncrementandquot;andgt;Is the primary key set to auto increment?andlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      70:         /// andlt;param name=andquot;ParameterStarterandquot;andgt;What the database expects as the&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      71:         /// parameter starting string (andquot;@andquot; for SQL Server, andquot;:andquot; for Oracle, etc.)andlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      72:         public Mapping(string TableName, string PrimaryKey, bool AutoIncrement = true, string ParameterStarter = andquot;@andquot;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      73:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      74:             Mappings = new TypeMappingandlt;ClassType, SQLHelperandgt;();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      75:             ParameterNames = new Listandlt;stringandgt;();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      76:             this.TableName = TableName;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      77:             this.PrimaryKey = PrimaryKey;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      78:             this.AutoIncrement = AutoIncrement;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      79:             this.ParameterStarter = ParameterStarter;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      80:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      81: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      82:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      83: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      84:         #region Properties&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      85: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      86:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      87:         /// SQL Helper&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      88:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      89:         public virtual SQLHelper Helper { get; set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      90: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      91:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      92:         /// Mapper used to map properties to SQLHelper&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      93:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      94:         public virtual TypeMappingandlt;ClassType, SQLHelperandgt; Mappings { get; set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      95: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      96:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      97:         /// Table name&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      98:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      99:         protected virtual string TableName { get; set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     100: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     101:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     102:         /// Primar key&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     103:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     104:         protected virtual string PrimaryKey { get; set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     105: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     106:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     107:         /// Auto increment?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     108:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     109:         protected virtual bool AutoIncrement { get; set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     110: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     111:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     112:         /// Parameter starter&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     113:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     114:         protected virtual string ParameterStarter { get; set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     115: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     116:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     117:         /// Parameter names&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     118:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     119:         public virtual Listandlt;stringandgt; ParameterNames { get; set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     120: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     121:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     122: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     123:         #region Public Functions&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     124: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     125:         #region All&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     126: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     127:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     128:         /// Gets a list of all objects that meet the specified criteria&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     129:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     130:         /// andlt;param name=andquot;Commandandquot;andgt;Command to use (can be an SQL string or stored procedure)andlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     131:         /// andlt;param name=andquot;CommandTypeandquot;andgt;Command typeandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     132:         /// andlt;param name=andquot;Parametersandquot;andgt;Parameters to search byandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     133:         /// andlt;returnsandgt;A list of all objects that meet the specified criteriaandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     134:         public virtual IEnumerableandlt;ClassTypeandgt; All(string Command, CommandType CommandType, params IParameter[] Parameters)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     135:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     136:             Check(Command, andquot;Commandandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     137:             Check(Helper, andquot;Helperandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     138:             Check(Mappings, andquot;Mappingsandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     139:             Listandlt;ClassTypeandgt; Return = new Listandlt;ClassTypeandgt;();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     140:             SetupCommand(Command, CommandType, Parameters);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     141:             Helper.ExecuteReader();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     142:             while (Helper.Read())&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     143:             {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     144:                 ClassType Temp = new ClassType();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     145:                 Mappings.Copy(Helper, Temp);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     146:                 Return.Add(Temp);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     147:             }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     148:             return Return;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     149:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     150: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     151:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     152:         /// Gets a list of all objects that meet the specified criteria&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     153:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     154:         /// andlt;param name=andquot;Columnsandquot;andgt;Columns to returnandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     155:         /// andlt;param name=andquot;Limitandquot;andgt;Limit on the number of items to returnandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     156:         /// andlt;param name=andquot;OrderByandquot;andgt;Order by clauseandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     157:         /// andlt;param name=andquot;Parametersandquot;andgt;Parameters to search byandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     158:         /// andlt;returnsandgt;A list of all objects that meet the specified criteriaandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     159:         public virtual IEnumerableandlt;ClassTypeandgt; All(string Columns = andquot;*andquot;, int Limit = 0, string OrderBy = andquot;andquot;, params IParameter[] Parameters)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     160:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     161:             Check(Columns, andquot;Columnsandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     162:             return All(SetupSelectCommand(Columns, Limit, OrderBy, Parameters), CommandType.Text, Parameters);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     163:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     164: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     165:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     166: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     167:         #region Any&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     168: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     169:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     170:         /// Gets a single object that fits the criteria&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     171:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     172:         /// andlt;param name=andquot;Columnsandquot;andgt;Columns to selectandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     173:         /// andlt;param name=andquot;Parametersandquot;andgt;Parameters to search byandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     174:         /// andlt;returnsandgt;An object fitting the criteria specified or null if none are foundandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     175:         public virtual ClassType Any(string Columns = andquot;*andquot;, ClassType ObjectToReturn = null, params IParameter[] Parameters)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     176:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     177:             Check(Columns, andquot;Columnsandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     178:             return Any(SetupSelectCommand(Columns, 1, andquot;andquot;, Parameters), CommandType.Text, ObjectToReturn, Parameters);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     179:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     180: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     181:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     182:         /// Gets a single object that fits the criteria&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     183:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     184:         /// andlt;param name=andquot;Commandandquot;andgt;Command to use (can be an SQL string or stored procedure name)andlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     185:         /// andlt;param name=andquot;CommandTypeandquot;andgt;Command typeandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     186:         /// andlt;param name=andquot;ObjectToReturnandquot;andgt;Object to return (in case the object needs to be created outside this)andlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     187:         /// andlt;param name=andquot;Parametersandquot;andgt;Parameters used to search byandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     188:         /// andlt;returnsandgt;An object fitting the criteria specified or null if none are foundandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     189:         public virtual ClassType Any(string Command, CommandType CommandType, ClassType ObjectToReturn = null, params IParameter[] Parameters)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     190:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     191:             Check(Mappings, andquot;Mappingsandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     192:             Check(Command, andquot;Commandandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     193:             Check(Helper, andquot;Helperandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     194:             ClassType Return = (ObjectToReturn == null) ? new ClassType() : ObjectToReturn;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     195:             SetupCommand(Command, CommandType, Parameters);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     196:             Helper.ExecuteReader();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     197:             if (Helper.Read())&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     198:                 Mappings.Copy(Helper, Return);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     199:             return Return;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     200:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     201: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     202:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     203: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     204:         #region Close&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     205: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     206:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     207:         /// Closes the connection to the database&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     208:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     209:         public virtual void Close()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     210:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     211:             Check(Helper, andquot;Helperandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     212:             Helper.Close();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     213:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     214: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     215:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     216: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     217:         #region Delete&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     218: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     219:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     220:         /// Deletes an object from the database&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     221:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     222:         /// andlt;param name=andquot;Commandandquot;andgt;Command to useandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     223:         /// andlt;param name=andquot;CommandTypeandquot;andgt;Command typeandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     224:         /// andlt;param name=andquot;Objectandquot;andgt;Object to deleteandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     225:         public virtual void Delete(string Command, CommandType CommandType, ClassType Object)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     226:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     227:             Check(Object, andquot;Objectandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     228:             Check(Command, andquot;Commandandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     229:             Check(Helper, andquot;Helperandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     230:             Check(Mappings, andquot;Mappingsandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     231:             SetupCommand(Command, CommandType, null);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     232:             Mappings.Copy(Object, Helper);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     233:             Helper.ExecuteNonQuery();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     234:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     235: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     236:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     237:         /// Deletes an object from the database&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     238:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     239:         /// andlt;param name=andquot;Objectandquot;andgt;Object to deleteandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     240:         public virtual void Delete(ClassType Object)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     241:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     242:             Delete(SetupDeleteCommand(), CommandType.Text, Object);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     243:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     244: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     245:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     246: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     247:         #region Insert&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     248: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     249:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     250:         /// Inserts an object based on the command specified&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     251:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     252:         /// andlt;typeparam name=andquot;DataTypeandquot;andgt;Data type expected to be returned from the query (to get the ID, etc.)andlt;/typeparamandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     253:         /// andlt;param name=andquot;Commandandquot;andgt;Command to runandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     254:         /// andlt;param name=andquot;CommandTypeandquot;andgt;Command typeandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     255:         /// andlt;param name=andquot;Objectandquot;andgt;Object to insertandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     256:         /// andlt;returnsandgt;The returned object from the query (usually the newly created row's ID)andlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     257:         public virtual DataType Insertandlt;DataTypeandgt;(string Command, CommandType CommandType, ClassType Object)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     258:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     259:             Check(Object, andquot;Objectandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     260:             Check(Command, andquot;Commandandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     261:             Check(Helper, andquot;Helperandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     262:             Check(Mappings, andquot;Mappingsandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     263:             SetupCommand(Command, CommandType, null);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     264:             Mappings.Copy(Object, Helper);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     265:             return (DataType)Convert.ChangeType(Helper.ExecuteScalar(), typeof(DataType));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     266:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     267: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     268:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     269:         /// Inserts an object into the database&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     270:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     271:         /// andlt;typeparam name=andquot;DataTypeandquot;andgt;Data type expected (should be the same type as the primary key)andlt;/typeparamandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     272:         /// andlt;param name=andquot;Objectandquot;andgt;Object to insertandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     273:         /// andlt;returnsandgt;The returned object from the query (the newly created row's ID)andlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     274:         public virtual DataType Insertandlt;DataTypeandgt;(ClassType Object)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     275:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     276:             return Insertandlt;DataTypeandgt;(SetupInsertCommand(), CommandType.Text, Object);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     277:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     278: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     279:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     280: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     281:         #region Map&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     282: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     283:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     284:         /// Maps a property to a database property name (required to actually get data from the database)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     285:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     286:         /// andlt;typeparam name=andquot;DataTypeandquot;andgt;Data type of the propertyandlt;/typeparamandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     287:         /// andlt;param name=andquot;Propertyandquot;andgt;Property to add a mapping forandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     288:         /// andlt;param name=andquot;DatabasePropertyNameandquot;andgt;Property nameandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     289:         public virtual Mappingandlt;ClassTypeandgt; Mapandlt;DataTypeandgt;(Expressionandlt;Funcandlt;ClassType, DataTypeandgt;andgt; Property, string DatabasePropertyName)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     290:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     291:             Check(Property, andquot;Propertyandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     292:             Check(DatabasePropertyName, andquot;DatabasePropertyNameandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     293:             Check(Mappings, andquot;Mappingsandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     294:             Expression Convert = Expression.Convert(Property.Body, typeof(object));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     295:             Expressionandlt;Funcandlt;ClassType, objectandgt;andgt; PropertyExpression = Expression.Lambdaandlt;Funcandlt;ClassType, objectandgt;andgt;(Convert, Property.Parameters);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     296:             Mappings.AddMapping(PropertyExpression,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     297:                 new Funcandlt;SQLHelper, objectandgt;((x) =andgt; x.GetParameter(DatabasePropertyName, default(DataType))),&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     298:                 new Actionandlt;SQLHelper, objectandgt;((x, y) =andgt; x.AddParameter(DatabasePropertyName, y)));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     299:             ParameterNames.Add(DatabasePropertyName);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     300:             return this;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     301:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     302: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     303:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     304:         /// Maps a property to a database property name (required to actually get data from the database)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     305:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     306:         /// andlt;param name=andquot;Propertyandquot;andgt;Property to add a mapping forandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     307:         /// andlt;param name=andquot;DatabasePropertyNameandquot;andgt;Property nameandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     308:         /// andlt;param name=andquot;Lengthandquot;andgt;Max length of the stringandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     309:         public virtual Mappingandlt;ClassTypeandgt; Map(Expressionandlt;Funcandlt;ClassType, stringandgt;andgt; Property, string DatabasePropertyName, int Length)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     310:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     311:             Check(Property, andquot;Propertyandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     312:             Check(DatabasePropertyName, andquot;DatabasePropertyNameandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     313:             Check(Mappings, andquot;Mappingsandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     314:             Expression Convert = Expression.Convert(Property.Body, typeof(object));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     315:             Expressionandlt;Funcandlt;ClassType, objectandgt;andgt; PropertyExpression = Expression.Lambdaandlt;Funcandlt;ClassType, objectandgt;andgt;(Convert, Property.Parameters);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     316:             Mappings.AddMapping(PropertyExpression,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     317:                 new Funcandlt;SQLHelper, objectandgt;((x) =andgt; x.GetParameter(DatabasePropertyName, andquot;andquot;)),&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     318:                 new Actionandlt;SQLHelper, objectandgt;((x, y) =andgt; x.AddParameter(DatabasePropertyName, (string)y, Length)));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     319:             ParameterNames.Add(DatabasePropertyName);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     320:             return this;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     321:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     322: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     323:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     324: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     325:         #region Open&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     326: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     327:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     328:         /// Opens the connection to the database&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     329:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     330:         public virtual void Open()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     331:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     332:             Check(Helper, andquot;Helperandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     333:             Helper.Open();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     334:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     335: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     336:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     337: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     338:         #region PageCount&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     339: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     340:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     341:         /// Gets the number of pages based on the specified &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     342:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     343:         /// andlt;param name=andquot;PageSizeandquot;andgt;Page sizeandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     344:         /// andlt;param name=andquot;Parametersandquot;andgt;Parameters to search byandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     345:         /// andlt;returnsandgt;The number of pages that the table contains for the specified page sizeandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     346:         public virtual int PageCount(int PageSize = 25, params IParameter[] Parameters)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     347:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     348:             Check(Helper, andquot;Helperandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     349:             SetupCommand(SetupPageCountCommand(PageSize, Parameters), CommandType.Text, Parameters);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     350:             Helper.ExecuteReader();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     351:             if (Helper.Read())&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     352:             {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     353:                 int Total = Helper.GetParameter(andquot;Totalandquot;, 0);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     354:                 return Total % PageSize == 0 ? Total / PageSize : (Total / PageSize) + 1;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     355:             }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     356:             return 0;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     357:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     358: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     359:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     360: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     361:         #region Paged&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     362: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     363:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     364:         /// Gets a paged list of objects fitting the specified criteria&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     365:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     366:         /// andlt;param name=andquot;Columnsandquot;andgt;Columns to returnandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     367:         /// andlt;param name=andquot;OrderByandquot;andgt;Order by clauseandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     368:         /// andlt;param name=andquot;PageSizeandquot;andgt;Page sizeandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     369:         /// andlt;param name=andquot;CurrentPageandquot;andgt;The current page (starting at 0)andlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     370:         /// andlt;param name=andquot;Parametersandquot;andgt;Parameters to search byandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     371:         /// andlt;returnsandgt;A list of objects that fit the specified criteriaandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     372:         public virtual IEnumerableandlt;ClassTypeandgt; Paged(string Columns = andquot;*andquot;, string OrderBy = andquot;andquot;, int PageSize = 25, int CurrentPage = 0, params IParameter[] Parameters)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     373:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     374:             Check(Columns, andquot;Columnsandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     375:             return All(SetupPagedCommand(Columns, OrderBy, PageSize, CurrentPage, Parameters), CommandType.Text, Parameters);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     376:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     377: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     378:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     379: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     380:         #region Update&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     381: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     382:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     383:         /// Updates an object in the database&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     384:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     385:         /// andlt;param name=andquot;Commandandquot;andgt;Command to useandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     386:         /// andlt;param name=andquot;CommandTypeandquot;andgt;Command typeandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     387:         /// andlt;param name=andquot;Objectandquot;andgt;Object to updateandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     388:         public virtual void Update(string Command, CommandType CommandType, ClassType Object)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     389:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     390:             Check(Helper, andquot;Helperandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     391:             Check(Mappings, andquot;Mappingsandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     392:             Check(Command, andquot;Commandandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     393:             SetupCommand(Command, CommandType, null);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     394:             Mappings.Copy(Object, Helper);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     395:             Helper.ExecuteNonQuery();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     396:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     397: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     398:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     399:         /// Updates an object in the database&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     400:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     401:         /// andlt;param name=andquot;Objectandquot;andgt;Object to updateandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     402:         public virtual void Update(ClassType Object)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     403:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     404:             Update(SetupUpdateCommand(), CommandType.Text, Object);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     405:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     406: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     407:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     408: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     409:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     410: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     411:         #region Protected Functions&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     412: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     413:         #region Check&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     414: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     415:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     416:         /// Checks if an object is null, throwing an exception if it is&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     417:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     418:         /// andlt;param name=andquot;Objectandquot;andgt;Object to checkandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     419:         /// andlt;param name=andquot;Nameandquot;andgt;Parameter nameandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     420:         protected virtual void Check(object Object, string Name)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     421:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     422:             if (Object == null)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     423:                 throw new ArgumentNullException(Name);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     424:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     425: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     426:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     427:         /// Checks if a string is null/empty, throwing an exception if it is&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     428:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     429:         /// andlt;param name=andquot;Stringandquot;andgt;String to checkandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     430:         /// andlt;param name=andquot;Nameandquot;andgt;Parameter nameandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     431:         protected virtual void Check(string String, string Name)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     432:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     433:             if (string.IsNullOrEmpty(String))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     434:                 throw new ArgumentNullException(Name);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     435:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     436: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     437:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     438: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     439:         #region SetupCommand&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     440: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     441:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     442:         /// Sets up a command&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     443:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     444:         /// andlt;param name=andquot;Commandandquot;andgt;Command to add to the SQL Helperandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     445:         /// andlt;param name=andquot;CommandTypeandquot;andgt;Command typeandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     446:         /// andlt;param name=andquot;Parametersandquot;andgt;Parameter listandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     447:         protected virtual void SetupCommand(string Command, CommandType CommandType, IParameter[] Parameters)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     448:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     449:             Check(Helper, andquot;Helperandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     450:             Check(Command, andquot;Commandandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     451:             Helper.Command = Command;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     452:             Helper.CommandType = CommandType;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     453:             if (Parameters != null)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     454:             {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     455:                 foreach (IParameter Parameter in Parameters)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     456:                 {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     457:                     Parameter.AddParameter(Helper);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     458:                 }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     459:             }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     460:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     461: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     462:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     463: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     464:         #region SetupDeleteCommand&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     465: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     466:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     467:         /// Sets up the delete command&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     468:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     469:         /// andlt;returnsandgt;The command stringandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     470:         protected virtual string SetupDeleteCommand()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     471:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     472:             return string.Format(andquot;DELETE FROM {0} WHERE {1}andquot;, TableName, PrimaryKey + andquot;=andquot; + ParameterStarter + PrimaryKey);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     473:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     474: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     475:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     476: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     477:         #region SetupInsertCommand&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     478: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     479:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     480:         /// Sets up the insert command&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     481:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     482:         /// andlt;returnsandgt;The command stringandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     483:         protected virtual string SetupInsertCommand()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     484:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     485:             string ParameterList = andquot;andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     486:             string ValueList = andquot;andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     487:             string Splitter = andquot;andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     488:             foreach (string Name in ParameterNames)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     489:             {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     490:                 if (!AutoIncrement || Name != PrimaryKey)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     491:                 {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     492:                     ParameterList += Splitter + Name;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     493:                     ValueList += Splitter + ParameterStarter + Name;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     494:                     Splitter = andquot;,andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     495:                 }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     496:             }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     497:             return string.Format(andquot;INSERT INTO {0}({1}) VALUES({2}) SELECT scope_identity() as [ID]andquot;, TableName, ParameterList, ValueList);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     498:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     499: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     500:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     501: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     502:         #region SetupPageCountCommand&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     503: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     504:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     505:         /// Sets up the page count command&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     506:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     507:         /// andlt;param name=andquot;PageSizeandquot;andgt;Page sizeandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     508:         /// andlt;param name=andquot;Parametersandquot;andgt;Parameter listandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     509:         /// andlt;returnsandgt;The string commandandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     510:         protected virtual string SetupPageCountCommand(int PageSize, IParameter[] Parameters)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     511:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     512:             string WhereCommand = andquot;andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     513:             if (Parameters != null andamp;andamp; Parameters.Length andgt; 0)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     514:             {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     515:                 WhereCommand += andquot; WHERE andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     516:                 string Splitter = andquot;andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     517:                 foreach (IParameter Parameter in Parameters)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     518:                 {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     519:                     WhereCommand += Splitter + Parameter;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     520:                     Splitter = andquot; AND andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     521:                 }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     522:             }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     523:             return string.Format(andquot;SELECT COUNT({0}) as Total FROM {1} {2}andquot;, PrimaryKey, TableName, WhereCommand);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     524:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     525: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     526:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     527: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     528:         #region SetupPagedCommand&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     529: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     530:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     531:         /// Sets up the paged select command&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     532:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     533:         /// andlt;param name=andquot;Columnsandquot;andgt;Columns to returnandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     534:         /// andlt;param name=andquot;OrderByandquot;andgt;Order by clauseandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     535:         /// andlt;param name=andquot;PageSizeandquot;andgt;Page sizeandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     536:         /// andlt;param name=andquot;CurrentPageandquot;andgt;Current pageandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     537:         /// andlt;param name=andquot;Parametersandquot;andgt;Parameter listandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     538:         /// andlt;returnsandgt;The command stringandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     539:         protected virtual string SetupPagedCommand(string Columns, string OrderBy, int PageSize, int CurrentPage, IParameter[] Parameters)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     540:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     541:             if (string.IsNullOrEmpty(OrderBy))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     542:                 OrderBy = PrimaryKey;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     543: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     544:             string WhereCommand = andquot;andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     545:             if (Parameters != null andamp;andamp; Parameters.Length andgt; 0)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     546:             {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     547:                 WhereCommand += andquot; WHERE andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     548:                 string Splitter = andquot;andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     549:                 foreach (IParameter Parameter in Parameters)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     550:                 {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     551:                     WhereCommand += Splitter + Parameter;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     552:                     Splitter = andquot; AND andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     553:                 }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     554:             }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     555:             string Command = string.Format(andquot;SELECT {0} FROM (SELECT ROW_NUMBER() OVER (ORDER BY {1}) AS Row, {0} FROM {2} {3}) AS Paged andquot;, Columns, OrderBy, TableName, WhereCommand);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     556:             int PageStart = CurrentPage * PageSize;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     557:             Command += string.Format(andquot; WHERE Rowandgt;{0} AND Rowandlt;={1}andquot;, PageStart, PageStart + PageSize);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     558:             return Command;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     559:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     560: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     561:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     562: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     563:         #region SetupSelectCommand&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     564: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     565:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     566:         /// Sets up the select command&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     567:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     568:         /// andlt;param name=andquot;Columnsandquot;andgt;Columns to returnandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     569:         /// andlt;param name=andquot;Limitandquot;andgt;limit on the number of items to returnandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     570:         /// andlt;param name=andquot;OrderByandquot;andgt;Order by clauseandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     571:         /// andlt;param name=andquot;Parametersandquot;andgt;Parameter listandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     572:         /// andlt;returnsandgt;The string commandandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     573:         protected virtual string SetupSelectCommand(string Columns, int Limit, string OrderBy, IParameter[] Parameters)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     574:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     575:             string Command = (Limit andgt; 0 ? andquot;SELECT TOP andquot; + Limit : andquot;SELECTandquot;) + andquot; {0} FROM {1}andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     576:             if (Parameters != null andamp;andamp; Parameters.Length andgt; 0)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     577:             {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     578:                 Command += andquot; WHERE andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     579:                 string Splitter = andquot;andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     580:                 foreach (IParameter Parameter in Parameters)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     581:                 {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     582:                     Command += Splitter + Parameter;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     583:                     Splitter = andquot; AND andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     584:                 }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     585:             }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     586:             if (!string.IsNullOrEmpty(OrderBy))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     587:                 Command += OrderBy.Trim().ToLower().StartsWith(andquot;order byandquot;, StringComparison.CurrentCultureIgnoreCase) ? andquot; andquot; + OrderBy : andquot; ORDER BY andquot; + OrderBy;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     588:             return string.Format(Command, Columns, TableName);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     589:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     590: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     591:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     592: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     593:         #region SetupUpdateCommand&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     594: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     595:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     596:         /// Sets up the update command&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     597:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     598:         /// andlt;returnsandgt;The command stringandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     599:         protected virtual string SetupUpdateCommand()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     600:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     601:             string ParameterList = andquot;andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     602:             string WhereCommand = andquot;andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     603:             string Splitter = andquot;andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     604:             foreach (string Name in ParameterNames)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     605:             {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     606:                 if (Name != PrimaryKey)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     607:                 {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     608:                     ParameterList += Splitter + Name + andquot;=andquot; + ParameterStarter + Name;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     609:                     Splitter = andquot;,andquot;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     610:                 }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     611:                 else&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     612:                     WhereCommand = Name + andquot;=andquot; + ParameterStarter + Name;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     613:             }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     614:             return string.Format(andquot;UPDATE {0} SET {1} WHERE {2}andquot;, TableName, ParameterList, WhereCommand);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     615:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     616: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     617:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     618: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     619:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     620: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     621:         #region IDisposable&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     622: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     623:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     624:         /// Dispose&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     625:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     626:         public void Dispose()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     627:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     628:             if (Helper != null)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     629:             {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     630:                 Helper = null;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     631:             }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     632:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     633: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     634:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     635:     }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     636: }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Lets start with the top, the constructors take in (at minimum) the table name and primary key for the class. Doing this makes things a lot simpler later on (specifically inserts, updates, etc.). But basically we're doing basic data setup. The next bit is the properties that are needed, we'll skip that... The next, actually interesting bit of code is All. The All function makes a query against the database and gives us all entries that it finds. For the most part it's pretty straightforward, it takes in the Command (could be sql text or a stored procedure), the command type, and allows you to add a number of parameters if they are needed. The parameter class looks like the following:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;       1: /*&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       2: Copyright (c) 2011 andlt;a href=andquot;http://www.gutgames.comandquot;andgt;James Craigandlt;/aandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       3: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       4: Permission is hereby granted, free of charge, to any person obtaining a copy&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       5: of this software and associated documentation files (the andquot;Softwareandquot;), to deal&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       6: in the Software without restriction, including without limitation the rights&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       7: to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       8: copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       9: furnished to do so, subject to the following conditions:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      10: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      11: The above copyright notice and this permission notice shall be included in&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      12: all copies or substantial portions of the Software.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      13: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      14: THE SOFTWARE IS PROVIDED andquot;AS ISandquot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      15: IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      16: FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      17: AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      18: LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      19: OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      20: THE SOFTWARE.*/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      21: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      22: #region Usings&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      23: using System;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      24: using System.Collections.Generic;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      25: using System.Linq;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      26: using System.Text;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      27: using Utilities.SQL.MicroORM.Interfaces;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      28: #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      29: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      30: namespace Utilities.SQL.MicroORM&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      31: {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      32:     /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      33:     /// Parameter class&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      34:     /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      35:     /// andlt;typeparam name=andquot;DataTypeandquot;andgt;Type of the parameterandlt;/typeparamandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      36:     public class Parameterandlt;DataTypeandgt;:IParameter&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      37:     {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      38:         #region Constructor&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      39: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      40:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      41:         /// Constructor&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      42:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      43:         /// andlt;param name=andquot;Valueandquot;andgt;Value of the parameterandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      44:         /// andlt;param name=andquot;IDandquot;andgt;Name of the parameterandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      45:         /// andlt;param name=andquot;ParameterStarterandquot;andgt;What the database expects as the&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      46:         /// parameter starting string (andquot;@andquot; for SQL Server, andquot;:andquot; for Oracle, etc.)andlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      47:         public Parameter(DataType Value, string ID, string ParameterStarter = andquot;@andquot;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      48:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      49:             this.Value = Value;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      50:             this.ID = ID;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      51:             this.ParameterStarter = ParameterStarter;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      52:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      53: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      54:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      55: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      56:         #region Properties&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      57: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      58:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      59:         /// Value of the parameter&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      60:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      61:         public DataType Value { get; set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      62: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      63:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      64:         /// Name of the parameter&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      65:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      66:         public string ID { get; set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      67: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      68:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      69:         /// Starting string of the parameter&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      70:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      71:         public string ParameterStarter { get; set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      72: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      73:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      74: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      75:         #region Functions&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      76: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      77:         public void AddParameter(SQLHelper Helper) { Helper.AddParameter(ID, Value); }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      78: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      79:         public override string ToString() { return ID + andquot;=andquot; + ParameterStarter + ID; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      80: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      81:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      82:     }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      83: }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The parameter class is really just a glorified key/value pair. Anyway, the All function just creates a list, calls our command, and lets the object to object mapper fill our object for us. We have another option (the function that asks for Columns, etc.), that will allow us to simply call All() if we only want to worry about such things like an order by clause. In this call though the class is generating the select statement for us (Pretty standard: SELECT Columns FROM TableName WHERE [List of parameters are true] ORDER BY OrderByClause).&lt;br /&gt;&lt;br /&gt;You'll find that most of the functions are similar to All. For instance, the Any function is pretty much a copy but it only returns the first item found by the query. Delete, Update, and Insert are only slightly different. Instead of copying data from the SQLHelper to the object, it simply goes the other way around. They all have the option to generate the code for you. Since we've set up our mappings beforehand, we know the names of the properties and we know the primary key from the constructor so it's not too difficult to generate the needed queries.&lt;br /&gt;&lt;br /&gt;The only function that might give you pause are the Pages and PageCount functions. Paged is simply a paged query (automatically generated). It works similarly to All but takes in page size and the current page that you want (0 based as I'm not a big fan of starting at 1 for such things). The code that it generates is also rather straightforward (but probably not the best), if you've ever done a paged query before. That being said, it's currently pretty specific to SQL Server but I'll probably change that to make it a bit more open in the future. Anyway, I also have a separate query called PageCount to allow you to figure out the total number of pages based on the page size that you specify. I could have that as an out parameter of the Paged function, but I figure you might want that information separately. But that's it really. There are also Open/Close functions to actually open the connection to the database, but those are pretty simple.&lt;br /&gt;&lt;br /&gt;So at this point we have our simple mapping of a single class. What we need now is a class to hold all of our mappings that we can use to make this simpler:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;       1: /*&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       2: Copyright (c) 2011 andlt;a href=andquot;http://www.gutgames.comandquot;andgt;James Craigandlt;/aandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       3: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       4: Permission is hereby granted, free of charge, to any person obtaining a copy&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       5: of this software and associated documentation files (the andquot;Softwareandquot;), to deal&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       6: in the Software without restriction, including without limitation the rights&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       7: to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       8: copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       9: furnished to do so, subject to the following conditions:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      10: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      11: The above copyright notice and this permission notice shall be included in&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      12: all copies or substantial portions of the Software.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      13: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      14: THE SOFTWARE IS PROVIDED andquot;AS ISandquot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      15: IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      16: FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      17: AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      18: LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      19: OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      20: THE SOFTWARE.*/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      21: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      22: #region Usings&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      23: using System;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      24: using System.Collections.Generic;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      25: using System.Linq;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      26: using System.Text;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      27: using Utilities.DataMapper;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      28: using System.Linq.Expressions;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      29: using Utilities.SQL.MicroORM.Interfaces;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      30: using System.Data;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      31: #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      32: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      33: namespace Utilities.SQL.MicroORM&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      34: {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      35:     /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      36:     /// Manager class that can be used to manage&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      37:     /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      38:     public class MicroORM : SQLHelper&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      39:     {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      40:         #region Constructor&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      41: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      42:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      43:         /// Constructor&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      44:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      45:         public MicroORM(string Connection)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      46:             : base(andquot;andquot;, Connection, CommandType.Text)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      47:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      48:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      49: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      50:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      51: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      52:         #region Properties&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      53: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      54:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      55:         /// Mappings&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      56:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      57:         protected static Dictionaryandlt;Type, IMappingandgt; Mappings = new Dictionaryandlt;Type, IMappingandgt;();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      58: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      59:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      60: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      61:         #region Functions&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      62: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      63:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      64:         /// Creates a mapping&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      65:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      66:         /// andlt;typeparam name=andquot;ClassTypeandquot;andgt;Class type to mapandlt;/typeparamandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      67:         /// andlt;param name=andquot;TableNameandquot;andgt;Table nameandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      68:         /// andlt;param name=andquot;PrimaryKeyandquot;andgt;Primary keyandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      69:         /// andlt;param name=andquot;AutoIncrementandquot;andgt;Auto incrementing primar keyandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      70:         /// andlt;param name=andquot;ParameterStarterandquot;andgt;Parameter starterandlt;/paramandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      71:         /// andlt;returnsandgt;The created mapping (or an already created one if it existsandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      72:         public static Mappingandlt;ClassTypeandgt; Mapandlt;ClassTypeandgt;(string TableName, string PrimaryKey, bool AutoIncrement = true, string ParameterStarter = andquot;@andquot;) where ClassType : class,new()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      73:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      74:             if (Mappings.ContainsKey(typeof(ClassType)))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      75:                 return (Mappingandlt;ClassTypeandgt;)Mappings[typeof(ClassType)];&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      76:             Mappingandlt;ClassTypeandgt; Mapping = new Mappingandlt;ClassTypeandgt;(TableName, PrimaryKey, AutoIncrement, ParameterStarter);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      77:             Mappings.Add(typeof(ClassType), Mapping);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      78:             return Mapping;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      79:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      80: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      81:         /// andlt;summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      82:         /// Returns a specific mapping&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      83:         /// andlt;/summaryandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      84:         /// andlt;typeparam name=andquot;ClassTypeandquot;andgt;Class type to getandlt;/typeparamandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      85:         /// andlt;returnsandgt;The mapping specifiedandlt;/returnsandgt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      86:         public Mappingandlt;ClassTypeandgt; Mapandlt;ClassTypeandgt;() where ClassType : class,new()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      87:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      88:             if (!Mappings.ContainsKey(typeof(ClassType)))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      89:                 throw new ArgumentOutOfRangeException(typeof(ClassType).Name + andquot; not foundandquot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      90:             Mappingandlt;ClassTypeandgt; ReturnValue = (Mappingandlt;ClassTypeandgt;)Mappings[typeof(ClassType)];&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      91:             ReturnValue.Helper = this;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      92:             return ReturnValue;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      93:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      94: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      95:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      96: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      97:         #region IDisposable Members&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      98: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      99:         public override void Dispose()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     100:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     101:             base.Dispose();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     102:             foreach (Type Key in Mappings.Keys)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     103:             {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     104:                 Mappings[Key].Dispose();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     105:             }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     106:             Mappings.Clear();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     107:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     108: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     109:         #endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     110:     }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     111: }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This class really only has a couple of functions, but inherits from the SQLHelper class from earlier. It basically just adds a static Map function (allowing us to store our mapping data in the MicroORM object). It also adds a nonstatic Map function on the object that we can use to actually call our mapping. For instance we can do the following:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;       1: class Program&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       2: {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       3:     static void Main(string[] args)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       4:     {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       5:         MicroORM.Mapandlt;Userandgt;(andquot;User_andquot;, andquot;ID_andquot;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       6:             .Map(x =andgt; x.ID, andquot;ID_andquot;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       7:             .Map(x =andgt; x.DateCreated, andquot;DateCreated_andquot;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       8:             .Map(x =andgt; x.DateModified, andquot;DateModified_andquot;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       9:             .Map(x =andgt; x.Active, andquot;Active_andquot;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      10:             .Map(x =andgt; x.UserName, andquot;UserName_andquot;, 128);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      11: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      12:         using (MicroORM ORM = new MicroORM(andquot;Data Source=localhost;Initial Catalog=MyDatabase;Integrated Security=SSPI;andquot;))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      13:         {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      14:             IEnumerableandlt;Userandgt; Users = ORM.Mapandlt;Userandgt;().All();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      15:             foreach (User User in Users)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      16:             {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      17:                 Console.WriteLine(User.UserName);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      18:             }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      19:         }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      20: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      21:         Console.ReadKey();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      22:     }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      23: }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      24: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      25: public class User&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      26: {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      27:     public virtual int ID { get; set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      28:     public virtual DateTime DateModified { get; set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      29:     public virtual DateTime DateCreated { get; set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      30:     public virtual bool Active { get; set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      31:     public virtual string UserName { get; set; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      32: }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;That code sets up the user object in a couple of lines of code, then it creates a MicroORM object an feeds it the connection string. From there it gets the User mapping and calls All (giving us all of the users). It then just spits the user names onto the screen. It's basic, simple, rather quick and all that you need for a micro ORM. In the future I will integrate this into my ORM project. Basically I'll show how to take a micro ORM and add on the features that you might want (database generation, lazy loading, etc.) while still keeping things simple.
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ZXIYO65DVegr4Pm4W8oMaf2bsJo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZXIYO65DVegr4Pm4W8oMaf2bsJo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ZXIYO65DVegr4Pm4W8oMaf2bsJo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZXIYO65DVegr4Pm4W8oMaf2bsJo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GutInstinct/~4/Y7hpyXL4cFo" height="1" width="1"/&gt;</description>
<itunes:subtitle>Creating an ORM in C# Revisited andndash; Part 2</itunes:subtitle><itunes:summary><![CDATA[Apparently this didn't actually get uploaded, so here's the second part of this a bit late along with the third. Anyway, last time I talked about coming up with a simple object to object mapper to help speed up and simplify the ORM. In this post we're going to worry about actually connecting to the database. In Dapper and Massive, they simply uses extension methods to DBConnections. I could easily do that but for a while now I've been using a class called SQLHelper to simplify connecting to a database (not Microsoft's SQLHelper, it's my own class). For me, it simplifies things quite a bit (I can set up the connection in one line instead of ten), so I'll be using that instead:             1: /*<br /><br /><br />       2: Copyright (c) 2011 andlt;a href=andquot;http://www.gutgames.comandquot;andgt;James Craigandlt;/aandgt;<br /><br /><br />       3: <br /><br /><br />       4: Permission is hereby granted, free of charge, to any person obtaining a copy<br /><br /><br />       5: of this software and associated documentation files (the andquot;Softwareandquot;), to deal<br /><br /><br />       6: in the Software without restriction, including without limitation the rights<br /><br /><br />       7: to use, copy, modify, merge, publish, distribute, sublicense, and/or sell<br /><br /><br />       8: copies of the Software, and to permit persons to whom the Software is<br /><br /><br />       9: furnished to do so, subject to the following conditions:<br /><br /><br />      10: <br /><br /><br />      11: The above copyright notice and this permission notice shall be included in<br /><br /><br />      12: all copies or substantial portions of the Software.<br /><br /><br />      13: <br /><br /><br />      14: THE SOFTWARE IS PROVIDED andquot;AS ISandquot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br /><br /><br />      15: IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br /><br /><br />      16: FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE<br /><br /><br />      17: AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER<br /><br /><br />      18: LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,<br /><br /><br />      19: OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN<br /><br /><br />      20: THE SOFTWARE.*/<br /><br /><br />      21: <br /><br /><br />      22: #region Usings<br /><br /><br />      23: using System;<br /><br /><br />      24: using System.Data;<br /><br /><br />      25: using System.Data.SqlClient;<br /><br /><br />      26: using System.Xml;<br /><br /><br />      27: using System.Data.Common;<br /><br /><br />      28: #endregion<br /><br /><br />      29: <br /><br /><br />      30: namespace Utilities.SQL<br /><br /><br />      31: {<br /><br /><br />      32:     /// andlt;summaryandgt;<br /><br /><br />      33:     /// SQL Helper class<br /><br /><br />      34:     /// andlt;/summaryandgt;<br /><br /><br />      35:     public class SQLHelper : IDisposable<br /><br /><br />      36:     {<br /><br /><br />      37:         #region Constructors<br /><br /><br />      38: <br /><br /><br />      39:         /// andlt;summaryandgt;<br /><br /><br />      40:         /// Constructor<br /><br /><br />      41:         /// andlt;/summaryandgt;<br /><br /><br />      42:         /// andlt;param name=andquot;Commandandquot;andgt;Stored procedure/SQL Text to useandlt;/paramandgt;<br /><br /><br />      43:         /// andlt;param name=andquot;ConnectionUsingandquot;andgt;The connection string to userandlt;/paramandgt;<br /><br /><br />      44:         /// andlt;param name=andquot;CommandTypeandquot;andgt;The command type of the command sent inandlt;/paramandgt;<br /><br /><br />      45:         public SQLHelper(string Command, string ConnectionUsing, CommandType CommandType, string DbType = andquot;System.Data.SqlClientandquot;)<br /><br /><br />      46:         {<br /><br /><br />      47:             Factory = DbProviderFactories.GetFactory(DbType);<br /><br /><br />      48:             Connection = Factory.CreateConnection();<br /><br /><br />      49:             Connection.ConnectionString = ConnectionUsing;<br /><br /><br />      50:             _Command = Command;<br /><br /><br />      51:             _CommandType = CommandType;<br /><br /><br />      52:             ExecutableCommand = Factory.CreateCommand();<br /><br /><br />      53:             ExecutableCommand.CommandText = _Command;<br /><br /><br />      54:             ExecutableCommand.Connection = Connection;<br /><br /><br />      55:             ExecutableCommand.CommandType = CommandType;<br /><br /><br />      56:         }<br /><br /><br />      57: <br /><br /><br />      58:         #endregion<br /><br /><br />      59: <br /><br /><br />      60:         #region Properties<br /><br /><br />      61: <br /><br /><br />      62:         /// andlt;summaryandgt;<br /><br /><br />      63:         /// Db provider factory (creates connections, etc.)<br /><br /><br />      64:         /// andlt;/summaryandgt;<br /><br /><br />      65:         protected virtual DbProviderFactory Factory { get; set; }<br /><br /><br />      66: <br /><br /><br />      67:         /// andlt;summaryandgt;<br /><br /><br />      68:         /// Connection to the database<br /><br /><br />      69:         /// andlt;/summaryandgt;<br /><br /><br />      70:         protected virtual DbConnection Connection { get; set; }<br /><br /><br />      71: <br /><br /><br />      72:         /// andlt;summaryandgt;<br /><br /><br />      73:         /// The executable command<br /><br /><br />      74:         /// andlt;/summaryandgt;<br /><br /><br />      75:         protected DbCommand ExecutableCommand { get; set; }<br /><br /><br />      76: <br /><br /><br />      77:         /// andlt;summaryandgt;<br /><br /><br />      78:         /// The data reader for the query<br /><br /><br />      79:         /// andlt;/summaryandgt;<br /><br /><br />      80:         protected DbDataReader Reader { get; set; }<br /><br /><br />      81: <br /><br /><br />      82:         /// andlt;summaryandgt;<br /><br /><br />      83:         /// The transaction associated with the query<br /><br /><br />      84:         /// andlt;/summaryandgt;<br /><br /><br />      85:         protected DbTransaction Transaction { get; set; }<br /><br /><br />      86: <br /><br /><br />      87:         /// andlt;summaryandgt;<br /><br /><br />      88:         /// Stored procedure's name or SQL Text<br /><br /><br />      89:         /// andlt;/summaryandgt;<br /><br /><br />      90:         public virtual string Command<br /><br /><br />      91:         {<br /><br /><br />      92:             get { return _Command; }<br /><br /><br />      93:             set<br /><br /><br />      94:             {<br /><br /><br />      95:                 _Command = value;<br /><br /><br />      96:                 RecreateConnection();<br /><br /><br />      97:             }<br /><br /><br />      98:         }<br /><br /><br />      99: <br /><br /><br />     100:         private string _Command = null;<br /><br /><br />     101: <br /><br /><br />     102: <br /><br /><br />     103:         /// andlt;summaryandgt;<br /><br /><br />     104:         /// Command Type<br /><br /><br />     105:         /// andlt;/summaryandgt;<br /><br /><br />     106:         public virtual CommandType CommandType<br /><br /><br />     107:         {<br /><br /><br />     108:             get { return _CommandType; }<br /><br /><br />     109:             set<br /><br /><br />     110:             {<br /><br /><br />     111:                 _CommandType = value;<br /><br /><br />     112:                 RecreateConnection();<br /><br /><br />     113:             }<br /><br /><br />     114:         }<br /><br /><br />     115:         private CommandType _CommandType;<br /><br /><br />     116: <br /><br /><br />     117:         #endregion<br /><br /><br />     118: <br /><br /><br />     119:         #region Functions<br /><br /><br />     120: <br /><br /><br />     121:         #region AddOutputParameter<br /><br /><br />     122: <br /><br /><br />     123:         /// andlt;summaryandgt;<br /><br /><br />     124:         /// Adds an output parameter<br /><br /><br />     125:         /// andlt;/summaryandgt;<br /><br /><br />     126:         /// andlt;param name=andquot;IDandquot;andgt;Name of the parameterandlt;/paramandgt;<br /><br /><br />     127:         /// andlt;param name=andquot;Typeandquot;andgt;SQL type of the parameterandlt;/paramandgt;<br /><br /><br />     128:         public virtual void AddOutputParameter(string ID, SqlDbType Type)<br /><br /><br />     129:         {<br /><br /><br />     130:             AddOutputParameter(ID, Utilities.DataTypes.DataTypeConversion.SqlDbTypeToDbType(Type));<br /><br /><br />     131:         }<br /><br /><br />     132: <br /><br /><br />     133:         /// andlt;summaryandgt;<br /><br /><br />     134:         /// Adds an output parameter<br /><br /><br />     135:         /// andlt;/summaryandgt;<br /><br /><br />     136:         /// andlt;param name=andquot;IDandquot;andgt;Name of the parameterandlt;/paramandgt;<br /><br /><br />     137:         /// andlt;param name=andquot;Typeandquot;andgt;SQL type of the parameterandlt;/paramandgt;<br /><br /><br />     138:         public virtual void AddOutputParameter(string ID, DbType Type)<br /><br /><br />     139:         {<br /><br /><br />     140:             if (ExecutableCommand != null)<br /><br /><br />     141:             {<br /><br /><br />     142:                 DbParameter Parameter = null;<br /><br /><br />     143:                 if (ExecutableCommand.Parameters.Contains(ID))<br /><br /><br />     144:                     Parameter = ExecutableCommand.Parameters[ID];<br /><br /><br />     145:                 else<br /><br /><br />     146:                 {<br /><br /><br />     147:                     Parameter = ExecutableCommand.CreateParameter();<br /><br /><br />     148:                     ExecutableCommand.Parameters.Add(Parameter);<br /><br /><br />     149:                 }<br /><br /><br />     150:                 Parameter.ParameterName = ID;<br /><br /><br />     151:                 Parameter.Value = null;<br /><br /><br />     152:                 Parameter.DbType = Type;<br /><br /><br />     153:                 Parameter.Direction = ParameterDirection.Output;<br /><br /><br />     154:             }<br /><br /><br />     155:         }<br /><br /><br />     156: <br /><br /><br />     157:         /// andlt;summaryandgt;<br /><br /><br />     158:         /// Adds an output parameter<br /><br /><br />     159:         /// andlt;/summaryandgt;<br /><br /><br />     160:         /// andlt;typeparam name=andquot;DataTypeandquot;andgt;Data type of the parameterandlt;/typeparamandgt;<br /><br /><br />     161:         /// andlt;param name=andquot;IDandquot;andgt;ID associated with the output parameterandlt;/paramandgt;<br /><br /><br />     162:         public virtual void AddOutputParameterandlt;DataTypeandgt;(string ID)<br /><br /><br />     163:         {<br /><br /><br />     164:             AddOutputParameter(ID, Utilities.DataTypes.DataTypeConversion.NetTypeToDbType(typeof(DataType)));<br /><br /><br />     165:         }<br /><br /><br />     166: <br /><br /><br />     167:         /// andlt;summaryandgt;<br /><br /><br />     168:         /// Adds an output parameter<br /><br /><br />     169:         /// andlt;/summaryandgt;<br /><br /><br />     170:         /// andlt;param name=andquot;IDandquot;andgt;Name of the parameterandlt;/paramandgt;<br /><br /><br />     171:         /// andlt;param name=andquot;Lengthandquot;andgt;Length of the string (either -1 or 5000 should be used to indicate nvarchar(max))andlt;/paramandgt;<br /><br /><br />     172:         public virtual void AddOutputParameter(string ID, int Length)<br /><br /><br />     173:         {<br /><br /><br />     174:             if (Length == 5000)<br /><br /><br />     175:                 Length = -1;<br /><br /><br />     176:             if (ExecutableCommand != null)<br /><br /><br />     177:             {<br /><br /><br />     178:                 DbParameter Parameter = null;<br /><br /><br />     179:                 if (ExecutableCommand.Parameters.Contains(ID))<br /><br /><br />     180:                     Parameter = ExecutableCommand.Parameters[ID];<br /><br /><br />     181:                 else<br /><br /><br />     182:                 {<br /><br /><br />     183:                     Parameter = ExecutableCommand.CreateParameter();<br /><br /><br />     184:                     ExecutableCommand.Parameters.Add(Parameter);<br /><br /><br />     185:                 }<br /><br /><br />     186:                 Parameter.ParameterName = ID;<br /><br /><br />     187:                 Parameter.Value = null;<br /><br /><br />     188:                 Parameter.DbType = Utilities.DataTypes.DataTypeConversion.NetTypeToDbType(typeof(string));<br /><br /><br />     189:                 Parameter.Direction = ParameterDirection.Output;<br /><br /><br />     190:                 Parameter.Size = Length;<br /><br /><br />     191:             }<br /><br /><br />     192:         }<br /><br /><br />     193: <br /><br /><br />     194:         #endregion<br /><br /><br />     195: <br /><br /><br />     196:         #region AddParameter<br /><br /><br />     197: <br /><br /><br />     198:         /// andlt;summaryandgt;<br /><br /><br />     199:         /// Adds a parameter to the call (for strings only)<br /><br /><br />     200:         /// andlt;/summaryandgt;<br /><br /><br />     201:         /// andlt;param name=andquot;IDandquot;andgt;Name of the parameterandlt;/paramandgt;<br /><br /><br />     202:         /// andlt;param name=andquot;Valueandquot;andgt;Value to addandlt;/paramandgt;<br /><br /><br />     203:         /// andlt;param name=andquot;Lengthandquot;andgt;Size of the string(either -1 or 5000 should be used to indicate nvarchar(max))andlt;/paramandgt;<br /><br /><br />     204:         public virtual void AddParameter(string ID, string Value, int Length)<br /><br /><br />     205:         {<br /><br /><br />     206:             if (Length == 5000)<br /><br /><br />     207:                 Length = -1;<br /><br /><br />     208:             if (ExecutableCommand != null)<br /><br /><br />     209:             {<br /><br /><br />     210:                 DbParameter Parameter = null;<br /><br /><br />     211:                 if (ExecutableCommand.Parameters.Contains(ID))<br /><br /><br />     212:                     Parameter = ExecutableCommand.Parameters[ID];<br /><br /><br />     213:                 else<br /><br /><br />     214:                 {<br /><br /><br />     215:                     Parameter = ExecutableCommand.CreateParameter();<br /><br /><br />     216:                     ExecutableCommand.Parameters.Add(Parameter);<br /><br /><br />     217:                 }<br /><br /><br />     218:                 Parameter.ParameterName = ID;<br /><br /><br />     219:                 Parameter.Value = (string.IsNullOrEmpty(Value)) ? System.DBNull.Value : (object)Value;<br /><br /><br />     220:                 Parameter.IsNullable = (string.IsNullOrEmpty(Value));<br /><br /><br />     221:                 Parameter.DbType = Utilities.DataTypes.DataTypeConversion.NetTypeToDbType(typeof(string));<br /><br /><br />     222:                 Parameter.Direction = ParameterDirection.Input;<br /><br /><br />     223:                 Parameter.Size = Length;<br /><br /><br />     224:             }<br /><br /><br />     225:         }<br /><br /><br />     226: <br /><br /><br />     227:         /// andlt;summaryandgt;<br /><br /><br />     228:         /// Adds a parameter to the call (for all types other than strings)<br /><br /><br />     229:         /// andlt;/summaryandgt;<br /><br /><br />     230:         /// andlt;param name=andquot;IDandquot;andgt;Name of the parameterandlt;/paramandgt;<br /><br /><br />     231:         /// andlt;param name=andquot;Valueandquot;andgt;Value to addandlt;/paramandgt;<br /><br /><br />     232:         /// andlt;param name=andquot;Typeandquot;andgt;SQL type of the parameterandlt;/paramandgt;<br /><br /><br />     233:         public virtual void AddParameter(string ID, object Value, SqlDbType Type)<br /><br /><br />     234:         {<br /><br /><br />     235:             AddParameter(ID, Value, Utilities.DataTypes.DataTypeConversion.SqlDbTypeToDbType(Type));<br /><br /><br />     236:         }<br /><br /><br />     237: <br /><br /><br />     238:         /// andlt;summaryandgt;<br /><br /><br />     239:         /// Adds a parameter to the call (for all types other than strings)<br /><br /><br />     240:         /// andlt;/summaryandgt;<br /><br /><br />     241:         /// andlt;typeparam name=andquot;DataTypeandquot;andgt;Data type of the parameterandlt;/typeparamandgt;<br /><br /><br />     242:         /// andlt;param name=andquot;IDandquot;andgt;Name of the parameterandlt;/paramandgt;<br /><br /><br />     243:         /// andlt;param name=andquot;Valueandquot;andgt;Value to addandlt;/paramandgt;<br /><br /><br />     244:         public virtual void AddParameterandlt;DataTypeandgt;(string ID, DataType Value)<br /><br /><br />     245:         {<br /><br /><br />     246:             AddParameter(ID, Value, Utilities.DataTypes.DataTypeConversion.NetTypeToDbType(Value.GetType()));<br /><br /><br />     247:         }<br /><br /><br />     248: <br /><br /><br />     249:         /// andlt;summaryandgt;<br /><br /><br />     250:         /// Adds a parameter to the call (for all types other than strings)<br /><br /><br />     251:         /// andlt;/summaryandgt;<br /><br /><br />     252:         /// andlt;param name=andquot;IDandquot;andgt;Name of the parameterandlt;/paramandgt;<br /><br /><br />     253:         /// andlt;param name=andquot;Valueandquot;andgt;Value to addandlt;/paramandgt;<br /><br /><br />     254:         /// andlt;param name=andquot;Typeandquot;andgt;SQL type of the parameterandlt;/paramandgt;<br /><br /><br />     255:         public virtual void AddParameter(string ID, object Value, DbType Type)<br /><br /><br />     256:         {<br /><br /><br />     257:             if (ExecutableCommand != null)<br /><br /><br />     258:             {<br /><br /><br />     259:                 DbParameter Parameter = null;<br /><br /><br />     260:                 if (ExecutableCommand.Parameters.Contains(ID))<br /><br /><br />     261:                     Parameter = ExecutableCommand.Parameters[ID];<br /><br /><br />     262:                 else<br /><br /><br />     263:                 {<br /><br /><br />     264:                     Parameter = ExecutableCommand.CreateParameter();<br /><br /><br />     265:                     ExecutableCommand.Parameters.Add(Parameter);<br /><br /><br />     266:                 }<br /><br /><br />     267:                 Parameter.ParameterName = ID;<br /><br /><br />     268:                 Parameter.Value = (Value == null) ? System.DBNull.Value : Value;<br /><br /><br />     269:                 Parameter.IsNullable = (Value == null);<br /><br /><br />     270:                 Parameter.DbType = Type;<br /><br /><br />     271:                 Parameter.Direction = ParameterDirection.Input;<br /><br /><br />     272:             }<br /><br /><br />     273:         }<br /><br /><br />     274: <br /><br /><br />     275:         #endregion<br /><br /><br />     276: <br /><br /><br />     277:         #region BeginTransaction<br /><br /><br />     278: <br /><br /><br />     279:         /// andlt;summaryandgt;<br /><br /><br />     280:         /// Begins a transaction<br /><br /><br />     281:         /// andlt;/summaryandgt;<br /><br /><br />     282:         public virtual void BeginTransaction()<br /><br /><br />     283:         {<br /><br /><br />     284:             Open();<br /><br /><br />     285:             Transaction = Connection.BeginTransaction();<br /><br /><br />     286:             Command = _Command;<br /><br /><br />     287:         }<br /><br /><br />     288: <br /><br /><br />     289:         #endregion<br /><br /><br />     290: <br /><br /><br />     291:         #region ClearParameters<br /><br /><br />     292: <br /><br /><br />     293:         /// andlt;summaryandgt;<br /><br /><br />     294:         /// Clears the parameters<br /><br /><br />     295:         /// andlt;/summaryandgt;<br /><br /><br />     296:         public virtual void ClearParameters()<br /><br /><br />     297:         {<br /><br /><br />     298:             if (ExecutableCommand != null)<br /><br /><br />     299:                 ExecutableCommand.Parameters.Clear();<br /><br /><br />     300:         }<br /><br /><br />     301: <br /><br /><br />     302:         #endregion<br /><br /><br />     303: <br /><br /><br />     304:         #region Close<br /><br /><br />     305: <br /><br /><br />     306:         /// andlt;summaryandgt;<br /><br /><br />     307:         /// Closes the connection<br /><br /><br />     308:         /// andlt;/summaryandgt;<br /><br /><br />     309:         public virtual void Close()<br /><br /><br />     310:         {<br /><br /><br />     311:             if (ExecutableCommand != null<br /><br /><br />     312:                 andamp;andamp; ExecutableCommand.Connection != null<br /><br /><br />     313:                 andamp;andamp; ExecutableCommand.Connection.State != ConnectionState.Closed)<br /><br /><br />     314:                 ExecutableCommand.Connection.Close();<br /><br /><br />     315:         }<br /><br /><br />     316: <br /><br /><br />     317:         #endregion<br /><br /><br />     318: <br /><br /><br />     319:         #region Commit<br /><br /><br />     320: <br /><br /><br />     321:         /// andlt;summaryandgt;<br /><br /><br />     322:         /// Commits a transaction<br /><br /><br />     323:         /// andlt;/summaryandgt;<br /><br /><br />     324:         public virtual void Commit()<br /><br /><br />     325:         {<br /><br /><br />     326:             if (Transaction != null)<br /><br /><br />     327:                 Transaction.Commit();<br /><br /><br />     328:         }<br /><br /><br />     329: <br /><br /><br />     330:         #endregion<br /><br /><br />     331: <br /><br /><br />     332:         #region ExecuteDataSet<br /><br /><br />     333: <br /><br /><br />     334:         /// andlt;summaryandgt;<br /><br /><br />     335:         /// Executes the query and returns a data set<br /><br /><br />     336:         /// andlt;/summaryandgt;<br /><br /><br />     337:         /// andlt;returnsandgt;A dataset filled with the results of the queryandlt;/returnsandgt;<br /><br /><br />     338:         public virtual DataSet ExecuteDataSet()<br /><br /><br />     339:         {<br /><br /><br />     340:             Open();<br /><br /><br />     341:             if (ExecutableCommand != null)<br /><br /><br />     342:             {<br /><br /><br />     343:                 DbDataAdapter Adapter = Factory.CreateDataAdapter();<br /><br /><br />     344:                 Adapter.SelectCommand = ExecutableCommand;<br /><br /><br />     345:                 DataSet ReturnSet = new DataSet();<br /><br /><br />     346:                 Adapter.Fill(ReturnSet);<br /><br /><br />     347:                 return ReturnSet;<br /><br /><br />     348:             }<br /><br /><br />     349:             return null;<br /><br /><br />     350:         }<br /><br /><br />     351: <br /><br /><br />     352:         #endregion<br /><br /><br />     353: <br /><br /><br />     354:         #region ExecuteNonQuery<br /><br /><br />     355: <br /><br /><br />     356:         /// andlt;summaryandgt;<br /><br /><br />     357:         /// Executes the stored procedure as a non query<br /><br /><br />     358:         /// andlt;/summaryandgt;<br /><br /><br />     359:         /// andlt;returnsandgt;Number of rows effectedandlt;/returnsandgt;<br /><br /><br />     360:         public virtual int ExecuteNonQuery()<br /><br /><br />     361:         {<br /><br /><br />     362:             Open();<br /><br /><br />     363:             if (ExecutableCommand != null)<br /><br /><br />     364:                 return ExecutableCommand.ExecuteNonQuery();<br /><br /><br />     365:             return 0;<br /><br /><br />     366:         }<br /><br /><br />     367: <br /><br /><br />     368:         #endregion<br /><br /><br />     369: <br /><br /><br />     370:         #region ExecuteReader<br /><br /><br />     371: <br /><br /><br />     372:         /// andlt;summaryandgt;<br /><br /><br />     373:         /// Executes the stored procedure and returns a reader object<br /><br /><br />     374:         /// andlt;/summaryandgt;<br /><br /><br />     375:         public virtual void ExecuteReader()<br /><br /><br />     376:         {<br /><br /><br />     377:             Open();<br /><br /><br />     378:             if (ExecutableCommand != null)<br /><br /><br />     379:                 Reader = ExecutableCommand.ExecuteReader();<br /><br /><br />     380:         }<br /><br /><br />     381: <br /><br /><br />     382:         #endregion<br /><br /><br />     383: <br /><br /><br />     384:         #region ExecuteScalar<br /><br /><br />     385: <br /><br /><br />     386:         /// andlt;summaryandgt;<br /><br /><br />     387:         /// Executes the stored procedure as a scalar query<br /><br /><br />     388:         /// andlt;/summaryandgt;<br /><br /><br />     389:         /// andlt;returnsandgt;The object of the first row and first columnandlt;/returnsandgt;<br /><br /><br />     390:         public virtual object ExecuteScalar()<br /><br /><br />     391:         {<br /><br /><br />     392:             Open();<br /><br /><br />     393:             if (ExecutableCommand != null)<br /><br /><br />     394:                 return ExecutableCommand.ExecuteScalar();<br /><br /><br />     395:             return null;<br /><br /><br />     396:         }<br /><br /><br />     397: <br /><br /><br />     398:         #endregion<br /><br /><br />     399: <br /><br /><br />     400:         #region ExecuteXmlReader<br /><br /><br />     401: <br /><br /><br />     402:         /// andlt;summaryandgt;<br /><br /><br />     403:         /// Executes the query and returns an XmlReader<br /><br /><br />     404:         /// andlt;/summaryandgt;<br /><br /><br />     405:         /// andlt;returnsandgt;The XmlReader filled with the data from the queryandlt;/returnsandgt;<br /><br /><br />     406:         public virtual XmlReader ExecuteXmlReader()<br /><br /><br />     407:         {<br /><br /><br />     408:             Open();<br /><br /><br />     409:             if (ExecutableCommand != null andamp;andamp; ExecutableCommand is SqlCommand)<br /><br /><br />     410:                 return ((SqlCommand)ExecutableCommand).ExecuteXmlReader();<br /><br /><br />     411:             return null;<br /><br /><br />     412:         }<br /><br /><br />     413: <br /><br /><br />     414:         #endregion<br /><br /><br />     415: <br /><br /><br />     416:         #region GetParameter<br /><br /><br />     417: <br /><br /><br />     418:         /// andlt;summaryandgt;<br /><br /><br />     419:         /// Returns a parameter's value<br /><br /><br />     420:         /// andlt;/summaryandgt;<br /><br /><br />     421:         /// andlt;param name=andquot;IDandquot;andgt;Parameter nameandlt;/paramandgt;<br /><br /><br />     422:         /// andlt;param name=andquot;Defaultandquot;andgt;Default value for the parameterandlt;/paramandgt;<br /><br /><br />     423:         /// andlt;returnsandgt;if the parameter exists (and isn't null or empty), it returns the parameter's value. Otherwise the default value is returned.andlt;/returnsandgt;<br /><br /><br />     424:         public virtual object GetParameter(string ID, object Default)<br /><br /><br />     425:         {<br /><br /><br />     426:             if (Reader != null andamp;andamp; !Convert.IsDBNull(Reader[ID]))<br /><br /><br />     427:                 return Reader[ID];<br /><br /><br />     428:             return Default;<br /><br /><br />     429:         }<br /><br /><br />     430: <br /><br /><br />     431:         /// andlt;summaryandgt;<br /><br /><br />     432:         /// Returns a parameter's value<br /><br /><br />     433:         /// andlt;/summaryandgt;<br /><br /><br />     434:         /// andlt;typeparam name=andquot;DataTypeandquot;andgt;Data type of the objectandlt;/typeparamandgt;<br /><br /><br />     435:         /// andlt;param name=andquot;IDandquot;andgt;Parameter nameandlt;/paramandgt;<br /><br /><br />     436:         /// andlt;param name=andquot;Defaultandquot;andgt;Default value for the parameterandlt;/paramandgt;<br /><br /><br />     437:         /// andlt;returnsandgt;if the parameter exists (and isn't null or empty), it returns the parameter's value. Otherwise the default value is returned.andlt;/returnsandgt;<br /><br /><br />     438:         public virtual DataType GetParameterandlt;DataTypeandgt;(string ID, DataType Default)<br /><br /><br />     439:         {<br /><br /><br />     440:             if (Reader != null andamp;andamp; !Convert.IsDBNull(Reader[ID]))<br /><br /><br />     441:                 return (DataType)Convert.ChangeType(Reader[ID], typeof(DataType));<br /><br /><br />     442:             return Default;<br /><br /><br />     443:         }<br /><br /><br />     444: <br /><br /><br />     445:         /// andlt;summaryandgt;<br /><br /><br />     446:         /// Returns a parameter's value<br /><br /><br />     447:         /// andlt;/summaryandgt;<br /><br /><br />     448:         /// andlt;param name=andquot;Positionandquot;andgt;Position in the rowandlt;/paramandgt;<br /><br /><br />     449:         /// andlt;param name=andquot;Defaultandquot;andgt;Default value for the parameterandlt;/paramandgt;<br /><br /><br />     450:         /// andlt;returnsandgt;if the parameter exists (and isn't null or empty), it returns the parameter's value. Otherwise the default value is returned.andlt;/returnsandgt;<br /><br /><br />     451:         public virtual object GetParameter(int Position, object Default)<br /><br /><br />     452:         {<br /><br /><br />     453:             if (Reader != null andamp;andamp; !Convert.IsDBNull(Reader[Position]))<br /><br /><br />     454:                 return Reader[Position];<br /><br /><br />     455:             return Default;<br /><br /><br />     456:         }<br /><br /><br />     457: <br /><br /><br />     458:         /// andlt;summaryandgt;<br /><br /><br />     459:         /// Returns a parameter's value<br /><br /><br />     460:         /// andlt;/summaryandgt;<br /><br /><br />     461:         /// andlt;typeparam name=andquot;DataTypeandquot;andgt;Data type of the objectandlt;/typeparamandgt;<br /><br /><br />     462:         /// andlt;param name=andquot;Positionandquot;andgt;Position in the rowandlt;/paramandgt;<br /><br /><br />     463:         /// andlt;param name=andquot;Defaultandquot;andgt;Default value for the parameterandlt;/paramandgt;<br /><br /><br />     464:         /// andlt;returnsandgt;if the parameter exists (and isn't null or empty), it returns the parameter's value. Otherwise the default value is returned.andlt;/returnsandgt;<br /><br /><br />     465:         public virtual DataType GetParameterandlt;DataTypeandgt;(int Position, DataType Default)<br /><br /><br />     466:         {<br /><br /><br />     467:             if (Reader != null andamp;andamp; !Convert.IsDBNull(Reader[Position]))<br /><br /><br />     468:                 return (DataType)Convert.ChangeType(Reader[Position], typeof(DataType));<br /><br /><br />     469:             return Default;<br /><br /><br />     470:         }<br /><br /><br />     471: <br /><br /><br />     472:         #endregion<br /><br /><br />     473: <br /><br /><br />     474:         #region GetOutputParameter<br /><br /><br />     475: <br /><br /><br />     476:         /// andlt;summaryandgt;<br /><br /><br />     477:         /// Returns an output parameter's value<br /><br /><br />     478:         /// andlt;/summaryandgt;<br /><br /><br />     479:         /// andlt;param name=andquot;IDandquot;andgt;Parameter nameandlt;/paramandgt;<br /><br /><br />     480:         /// andlt;param name=andquot;Defaultandquot;andgt;Default value for the parameterandlt;/paramandgt;<br /><br /><br />     481:         /// andlt;returnsandgt;if the parameter exists (and isn't null or empty), it returns the parameter's value. Otherwise the default value is returned.andlt;/returnsandgt;<br /><br /><br />     482:         public virtual object GetOutputParameter(string ID, object Default)<br /><br /><br />     483:         {<br /><br /><br />     484:             if (ExecutableCommand != null andamp;andamp; !Convert.IsDBNull(ExecutableCommand.Parameters[ID]))<br /><br /><br />     485:                 return ExecutableCommand.Parameters[ID].Value;<br /><br /><br />     486:             return Default;<br /><br /><br />     487:         }<br /><br /><br />     488: <br /><br /><br />     489:         /// andlt;summaryandgt;<br /><br /><br />     490:         /// Returns an output parameter's value<br /><br /><br />     491:         /// andlt;/summaryandgt;<br /><br /><br />     492:         /// andlt;typeparam name=andquot;DataTypeandquot;andgt;Data type of the objectandlt;/typeparamandgt;<br /><br /><br />     493:         /// andlt;param name=andquot;IDandquot;andgt;Parameter nameandlt;/paramandgt;<br /><br /><br />     494:         /// andlt;param name=andquot;Defaultandquot;andgt;Default value for the parameterandlt;/paramandgt;<br /><br /><br />     495:         /// andlt;returnsandgt;if the parameter exists (and isn't null or empty), it returns the parameter's value. Otherwise the default value is returned.andlt;/returnsandgt;<br /><br /><br />     496:         public virtual DataType GetOutputParameterandlt;DataTypeandgt;(string ID, DataType Default)<br /><br /><br />     497:         {<br /><br /><br />     498:             if (ExecutableCommand != null andamp;andamp; !Convert.IsDBNull(ExecutableCommand.Parameters[ID]))<br /><br /><br />     499:                 return (DataType)Convert.ChangeType(ExecutableCommand.Parameters[ID].Value, typeof(DataType));<br /><br /><br />     500:             return Default;<br /><br /><br />     501:         }<br /><br /><br />     502: <br /><br /><br />     503:         #endregion<br /><br /><br />     504: <br /><br /><br />     505:         #region NextResult<br /><br /><br />     506: <br /><br /><br />     507:         /// andlt;summaryandgt;<br /><br /><br />     508:         /// Goes to the next result set (used if multiple queries are sent in)<br /><br /><br />     509:         /// andlt;/summaryandgt;<br /><br /><br />     510:         public virtual void NextResult()<br /><br /><br />     511:         {<br /><br /><br />     512:             if (Reader != null)<br /><br /><br />     513:                 Reader.NextResult();<br /><br /><br />     514:         }<br /><br /><br />     515: <br /><br /><br />     516:         #endregion<br /><br /><br />     517: <br /><br /><br />     518:         #region Open<br /><br /><br />     519: <br /><br /><br />     520:         /// andlt;summaryandgt;<br /><br /><br />     521:         /// Opens the connection<br /><br /><br />     522:         /// andlt;/summaryandgt;<br /><br /><br />     523:         public virtual void Open()<br /><br /><br />     524:         {<br /><br /><br />     525:             if (ExecutableCommand != null <br /><br /><br />     526:                 andamp;andamp; ExecutableCommand.Connection != null <br /><br /><br />     527:                 andamp;andamp; ExecutableCommand.Connection.State != ConnectionState.Open)<br /><br /><br />     528:                 ExecutableCommand.Connection.Open();<br /><br /><br />     529:         }<br /><br /><br />     530: <br /><br /><br />     531:         #endregion<br /><br /><br />     532: <br /><br /><br />     533:         #region Read<br /><br /><br />     534: <br /><br /><br />     535:         /// andlt;summaryandgt;<br /><br /><br />     536:         /// Is there more information?<br /><br /><br />     537:         /// andlt;/summaryandgt;<br /><br /><br />     538:         /// andlt;returnsandgt;True if there is more rows, false otherwiseandlt;/returnsandgt;<br /><br /><br />     539:         public virtual bool Read()<br /><br /><br />     540:         {<br /><br /><br />     541:             return (Reader != null) ? Reader.Read() : false;<br /><br /><br />     542:         }<br /><br /><br />     543: <br /><br /><br />     544:         #endregion<br /><br /><br />     545: <br /><br /><br />     546:         #region RecreateConnection<br /><br /><br />     547: <br /><br /><br />     548:         private void RecreateConnection()<br /><br /><br />     549:         {<br /><br /><br />     550:             if (Reader != null)<br /><br /><br />     551:             {<br /><br /><br />     552:                 Reader.Close();<br /><br /><br />     553:                 Reader.Dispose();<br /><br /><br />     554:                 Reader = null;<br /><br /><br />     555:             }<br /><br /><br />     556:             if (ExecutableCommand != null)<br /><br /><br />     557:             {<br /><br /><br />     558:                 ExecutableCommand.Dispose();<br /><br /><br />     559:                 ExecutableCommand = null;<br /><br /><br />     560:             }<br /><br /><br />     561:             ExecutableCommand = Factory.CreateCommand();<br /><br /><br />     562:             ExecutableCommand.CommandText = _Command;<br /><br /><br />     563:             ExecutableCommand.Connection = Connection;<br /><br /><br />     564:             ExecutableCommand.CommandType = CommandType;<br /><br /><br />     565:             if (Transaction != null)<br /><br /><br />     566:                 ExecutableCommand.Transaction = Transaction;<br /><br /><br />     567:         }<br /><br /><br />     568: <br /><br /><br />     569:         #endregion<br /><br /><br />     570: <br /><br /><br />     571:         #region Rollback<br /><br /><br />     572: <br /><br /><br />     573:         /// andlt;summaryandgt;<br /><br /><br />     574:         /// Rolls back a transaction<br /><br /><br />     575:         /// andlt;/summaryandgt;<br /><br /><br />     576:         public virtual void Rollback()<br /><br /><br />     577:         {<br /><br /><br />     578:             if (Transaction != null)<br /><br /><br />     579:                 Transaction.Rollback();<br /><br /><br />     580:         }<br /><br /><br />     581: <br /><br /><br />     582:         #endregion<br /><br /><br />     583: <br /><br /><br />     584:         #endregion<br /><br /><br />     585: <br /><br /><br />     586:         #region IDisposable Members<br /><br /><br />     587: <br /><br /><br />     588: 
