<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Under The Influence(of code)</title>
        <link>http://geekswithblogs.net/abhijeetp/Default.aspx</link>
        <description>Abhijeet Patel's blog</description>
        <language>en-US</language>
        <copyright>Abhijeet Patel</copyright>
        <managingEditor>abhidotnet@gmail.com</managingEditor>
        <generator>Subtext Version 0.0.0.0</generator>
        <image>
            <title>Under The Influence(of code)</title>
            <url>http://geekswithblogs.net/images/RSS2Image.gif</url>
            <link>http://geekswithblogs.net/abhijeetp/Default.aspx</link>
            <width>77</width>
            <height>60</height>
        </image>
        <item>
            <title>MEF 101 - Part2</title>
            <category>C#</category>
            <link>http://geekswithblogs.net/abhijeetp/archive/2011/10/30/mef-101---part-2.aspx</link>
            <description>&lt;p&gt;
&lt;/p&gt;&lt;title&gt;&lt;/title&gt;
&lt;link href="http://geekswithblogs.net/abhijeetp/customcss.aspx" rel="stylesheet" type="text/css" /&gt;
&lt;div class="defaultText"&gt;
&lt;p&gt;This is part 2 of a 2 part series exploring the MEF.We covered some of the basics in &lt;a href="http://geekswithblogs.net/abhijeetp/archive/2010/07/03/mef-101---part1.aspx"&gt;Part 1&lt;/a&gt;             In this part we'll cover the following:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Catalogs&lt;/li&gt;
    &lt;li&gt;Recomposition&lt;/li&gt;
    &lt;li&gt;Export Providers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt; Catalogs:&lt;/b&gt;&lt;br /&gt;
Catalogs provide one way for MEF to discover components that it can compose.             In it's most basic form it contains a registration of types.             A container by itself is just an empty repository. The catalog is the one that collects and returns ComposablePartDefinitions i.e (objects of types that you have registered with MEF)             to the container which in turn uses this for satifying imports on a specified object.                         We've seen AssemblyCatalog previously as a means for finding and satisfying imports.                          The following catalogs are built into the framework:             &lt;i&gt;TypeCatalog&lt;/i&gt;,&lt;i&gt; AssemblyCatalog&lt;/i&gt;,&lt;i&gt; DirectoryCatalog&lt;/i&gt; and &lt;i&gt;AggregateCatalog&lt;/i&gt;.             Each of these catalogs are derived from &lt;i&gt;ComposablePartCatalog&lt;/i&gt; which is the abstract base class for all catalogs.&lt;/p&gt;
&lt;p&gt;&lt;i&gt;TypeCatalog&lt;/i&gt;&lt;br /&gt;
A type catalog is an immutable catalog that lets you register one or more type names.When this catalog is provided to the container it will use the types specified in this catalog             for resolving imports and exports. You can specify types directly using 'typeof' (less useful since you are coupled to concrete types) or read type information from a configuration              file instead.&lt;/p&gt;
&lt;div class="dp-highlighter" id="DIV2"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt;[Export(&lt;/span&gt;&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(ILogger))]   &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; ConsoleLogger : ILogger   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;{   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    [Import]   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; ITextFormatter Formatter   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    {   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;;   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        &lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;;   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    }   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Log(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; str)   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    {   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; formattedString = Formatter.Format(str);   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        Console.WriteLine(formattedString);   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    }   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Name   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    {   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        {   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            &lt;/span&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="string"&gt;"Console Logger"&lt;/span&gt;&lt;span&gt;;   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        }   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    }   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;}   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;[Export(&lt;/span&gt;&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(ITextFormatter))]   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; TextFormatter : ITextFormatter   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;{   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Name   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    {   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        {   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            &lt;/span&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="string"&gt;"Text Formatter"&lt;/span&gt;&lt;span&gt;;   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        }   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    }   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Format(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; str)   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    {   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        &lt;/span&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;.Format(&lt;/span&gt;&lt;span class="string"&gt;"Formatted Message:{0}"&lt;/span&gt;&lt;span&gt;, str);   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    }   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;}   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; Program   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;{   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    [Import]   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; ILogger Logger { &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;; }   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Main(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;[] args)   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    {   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        Program p = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Program();   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        ComposablePartCatalog typeCatalog = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; TypeCatalog(&lt;/span&gt;&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(ConsoleLogger), &lt;/span&gt;&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(TextFormatter));    &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        CompositionContainer container =   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; CompositionContainer(typeCatalog);               &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        container.ComposeParts(p);   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        p.Logger.Log(&lt;/span&gt;&lt;span class="string"&gt;"Hello world"&lt;/span&gt;&lt;span&gt;);   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    }   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
To avoid coupling to specific type names (and by extension an assembly holding a concrete implementation) you could use 'Type.GetType(string typename)' instead where the typename could come from a config file.         TypeCatalog gives you fine grained control over each type that you would like to register and make available to the container.
&lt;p&gt;&lt;b&gt;Assembly Catalog&lt;/b&gt;     &lt;br /&gt;
If all the types that you would like to register are contained in an assembly you can use the AssemblyCatalog which scans the assembly and identifies the types that expose             Import and Export attributes and registers them in one fell swoop into the catalog.This is useful when you have an application which is broken down into components by say              feature areas or you have an on demand download for performance reasons or  you have a pay as you go model for features available to your application as is typical in plugin              based applications which is what MEF is all about anyways. &lt;br /&gt;
The AssemblyCatalog lets you register the types defined in such assemblies and make them available to the rest of the host application via the container.&lt;br /&gt;
 &lt;/p&gt;
&lt;div class="dp-highlighter" id="hlDiv"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; Program   &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;{   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    [Import]   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; ILogger Logger { &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;; }   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Main(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;[] args)   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    {   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        Program p = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Program();   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        Assembly assembly = Assembly.LoadFile(Path.Combine(Directory.GetCurrentDirectory(), &lt;/span&gt;&lt;span class="string"&gt;"MEF101.Implementations.dll"&lt;/span&gt;&lt;span&gt;));   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        &lt;/span&gt;&lt;span class="comment"&gt;//you could also load the assembly on the fly from over the wire by using Assemly.Load(byte[] bytes) &lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        ComposablePartCatalog assemblyCatalog = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; AssemblyCatalog(assembly);               &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        CompositionContainer container =  &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; CompositionContainer(assemblyCatalog);               &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        container.ComposeParts(p);   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        p.Logger.Log(&lt;/span&gt;&lt;span class="string"&gt;"Hello World"&lt;/span&gt;&lt;span&gt;);   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    }   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;&lt;b&gt;DirectoryCatalog&lt;/b&gt;&lt;br /&gt;
If all your types are contained in a specific directory (such as the current directory your exe is running from) you could use the DirectoryCatalog specifying a directory name              and an optional search pattern to have MEF scan all assemblies in the specified directory and automatically register all types that it finds into the catalog like so:&lt;br /&gt;
 &lt;/p&gt;
&lt;div class="dp-highlighter" id="DIV3"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; Program   &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;   {   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;       [Import]   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;       &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; MEF101.Interfaces.ILogger Logger { &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;; }   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;       &lt;/span&gt;&lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Main(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;[] args)   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;       {   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;           Program p = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Program();               &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           ComposablePartCatalog dirCatalog = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; DirectoryCatalog(Directory.GetCurrentDirectory());   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;           CompositionContainer container =  &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; CompositionContainer(dirCatalog);               &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           container.ComposeParts(p);   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;           p.Logger.Log(&lt;/span&gt;&lt;span class="string"&gt;"Hello World"&lt;/span&gt;&lt;span&gt;);   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;       }   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;   }  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;&lt;b&gt;AggregateCatalog&lt;/b&gt;&lt;br /&gt;
You can all combine all the above catalog types into an &lt;i&gt;aggregate&lt;/i&gt; catalog type using the AggregateCatalog. As the name implies this takes in one or more ComposablePartCatalogs             and exposes the the type registrations contained in all of them to the container as one whole. This is great when you have your types spread out over multiple locations.             For example your applcation can start with a barebones set of features loaded from an assembly running in the current directory and you can asynchronously download updates/feature             assemblies in the background. You can then compose your application using a combination of AssemblyCatalog and DirectoryCatalog &lt;br /&gt;
The following code shows a simplified example wherein &lt;i&gt;ILogger&lt;/i&gt; implementations come from an &lt;i&gt;AssemblyCatalog&lt;/i&gt; and a &lt;i&gt;TypeCatalog&lt;/i&gt;              .The &lt;i&gt;TypeCatalog&lt;/i&gt; is added after the &lt;i&gt;AggregateCatalog&lt;/i&gt; is constructed             .&lt;/p&gt;
&lt;div class="dp-highlighter" id="DIV1"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt;[Export(&lt;/span&gt;&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(MEF101.Interfaces.ILogger))]   &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; DebugLogger : MEF101.Interfaces.ILogger   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;{   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;       &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Name   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;       {   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;           &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="string"&gt;"Debug Logger"&lt;/span&gt;&lt;span&gt;; }   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;       }   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;       [Import]   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;       &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; MEF101.Interfaces.ITextFormatter Formatter   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;       {   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;           &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;;   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           &lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;;   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;       }   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;       &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Log(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; str)   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;       {   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;           Debug.Write(str);   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;       }   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;   }   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; Program   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;{   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    [ImportMany]   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; IEnumerable&amp;lt;MEF101.Interfaces.ILogger&amp;gt; Loggers { &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;; }   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Main(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;[] args)   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    {   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        Program p = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Program();               &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        ComposablePartCatalog typeCatalog = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; TypeCatalog(&lt;/span&gt;&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(DebugLogger));   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        ComposablePartCatalog assemblyCatalog = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; AssemblyCatalog(Assembly.LoadFile(   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                                Path.Combine(Directory.GetCurrentDirectory(),   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;span class="string"&gt;"MEF101.Implementations.dll"&lt;/span&gt;&lt;span&gt;)));   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        AggregateCatalog aggCatalog = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; AggregateCatalog(assemblyCatalog);   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        aggCatalog.Catalogs.Add(typeCatalog);   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        CompositionContainer container =  &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; CompositionContainer(aggCatalog);               &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        container.ComposeParts(p);   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        &lt;/span&gt;&lt;span class="keyword"&gt;foreach&lt;/span&gt;&lt;span&gt; (var logger &lt;/span&gt;&lt;span class="keyword"&gt;in&lt;/span&gt;&lt;span&gt; p.Loggers)   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        {   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            logger.Log(&lt;/span&gt;&lt;span class="string"&gt;"Hello"&lt;/span&gt;&lt;span&gt;);   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        }              &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    }   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;br /&gt;
Whereas all the other catalog types are immutable, the &lt;i&gt;AggregateCatalog&lt;/i&gt; lets you add and subract &lt;i&gt;ComposablePartCatalogs&lt;/i&gt; from it's internal "Catalog" collection facilitating &lt;i&gt;recomposition&lt;/i&gt; of the container on the fly.
&lt;p&gt;&lt;b&gt;Recomposition&lt;/b&gt;&lt;br /&gt;
MEF provides a facility to allow a composable application to change              it's behavior when composable parts can change on the fly via a mechanism called             recomposition.&lt;br /&gt;
Let's re-write the example such that the call to "Catalogs.Add" is made after we compose the instance of &lt;i&gt;Program&lt;/i&gt; &lt;br /&gt;
 &lt;/p&gt;
&lt;div class="dp-highlighter" id="DIV4"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt;[Export(&lt;/span&gt;&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(MEF101.Interfaces.ILogger))]   &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; DebugLogger : MEF101.Interfaces.ILogger   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;{   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;       &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Name   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;       {   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;           &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="string"&gt;"Debug Logger"&lt;/span&gt;&lt;span&gt;; }   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;       }   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;       [Import]   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;       &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; MEF101.Interfaces.ITextFormatter Formatter   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;       {   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;           &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;;   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           &lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;;   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;       }   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;       &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Log(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; str)   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;       {   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;           Debug.Write(str);   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;       }   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;   }   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; Program   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;{   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    [ImportMany]   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; IEnumerable&amp;lt;MEF101.Interfaces.ILogger&amp;gt; Loggers { &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;; }   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Main(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;[] args)   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    {   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        Program p = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Program();               &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        ComposablePartCatalog typeCatalog = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; TypeCatalog(&lt;/span&gt;&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(DebugLogger));   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        ComposablePartCatalog assemblyCatalog = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; AssemblyCatalog(Assembly.LoadFile(   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                                Path.Combine(Directory.GetCurrentDirectory(),   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;span class="string"&gt;"MEF101.Implementations.dll"&lt;/span&gt;&lt;span&gt;)));   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        AggregateCatalog aggCatalog = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; AggregateCatalog(assemblyCatalog);   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;           CompositionContainer container =  &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; CompositionContainer(aggCatalog);               &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           container.ComposeParts(p);   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        &lt;strong&gt;aggCatalog.Catalogs.Add(typeCatalog);&lt;/strong&gt;   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            &lt;/span&gt;&lt;span class="keyword"&gt;foreach&lt;/span&gt;&lt;span&gt; (var logger &lt;/span&gt;&lt;span class="keyword"&gt;in&lt;/span&gt;&lt;span&gt; p.Loggers)   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            {   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;               logger.Log(&lt;/span&gt;&lt;span class="string"&gt;"Hello"&lt;/span&gt;&lt;span&gt;);   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            }              &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    }   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;br /&gt;
This causes the following exception to be thrown:&lt;br /&gt;
&lt;i&gt;Change in exports prevented by non-recomposable import 'MEF.LazyImports.Program.Loggers (ContractName="MEF101.Interfaces.ILogger")' on part 'MEF.LazyImports.Program'&lt;/i&gt; &lt;br /&gt;
This happens because the container changed after the instance of &lt;i&gt;Program&lt;/i&gt; was already composed. The error indicates that the part being imported on the instance of &lt;i&gt;Program &lt;/i&gt; i.e Loggers  does not support recomposition and hence the change was prevented. We can easily enable this by  changing the &lt;i&gt;[Import]&lt;/i&gt; declaration on the &lt;i&gt;Loggers&lt;/i&gt; property to &lt;br /&gt;
&lt;i&gt;[ImportMany&lt;b&gt;(AllowRecomposition=true)]&lt;/b&gt;&lt;/i&gt;. This allows for the program to dynamically obtain another instance of logger in it's &lt;i&gt;Loggers&lt;/i&gt; collection and continue working normally&lt;br /&gt;
i.e. recompose itself&lt;br /&gt;
Similar to adding catalogs on the fly, we can also remove catalogs from the container and  this will cause recomposition and update the &lt;i&gt;Import&lt;/i&gt; on the instance of the  &lt;i&gt;Program&lt;/i&gt; automatically like so:&lt;br /&gt;
&lt;div class="dp-highlighter" id="DIV5"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt;[Export(&lt;/span&gt;&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(MEF101.Interfaces.ILogger))]   &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; DebugLogger : MEF101.Interfaces.ILogger   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;{   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;       &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Name   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;       {   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;           &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="string"&gt;"Debug Logger"&lt;/span&gt;&lt;span&gt;; }   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;       }   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;       [Import]   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;       &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; MEF101.Interfaces.ITextFormatter Formatter   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;       {   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;           &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;;   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           &lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;;   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;       }   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;       &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Log(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; str)   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;       {   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;           Debug.Write(str);   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;       }   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;   }   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; Program   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;{   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    [ImportMany]   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; IEnumerable&amp;lt;MEF101.Interfaces.ILogger&amp;gt; Loggers { &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;; }   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Main(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;[] args)   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    {   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        Program p = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Program();               &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        ComposablePartCatalog typeCatalog = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; TypeCatalog(&lt;/span&gt;&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(DebugLogger));   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        ComposablePartCatalog assemblyCatalog = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; AssemblyCatalog(Assembly.LoadFile(   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                                Path.Combine(Directory.GetCurrentDirectory(),   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;span class="string"&gt;"MEF101.Implementations.dll"&lt;/span&gt;&lt;span&gt;)));   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        AggregateCatalog aggCatalog = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; AggregateCatalog(assemblyCatalog);   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;           CompositionContainer container =  &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; CompositionContainer(aggCatalog);               &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           container.ComposeParts(p);   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        aggCatalog.Catalogs.Add(typeCatalog);   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            &lt;/span&gt;&lt;span class="keyword"&gt;foreach&lt;/span&gt;&lt;span&gt; (var logger &lt;/span&gt;&lt;span class="keyword"&gt;in&lt;/span&gt;&lt;span&gt; p.Loggers)   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            {   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;               logger.Log(&lt;/span&gt;&lt;span class="string"&gt;"Hello"&lt;/span&gt;&lt;span&gt;);   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            }   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        aggCatalog.Catalogs.Remove(typeCatalog);   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            &lt;/span&gt;&lt;span class="keyword"&gt;foreach&lt;/span&gt;&lt;span&gt; (var logger &lt;/span&gt;&lt;span class="keyword"&gt;in&lt;/span&gt;&lt;span&gt; p.Loggers)   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            {   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                logger.Log(&lt;/span&gt;&lt;span class="string"&gt;"Hello"&lt;/span&gt;&lt;span&gt;);   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            }              &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    }   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;&lt;i&gt;Notifications of Recomposition&lt;/i&gt; &lt;br /&gt;
MEF can notify you whenever a recomposition happens in case you need to perform           some action such as cleanup/housekeeping. It does this via an interface called          &lt;i&gt;IPartImportSatisfiedNotification&lt;/i&gt; &lt;br /&gt;
You implement this interface in any of your parts in which you need that a           recomposition(or more generally a composition) has occured.The interface has a single method called &lt;i&gt;OnImportSatisfied&lt;/i&gt;&lt;br /&gt;
that you need to provide an implementation for.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div class="dp-highlighter" id="DIV6"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt;[Export(&lt;/span&gt;&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(MEF101.Interfaces.ILogger))]   &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; DebugLogger : MEF101.Interfaces.ILogger   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;{   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;       &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Name   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;       {   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;           &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="string"&gt;"Debug Logger"&lt;/span&gt;&lt;span&gt;; }   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;       }   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;       [Import]   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;       &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; MEF101.Interfaces.ITextFormatter Formatter   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;       {   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;           &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;;   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           &lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;;   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;       }   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;       &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Log(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; str)   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;       {   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;           Debug.Write(str);   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;       }   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;   }   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; Program : IPartImportsSatisfiedNotification   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;{   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    [ImportMany]   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; IEnumerable&amp;lt;MEF101.Interfaces.ILogger&amp;gt; Loggers { &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;; }   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; OnImportsSatisfied()   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    {   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        Console.WriteLine(&lt;/span&gt;&lt;span class="string"&gt;"Import satisfied"&lt;/span&gt;&lt;span&gt;);   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    }   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Main(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;[] args)   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    {   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        Program p = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Program();               &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        ComposablePartCatalog typeCatalog = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; TypeCatalog(&lt;/span&gt;&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(DebugLogger));   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        ComposablePartCatalog assemblyCatalog = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; AssemblyCatalog(Assembly.LoadFile(   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                                Path.Combine(Directory.GetCurrentDirectory(),   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;span class="string"&gt;"MEF101.Implementations.dll"&lt;/span&gt;&lt;span&gt;)));   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        AggregateCatalog aggCatalog = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; AggregateCatalog(assemblyCatalog);   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           CompositionContainer container =  &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; CompositionContainer(aggCatalog);               &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;           &lt;strong&gt;container.ComposeParts(p);&lt;/strong&gt;   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        &lt;strong&gt;aggCatalog.Catalogs.Add(typeCatalog);&lt;/strong&gt;   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            &lt;/span&gt;&lt;span class="keyword"&gt;foreach&lt;/span&gt;&lt;span&gt; (var logger &lt;/span&gt;&lt;span class="keyword"&gt;in&lt;/span&gt;&lt;span&gt; p.Loggers)   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            {   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;               logger.Log(&lt;/span&gt;&lt;span class="string"&gt;"Hello"&lt;/span&gt;&lt;span&gt;);   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            }   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        &lt;strong&gt;aggCatalog.Catalogs.Remove(typeCatalog);&lt;/strong&gt;   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            &lt;/span&gt;&lt;span class="keyword"&gt;foreach&lt;/span&gt;&lt;span&gt; (var logger &lt;/span&gt;&lt;span class="keyword"&gt;in&lt;/span&gt;&lt;span&gt; p.Loggers)   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            {   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                logger.Log(&lt;/span&gt;&lt;span class="string"&gt;"Hello"&lt;/span&gt;&lt;span&gt;);   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            }              &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    }   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;In the above example, recomposition occurs thrice. Once for the initial composition: &lt;i&gt;container.ComposeParts(p);&lt;/i&gt; and then once each for the calls to &lt;i&gt;Catalogs.Add&lt;/i&gt;     and &lt;i&gt;Catalogs.Remove&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Export Providers&lt;/b&gt;&lt;br /&gt;
Up until now we have used catalogs to initialize the &lt;i&gt;CompositionContainer&lt;/i&gt;.We can also use one or more Export Providers to initialize the container. The difference is that by providing  one or more export providers, MEF will search for exports matching an import in the order in  which the exports providers are set on the &lt;i&gt;CompositionContainer&lt;/i&gt;. This helps in situations where more than one catalog has part definitions that could satisfy an Import. Let's change the code above to illustrate this&lt;br /&gt;
 &lt;/p&gt;
&lt;div class="dp-highlighter" id="DIV7"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt;[Export(&lt;/span&gt;&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(MEF101.Interfaces.ILogger))]   &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; DebugLogger : MEF101.Interfaces.ILogger   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    {   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Name   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        {   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="string"&gt;"Debug Logger"&lt;/span&gt;&lt;span&gt;; }   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        }   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        [Import]   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; MEF101.Interfaces.ITextFormatter Formatter   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        {   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;;   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            &lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;;   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        }   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Log(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; str)   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        {   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            Debug.Write(str);   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        }   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    }   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;       &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; Program    &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    {   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;         [Import(AllowRecomposition=&lt;/span&gt;&lt;span class="keyword"&gt;true&lt;/span&gt;&lt;span&gt;)]   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; MEF101.Interfaces.ILogger Logger { &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;; }   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        &lt;/span&gt;&lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Main(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;[] args)   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        {   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            Program p = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Program();               &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            ComposablePartCatalog typeCatalog = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; TypeCatalog(&lt;/span&gt;&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(DebugLogger));   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            ComposablePartCatalog assemblyCatalog = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; AssemblyCatalog(Assembly.LoadFile(   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                                              Path.Combine(Directory.GetCurrentDirectory(),   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                                              &lt;/span&gt;&lt;span class="string"&gt;"MEF101.Implementations.dll"&lt;/span&gt;&lt;span&gt;)));   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            AggregateCatalog aggCatalog = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; AggregateCatalog(typeCatalog,assemblyCatalog);   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            CompositionContainer container =  &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; CompositionContainer(aggCatalog);               &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            container.ComposeParts(p);             &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        }         &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
The call to &lt;i&gt;ComposeParts&lt;/i&gt; causes the following error. &lt;br /&gt;
&lt;i&gt;More than one export was found that matches the constraint &lt;/i&gt;. The reason for this is because there are 2 parts (ConsoleLogger and DebugLogger) that are exported  as &lt;i&gt;ILogger&lt;/i&gt; and the &lt;i&gt;Program&lt;/i&gt; has a single import for a logger instead of a collection of loggers. In this case MEF does not know which export to use for satisfying the import and hence  the exception.&lt;br /&gt;
By using ExportProviders you can control the resolution order for satisying imports.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="dp-highlighter" id="DIV8"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt;[Export(&lt;/span&gt;&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(MEF101.Interfaces.ILogger))]   &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; DebugLogger : MEF101.Interfaces.ILogger   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;{   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;       &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Name   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;       {   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="string"&gt;"Debug Logger"&lt;/span&gt;&lt;span&gt;; }   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;       }   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;       [Import]   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;       &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; MEF101.Interfaces.ITextFormatter Formatter   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;       {   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;;   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;           &lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;;   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;       }   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;       &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Log(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; str)   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;       {   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           Debug.Write(str);   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;       }   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;   }   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; Program   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;{   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;     [Import(AllowRecomposition=&lt;/span&gt;&lt;span class="keyword"&gt;true&lt;/span&gt;&lt;span&gt;)]   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; MEF101.Interfaces.ILogger Logger { &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;; }   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;          &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Main(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;[] args)   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    {   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        Program p = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Program();               &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        ComposablePartCatalog typeCatalog = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; TypeCatalog(&lt;/span&gt;&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(DebugLogger));   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        ComposablePartCatalog assemblyCatalog = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; AssemblyCatalog(Assembly.LoadFile(   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                                          Path.Combine(Directory.GetCurrentDirectory(),   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                                          &lt;/span&gt;&lt;span class="string"&gt;"MEF101.Implementations.dll"&lt;/span&gt;&lt;span&gt;)));   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           CatalogExportProvider assemblyProvider = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; CatalogExportProvider(assemblyCatalog);   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;           CatalogExportProvider typeProvider = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; CatalogExportProvider(typeCatalog);   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           AggregateExportProvider aggProvider = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; AggregateExportProvider(   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;               &lt;strong&gt;assemblyProvider&lt;/strong&gt;, typeProvider);               &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           CompositionContainer container = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; CompositionContainer(aggProvider);   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;           typeProvider.SourceProvider = container;   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           assemblyProvider.SourceProvider = container;   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        container.ComposeParts(p);   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        p.Logger.Log(&lt;/span&gt;&lt;span class="string"&gt;"Hello"&lt;/span&gt;&lt;span&gt;);   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;       }          &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;   }  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;br /&gt;
Since the &lt;i&gt;AggregateExportProvider&lt;/i&gt; contains the assemblyProvider first followed by  typeProvider, the call to ComposeParts checks the assemblyProvider(and by extension the  assemblyCatalog) first and notices that it can satisfy the import defined on &lt;i&gt;Program&lt;/i&gt;, stops there and ends up using the ConsoleLogger. If no export was defined in the assemblyProvider then MEF would  continue looking into the typeProvider for satisfying the import. Vice-versa, if the order was reversed and  typeProvider was set before assemblyProvider then &lt;i&gt;DebugLogger&lt;/i&gt; would have been used instead. You can also buid your own export providers by deriving from &lt;i&gt;ExportProvider&lt;/i&gt;. This wraps up the coverage of MEF.&lt;/div&gt; &lt;img src="http://geekswithblogs.net/abhijeetp/aggbug/147497.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Abhijeet Patel</dc:creator>
            <guid>http://geekswithblogs.net/abhijeetp/archive/2011/10/30/mef-101---part-2.aspx</guid>
            <pubDate>Sun, 30 Oct 2011 22:27:26 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/abhijeetp/comments/147497.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/abhijeetp/archive/2011/10/30/mef-101---part-2.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/abhijeetp/comments/commentRss/147497.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/abhijeetp/services/trackbacks/147497.aspx</trackback:ping>
        </item>
        <item>
            <title>MEF 101 - Part1</title>
            <category>C#</category>
            <link>http://geekswithblogs.net/abhijeetp/archive/2010/07/03/mef-101---part1.aspx</link>
            <description>    &lt;div class="defaultText"&gt;
        &lt;p&gt;         
          The Managed Extensibility framework or MEF is a framework released as part of .NET 4 and Silverlight that provides a mechanism to dynamically compose an application 
          at runtime out of loosely coupled parts and provides a variety of mechanisms to discovering these parts.
          You can think of this as an implementation of a plugin framework that enables plugging in functionality into a container,
          based on information available at runtime. The most notable example of a MEF client is the Visual Studio 2010 editor 
          which uses MEF to plugin in 3rd party extensions into it's shell proving an easy to use programming model to customize and/or
          extend the behavior of the IDE.
        &lt;/p&gt;
        
        &lt;p&gt;
          To wrap my head around MEF and how to leverage the framework to write extensible apps,I'll be going over some of the key 
          features and APIs in MEF over the next several posts.
          This is the first in the series, and covers the nuts and bolts that MEF is made up of:                       
        &lt;/p&gt;             
        &lt;p&gt;
           &lt;b style="font-size:30px"&gt; Imports and Exports&lt;/b&gt;
        &lt;/p&gt;
        &lt;p&gt;
           Imports and Exports is how MEF discovers and marries components that provide a service with components needing a 
           service. The discovery is based on attributes. &lt;br /&gt;
           A type decorated with the [Export] attribute indicates to MEF that the type is available to any type that needs 
           it's services. Similarly a type needing a service is decorated with the [Import] attribute which conveys to MEF
           that it is in need of some type which provides the service.  
        &lt;/p&gt;         
        &lt;p&gt;
           &lt;i&gt;&lt;b&gt;Using Concrete classes&lt;/b&gt;&lt;/i&gt;
        &lt;/p&gt; 
        &lt;p&gt;    
           To make things a bit concrete, let's say we have a Logger which uses a TextFormatter to format messages before
           they are logged.
        &lt;/p&gt;         
        &lt;p&gt;
           &lt;/p&gt;&lt;div id="hlDiv" class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;/div&gt;&lt;ol class="dp-c" start="1"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt;[Export]  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; TextFormatter  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Format(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; str)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;.Format(&lt;/span&gt;&lt;span class="string"&gt;"Formatted Message:{0}"&lt;/span&gt;&lt;span&gt;, str);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;[Export]  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; ConsoleLogger  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    [Import]  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    TextFormatter Formatter  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Log(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; str)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; formattedString = Formatter.Format(str);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        Console.WriteLine(formattedString);  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;
        
        &lt;p&gt;
           The [Export] attribute on the TextFormatter class indicates that the services of this type are available
           to any type that needs them.
           The [Import] attribute on the ConsoleLogger indicates that it needs a TextFormatter in order for it to log messages.&lt;br /&gt;          
           Similarly the [Export] attribute on the ConsoleLogger indicates that it's services are available to any type
           that needs a ConsoleLogger.
        &lt;/p&gt;
        &lt;p&gt;
           &lt;/p&gt;&lt;div id="Div1" class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;/div&gt;&lt;ol class="dp-c" start="1"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; Program  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    [Import]  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; ConsoleLogger Logger { &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;; }  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Main(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;[] args)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        Program p = &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Program();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        CompositionContainer container =   &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; CompositionContainer(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; AssemblyCatalog(Assembly.GetExecutingAssembly()));  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;          &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        container.ComposeParts(p);  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        p.Logger.Log(&lt;span class="string"&gt;"This is a test"&lt;/span&gt;&lt;span&gt;);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;
        
        &lt;p&gt;
            Nowhere in the code above do you see a &lt;b&gt;new TextFormatter()&lt;/b&gt; or &lt;b&gt;new ConsoleLogger()&lt;/b&gt;. &lt;br /&gt;
            MEF handles the creation for you. In order to do this it needs to discover the types available so that it 
            can satify the imports. It does this using a &lt;i&gt;CompositionContainer&lt;/i&gt; which holds onto catalogs of various types.
            A catalog itself is a container holding types. In the code above we are using one type of catalog called
            &lt;i&gt;AssemblyCatalog&lt;/i&gt; which wraps around a specified assembly and holds onto the types available in the assembly
            which exports services that can be used for satisfying imports(more on catalogs later).
            The main program imports the ConsoleLogger, in order to satisfy this import and have MEF create a ConsoleLogger
            for us we need to tell MEF to go through a composition on the instance of the Program so that it can satify it's
            imports. This is achieved via the call to container.Composeparts(p). At the end of this step MEF has
            inspected the current assembly, discovered that TextFormatter exports it's services which are needed in turn 
            by the ConsoleLogger and injected an instance of the TextFormatter into the ConsoleLogger. &lt;br /&gt;
            Furthermore, it then creates an instance of the ConsolLogger(since it also is an [Export]) and has injected
            an intance of the ConsoleLogger into the intance of the main program we created.
        &lt;/p&gt;
        &lt;p&gt;
            You might say "Why can't I just use &lt;b&gt;new...&lt;/b&gt;?" which is a valid question, considering that everything
            is currently in one code file/assembly, this will become clearer as we progress further along where not all
            types are available in the same assembly and there is no static dependency between assemblies(via add ref).
        &lt;/p&gt;    
        &lt;p&gt;
           &lt;i&gt;&lt;b&gt;Injecting dependencies via Constructor Injection&lt;/b&gt;&lt;/i&gt;
        &lt;/p&gt;    
        &lt;p&gt;
           Imports can also be specified on constructors so that dependencies can be auto injected into a type.
           This is specified by using the &lt;i&gt;[ImportingConstructor]&lt;/i&gt; attribute on the constructor of the type into 
           which the dependency needs to be injected.
           &lt;/p&gt;&lt;p&gt;
           &lt;/p&gt;&lt;div id="Div2" class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;/div&gt;&lt;ol class="dp-c" start="1"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt;[Export]  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;   &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; TextFormatter  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;   {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;       &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Format(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; str)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;       {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;           &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;.Format(&lt;/span&gt;&lt;span class="string"&gt;"Formatted Message:{0}"&lt;/span&gt;&lt;span&gt;, str);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;       }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;   }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;   [Export]  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;   &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; ConsoleLogger  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;   {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;       TextFormatter _formatter;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;       [ImportingConstructor]  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;       &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; ConsoleLogger(TextFormatter formatter)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;       {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;           _formatter = formatter;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;       }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;       &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Log(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; str)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;       {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;           &lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; formattedString = _formatter.Format(str);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;           Console.WriteLine(formattedString);  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;       }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;   }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;   &lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; Program  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;   {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;       [Import]  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;       &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; ConsoleLogger Logger { &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;; }  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;       &lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Main(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;[] args)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;       {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;           Program p = &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Program();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;           CompositionContainer container =   &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;               &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; CompositionContainer(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; AssemblyCatalog(Assembly.GetExecutingAssembly()));  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;             &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;           container.ComposeParts(p);  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;           p.Logger.Log(&lt;span class="string"&gt;"This is a test"&lt;/span&gt;&lt;span&gt;);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;       }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;   }  &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;
           
        
        &lt;p&gt;
            In the above code,the TextFormatter is specified as a constructor parameter to the ConsoleLogger.
            the [ImportingConstructor] attribute indicates to MEF that the TextFormatter needs to be injected into the 
            ConsoleLogger.&lt;br /&gt; As before, the ConsoleLogger has an [Export] attribute and is imported into the main
            Program as an Import. When the Program is composed, MEF finds the TextFormatter in the AssemblyCatalog
            (since it's in the current assembly) and uses that to satisfy the import for the ConsoleLogger's constructor.            
        &lt;/p&gt;
        &lt;p&gt;&lt;i&gt;&lt;b&gt;Exporting types from a Factory class&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
        &lt;p&gt;
            In the previous examples we've specified the [Export] attribute on the type 
            itself such as on the TextFormatter and ConsoleLogger classes, which in turn 
            causes MEF to instantiate these types for satisfying imports. Instead, if we 
            wanted to have a factory class in charge of creating instances of a type so that 
            you have more control, and specify these types as the ones to use for satisfying 
            an import, we can do something like so:
        &lt;/p&gt;
        &lt;p&gt;
        &lt;/p&gt;&lt;div id="Div3" class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;/div&gt;&lt;ol class="dp-c" start="1"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; FormatterFactory  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;   {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;       [Export]  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;       &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; TextFormatter Formatter  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;       {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;           &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;           {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;               &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; TextFormatter();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;           }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;       }        &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;   }  &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;
        
        &lt;p&gt;
        The Formatter property of the FormatterFactory provides a valid export to MEF. If another type needs to Import
        a TextFormatter, MEF is prepared to instantiate the FormatterFactory and invoke the "Formatter" property
        in order to satisy the import.
        &lt;/p&gt;
        &lt;p&gt;
        &lt;/p&gt;&lt;div id="Div4" class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;/div&gt;&lt;ol class="dp-c" start="1"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; TextFormatter   &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Format(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; str)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;.Format(&lt;/span&gt;&lt;span class="string"&gt;"Formatted Message:{0}"&lt;/span&gt;&lt;span&gt;, str);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;[Export]  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; ConsoleLogger  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    [Import]  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    TextFormatter Formatter  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    }               &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;     &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Log(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; str)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;     &lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; formattedString = Formatter.Format(str);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;     Console.WriteLine(formattedString);                                &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; Program  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    [Import]  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; ConsoleLogger Logger { &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;; }  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Main(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;[] args)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        Program p = &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Program();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        CompositionContainer container =   &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; CompositionContainer(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; AssemblyCatalog(Assembly.GetExecutingAssembly()));              &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        container.ComposeParts(p);  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        p.Logger.Log(&lt;span class="string"&gt;"This is a test"&lt;/span&gt;&lt;span&gt;);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;
        
        &lt;p&gt;
            Notice that the [Export] atribute is no longer present on the TextFormatter, and the import in ConsoleLogger
            is satisfied by the FormatterFactory.
        &lt;/p&gt;
        &lt;p&gt;
            In addition to exporting a type from a property we can also have function exports. i.e the [Export] attribute
            is tagged onto a method&lt;br /&gt;
            &lt;/p&gt;&lt;div id="Div5" class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;/div&gt;&lt;ol class="dp-c" start="1"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; FormatterFactory  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        [Export]  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; TextFormatter Formatter  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;                &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; TextFormatter();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        [Export]  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; TextFormatter GetTextFormatter()  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; TextFormatter();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;         &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        [Export]  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; WriteFormattedOutput(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; str, Stream stream)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            System.Text.UTF8Encoding encoding = &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; System.Text.UTF8Encoding();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            var bytes = encoding.GetBytes(str);  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            stream.Write(bytes,0,bytes.Length);  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;
        
        &lt;p&gt;
            This enables some interesting scenarios for import, such as lazy evaulation.The function export can be 
            imported into a type by specifying a delegate type that matches the function signature, The signatures 
            of &lt;i&gt;GetTextFormatter()&lt;/i&gt; and &lt;i&gt;WriteFormattedOutput(string str, Stream stream)&lt;/i&gt; match the delegates
            &lt;i&gt;Func&amp;lt;TextFormatter&amp;gt;&lt;/i&gt; and &lt;i&gt;Action&amp;lt;string, Stream&amp;gt;&lt;/i&gt; respectively.
            We can use these delegates to import these exports into the ConsoleLogger.
        &lt;/p&gt;
        &lt;p&gt;
        &lt;/p&gt;&lt;div id="Div6" class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;/div&gt;&lt;ol class="dp-c" start="1"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; TextFormatter   &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Format(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; str)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;.Format(&lt;/span&gt;&lt;span class="string"&gt;"Formatted Message:{0}"&lt;/span&gt;&lt;span&gt;, str);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;[Export]  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; ConsoleLogger  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    [Import]  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    TextFormatter Formatter  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    [Import]  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; Func&amp;lt;TextFormatter&amp;gt; FormatterFunc  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    }         &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    [Import]  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; Action&amp;lt;&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;, Stream&amp;gt; FormatterAction  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Log(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; str)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; formattedString = Formatter.Format(str);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        Console.WriteLine(formattedString);                     &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        formattedString = FormatterFunc().Format(str);  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        FormatterAction(str, Console.OpenStandardOutput());  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        Console.WriteLine(formattedString);  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; Program  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    [Import]  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; ConsoleLogger Logger { &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;; }  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Main(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;[] args)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        Program p = &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Program();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        CompositionContainer container =   &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; CompositionContainer(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; AssemblyCatalog(Assembly.GetExecutingAssembly()));              &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        container.ComposeParts(p);  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        p.Logger.Log(&lt;span class="string"&gt;"This is a test"&lt;/span&gt;&lt;span&gt;);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;
        
        &lt;p&gt;
            Notice the following 2 lines in the Log method &lt;br /&gt;
            &lt;i&gt;formattedString = FormatterFunc().Format(str);&lt;/i&gt;&lt;br /&gt;
            &lt;i&gt;FormatterAction(str, Console.OpenStandardOutput());&lt;/i&gt;&lt;br /&gt;
            &lt;i&gt;FormatterFunc()&lt;/i&gt; invokes the GetTextFormatter() of the Export which gives us a TextFormatter on which 
            we then invoke the Format method.&lt;br /&gt;
            &lt;i&gt;FormatterAction(str, Console.OpenStandardOutput())&lt;/i&gt; invokes the WriteFormattedOutput method we
            exported passing in a string and the standard console stream. &lt;br /&gt;
            This is immensely useful when you don't necessarily want MEF to materialize a value up front but rather
            provide a handle to a method which on invocation yields a value, but there are other ways to be lazy.
        &lt;/p&gt;
        &lt;p&gt;&lt;i&gt;&lt;b&gt;Using Interfaces instead of concrete classes&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
        &lt;p&gt;
           This far we've been using concrete classes for all exports and imports, i.e we've used ConsoleLogger and
           TextFormatter. This limits us to working only with these types. To promote loose coupling to any 
           type, MEF also supports importing and exporting via interfaces.
           We can extract out the following interfaces from the ConsoleLogger and TextFormatter&lt;br /&gt;
        &lt;/p&gt;
        &lt;p&gt;
        &lt;/p&gt;&lt;div id="Div8" class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;/div&gt;&lt;ol class="dp-c" start="1"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;interface&lt;/span&gt;&lt;span&gt; ITextFormatter  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Name { &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;;}  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Format(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; str);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;interface&lt;/span&gt;&lt;span&gt; ILogger  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Name { &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;;}  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    ITextFormatter Formatter {  &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;;}  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Log(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; str);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;
        
        &lt;p&gt;
        and have both classes implement the respective interface
        &lt;/p&gt;
        &lt;p&gt;
        &lt;/p&gt;&lt;div id="Div9" class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;/div&gt;&lt;ol class="dp-c" start="1"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt;[Export(&lt;/span&gt;&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(ITextFormatter))]  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; TextFormatter : ITextFormatter  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Name  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="string"&gt;"Text Formatter"&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Format(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; str)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;.Format(&lt;/span&gt;&lt;span class="string"&gt;"Formatted Message:{0}"&lt;/span&gt;&lt;span&gt;, str);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;[Export(&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(ILogger))]  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; ConsoleLogger : ILogger  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    [Import]  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; ITextFormatter Formatter  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Log(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; str)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; formattedString = Formatter.Format(str);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        Console.WriteLine(formattedString);  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;   &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Name  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="string"&gt;"Console Logger"&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        }              &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;
        
        &lt;p&gt;
           Notice that the Export attributes now export the respective interface types
           and not the concrete types anymore and the Import attributes are applied on properties of 
           interface types
        &lt;/p&gt;
        &lt;p&gt;
        &lt;/p&gt;&lt;div id="Div10" class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;/div&gt;&lt;ol class="dp-c" start="1"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; Program  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    [Import]  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; ILogger Logger { &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;; }  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Main(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;[] args)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        Program p = &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Program();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        CompositionContainer container =   &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; CompositionContainer(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; AssemblyCatalog(Assembly.GetExecutingAssembly()));  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;          &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        container.ComposeParts(p);  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        p.Logger.Log(&lt;span class="string"&gt;"This is a test"&lt;/span&gt;&lt;span&gt;);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;br /&gt;
        The main program now just works since MEF resolves the import by instantiating the concrete type on which the
        Export attribute is defined, types it to the specified interface type and uses the interface type to satisfy
        imports.
        

        &lt;p&gt;&lt;i&gt;&lt;b&gt;Lazy Imports&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
        &lt;p&gt;
           It's great that MEF instantiates and injects types to satisfy imports but there are times when you just don't
           need an import to be satisfied until the point in time at which you need the imported type.
           The default behavior with the Import attribute is that when a part is composed, imports are satisified 
           and MEF has already created an instance of the type and injected them into your type. Based on the dynamics of 
           how your type is used, the satisifed import may never get used, this means that you paid for something that 
           you did not need but paid for it in anticipation of it's use. It could very well be that the export
           might be a type which consumes expensive resources, or needs to make a cross domain/ cross process call
           as part of it's construction, or pull data from a database to initialize itself to a usable state, which
           means that we paid a "lot" for anticipation. To alleviate this, MEF leverages the &lt;a href="http://msdn.microsoft.com/en-us/library/dd642331.aspx"&gt;Lazy&amp;lt;T&amp;gt; &lt;/a&gt; type which is 
           new in .NET 4.0 to allow for lazy instantiaion of types. Using Lazy&amp;lt;T&amp;gt; for an import instead of T,  
           causes MEF to delay the instantiation of the type T until the &lt;a href="http://msdn.microsoft.com/en-us/library/dd642177.aspx"&gt;Value&lt;/a&gt; property 
           of the Lazy&amp;lt;T&amp;gt; is accessed.
        &lt;/p&gt;
        &lt;p&gt;
            If we replace the Import in the main Program to use Lazy&amp;lt;ILogger&amp;gt; instead of ILogger, we effectively delay 
            the creation of the ConsoleLogger until the Value property is accessed for the first time.
            &lt;/p&gt;&lt;div id="Div7" class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;/div&gt;&lt;ol class="dp-c" start="1"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt;[Export(&lt;/span&gt;&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(ILogger))]  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; ConsoleLogger : ILogger  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    [Import]  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; ITextFormatter Formatter  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Log(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; str)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; formattedString = Formatter.Format(str);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        Console.WriteLine(formattedString);  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;   &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Name  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="string"&gt;"Console Logger"&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        }              &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; Program  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;      &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    [Import]  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; Lazy&amp;lt;ILogger&amp;gt; Logger { &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;; }  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Main(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;[] args)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        Program p = &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Program();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        CompositionContainer container =   &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; CompositionContainer(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; AssemblyCatalog(Assembly.GetExecutingAssembly()));  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;          &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        container.ComposeParts(p);  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;b&gt;p.Logger.Value.Log(&lt;span class="string"&gt;"This is a test"&lt;/span&gt;&lt;/b&gt;&lt;span&gt;);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;br /&gt;
            If you were to add a watch to the p.Logger.IsValueCreated, you would observe that it returns false.Once the 
            Value property is accessed, IsValueCreated would return true.
        

        &lt;p&gt;&lt;i&gt;&lt;b&gt;Part Creation Policy&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
        &lt;p&gt;
        By default when MEF satisfies imports for a type(note the pluralization), it shares the instance that it
        creates from the export across all imports(i.e. it creates a singleton) and this is the default behvior.
        You can change this behavior on the importing side or the exporting side.
        &lt;/p&gt;
        &lt;p&gt;
        On the exporting side you can specify a &lt;i&gt;PartCreationPolicy&lt;/i&gt; attribute on the type being exported
        indicating that a new instance should be created for satisying an import, by specifying a value of &lt;i&gt;CreationPolicy.NonShared&lt;/i&gt;
        (the default that MEF uses is &lt;i&gt;CreationPolicy.Shared)&lt;/i&gt;
        &lt;/p&gt;
        &lt;p&gt;
        &lt;/p&gt;&lt;div id="Div11" class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;/div&gt;&lt;ol class="dp-c" start="1"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt;[Export(&lt;/span&gt;&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(ILogger))]      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;[PartCreationPolicy(CreationPolicy.NonShared)]  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; ConsoleLogger : ILogger  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    [Import]  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; ITextFormatter Formatter  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Log(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; str)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; formattedString = Formatter.Format(str);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        Console.WriteLine(formattedString);  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;   &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Name  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="string"&gt;"Console Logger"&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        }              &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;
        &lt;br /&gt;
        Now, whenever MEF satisfies an import it will create a new instance of the ConsoleLogger instead of a singleton.&lt;br /&gt;
        You can also specify a value of &lt;i&gt;CreationPolicy.Any&lt;/i&gt; which effectively means that the importer decides 
        the creation policy.&lt;br /&gt;
        This is accomplished by using an overload of the Import attribute which accepts a &lt;i&gt;RequiredCreationPolicy&lt;/i&gt;
        enum,which can have values of &lt;i&gt;Shared&lt;/i&gt;,&lt;i&gt;NonShared&lt;/i&gt; or &lt;i&gt;Any&lt;/i&gt;.
        This is best illustrated with an example:&lt;br /&gt;
        &lt;p&gt;
         &lt;/p&gt;&lt;div id="Div12" class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;/div&gt;&lt;ol class="dp-c" start="1"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt;[Export(&lt;/span&gt;&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(ILogger))]  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;[PartCreationPolicy(CreationPolicy.Any)]  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; ConsoleLogger : ILogger  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    [Import]  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; ITextFormatter Formatter  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Log(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; str)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; formattedString = Formatter.Format(str);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        Console.WriteLine(formattedString);  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;   &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Name  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="string"&gt;"Console Logger"&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        }              &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; Program  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    [Import]  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; ILogger Logger1 { &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;; }        &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    [Import(RequiredCreationPolicy=CreationPolicy.Shared)]          &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; ILogger Logger2 { &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;; }  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;     &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    [Import(RequiredCreationPolicy=CreationPolicy.Shared)]  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; ILogger Logger3 { &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;; }  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    [Import(RequiredCreationPolicy=CreationPolicy.NonShared)]  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; ILogger Logger4 { &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;; }  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Main(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;[] args)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        Program p = &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Program();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        CompositionContainer container =   &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; CompositionContainer(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; AssemblyCatalog(Assembly.GetExecutingAssembly()));  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;          &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        container.ComposeParts(p);              &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;        
        &lt;p&gt;
         Since Logger2 and Logger3 have a &lt;i&gt;CreationPolicy&lt;/i&gt; of &lt;i&gt;CreationPolicy.Shared&lt;/i&gt;, they will share an 
         instance of a ConsoleLogger that MEF creates, Logger1 will also share this instance since the default behavior is
         &lt;i&gt;Shared&lt;/i&gt; if nothing is specified. &lt;br /&gt;
         Logger4 on the other hand uses a &lt;i&gt;CreationPolicy&lt;/i&gt; of &lt;i&gt;CreationPolicy.NonShared&lt;/i&gt;, which will cause
         MEF to create a new instance of the ConsolLogger4 for satisfying the import for Logger4. This instance is 
         not shared with any other import.
        &lt;/p&gt;
        &lt;p&gt;&lt;i&gt;&lt;b&gt;Default Values&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
        &lt;p&gt;
        There may be times where there is no available export to satisfy an import and it might be feasible 
        to settle with a default value for an import (null for a reference type and the default value for a value
        type).&lt;br /&gt;
        If a Formatter is not available, the logger can still perform logging like so:
        &lt;/p&gt;
        &lt;div id="Div13" class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;/div&gt;&lt;ol class="dp-c" start="1"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;struct&lt;/span&gt;&lt;span&gt; LogInfo  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; _loggedBy ;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; LoggedBy  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; _loggedBy; }  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;              &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; LogInfo(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; loggedBy)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            _loggedBy = loggedBy;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        }         &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    [Export(&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(ILogger))]  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; ConsoleLogger : ILogger  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        [Import(AllowDefault=&lt;span class="keyword"&gt;true&lt;/span&gt;&lt;span&gt;)]  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; ITextFormatter Formatter  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            &lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        [Import(AllowDefault = &lt;span class="keyword"&gt;true&lt;/span&gt;&lt;span&gt;)]  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; LogInfo Info  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            &lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        }         &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Log(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; str)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            &lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt; (Formatter != &lt;/span&gt;&lt;span class="keyword"&gt;null&lt;/span&gt;&lt;span&gt;)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;                &lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; formattedString = Formatter.Format(!&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;.IsNullOrEmpty(Info.LoggedBy)?  str + &lt;/span&gt;&lt;span class="string"&gt;" logged by"&lt;/span&gt;&lt;span&gt; + Info.LoggedBy: str);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;                Console.WriteLine(formattedString);  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;       &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Name  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;                &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="string"&gt;"Console Logger"&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            }              &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        }         &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; Program  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        [Import]  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; ILogger Logger { &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;; }              &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Main(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;[] args)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            Program p = &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Program();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            CompositionContainer container =   &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;                &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; CompositionContainer(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; AssemblyCatalog(Assembly.GetExecutingAssembly()));              &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            container.ComposeParts(p);              &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;        
        Note that the [Import]  ttribute sets "AllowDefault" to true which causes the Formatter property to be set to null
        since there are no types which export IFormatter and hence the Formatter is set to null.&lt;br /&gt;
        Also note that for kicks we have included a struct (LogInfo) and the ConsoleLogger imports this struct.
        Since this struct is not explicitly exported and "AllowDefault = true", MEF creates a default instance of the struct and
        sets the "Info" property to this default instance.  
        
        &lt;p&gt;&lt;i&gt;&lt;b&gt;Named Exports&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;   
        Since multiple types can export the same contract you can provide a name for each export so that you can uniquely
        identify an export on the importing side like so:&lt;br /&gt;
        &lt;div id="Div17" class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;/div&gt;&lt;ol class="dp-c" start="1"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt;[Export(&lt;/span&gt;&lt;span class="string"&gt;"Console Loger"&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(ILogger))]  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; ConsoleLogger : ILogger  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    [Import]  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; ITextFormatter Formatter  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Log(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; str)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; formattedString = Formatter.Format(str);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        Console.WriteLine(formattedString);  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;   &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Name  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="string"&gt;"Console Logger"&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        }              &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    }         &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;[Export(&lt;span class="string"&gt;"Debug Logger"&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(ILogger))]  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; DebugLogger : ILogger  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    [Import(AllowDefault = &lt;span class="keyword"&gt;true&lt;/span&gt;&lt;span&gt;)]  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; ITextFormatter Formatter  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Log(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; str)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; formattedString = Formatter.Format(str);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        Debug.WriteLine(formattedString);              &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Name  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="string"&gt;"Debug Logger"&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; Program  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    [Import(&lt;span class="string"&gt;"Debug Logger"&lt;/span&gt;&lt;span&gt;)]  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; ILogger Logger { &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;; }              &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Main(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;[] args)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        Program p = &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Program();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        CompositionContainer container =   &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; CompositionContainer(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; AssemblyCatalog(Assembly.GetExecutingAssembly()));              &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        container.ComposeParts(p);             &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        p.Logger.Log(DateTime.UtcNow.ToString());             &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;
        The main drawback here is that we are now rely on strings for identifying a particular export. There are better 
        ways to achieve the same end effect using attributes as we'll soon see. 
        &lt;p&gt;&lt;i&gt;&lt;b&gt;Import Many  &lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
        &lt;p&gt;
        The main advantage of MEF is building wholes out of parts and building functionality by assembling parts. 
        Multiple types can implement the same contract and export it. You are not limited to importing a single implementation
        of an export,multiple implementations of a contract can be imported using &lt;i&gt;[ImportMany]&lt;/i&gt;
        You could have different types of loggers,a ConsoleLogger to log to the console, a DebugLogger to log to the debug output 
        and so on. These loggers can all export the ILogger interface. A client application can &lt;i&gt;import many&lt;/i&gt; such ILoggers 
        which causes MEF to look for all matching available exports in the configured catalogs to satisfy the import. 
        This is specified using an &lt;i&gt;ImportMany&lt;/i&gt; attribute an  &lt;i&gt;IEnumerable&amp;lt;ILogger&amp;gt;&lt;/i&gt; like so:&lt;br /&gt;
        &lt;/p&gt;&lt;div id="Div14" class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;/div&gt;&lt;ol class="dp-c" start="1"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt;[Export(&lt;/span&gt;&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(ITextFormatter))]  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; TextFormatter : ITextFormatter  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Name  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;                &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="string"&gt;"Text Formatter"&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Format(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; str)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;.Format(&lt;/span&gt;&lt;span class="string"&gt;"Formatted Message:{0}"&lt;/span&gt;&lt;span&gt;, str);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    [Export(&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(ILogger))]  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; ConsoleLogger : ILogger  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        [Import]  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; ITextFormatter Formatter  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            &lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Log(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; str)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            &lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; formattedString = Formatter.Format(str);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            Console.WriteLine(formattedString);  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;       &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Name  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;                &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="string"&gt;"Console Logger"&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            }              &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        }         &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    [Export(&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(ILogger))]  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; DebugLogger : ILogger  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        [Import(AllowDefault = &lt;span class="keyword"&gt;true&lt;/span&gt;&lt;span&gt;)]  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; ITextFormatter Formatter  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            &lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Log(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; str)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            &lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; formattedString = Formatter.Format(str);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            Debug.WriteLine(formattedString);              &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Name  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;                &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="string"&gt;"Debug Logger"&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; Program  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        [ImportMany]  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; IEnumerable&amp;lt;ILogger&amp;gt; Loggers { &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;; }              &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Main(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;[] args)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            Program p = &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Program();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            CompositionContainer container =   &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;                &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; CompositionContainer(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; AssemblyCatalog(Assembly.GetExecutingAssembly()));              &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            container.ComposeParts(p);  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            &lt;span class="keyword"&gt;foreach&lt;/span&gt;&lt;span&gt; (var logger &lt;/span&gt;&lt;span class="keyword"&gt;in&lt;/span&gt;&lt;span&gt; p.Loggers)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;                logger.Log(DateTime.UtcNow.ToString());  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;
                    

         &lt;p&gt;&lt;i&gt;&lt;b&gt;Exporting Metadata&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
         &lt;p&gt;
         So now you've imported multiple exports,great!, you can use these exports as they are, but what if you needed
         to get a handle to a particular export you've imported. This is where metadata comes in. Each export can be
         annotated with export metadata which can be used to query the export.The metadata is made available on the 
         import side as a &lt;i&gt;Dictionary&amp;lt;string,object&amp;gt;&lt;/i&gt; which can be queried for the attribute name which is 
         the dictionary key, and the value can be checked for the value of interest.&lt;br /&gt;
         We can mark the ConsoleLogger as the default logger to use by specifying an &lt;i&gt;ExportMetatdata&lt;/i&gt; attribute 
         with key name "IsDefault" and value true.&lt;br /&gt;
         &lt;/p&gt;&lt;div id="Div15" class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;/div&gt;&lt;ol class="dp-c" start="1"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt;[Export(&lt;/span&gt;&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(ITextFormatter))]  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; TextFormatter : ITextFormatter  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Name  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;                &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="string"&gt;"Text Formatter"&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Format(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; str)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;.Format(&lt;/span&gt;&lt;span class="string"&gt;"Formatted Message:{0}"&lt;/span&gt;&lt;span&gt;, str);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    [Export(&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(ILogger))]  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    [ExportMetadata(&lt;span class="string"&gt;"IsDefault"&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class="keyword"&gt;true&lt;/span&gt;&lt;span&gt;)]  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; ConsoleLogger : ILogger  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        [Import]  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; ITextFormatter Formatter  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            &lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Log(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; str)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            &lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; formattedString = Formatter.Format(str);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            Console.WriteLine(formattedString);  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;       &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Name  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;                &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="string"&gt;"Console Logger"&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            }              &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        }         &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    [Export(&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(ILogger))]  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    [ExportMetadata(&lt;span class="string"&gt;"IsDefault"&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class="keyword"&gt;false&lt;/span&gt;&lt;span&gt;)]  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; DebugLogger : ILogger  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        [Import(AllowDefault = &lt;span class="keyword"&gt;true&lt;/span&gt;&lt;span&gt;)]  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; ITextFormatter Formatter  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            &lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Log(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; str)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            &lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; formattedString = Formatter.Format(str);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            Debug.WriteLine(formattedString);              &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Name  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;                &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="string"&gt;"Debug Logger"&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;
         &lt;br /&gt;
         The client can query for the default logger like so:&lt;br /&gt;
         &lt;div id="Div16" class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;/div&gt;&lt;ol class="dp-c" start="1"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; Program  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        [ImportMany]  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; IEnumerable&amp;lt;Lazy&amp;lt;ILogger,Dictionary&amp;lt;&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class="keyword"&gt;object&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt; Loggers { &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;; }  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; LogUsingDefaultLogger(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; message)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            &lt;span class="keyword"&gt;foreach&lt;/span&gt;&lt;span&gt; (var logger &lt;/span&gt;&lt;span class="keyword"&gt;in&lt;/span&gt;&lt;span&gt; Loggers)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;                &lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt; (logger.Metadata.ContainsKey(&lt;/span&gt;&lt;span class="string"&gt;"IsDefault"&lt;/span&gt;&lt;span&gt;))  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;                {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;                    &lt;span class="keyword"&gt;bool&lt;/span&gt;&lt;span&gt; isdefault = (&lt;/span&gt;&lt;span class="keyword"&gt;bool&lt;/span&gt;&lt;span&gt;)logger.Metadata[&lt;/span&gt;&lt;span class="string"&gt;"IsDefault"&lt;/span&gt;&lt;span&gt;];  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;                    &lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt; (isdefault)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;                    {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;                        logger.Value.Log(message);  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;                    }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;                }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Main(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;[] args)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            Program p = &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Program();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            CompositionContainer container =   &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;                &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; CompositionContainer(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; AssemblyCatalog(Assembly.GetExecutingAssembly()));              &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            container.ComposeParts(p);  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            p.LogUsingDefaultLogger(&lt;span class="string"&gt;"test"&lt;/span&gt;&lt;span&gt;);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;br /&gt;
         Note that in order to get to the metadata the Loggers property is of type IEnumerable&amp;lt;Lazy&amp;lt;ILogger,Dictionary&amp;lt;string,object&amp;gt;&amp;gt;&amp;gt;, Lazy&amp;lt;T&amp;gt; exposes a Metadata
         property which allows us to get to our metadata as shown in &lt;i&gt;LogUsingDefaultLogger&lt;/i&gt;
         
         &lt;p&gt;&lt;i&gt;&lt;b&gt;Exporting Metadata the strongly typed way&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
         Working with strings tends to be error prone.Wouldn't it be nicer to export metadata using strong types instead of strings.
         The good news is you can.You can write a custom attribute class derived from &lt;i&gt;ExportAttribute&lt;/i&gt; and includes
         properties in the derived class which you can then use for finding exports matching your filter criteria&lt;br /&gt;
        &lt;div id="Div18" class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;/div&gt;&lt;ol class="dp-c" start="1"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt;[MetadataAttribute]  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;[AttributeUsage(AttributeTargets.Class,AllowMultiple=&lt;span class="keyword"&gt;false&lt;/span&gt;&lt;span&gt;)]  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; LogExportAttribute : ExportAttribute  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; LogExportAttribute() : &lt;/span&gt;&lt;span class="keyword"&gt;base&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(ILogger))  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;bool&lt;/span&gt;&lt;span&gt; IsDefault { &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;; }  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;         &lt;br /&gt;
         You can then decorate the loggers with this attribute and set one as the default&lt;br /&gt;
         &lt;div id="Div19" class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;/div&gt;&lt;ol class="dp-c" start="1"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt;[Export(&lt;/span&gt;&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(ILogger))]  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;[LogExport(IsDefault=&lt;span class="keyword"&gt;true&lt;/span&gt;&lt;span&gt;)]  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; ConsoleLogger : ILogger  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    [Import]  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; ITextFormatter Formatter  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Log(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; str)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; formattedString = Formatter.Format(str);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        Console.WriteLine(formattedString);  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;   &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Name  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="string"&gt;"Console Logger"&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        }              &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    }         &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;[Export(&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(ILogger))]  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;[LogExport(IsDefault=&lt;span class="keyword"&gt;false&lt;/span&gt;&lt;span&gt;)]  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; DebugLogger : ILogger  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    [Import(AllowDefault = &lt;span class="keyword"&gt;true&lt;/span&gt;&lt;span&gt;)]  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; ITextFormatter Formatter  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Log(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; str)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; formattedString = Formatter.Format(str);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        Debug.WriteLine(formattedString);              &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Name  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="string"&gt;"Debug Logger"&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;br /&gt;
         In order to query for the attribute and reach into it's properties we need to also define an interface with 
         properties corresponding  to that of the custom attribute class like so:&lt;br /&gt;
         &lt;div id="Div20" class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;/div&gt;&lt;ol class="dp-c" start="1"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;interface&lt;/span&gt;&lt;span&gt; ILogExportMetdata  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;   {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;       &lt;span class="keyword"&gt;bool&lt;/span&gt;&lt;span&gt; IsDefault { &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;; }  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;   }  &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;br /&gt;
         We can then consume the metadata(strongly typed) like so:&lt;br /&gt;
         &lt;div id="Div21" class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;/div&gt;&lt;ol class="dp-c" start="1"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; Program  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;   {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;       [ImportMany]  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;       &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; IEnumerable&amp;lt;Lazy&amp;lt;ILogger,ILogExportMetdata&amp;gt;&amp;gt; Loggers { &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;; }  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;       &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; LogUsingDefaultLogger(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; message)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;       {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;           &lt;span class="keyword"&gt;foreach&lt;/span&gt;&lt;span&gt; (var logger &lt;/span&gt;&lt;span class="keyword"&gt;in&lt;/span&gt;&lt;span&gt; Loggers)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;           {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;               &lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt; (logger.Metadata.IsDefault)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;               {                      &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;                   logger.Value.Log(message);                      &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;               }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;           }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;       }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;       &lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Main(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;[] args)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;       {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;           Program p = &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Program();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;           CompositionContainer container =   &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;               &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; CompositionContainer(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; AssemblyCatalog(Assembly.GetExecutingAssembly()));              &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;           container.ComposeParts(p);  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;           p.LogUsingDefaultLogger(&lt;span class="string"&gt;"test"&lt;/span&gt;&lt;span&gt;);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;       }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;   }  &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;br /&gt;
         Behind the scenes MEF performs some clever mapping of the attribute's properties to the interface's properties
         so that we can access the metadata in a strongly typed way.&lt;br /&gt;

         This post is getting longer than I anticipated but we've covered the heart of what MEF is about.&lt;br /&gt;
         In part 2 we'll look at Catalogs.
     &lt;/div&gt; &lt;img src="http://geekswithblogs.net/abhijeetp/aggbug/140745.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Abhijeet Patel</dc:creator>
            <guid>http://geekswithblogs.net/abhijeetp/archive/2010/07/03/mef-101---part1.aspx</guid>
            <pubDate>Sat, 03 Jul 2010 16:03:53 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/abhijeetp/comments/140745.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/abhijeetp/archive/2010/07/03/mef-101---part1.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/abhijeetp/comments/commentRss/140745.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/abhijeetp/services/trackbacks/140745.aspx</trackback:ping>
        </item>
        <item>
            <title>A simple Dynamic Proxy</title>
            <category>C#</category>
            <link>http://geekswithblogs.net/abhijeetp/archive/2010/04/04/a-simple-dynamic-proxy.aspx</link>
            <description>&lt;div class="defaultText"&gt;
&lt;p&gt;Frameworks such as EF4 and MOQ do what most developers consider "dark magic". For instance in EF4, when you use a POCO for an entity you can            opt-in to get behaviors such as "lazy-loading" and "change tracking" at runtime merely by ensuring that your type has the following characteristics:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;The class must be public and not sealed.&lt;/li&gt;
    &lt;li&gt;The class must have a public or protected parameter-less constructor.&lt;/li&gt;
    &lt;li&gt;The class must have public or protected properties&lt;/li&gt;
&lt;/ul&gt;
Adhere to this and your type is magically endowed with these behaviors without any additional programming on your part.&lt;br /&gt;
Behind the scenes the framework subclasses your type at runtime and creates a            "dynamic proxy" which has these additional behaviors and when you navigate properties of your POCO, the framework replaces           the POCO type with derived type instances.
&lt;p&gt;The MOQ framework does  simlar magic. Let's say you have a simple interface:&lt;/p&gt;
&lt;div class="dp-highlighter" id="hlDiv"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol start="1" class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;interface&lt;/span&gt;&lt;span&gt; IFoo  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;   {  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;       &lt;span class="keyword"&gt;int&lt;/span&gt;&lt;span&gt; GetNum();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;   }  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;br /&gt;
We can verify that the GetNum() was invoked on a mock like so:
&lt;div class="dp-highlighter" id="Div1"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol start="1" class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt;var mock = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Mock&amp;lt;IFoo&amp;gt;(MockBehavior.Default);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;mock.Setup(f =&amp;gt; f.GetNum());  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;var num = mock.Object.GetNum();  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;mock.Verify(f =&amp;gt; f.GetNum());  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;br /&gt;
Beind the scenes the MOQ framework is generating a dynamic proxy by implementing  &lt;i&gt;IFoo&lt;/i&gt; at runtime. the call to &lt;i&gt;moq.Object&lt;/i&gt; returns          the             dynamic proxy on which we then call "GetNum" and then verify that this method was invoked.
&lt;p&gt;No dark magic at all, just clever programming is what's going on here, just not visible and hence appears magical!&lt;/p&gt;
Let's create a simple dynamic proxy generator which accepts an interface type and dynamically creates a proxy implementing              the interface type specified at runtime.&lt;br /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div class="dp-highlighter" id="Div11"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; DynamicProxyGenerator  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; T GetInstanceFor&amp;lt;T&amp;gt;()  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        Type typeOfT = &lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(T);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        var methodInfos = typeOfT.GetMethods();  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        AssemblyName assName = &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; AssemblyName(&lt;/span&gt;&lt;span class="string"&gt;"testAssembly"&lt;/span&gt;&lt;span&gt;);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        var assBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assName, AssemblyBuilderAccess.RunAndSave);  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        var moduleBuilder = assBuilder.DefineDynamicModule(&lt;span class="string"&gt;"testModule"&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class="string"&gt;"test.dll"&lt;/span&gt;&lt;span&gt;);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        var typeBuilder = moduleBuilder.DefineType(typeOfT.Name + &lt;span class="string"&gt;"Proxy"&lt;/span&gt;&lt;span&gt;, TypeAttributes.Public);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        typeBuilder.AddInterfaceImplementation(typeOfT);  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        var ctorBuilder = typeBuilder.DefineConstructor(  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                  MethodAttributes.Public,  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                  CallingConventions.Standard,  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                  &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Type[] { });  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        var ilGenerator = ctorBuilder.GetILGenerator();  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        ilGenerator.EmitWriteLine(&lt;span class="string"&gt;"Creating Proxy instance"&lt;/span&gt;&lt;span&gt;);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        ilGenerator.Emit(OpCodes.Ret);  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        &lt;span class="keyword"&gt;foreach&lt;/span&gt;&lt;span&gt; (var methodInfo &lt;/span&gt;&lt;span class="keyword"&gt;in&lt;/span&gt;&lt;span&gt; methodInfos)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            var methodBuilder = typeBuilder.DefineMethod(  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                methodInfo.Name,  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                MethodAttributes.Public | MethodAttributes.Virtual,  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                methodInfo.ReturnType,  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                methodInfo.GetParameters().Select(p =&amp;gt; p.GetType()).ToArray()  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                );  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            var methodILGen = methodBuilder.GetILGenerator();               &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            &lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt; (methodInfo.ReturnType == &lt;/span&gt;&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt;))  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            {  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                methodILGen.Emit(OpCodes.Ret);  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            }  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            &lt;span class="keyword"&gt;else&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            {  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                &lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt; (methodInfo.ReturnType.IsValueType || methodInfo.ReturnType.IsEnum)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                {  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                    MethodInfo getMethod = &lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(Activator).GetMethod(/span&amp;gt;&lt;span class="string"&gt;"CreateInstance"&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Type[]{&lt;/span&gt;&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;((Type)});                          &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                    LocalBuilder lb = methodILGen.DeclareLocal(methodInfo.ReturnType);  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                    methodILGen.Emit(OpCodes.Ldtoken, lb.LocalType);  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                    methodILGen.Emit(OpCodes.Call, &lt;span class="keyword"&gt;typeofype).GetMethod(&lt;/span&gt;&lt;span class="string"&gt;"GetTypeFromHandle"&lt;/span&gt;&lt;span&gt;));  ));  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                    methodILGen.Emit(OpCodes.Callvirt, getMethod);  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                    methodILGen.Emit(OpCodes.Unbox_Any, lb.LocalType);  &lt;/span&gt;&lt;/li&gt;
    &lt;span&gt;                                          &lt;/span&gt;
    &lt;li&gt;&lt;span&gt;                                 }  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;                 &lt;span class="keyword"&gt;else&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                {  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                    methodILGen.Emit(OpCodes.Ldnull);  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                }  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                methodILGen.Emit(OpCodes.Ret);  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            }  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            typeBuilder.DefineMethodOverride(methodBuilder, methodInfo);  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        }  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;         &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        Type constructedType = typeBuilder.CreateType();  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        var instance = Activator.CreateInstance(constructedType);  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; (T)instance;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;Dynamic proxies are created by calling into the following main types: &lt;i&gt;AssemblyBuilder&lt;/i&gt;, &lt;i&gt;TypeBuilder&lt;/i&gt;, &lt;i&gt;Modulebuilder&lt;/i&gt; and &lt;i&gt;ILGenerator&lt;/i&gt;.              These types enable dynamically creating an assembly and emitting .NET modules and types in that assembly, all using IL instructions.&lt;br /&gt;
Let's break down the code above a bit and examine it piece by piece&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div class="dp-highlighter" id="Div2"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol start="1" class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           Type typeOfT = &lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(T);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;           var methodInfos = typeOfT.GetMethods();  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           AssemblyName assName = &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; AssemblyName(&lt;/span&gt;&lt;span class="string"&gt;"testAssembly"&lt;/span&gt;&lt;span&gt;);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;           var assBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assName, AssemblyBuilderAccess.RunAndSave);  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           var moduleBuilder = assBuilder.DefineDynamicModule(&lt;span class="string"&gt;"testModule"&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class="string"&gt;"test.dll"&lt;/span&gt;&lt;span&gt;);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;           var typeBuilder = moduleBuilder.DefineType(typeOfT.Name + &lt;span class="string"&gt;"Proxy"&lt;/span&gt;&lt;span&gt;, TypeAttributes.Public);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;br /&gt;
We are instructing the runtime to create an assembly caled "test.dll"and in this assembly we then emit a new module called "testModule".             We then emit a new type definition of name "typeName"Proxy into this new module. This is the definition for the "dynamic proxy" for type T
&lt;p&gt; &lt;/p&gt;
&lt;div class="dp-highlighter" id="Div3"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol start="1" class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            typeBuilder.AddInterfaceImplementation(typeOfT);   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            var ctorBuilder = typeBuilder.DefineConstructor(  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                      MethodAttributes.Public,  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                      CallingConventions.Standard,  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                      &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Type[] { });  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            var ilGenerator = ctorBuilder.GetILGenerator();  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            ilGenerator.EmitWriteLine(&lt;span class="string"&gt;"Creating Proxy instance"&lt;/span&gt;&lt;span&gt;);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            ilGenerator.Emit(OpCodes.Ret);  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;br /&gt;
The newly created type implements type T and defines a default parameterless constructor in which we emit a call to &lt;i&gt;Console.WriteLine&lt;/i&gt;.             This call is not necessary but we do this so that we can see first hand that when the proxy is constructed, when our default constructor is invoked.
&lt;p&gt; &lt;/p&gt;
&lt;div class="dp-highlighter" id="Div4"&gt;
&lt;ol start="1" class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt;var methodBuilder = typeBuilder.DefineMethod(  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                   methodInfo.Name,  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                   MethodAttributes.Public | MethodAttributes.Virtual,  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                   methodInfo.ReturnType,  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                   methodInfo.GetParameters().Select(p =&amp;gt; p.GetType()).ToArray()  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                   );  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;br /&gt;
We then iterate over each method declared on type T and add a method definition of the same name into our "dynamic proxy" definition
&lt;p&gt; &lt;/p&gt;
&lt;div class="dp-highlighter" id="Div5"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol start="1" class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt; (methodInfo.ReturnType == &lt;/span&gt;&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt;))  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    methodILGen.Emit(OpCodes.Ret);  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;br /&gt;
If the return type specified in the method declaration of T is void we simply return.
&lt;p&gt; &lt;/p&gt;
&lt;div class="dp-highlighter" id="Div6"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol start="1" class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt; (methodInfo.ReturnType.IsValueType || methodInfo.ReturnType.IsEnum)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;{                          &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    MethodInfo getMethod = &lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(Activator).GetMethod(&lt;/span&gt;&lt;span class="string"&gt;"CreateInstance"&lt;/span&gt;&lt;span&gt;,  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                                                      &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Type[]{&lt;/span&gt;&lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(Type)});                          &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    LocalBuilder lb = methodILGen.DeclareLocal(methodInfo.ReturnType);                                                &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    methodILGen.Emit(OpCodes.Ldtoken, lb.LocalType);  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    methodILGen.Emit(OpCodes.Call, &lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(Type).GetMethod(&lt;/span&gt;&lt;span class="string"&gt;"GetTypeFromHandle"&lt;/span&gt;&lt;span&gt;));  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    methodILGen.Emit(OpCodes.Callvirt, getMethod);  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    methodILGen.Emit(OpCodes.Unbox_Any, lb.LocalType);  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;br /&gt;
If the return type in the method declaration of T is either a value type or an enum, then we need to create an instance of the value type and return that instance the caller.             In order to accomplish that we need to do the following:&lt;br /&gt;
1) Get a handle to the Activator.CreateInstance method &lt;br /&gt;
2) Declare a local variable which represents the Type of the return type(i.e the type object of the return type) specified on the method declaration of T(obtained from the MethodInfo) and push this Type object onto the evaluation stack. &lt;br /&gt;
In reality a &lt;i&gt;RuntimeTypeHandle&lt;/i&gt; is what is pushed onto the stack.&lt;br /&gt;
3) Invoke the "GetTypeFromHandle" method(a static method in the Type class) passing in the &lt;i&gt;RuntimeTypeHandle&lt;/i&gt; pushed onto the stack previously as an argument, the result of this                 invocation is a Type object (representing the method's return type) which is pushed onto the top of the evaluation stack.&lt;br /&gt;
4) Invoke Activator.CreateInstance passing in the Type object from step 3, the result of this invocation is an instance of the value type boxed as a reference type and pushed onto                 the top of the evaluation stack.&lt;br /&gt;
5) Unbox the result and place it into the local variable of the return type defined in step 2&lt;br /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div class="dp-highlighter" id="Div7"&gt;
&lt;ol start="1" class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt;methodILGen.Emit(OpCodes.Ldnull);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;br /&gt;
If the return type is a reference type then we just load a null onto the evaluation stack
&lt;p&gt; &lt;/p&gt;
&lt;div class="dp-highlighter" id="Div8"&gt;
&lt;ol start="1" class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt;methodILGen.Emit(OpCodes.Ret);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;br /&gt;
Emit a a return statement to return whatever is on top of the evaluation stack(&lt;i&gt;null&lt;/i&gt; or an instance of a value type) back to the caller
&lt;p&gt; &lt;/p&gt;
&lt;div class="dp-highlighter" id="Div9"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol start="1" class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt;Type constructedType = typeBuilder.CreateType();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;var instance = Activator.CreateInstance(constructedType);  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; (T)instance;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;br /&gt;
Now that we have a definition of the "dynamic proxy" implementing all the methods declared on T, we can now create an instance of the proxy type and return that out typed as T.
&lt;p&gt;The caller can now invoke the generator and request a dynamic proxy for any type T.&lt;br /&gt;
In our example when the client invokes GetNum() we get back "0".         Lets add a new method on the interface called &lt;i&gt;DayOfWeek GetDay()&lt;/i&gt;&lt;/p&gt;
&lt;div class="dp-highlighter" id="Div10"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol start="1" class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;interface&lt;/span&gt;&lt;span&gt; IFoo  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;   {  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;       &lt;span class="keyword"&gt;int&lt;/span&gt;&lt;span&gt; GetNum();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;       DayOfWeek GetDay();  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;   }  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;br /&gt;
When GetDay() is invoked, the "dynamic proxy" returns "Sunday" since that is the default value for the &lt;i&gt;DayOfWeek&lt;/i&gt; enum
&lt;p&gt;A client would consume this as follows:&lt;/p&gt;
&lt;div class="dp-highlighter" id="Div12"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol start="1" class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Main(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;[] args)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;{                &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    var instance = DynamicProxyGenerator.GetInstanceFor&amp;lt;IFoo&amp;gt;();  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    &lt;span class="keyword"&gt;int&lt;/span&gt; num = instance.GetNum();  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    var day = instance.GetDay();&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;    &lt;span&gt; Console.WriteLine(num);&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;    Console.WriteLine(day);&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt; }  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;This is a very trivial example of dynamic proxies, frameworks like MOQ have a way more sophisticated implementation of this             paradigm where in you can instruct the framework to create proxies which return specified values for a method implementation as part of Setup.&lt;/p&gt;
&lt;/div&gt; &lt;img src="http://geekswithblogs.net/abhijeetp/aggbug/139088.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Abhijeet Patel</dc:creator>
            <guid>http://geekswithblogs.net/abhijeetp/archive/2010/04/04/a-simple-dynamic-proxy.aspx</guid>
            <pubDate>Sun, 04 Apr 2010 22:41:33 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/abhijeetp/comments/139088.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/abhijeetp/archive/2010/04/04/a-simple-dynamic-proxy.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/abhijeetp/comments/commentRss/139088.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/abhijeetp/services/trackbacks/139088.aspx</trackback:ping>
        </item>
        <item>
            <title>CLR via C# 3rd Edition is out</title>
            <category>Books</category>
            <link>http://geekswithblogs.net/abhijeetp/archive/2010/03/13/clr-via-c-3rd-edition-is-out.aspx</link>
            <description>&lt;div class="defaultText"&gt;
&lt;p&gt;Time for some book news update. CLR via C#, 3rd Edition seems to have been out for a little while now. The book was released in early Feb this year, and needless to say my copy is on it’s way. I can barely wait to dig in and chew on the goodies that one of the best technical authors and software professionals I respect has in store. The 2nd edition of the book was an absolute treat and this edition promises to be no less.&lt;/p&gt;
&lt;p&gt;Here is a brief description of what’s new and updated from the 2nd edition.&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Part I – CLR Basics&lt;/h3&gt;
&lt;h4&gt;Chapter 1-The CLR’s Execution Model&lt;/h4&gt;
&lt;p&gt;Added about discussion about C#’s /optimize and /debug switches and how they relate to each other.&lt;/p&gt;
&lt;h4&gt;Chapter 2-Building, Packaging, Deploying, and Administering Applications and Types&lt;/h4&gt;
&lt;p&gt;Improved discussion about Win32 manifest information and version resource information.&lt;/p&gt;
&lt;h4&gt;Chapter 3-Shared Assemblies and Strongly Named Assemblies&lt;/h4&gt;
&lt;p&gt;Added discussion of TypeForwardedToAttribute and TypeForwardedFromAttribute.&lt;/p&gt;
&lt;h3&gt;Part II – Designing Types&lt;/h3&gt;
&lt;h4&gt;Chapter 4-Type Fundamentals&lt;/h4&gt;
&lt;p&gt;No new topics.&lt;/p&gt;
&lt;h4&gt;Chapter 5-Primitive, Reference, and Value Types&lt;/h4&gt;
&lt;p&gt;Enhanced discussion of checked and unchecked code and added discussion of new BigInteger type. Also added discussion of C# 4.0’s dynamic primitive type.&lt;/p&gt;
&lt;h4&gt;Chapter 6-Type and Member Basics&lt;/h4&gt;
&lt;p&gt;No new topics.&lt;/p&gt;
&lt;h4&gt;Chapter 7-Constants and Fields&lt;/h4&gt;
&lt;p&gt;No new topics.&lt;/p&gt;
&lt;h4&gt;Chapter 8-Methods&lt;/h4&gt;
&lt;p&gt;Added discussion of extension methods and partial methods.&lt;/p&gt;
&lt;h4&gt;Chapter 9-Parameters&lt;/h4&gt;
&lt;p&gt;Added discussion of optional/named parameters and implicitly-typed local variables.&lt;/p&gt;
&lt;h4&gt;Chapter 10-Properties&lt;/h4&gt;
&lt;p&gt;Added discussion of automatically-implemented properties, properties and the Visual Studio debugger, object and collection initializers, anonymous types, the System.Tuple type and the ExpandoObject type.&lt;/p&gt;
&lt;h4&gt;Chapter 11-Events&lt;/h4&gt;
&lt;p&gt;Added discussion of events and thread-safety as well as showing a cool extension method to simplify the raising of an event.&lt;/p&gt;
&lt;h4&gt;Chapter 12-Generics&lt;/h4&gt;
&lt;p&gt;Added discussion of delegate and interface generic type argument variance.&lt;/p&gt;
&lt;h4&gt;Chapter 13-Interfaces&lt;/h4&gt;
&lt;p&gt;No new topics.&lt;/p&gt;
&lt;h3&gt;Part III – Essential Types&lt;/h3&gt;
&lt;h4&gt;Chapter 14-Chars, Strings, and Working with Text&lt;/h4&gt;
&lt;p&gt;No new topics.&lt;/p&gt;
&lt;h4&gt;Chapter 15-Enums&lt;/h4&gt;
&lt;p&gt;Added coverage of new Enum and Type methods to access enumerated type instances.&lt;/p&gt;
&lt;h4&gt;Chapter 16-Arrays&lt;/h4&gt;
&lt;p&gt;Added new section on initializing array elements.&lt;/p&gt;
&lt;h4&gt;Chapter 17-Delegates&lt;/h4&gt;
&lt;p&gt;Added discussion of using generic delegates to avoid defining new delegate types. Also added discussion of lambda expressions.&lt;/p&gt;
&lt;h4&gt;Chapter 18-Attributes&lt;/h4&gt;
&lt;p&gt;No new topics.&lt;/p&gt;
&lt;h4&gt;Chapter 19-Nullable Value Types&lt;/h4&gt;
&lt;p&gt;Added discussion on performance.&lt;/p&gt;
&lt;h3&gt;Part IV – CLR Facilities&lt;/h3&gt;
&lt;h4&gt;Chapter 20-Exception Handling and State Management&lt;/h4&gt;
&lt;p&gt;This chapter has been completely rewritten. It is now about exception handling and state management. It includes discussions of code contracts and constrained execution regions (CERs). It also includes a new section on trade-offs between writing productive code and reliable code.&lt;/p&gt;
&lt;h4&gt;Chapter 21-Automatic Memory Management&lt;/h4&gt;
&lt;p&gt;Added discussion of C#’s fixed state and how it works to pin objects in the heap. Rewrote the code for weak delegates so you can use them with any class that exposes an event (the class doesn’t have to support weak delegates itself). Added discussion on the new ConditionalWeakTable class, GC Collection modes, Full GC notifications, garbage collection modes and latency modes. I also include a new sample showing how your application can receive notifications whenever Generation 0 or 2 collections occur.&lt;/p&gt;
&lt;h4&gt;Chapter 22-CLR Hosting and AppDomains&lt;/h4&gt;
&lt;p&gt;Added discussion of side-by-side support allowing multiple CLRs to be loaded in a single process. Added section on the performance of using MarshalByRefObject-derived types. Substantially rewrote the section on cross-AppDomain communication. Added section on AppDomain Monitoring and first chance exception notifications. Updated the section on the AppDomainManager class.&lt;/p&gt;
&lt;h4&gt;Chapter 23-Assembly Loading and Reflection&lt;/h4&gt;
&lt;p&gt;Added section on how to deploy a single file with dependent assemblies embedded inside it. Added section comparing reflection invoke vs bind/invoke vs bind/create delegate/invoke vs C#’s dynamic type.&lt;/p&gt;
&lt;h4&gt;Chapter 24-Runtime Serialization&lt;/h4&gt;
&lt;p&gt;This is a whole new chapter that was not in the 2&lt;sup&gt;nd&lt;/sup&gt; Edition.&lt;/p&gt;
&lt;h3&gt;Part V – Threading&lt;/h3&gt;
&lt;h4&gt;Chapter 25-Threading Basics&lt;/h4&gt;
&lt;p&gt;Whole new chapter motivating why Windows supports threads, thread overhead, CPU trends, NUMA Architectures, the relationship between CLR threads and Windows threads, the Thread class, reasons to use threads, thread scheduling and priorities, foreground thread vs background threads.&lt;/p&gt;
&lt;h4&gt;Chapter 26-Performing Compute-Bound Asynchronous Operations&lt;/h4&gt;
&lt;p&gt;Whole new chapter explaining the CLR’s thread pool. This chapter covers all the new .NET 4.0 constructs including cooperative cancelation, Tasks, the aralle class, parallel language integrated query, timers, how the thread pool manages its threads, cache lines and false sharing.&lt;/p&gt;
&lt;h4&gt;Chapter 27-Performing I/O-Bound Asynchronous Operations&lt;/h4&gt;
&lt;p&gt;Whole new chapter explaining how Windows performs synchronous and asynchronous I/O operations. Then, I go into the CLR’s Asynchronous Programming Model, my AsyncEnumerator class, the APM and exceptions, Applications and their threading models, implementing a service asynchronously, the APM and Compute-bound operations, APM considerations, I/O request priorities, converting the APM to a Task, the event-based Asynchronous Pattern, programming model soup.&lt;/p&gt;
&lt;h4&gt;Chapter 28-Primitive Thread Synchronization Constructs&lt;/h4&gt;
&lt;p&gt;Whole new chapter discusses class libraries and thread safety, primitive user-mode, kernel-mode constructs, and data alignment.&lt;/p&gt;
&lt;h4&gt;Chapter 29-Hybrid Thread Synchronization Constructs&lt;/h4&gt;
&lt;p&gt;Whole new chapter discussion various hybrid constructs such as ManualResetEventSlim, SemaphoreSlim, CountdownEvent, Barrier, ReaderWriterLock(Slim), OneManyResourceLock, Monitor, 3 ways to solve the double-check locking technique, .NET 4.0’s Lazy and LazyInitializer classes, the condition variable pattern, .NET 4.0’s concurrent collection classes, the ReaderWriterGate and SyncGate classes.&lt;/p&gt; &lt;img src="http://geekswithblogs.net/abhijeetp/aggbug/138502.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Abhijeet Patel</dc:creator>
            <guid>http://geekswithblogs.net/abhijeetp/archive/2010/03/13/clr-via-c-3rd-edition-is-out.aspx</guid>
            <pubDate>Sun, 14 Mar 2010 00:09:50 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/abhijeetp/comments/138502.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/abhijeetp/archive/2010/03/13/clr-via-c-3rd-edition-is-out.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/abhijeetp/comments/commentRss/138502.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/abhijeetp/services/trackbacks/138502.aspx</trackback:ping>
        </item>
        <item>
            <title>Chunking a List  - .NET vs Python</title>
            <category>C#</category>
            <category>Python</category>
            <link>http://geekswithblogs.net/abhijeetp/archive/2010/03/07/chunking-a-list----.net-vs-python.aspx</link>
            <description>&lt;head&gt;
    &lt;title&gt;Chunking a List&lt;/title&gt;
    &lt;link href="customcss.ashx.css" rel="stylesheet" type="text/css" /&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;div class="defaultText"&gt;
        &lt;p&gt;
          As I mentioned last time, I'm knee deep in python these days. I come from a statically typed background so it's definitely 
          a mental adjustment. List comprehensions is BIG in Python and having worked with a few of them I can see why.
          Let's say we need to chunk a list into sublists of a specified size.&lt;br /&gt;
          Here is how we'd do it in C#
        &lt;/p&gt;
        
        &lt;p&gt;
            &lt;/p&gt;&lt;div id="hlDiv" class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;/div&gt;&lt;ol class="dp-c" start="1"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; Extensions  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt; {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;     &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; IEnumerable&amp;lt;List&amp;lt;T&amp;gt;&amp;gt; Chunk&amp;lt;T&amp;gt;(&lt;/span&gt;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span&gt; List&amp;lt;T&amp;gt; l, &lt;/span&gt;&lt;span class="keyword"&gt;int&lt;/span&gt;&lt;span&gt; chunkSize)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;     {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;         &lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt; (chunkSize &amp;lt;0)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;         {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;             &lt;span class="keyword"&gt;throw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; ArgumentException(&lt;/span&gt;&lt;span class="string"&gt;"chunkSize cannot be negative"&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class="string"&gt;"chunkSize"&lt;/span&gt;&lt;span&gt;);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;         }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;         &lt;span class="keyword"&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class="keyword"&gt;int&lt;/span&gt;&lt;span&gt; i = 0; i &amp;lt; l.Count; i += chunkSize)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;         {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;             yield &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; List&amp;lt;T&amp;gt;(l.Skip(i).Take(chunkSize));  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;         }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;     }   &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt; }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Main(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;[] args)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;         var l = &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; List&amp;lt;&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;&amp;gt; { &lt;/span&gt;&lt;span class="string"&gt;"a"&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class="string"&gt;"b"&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class="string"&gt;"c"&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class="string"&gt;"d"&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class="string"&gt;"e"&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class="string"&gt;"f"&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class="string"&gt;"g"&lt;/span&gt;&lt;span&gt; };  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;         &lt;span class="keyword"&gt;foreach&lt;/span&gt;&lt;span&gt; (var list &lt;/span&gt;&lt;span class="keyword"&gt;in&lt;/span&gt;&lt;span&gt; l.Chunk(7))  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;         {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;             &lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; str = list.Aggregate((s1, s2) =&amp;gt; s1 + &lt;/span&gt;&lt;span class="string"&gt;","&lt;/span&gt;&lt;span&gt; + s2);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;             Console.WriteLine(str);  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;         }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt; }  &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;        
              
       
        &lt;p&gt;
        A little wordy but still pretty concise thanks to LINQ.We skip the iteration number plus &lt;i&gt;chunkSize&lt;/i&gt; elements and &lt;i&gt;yield&lt;/i&gt; out a new &lt;i&gt;List&lt;/i&gt;
        of &lt;i&gt;chunkSize&lt;/i&gt; elements on each iteration.        
        &lt;/p&gt;
       
        &lt;p&gt;
        The python implementation is a bit more terse.&lt;br /&gt;
        &lt;/p&gt;&lt;div id="Div2" class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;/div&gt;&lt;ol class="dp-py" start="1"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;def&lt;/span&gt;&lt;span&gt; chunkIterable(&lt;/span&gt;&lt;span class="builtins"&gt;iter&lt;/span&gt;&lt;span&gt;, chunkSize):  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="string"&gt;'''Chunks an iterable&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="string"&gt;        object into a list of the specified chunkSize&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&lt;span class="string"&gt;    '''&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;assert&lt;/span&gt;&lt;span&gt; hasattr(&lt;/span&gt;&lt;span class="builtins"&gt;iter&lt;/span&gt;&lt;span&gt;, "&lt;/span&gt;&lt;span class="magicmethods"&gt;__iter__&lt;/span&gt;&lt;span&gt;"), "&lt;/span&gt;&lt;span class="builtins"&gt;iter&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;is&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;not&lt;/span&gt;&lt;span&gt; an iterable"  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;for&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span class="keyword"&gt;in&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="builtins"&gt;xrange&lt;/span&gt;&lt;span&gt;(0, &lt;/span&gt;&lt;span class="builtins"&gt;len&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class="builtins"&gt;iter&lt;/span&gt;&lt;span&gt;), chunkSize):  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;yield&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="builtins"&gt;iter&lt;/span&gt;&lt;span&gt;[i:i + chunkSize]  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="builtins"&gt;__name__&lt;/span&gt;&lt;span&gt; == '&lt;/span&gt;&lt;span class="builtins"&gt;__main__&lt;/span&gt;&lt;span&gt;':  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    l = ['a', 'b', 'c', 'd', 'e', 'f']  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    generator = chunkIterable(l,2)  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;try&lt;/span&gt;&lt;span&gt;:  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;while&lt;/span&gt;&lt;span&gt;(1):  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            &lt;span class="keyword"&gt;print&lt;/span&gt;&lt;span&gt; generator.next()  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;except&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="exceptions"&gt;StopIteration&lt;/span&gt;&lt;span&gt;:  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;pass&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;
           
          &lt;i&gt;xrange&lt;/i&gt; generates elements in the specified range taking in a seed and returning a generator.
            which can be used in a for loop(much like using a C# iterator in a foreach loop)&lt;br /&gt;
            Since &lt;i&gt;chunkIterable&lt;/i&gt; has a yield statement, it turns this method into a generator as well.&lt;br /&gt;
            &lt;i&gt;iter[i:i + chunkSize]&lt;/i&gt;  essentially slices the list based on the current iteration index and chunksize and creates 
            a new list that we &lt;i&gt;yield&lt;/i&gt; out to the caller one at a time. &lt;br /&gt;
            A generator much like an iterator is a state machine and each subsequent call 
            to it remembers the state at which the last call left off and resumes execution from that point.
        &lt;p&gt;
            The caveat to keep in mind is that since variables are not explicitly typed we need to ensure that the object passed 
            in is iterable using &lt;i&gt;hasattr(iter, "__iter__")&lt;/i&gt;.This way we can perform chunking on any object which is an 
            "iterable", very similar to accepting an &lt;i&gt;IEnumerable&lt;/i&gt; in the .NET land
        &lt;/p&gt;       
    &lt;/div&gt;
&lt;/body&gt;
 &lt;img src="http://geekswithblogs.net/abhijeetp/aggbug/138380.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Abhijeet Patel</dc:creator>
            <guid>http://geekswithblogs.net/abhijeetp/archive/2010/03/07/chunking-a-list----.net-vs-python.aspx</guid>
            <pubDate>Sun, 07 Mar 2010 20:36:03 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/abhijeetp/comments/138380.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/abhijeetp/archive/2010/03/07/chunking-a-list----.net-vs-python.aspx#feedback</comments>
            <slash:comments>5</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/abhijeetp/comments/commentRss/138380.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/abhijeetp/services/trackbacks/138380.aspx</trackback:ping>
        </item>
        <item>
            <title>Showing Progress in a .NET Console Application</title>
            <category>C#</category>
            <link>http://geekswithblogs.net/abhijeetp/archive/2010/02/21/showing-progress-in-a-.net-console-application.aspx</link>
            <description>&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;link href="customcss.ashx.css" rel="stylesheet" type="text/css" /&gt;
&lt;div class="defaultText"&gt;
&lt;p&gt;Showing the progress of an operation is trivial in rich client applications using a progress bar control of some sort. But what about .NET console apps? The Console class offers 2 static methods &lt;i&gt;Console.Write&lt;/i&gt; and &lt;i&gt;Console.WriteLine&lt;/i&gt; to write out to the Console, but any subsequent calls to these methods will write the content out at the current location of the cursor.This doesn't really help when you want the progress percentage to refresh in place instead. The trick is to write out the "\r" character in the call to Console.Write so that the cursor is repositioned to the begining of the line after the content is written out. Following is quick implementation of a method which shows percentage of progress, refreshing the percent value in place.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div class="dp-highlighter" id="hlDiv"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; ShowPercentProgress(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; message, &lt;/span&gt;&lt;span class="keyword"&gt;int&lt;/span&gt;&lt;span&gt; currElementIndex, &lt;/span&gt;&lt;span class="keyword"&gt;int&lt;/span&gt;&lt;span&gt; totalElementCount)   &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;{   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt; (currElementIndex &amp;lt; 0 || currElementIndex &amp;gt;=totalElementCount)   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    {   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           &lt;/span&gt;&lt;span class="keyword"&gt;throw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; InvalidOperationException(&lt;/span&gt;&lt;span class="string"&gt;"currElement out of range"&lt;/span&gt;&lt;span&gt;);   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    }   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;int&lt;/span&gt;&lt;span&gt; percent =  (100 * (currElementIndex + 1)) / totalElementCount;   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    Console.Write(&lt;/span&gt;&lt;span class="string"&gt;"\r{0}{1}% complete"&lt;/span&gt;&lt;span&gt;,message, percent);   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt; (currElementIndex == totalElementCount-1)   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    {   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        Console.WriteLine(Environment.NewLine);   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    }   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;and the caller of course.&lt;br /&gt;
 &lt;/p&gt;
&lt;div class="dp-highlighter" id="DIV5"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Main(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;[] args)   &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;{   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class="keyword"&gt;int&lt;/span&gt;&lt;span&gt; i = 0; i &amp;lt; 100; i++)   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    {   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        ShowPercentProgress(&lt;/span&gt;&lt;span class="string"&gt;"Processing..."&lt;/span&gt;&lt;span&gt;, i, 100);   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        Thread.Sleep(100);   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    }   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;That's all there is to it. Happy coding.&lt;/p&gt;
&lt;b style="color: red;"&gt;UPDATE: This example wouldn't be complete unless I provide an Python implmentation since that's what I'm living and breathing these days.&lt;/b&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div class="dp-highlighter" id="DIV1"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol class="dp-py"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;def&lt;/span&gt;&lt;span&gt; showProgress(message, it = [], currElement = 0):   &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    percent = (100 * (currElement + 1)) / &lt;/span&gt;&lt;span class="builtins"&gt;len&lt;/span&gt;&lt;span&gt;(it)   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    &lt;/span&gt;&lt;span class="commonlibs"&gt;sys&lt;/span&gt;&lt;span&gt;.stdout.&lt;/span&gt;&lt;span class="builtins"&gt;write&lt;/span&gt;&lt;span&gt;("\r")   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    &lt;/span&gt;&lt;span class="commonlibs"&gt;sys&lt;/span&gt;&lt;span&gt;.stdout.&lt;/span&gt;&lt;span class="builtins"&gt;write&lt;/span&gt;&lt;span&gt;("%s %i complete" % (message, percent))   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    &lt;/span&gt;&lt;span class="commonlibs"&gt;sys&lt;/span&gt;&lt;span&gt;.stdout.&lt;/span&gt;&lt;span class="builtins"&gt;flush&lt;/span&gt;&lt;span&gt;()   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span class="keyword"&gt;def&lt;/span&gt;&lt;span&gt; process(it, notifyCompletion = showProgress):   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    &lt;/span&gt;&lt;span class="keyword"&gt;for&lt;/span&gt;&lt;span&gt; item &lt;/span&gt;&lt;span class="keyword"&gt;in&lt;/span&gt;&lt;span&gt; it:   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        &lt;/span&gt;&lt;span class="commonlibs"&gt;time&lt;/span&gt;&lt;span&gt;.sleep(0.5)   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        notifyCompletion("Processing", it, it.&lt;/span&gt;&lt;span class="builtins"&gt;index&lt;/span&gt;&lt;span&gt;(item))            &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="builtins"&gt;__name__&lt;/span&gt;&lt;span&gt; == "&lt;/span&gt;&lt;span class="builtins"&gt;__main__&lt;/span&gt;&lt;span&gt;":      &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    process(&lt;/span&gt;&lt;span class="builtins"&gt;range&lt;/span&gt;&lt;span&gt;(10));   &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p style="color: red;"&gt;UPDATE(4/27/11): I received a comment requesting a precise usage example of the above for copying files&lt;br /&gt;
The code below has been adapted to achieve that. &lt;br /&gt;
&lt;b&gt;Disclamer&lt;/b&gt;: If you use this code, please add proper error handling as you see fit.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div class="dp-highlighter" id="hlDiv"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; Program   &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;{    &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;       &lt;/span&gt;&lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Copyfiles(   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;[] sourceFiles,   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; destPath,                &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            Action&amp;lt;&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class="keyword"&gt;long&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class="keyword"&gt;long&lt;/span&gt;&lt;span&gt;&amp;gt; reportProgress,   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            &lt;/span&gt;&lt;span class="keyword"&gt;int&lt;/span&gt;&lt;span&gt; blockSizeToRead = 4096)   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        {               &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            &lt;/span&gt;&lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt;(!Directory.Exists(destPath))   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            {   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;               &lt;/span&gt;&lt;span class="keyword"&gt;throw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; DirectoryNotFoundException(destPath);   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            }   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            &lt;/span&gt;&lt;span class="keyword"&gt;foreach&lt;/span&gt;&lt;span&gt; (var sourceFile &lt;/span&gt;&lt;span class="keyword"&gt;in&lt;/span&gt;&lt;span&gt; sourceFiles)   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            {   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                &lt;/span&gt;&lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt; (!File.Exists(sourceFile))   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                {   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                    Console.WriteLine(&lt;/span&gt;&lt;span class="string"&gt;"{0} not found.. skipping"&lt;/span&gt;&lt;span&gt;,sourceFile);   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                }   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                FileInfo sourceFileInfo = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; FileInfo(sourceFile);   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; message = &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;.Format(&lt;/span&gt;&lt;span class="string"&gt;"Copying {0} "&lt;/span&gt;&lt;span&gt;, sourceFileInfo.Name);   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; destFilePath = Path.Combine(destPath, sourceFileInfo.Name);   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                &lt;/span&gt;&lt;span class="keyword"&gt;byte&lt;/span&gt;&lt;span&gt;[] buffer = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;byte&lt;/span&gt;&lt;span&gt;[blockSizeToRead];   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                &lt;/span&gt;&lt;span class="keyword"&gt;using&lt;/span&gt;&lt;span&gt; (var destfs = File.OpenWrite(destFilePath))   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                {   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span class="keyword"&gt;using&lt;/span&gt;&lt;span&gt; (var sourcefs = File.OpenRead(sourceFile))   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                    {                           &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span class="keyword"&gt;int&lt;/span&gt;&lt;span&gt; bytesRead,totalBytesRead = 0;   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span class="keyword"&gt;while&lt;/span&gt;&lt;span&gt; ((bytesRead = sourcefs.Read(buffer, 0, buffer.Length - 1)) &amp;gt; 0)   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                        {   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                            destfs.Write(buffer, 0, bytesRead);   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                            totalBytesRead += bytesRead;   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt; (reportProgress != &lt;/span&gt;&lt;span class="keyword"&gt;null&lt;/span&gt;&lt;span&gt;)   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                            {   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                                reportProgress(message, totalBytesRead, sourceFileInfo.Length);   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                            }   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                        }   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                    }   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                }   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            }   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        }   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        &lt;/span&gt;&lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; ShowPercentProgress(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; message, &lt;/span&gt;&lt;span class="keyword"&gt;long&lt;/span&gt;&lt;span&gt; processed, &lt;/span&gt;&lt;span class="keyword"&gt;long&lt;/span&gt;&lt;span&gt; total)   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        {   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;               &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            &lt;/span&gt;&lt;span class="keyword"&gt;long&lt;/span&gt;&lt;span&gt; percent = (100 * (processed + 1)) / total;   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            Console.Write(&lt;/span&gt;&lt;span class="string"&gt;"\r{0}{1}% complete"&lt;/span&gt;&lt;span&gt;, message, percent);   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            &lt;/span&gt;&lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt; (processed &amp;gt;= total - 1)   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            {   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                Console.WriteLine(Environment.NewLine);   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            }   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        }     &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        &lt;/span&gt;&lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Main(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;[] args)   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        {   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            var files = Directory.GetFiles(@&lt;/span&gt;&lt;span class="string"&gt;"C:\temp\source"&lt;/span&gt;&lt;span&gt;);   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            Copyfiles(files, @&lt;/span&gt;&lt;span class="string"&gt;"C:\temp\dest"&lt;/span&gt;&lt;span&gt;, ShowPercentProgress);   &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        }   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;/div&gt; &lt;img src="http://geekswithblogs.net/abhijeetp/aggbug/138074.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Abhijeet Patel</dc:creator>
            <guid>http://geekswithblogs.net/abhijeetp/archive/2010/02/21/showing-progress-in-a-.net-console-application.aspx</guid>
            <pubDate>Sun, 21 Feb 2010 18:50:28 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/abhijeetp/comments/138074.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/abhijeetp/archive/2010/02/21/showing-progress-in-a-.net-console-application.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/abhijeetp/comments/commentRss/138074.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/abhijeetp/services/trackbacks/138074.aspx</trackback:ping>
        </item>
        <item>
            <title>Covariance and Contravariance in C# 4.0</title>
            <category>C#</category>
            <link>http://geekswithblogs.net/abhijeetp/archive/2010/01/10/covariance-and-contravariance-in-c-4.0.aspx</link>
            <description>&lt;div class="defaultText"&gt;
&lt;p&gt;C# 4.0 introduces the notion of Covariance and Contravariance of generic type parameters for interfaces and delegate types.             Eric Lippert has put together a bunch of &lt;a href="http://blogs.msdn.com/ericlippert/archive/tags/Covariance+and+Contravariance/default.aspx"&gt;posts&lt;/a&gt; that              goes into details of the why and how, an excellent read but not for the faint of heart.             I would strongly suggest reading these posts to get a firm grounding and a better appreciation of this feature.             It took me a while to get my head wrapped around this, especially since none of the VS2010 Betas were not out at the time and there              was no way to try out any code.             Now that I have Beta2 of VS2010 at hand I decided to try out some code samples first hand and solidify my understanding of             the feature.&lt;/p&gt;
&lt;p&gt;Suppose we have the following inheritance hierarchy:&lt;/p&gt;
&lt;div class="dp-highlighter" id="hlDiv"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol start="1" class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;interface&lt;/span&gt;&lt;span&gt; IAnimal  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Speak();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; Whale : IAnimal  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;     &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt;  Speak()  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;         Console.WriteLine(&lt;span class="string"&gt;"I'm a Whale"&lt;/span&gt;&lt;span&gt;);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; Giraffe : IAnimal  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Speak()  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        Console.WriteLine(&lt;span class="string"&gt;"I'm a Giraffe"&lt;/span&gt;&lt;span&gt;);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;and a processor to process animals:&lt;/p&gt;
&lt;div class="dp-highlighter" id="Div5"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol start="1" class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;interface&lt;/span&gt;&lt;span&gt; IProcessor&amp;lt;T&amp;gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Process(IEnumerable&amp;lt;T&amp;gt; ts);     &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; Processor&amp;lt;T&amp;gt; : IProcessor&amp;lt;T&amp;gt; where T:IAnimal  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Process(IEnumerable&amp;lt;T&amp;gt; ts)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        &lt;span class="keyword"&gt;foreach&lt;/span&gt;&lt;span&gt; (var t &lt;/span&gt;&lt;span class="keyword"&gt;in&lt;/span&gt;&lt;span&gt; ts)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            t.Speak();  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        }  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    }          &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;It would be natural to be able to create a Processor to process any kind of animal, but the following code            does not compile today on the C# 3.0 compiler&lt;/p&gt;
&lt;div class="dp-highlighter" id="Div1"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol start="1" class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt;List&amp;lt;Giraffe&amp;gt; giraffeList = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; List&amp;lt;Giraffe&amp;gt; { &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Giraffe() };  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;IProcessor&amp;lt;IAnimal&amp;gt; proc = &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Processor&amp;lt;IAnimal&amp;gt;();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;proc.Process(giraffeList);  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
We have to add a silly"OfType&amp;lt;IAnimal&amp;gt;" cast to make it work:&lt;br /&gt;
&lt;div class="dp-highlighter" id="Div6"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol start="1" class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt;List&amp;lt;Giraffe&amp;gt; giraffeList = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; List&amp;lt;Giraffe&amp;gt; { &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Giraffe() };  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;IProcessor&amp;lt;IAnimal&amp;gt; proc = &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Processor&amp;lt;IAnimal&amp;gt;();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;proc.Process(giraffeList.OfType&amp;lt;IAnimal&amp;gt;());  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;In C# 4.0 no such cast is needed and everything just works as expected. Why? because in .NET 4.0 IEnumerable&amp;lt;T&amp;gt; is covariant in             it's type parameter T, this is what the definition looks like&lt;/p&gt;
&lt;div class="dp-highlighter" id="Div2"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol start="1" class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;interface&lt;/span&gt;&lt;span&gt; IEnumerable&amp;lt;&lt;/span&gt;&lt;span class="keyword"&gt;out&lt;/span&gt;&lt;span&gt; T&amp;gt; : IEnumerable  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;....  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;....  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;}   &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
The "out" keyword is what makes the "T" &lt;i&gt;covariant&lt;/i&gt;; which means that you can pass in any type which is more derived than             "T" as the type argument, hence we can pass in IEnumerable&amp;lt;Giraffe&amp;gt; or IEnumerable&amp;lt;Whale&amp;gt; to the Process method            which accepts an IEnumerable&amp;lt;IAnimal&amp;gt; and everything just works as expected in a type safe way.&lt;br /&gt;
&lt;p&gt; &lt;/p&gt;
You can define your own covariant types to allow for such conversions.&lt;br /&gt;
Consider the following generic class definition to create instances of a specified type&lt;br /&gt;
&lt;div class="dp-highlighter" id="Div7"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol start="1" class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;interface&lt;/span&gt;&lt;span&gt; IFactory&amp;lt;&lt;/span&gt;&lt;span class="keyword"&gt;out&lt;/span&gt;&lt;span&gt; T&amp;gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    T CreateInstance();  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; Factory&amp;lt;T&amp;gt; : IFactory&amp;lt;T&amp;gt; where T: &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt;()  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; T CreateInstance()  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; T();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    }          &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
IFactory&amp;lt;T&amp;gt; is covariant in T so we can treat a Factory&amp;lt;Giraffe&amp;gt; as an IFactory&amp;lt;IAnimal&amp;gt;.            This allows us to treat factories of types in the same inheritance chain uniformly like so:&lt;br /&gt;
&lt;div class="dp-highlighter" id="Div8"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol start="1" class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt;IFactory&amp;lt;IAnimal&amp;gt; giraffeFactory = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Factory&amp;lt;Giraffe&amp;gt;();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;IFactory&amp;lt;IAnimal&amp;gt; whaleFactory = &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Factory&amp;lt;Whale&amp;gt;();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;List&amp;lt;IFactory&amp;lt;IAnimal&amp;gt;&amp;gt; factories = &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; List&amp;lt;IFactory&amp;lt;IAnimal&amp;gt;&amp;gt;{ giraffeFactory, whaleFactory };  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;foreach&lt;/span&gt;&lt;span&gt; (var factory &lt;/span&gt;&lt;span class="keyword"&gt;in&lt;/span&gt;&lt;span&gt; factories)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    factory.CreateInstance().Speak();  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;Note that it is illegal for a covariant type parameter to occur in an input position, it can only occur in output positions such as return type of             a method in the type. This restriction is key in making covariance work,allowing the type parameter in an input position            would break covariance. How you might ask.            Imagine if the following &lt;i&gt;illegal&lt;/i&gt; code were legal and you could specify T in an input position.&lt;/p&gt;
&lt;div class="dp-highlighter" id="Div3"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol start="1" class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;interface&lt;/span&gt;&lt;span&gt; IFactory&amp;lt;&lt;/span&gt;&lt;span class="keyword"&gt;out&lt;/span&gt;&lt;span&gt; T&amp;gt;    &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    T CreateInstance();  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    T CreateInstanceFrom(T t);  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; Factory&amp;lt;T&amp;gt; : IFactory&amp;lt;T&amp;gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    where T : &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt;()  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    where T : ICloneable  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; T CreateInstance()  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; T();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; T CreateInstanceFrom(T t)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; (T)t.Clone();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
We added a constraint to the factory class to constrain the type parameter to support &lt;i&gt;ICloneable&lt;/i&gt; and added            a new method &lt;i&gt;CreateInstanceFrom&lt;/i&gt; which accept the instance to clone.            Now what happens if we do the following:&lt;br /&gt;
&lt;div class="dp-highlighter" id="Div4"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol start="1" class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt;IFactory&amp;lt;IAnimal&amp;gt; giraffeFactory = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Factory&amp;lt;Giraffe&amp;gt;();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;giraffeFactory.CreateInstanceFrom(&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Whale())  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
Oh my! we just passed in a Whale to clone a Giraffe, and we'd bomb a runtime.&lt;br /&gt;
It is precisely for this reason that a covariant type parameter can only occur in output positions(hence the keyword &lt;i&gt;out&lt;/i&gt;) and             the runtime error is now a compile time error.
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;But what if we wanted to have the type paramter in an input position to get the benefits variance has to offer, enter contrvariance             which is the dual of covariance. In that a type argument can be safely replaced by a more derived type but only in an input position.&lt;/p&gt;
&lt;p&gt;If T appears ONLY in an input position (such as a parameter in methods of IProcessor) then we can mark T as contravariant using the &lt;i&gt;in&lt;/i&gt;             keyword, allowing us to substitute any sub type of T.&lt;/p&gt;
&lt;div class="dp-highlighter" id="Div9"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol start="1" class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;interface&lt;/span&gt;&lt;span&gt; IProcessor&amp;lt;&lt;/span&gt;&lt;span class="keyword"&gt;in&lt;/span&gt;&lt;span&gt; T&amp;gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Process(IEnumerable&amp;lt;T&amp;gt; ts);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;This makes assignments such as the following legal.&lt;/p&gt;
&lt;div class="dp-highlighter" id="Div10"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol start="1" class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt;List&amp;lt;Giraffe&amp;gt; giraffes = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; List&amp;lt;Giraffe&amp;gt; { &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Giraffe() };  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;List&amp;lt;Whale&amp;gt; whales = &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; List&amp;lt;Whale&amp;gt; { &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Whale() };  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;IProcessor&amp;lt;IAnimal&amp;gt; animalProc = &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Processor&amp;lt;IAnimal&amp;gt;();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&lt;b&gt;IProcessor&amp;lt;Giraffe&amp;gt; giraffeProcessor = animalProc;  &lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;b&gt;IProcessor&amp;lt;Whale&amp;gt; whaleProcessor = animalProc;  &lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;giraffeProcessor.Process(giraffes);  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;whaleProcessor.Process(whales);  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Finally let's look at variance in delegate types.            Consider the following delegate definition and it's subsequent usage&lt;/p&gt;
&lt;div class="dp-highlighter" id="Div11"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol start="1" class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;delegate&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; MyAction&amp;lt;&lt;/span&gt;&lt;span class="keyword"&gt;in&lt;/span&gt;&lt;span&gt; T&amp;gt;(T t);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;........  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;.......  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;.........  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt; MyAction&amp;lt;IAnimal&amp;gt; animalAction = a =&amp;gt; a.Speak();  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
Since T is contravariant, we can treat MyAction&amp;lt;IAnimal&amp;gt; as MyAction&amp;lt;Giraffe&amp;gt; since Giraffe is more derived than IAnimal&lt;br /&gt;
&lt;div class="dp-highlighter" id="Div13"&gt;
&lt;ol start="1" class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt;MyAction&amp;lt;Giraffe&amp;gt; rafAction = animalAction;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Now let's combine both co and contravariance, consider the following delegate&lt;/p&gt;
&lt;div class="dp-highlighter" id="Div14"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol start="1" class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;delegate&lt;/span&gt;&lt;span&gt; T2 MyFunc&amp;lt;&lt;/span&gt;&lt;span class="keyword"&gt;in&lt;/span&gt;&lt;span&gt; T1,&lt;/span&gt;&lt;span class="keyword"&gt;out&lt;/span&gt;&lt;span&gt; T2&amp;gt;(T1 t1);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
T2 is covariant and T1 is contravariant and hence we can use T1 or any subtypes of T1 as the first generic type paramter and             T2 or any of its base types as the second generic type parameter, allowing us to use assignments such as the following with full            type safety&lt;br /&gt;
&lt;div class="dp-highlighter" id="Div12"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol start="1" class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt;Func&amp;lt;IAnimal, Giraffe&amp;gt; func = a =&amp;gt; a &lt;/span&gt;&lt;span class="keyword"&gt;as&lt;/span&gt;&lt;span&gt; Giraffe;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;Func&amp;lt;Giraffe, IAnimal&amp;gt; funcG = func;  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Covariance and Contravariance may sound like a mouthful and daunting to understand but at its core it's quite simple to grasp once you understand       its purpose, it enables writing generic code more naturally and allows safe type coercions.       That's it for today. Happy coding.&lt;/p&gt;
&lt;/div&gt; &lt;img src="http://geekswithblogs.net/abhijeetp/aggbug/137413.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Abhijeet Patel</dc:creator>
            <guid>http://geekswithblogs.net/abhijeetp/archive/2010/01/10/covariance-and-contravariance-in-c-4.0.aspx</guid>
            <pubDate>Sun, 10 Jan 2010 20:50:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/abhijeetp/comments/137413.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/abhijeetp/archive/2010/01/10/covariance-and-contravariance-in-c-4.0.aspx#feedback</comments>
            <slash:comments>9</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/abhijeetp/comments/commentRss/137413.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/abhijeetp/services/trackbacks/137413.aspx</trackback:ping>
        </item>
        <item>
            <title>T4 template consuming a WCF service</title>
            <category>C#</category>
            <category>WCF</category>
            <link>http://geekswithblogs.net/abhijeetp/archive/2009/10/18/t4-template-consuming-a-wcf-service.aspx</link>
            <description>&lt;p&gt;
&lt;/p&gt;&lt;link rel="stylesheet" type="text/css" href="customcss.ashx.css" /&gt;
&lt;div class="defaultText"&gt;It’s been a while since I’ve blogged since things have been crazy busy. I finally decided to kick myself and do a post so without further ado, the problem at hand:&lt;br /&gt;
A co-worker of mine asked me whether its possible to dynamically create a type from some data he is receiving from a WCF service (over HTTP). &lt;br /&gt;
My natural response was, why would you need to do that since Visual Studio creates a proxy from the metadata exposed by the service and the return types would typically be DataContracts. &lt;br /&gt;
Well, it turns out that instead of returning a strongly typed domain specific object, the service is returning a &lt;strong&gt;Dictionary&amp;lt;string,string&amp;gt; &lt;/strong&gt;where the Key represents an attribute and the Value represents the value of the attribute. &lt;br /&gt;
&lt;br /&gt;
This has obvious problems:&lt;br /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Nothing is strongly typed&lt;/li&gt;
    &lt;li&gt;No contract versioning&lt;/li&gt;
    &lt;li&gt;The service could return a variable number of fields&lt;/li&gt;
&lt;/ul&gt;
A naive approach is to inspect the data returned by the service and hand code a class with properties based on the type of each key in the Dictionary.&lt;br /&gt;
For example, if the Dictionary contained the following KeyValuePairs.&lt;br /&gt;
{“Name”,”Jon Smith”} &lt;br /&gt;
{“Age”,”20”} &lt;br /&gt;
{“Zip”,”90876”} &lt;br /&gt;
&lt;br /&gt;
The class definition would look something like this:
&lt;div&gt;&lt;!-- Code --&gt;
&lt;div id="hlDiv" class="dp-highlighter"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; User  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Name {&lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;;}  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;  &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;int&lt;/span&gt;&lt;span&gt; Age {&lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;;}  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;int&lt;/span&gt;&lt;span&gt; Zip {&lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;;}  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;That’s fine when you have a couple of &lt;strong&gt;KeyValuePairs&lt;/strong&gt; but what if you had 10 or 20, it gets unwieldy very quickly.&lt;br /&gt;
Enter T4 templates, a slick way to generate code for repetitive tasks. I'd never written a T4 template before so I figured this would be a nice excuse to dabble in it a little.&lt;br /&gt;
 &lt;/p&gt;
&lt;p&gt;Let’s create a simple service to simulate some data, nothing too fancy&lt;br /&gt;
 &lt;/p&gt;
&lt;div id="Div2" class="dp-highlighter"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;using&lt;/span&gt;&lt;span&gt; System;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&lt;span class="keyword"&gt;using&lt;/span&gt;&lt;span&gt; System.Collections.Generic;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;using&lt;/span&gt;&lt;span&gt; System.Linq;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&lt;span class="keyword"&gt;using&lt;/span&gt;&lt;span&gt; System.Runtime.Serialization;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;using&lt;/span&gt;&lt;span&gt; System.ServiceModel;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&lt;span class="keyword"&gt;using&lt;/span&gt;&lt;span&gt; System.Text;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&lt;span class="keyword"&gt;namespace&lt;/span&gt;&lt;span&gt; T4WCFService  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    [ServiceContract]  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;interface&lt;/span&gt;&lt;span&gt; IT4WCFService  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        [OperationContract]  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        Dictionary&amp;lt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;&amp;gt; GetUser(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; userID);         &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
and its implementation...&lt;br /&gt;
&lt;div id="Div1" class="dp-highlighter"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;using&lt;/span&gt;&lt;span&gt; System;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&lt;span class="keyword"&gt;using&lt;/span&gt;&lt;span&gt; System.Collections.Generic;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;using&lt;/span&gt;&lt;span&gt; System.Linq;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&lt;span class="keyword"&gt;using&lt;/span&gt;&lt;span&gt; System.Runtime.Serialization;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;using&lt;/span&gt;&lt;span&gt; System.ServiceModel;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&lt;span class="keyword"&gt;using&lt;/span&gt;&lt;span&gt; System.Text;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&lt;span class="keyword"&gt;namespace&lt;/span&gt;&lt;span&gt; T4WCFService  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; T4Service : IT4WCFService  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="preprocessor"&gt;        #region IT4WCFService Members&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; Dictionary&amp;lt;&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;&amp;gt; GetUser(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; userID)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            &lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt; (userID == &lt;/span&gt;&lt;span class="string"&gt;"jsmith"&lt;/span&gt;&lt;span&gt;)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            {  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Dictionary&amp;lt;&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;&amp;gt;   &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                        {   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                            { &lt;span class="string"&gt;"Name"&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class="string"&gt;"Jack smith"&lt;/span&gt;&lt;span&gt; },  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                            { &lt;span class="string"&gt;"Age"&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class="string"&gt;"30"&lt;/span&gt;&lt;span&gt; },   &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                            { &lt;span class="string"&gt;"City"&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class="string"&gt;"San francisco"&lt;/span&gt;&lt;span&gt; },  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                            { &lt;span class="string"&gt;"State"&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class="string"&gt;"CA"&lt;/span&gt;&lt;span&gt;  },   &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                            { &lt;span class="string"&gt;"Zip"&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class="string"&gt;"94061"&lt;/span&gt;&lt;span&gt;  },  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                            { &lt;span class="string"&gt;"Country"&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class="string"&gt;"USA"&lt;/span&gt;&lt;span&gt;  }   &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                        };    &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            }  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            &lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt; (userID == &lt;/span&gt;&lt;span class="string"&gt;"jasmith"&lt;/span&gt;&lt;span&gt;)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            {  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Dictionary&amp;lt;&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;&amp;gt;   &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                        {   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                            { &lt;span class="string"&gt;"Name"&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class="string"&gt;"Jane smith"&lt;/span&gt;&lt;span&gt; },  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                            { &lt;span class="string"&gt;"Age"&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class="string"&gt;"28"&lt;/span&gt;&lt;span&gt; },   &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                            { &lt;span class="string"&gt;"City"&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class="string"&gt;"Portland"&lt;/span&gt;&lt;span&gt; },  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                            { &lt;span class="string"&gt;"State"&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class="string"&gt;"OR"&lt;/span&gt;&lt;span&gt;  },   &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                            { &lt;span class="string"&gt;"Zip"&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class="string"&gt;"98685"&lt;/span&gt;&lt;span&gt;  },  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                            { &lt;span class="string"&gt;"Country"&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class="string"&gt;"USA"&lt;/span&gt;&lt;span&gt;  }   &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                        };  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            }  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Dictionary&amp;lt;&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;&amp;gt;();              &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        }  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt; &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&lt;span class="preprocessor"&gt;        #endregion&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;br /&gt;
The service just simulates returning some dummy users based on a userID and returns an empty Dictionary if no matching user is found, and it’s exposed using
&lt;div class="code"&gt;WSHttpBinding&lt;/div&gt;
&lt;br /&gt;
The &amp;lt;system.servicemodel&amp;gt; looks as follows:&lt;br /&gt;
&lt;div id="Div3" class="dp-highlighter"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol class="dp-xml"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;system.serviceModel&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;  &lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;services&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;service&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="attribute"&gt;behaviorConfiguration&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"T4WCFService.Service1Behavior"&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;      &lt;span class="attribute"&gt;name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"T4WCFService.T4Service"&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;      &lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;endpoint&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="attribute"&gt;address&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"WsHttpT4Service"&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="attribute"&gt;binding&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"wsHttpBinding"&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="attribute"&gt;name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"WsHttpT4Service"&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        &lt;span class="attribute"&gt;contract&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"T4WCFService.IT4WCFService"&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;identity&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;          &lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;dns&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="attribute"&gt;value&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"localhost"&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="tag"&gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag-name"&gt;identity&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;      &lt;span class="tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag-name"&gt;endpoint&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;      &lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;endpoint&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="attribute"&gt;address&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"mex"&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="attribute"&gt;binding&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"mexHttpBinding"&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="attribute"&gt;contract&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"IMetadataExchange"&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="tag"&gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;      &lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;endpoint&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="attribute"&gt;address&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"basicHttpTService"&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="attribute"&gt;binding&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"basicHttpBinding"&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="attribute"&gt;name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"basicHttpTService"&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="attribute"&gt;contract&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"T4WCFService.IT4WCFService"&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="tag"&gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;      &lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;host&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;baseAddresses&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;          &lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;add&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="attribute"&gt;baseAddress&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"http://WCFServices"&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="tag"&gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag-name"&gt;baseAddresses&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;      &lt;span class="tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag-name"&gt;host&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag-name"&gt;service&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;  &lt;span class="tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag-name"&gt;services&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;behaviors&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    &lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;serviceBehaviors&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;      &lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;behavior&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="attribute"&gt;name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"T4WCFService.Service1Behavior"&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        &lt;span class="comments"&gt;&amp;lt;!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;serviceMetadata&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="attribute"&gt;httpGetEnabled&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"true"&lt;/span&gt;&lt;span class="tag"&gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        &lt;span class="comments"&gt;&amp;lt;!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information --&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;serviceDebug&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="attribute"&gt;includeExceptionDetailInFaults&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"false"&lt;/span&gt;&lt;span class="tag"&gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;      &lt;span class="tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag-name"&gt;behavior&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag-name"&gt;serviceBehaviors&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;  &lt;span class="tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag-name"&gt;behaviors&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag-name"&gt;system.serviceModel&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;If you(like me) have never created a T4 template before, I’d strongly suggest reading &lt;a target="_blank" href="http://www.olegsych.com/2008/09/t4-tutorial-creatating-your-first-code-generator/"&gt;this&lt;/a&gt; article first.&lt;br /&gt;
&lt;br /&gt;
Welcome back, now that you know how to create a simple T4 template, let’s get started.&lt;br /&gt;
T4 enables writing reusable modules that can be consumed from other T4 modules. For the purpose of this exercise I decided to create a template which encapsulates invoking a WCF service and returning the result back to the caller.&lt;br /&gt;
&lt;br /&gt;
Create a new Console Application and add a service reference to the service we created above, also add a new T4 file to your project called &lt;strong&gt;WCFServiceInvoker.tt&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img title="T4_WCFServiceInvoker" alt="T4_WCFServiceInvoker" src="http://gp6uig.bay.livefilestore.com/y1pH4gEhJsrQ7D61CSACzHPcK1UxcASBsBWX7ptqSRbNwFV9JYBhpY53POkxiTmotKCkYqzuqrAjNd3Ftj9yJvdUg/T4_WCFServiceInvoker.png" /&gt;&lt;/p&gt;
&lt;p&gt;Double click on WCFServiceInvoker.tt and the file should open up in markup mode.Delete the default code in the .tt file and add the following code:&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div id="Div4" class="dp-highlighter"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol class="dp-xml"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;#@ template &lt;/span&gt;&lt;span class="attribute"&gt;language&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"C#v3.5"&lt;/span&gt;&lt;span&gt;#&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;#@ output &lt;/span&gt;&lt;span class="attribute"&gt;extension&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;".cs"&lt;/span&gt;&lt;span&gt;#&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;#@ assembly &lt;/span&gt;&lt;span class="attribute"&gt;name&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class="attribute-value"&gt;"System.ServiceModel"&lt;/span&gt;&lt;span&gt; #&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;#@ import &lt;/span&gt;&lt;span class="attribute"&gt;namespace&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"System.Collections.Generic"&lt;/span&gt;&lt;span&gt;#&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;#@ import &lt;/span&gt;&lt;span class="attribute"&gt;namespace&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"System.Reflection"&lt;/span&gt;&lt;span&gt;#&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;#@ import &lt;/span&gt;&lt;span class="attribute"&gt;namespace&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"System.ServiceModel.Channels"&lt;/span&gt;&lt;span&gt;#&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;#@ import &lt;/span&gt;&lt;span class="attribute"&gt;namespace&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"System.ServiceModel"&lt;/span&gt;&lt;span&gt;#&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;#+  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    public class WCFServiceInvoker&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;TInterfaceType&lt;/span&gt;&lt;span&gt;,TReturnType&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; where TReturnType:class  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;      public string EndPointAddress {get;set;}  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;      public string EndPointName {get;set;}  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;      public Type ServiceInterfaceType {get;set;}        &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;      public Binding Binding {get;set;}  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;      public string MethodName {get;set;}  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;      public object[] Parameters {get;set;}  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;      public TReturnType InvokeMethod()  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;      {  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            EndpointAddress &lt;span class="attribute"&gt;endpoint&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span class="attribute-value"&gt;new&lt;/span&gt;&lt;span&gt; EndpointAddress(EndPointAddress);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            Type &lt;span class="attribute"&gt;typeDef&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span class="attribute-value"&gt;typeof&lt;/span&gt;&lt;span&gt;(ChannelFactory&lt;/span&gt;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;).MakeGenericType(typeof(TInterfaceType));  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            var &lt;span class="attribute"&gt;typeInst&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span class="attribute-value"&gt;Activator&lt;/span&gt;&lt;span&gt;.CreateInstance(typeDef,new object[]{Binding,endpoint});  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            var &lt;span class="attribute"&gt;channel&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span class="attribute-value"&gt;typeInst&lt;/span&gt;&lt;span&gt;.GetType().InvokeMember("CreateChannel", BindingFlags.InvokeMethod,null, typeInst, null);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            var &lt;span class="attribute"&gt;results&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span class="attribute-value"&gt;channel&lt;/span&gt;&lt;span&gt;.GetType().InvokeMember(MethodName, BindingFlags.InvokeMethod, null,channel, Parameters);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            return results as TReturnType;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;      }  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;#&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;There is a lot going on here.&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;The template and output directives indicate that the code is written in C# and the generated file needs to be have an extension of .cs. &lt;br /&gt;
     &lt;/li&gt;
    &lt;li&gt;The &amp;lt;#@assembly&amp;gt; directive is similar to an “Add Reference” in Visual Studio, it allows for referencing external assemblies.&lt;/li&gt;
    &lt;li&gt;The &amp;lt;#@import&amp;gt; directive is similar to a “using” statement, in that it brings the types in the specified namespace in scope so that the template can avail of them.&lt;/li&gt;
    &lt;li&gt;The &amp;lt;#+ #&amp;gt; directive is called &lt;a target="_blank" href="http://www.olegsych.com/2008/02/t4-class-feature-blocks/"&gt;Class feature block&lt;/a&gt; and it allows for writing class definitions within the template.&lt;br /&gt;
    This allows for encapsulating reusable logic. &lt;br /&gt;
    NOTE: The class definitions in this block are not emitted out to the final .cs file.&lt;/li&gt;
    &lt;li&gt;The WCFServiceInvoker class contains a bunch of properties, whose values(when set) are used for invoking a specified service dynamically.&lt;/li&gt;
    &lt;li&gt;The type parameters “TInterfaceType” represents the type of the interface on which the method specified in the "MethodName" parameter will be invoked.&lt;/li&gt;
    &lt;li&gt;The type parameter “TReturnType” represents the type of the result returned from the method call.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Using “TInterfaceType” we dynamically create a type definition for &lt;strong&gt;ChannelFactory&amp;lt;T&amp;gt;&lt;/strong&gt; using reflection, and then create an instance of it, on which we then call &lt;strong&gt;CreateChannel&lt;/strong&gt; which in turns returns us an instance of a type which implements &lt;strong&gt;TInterfaceType&lt;/strong&gt;. Once we have a “TInterfaceType” instance we then go ahead and invoke the specified “MethodName” with the parameters specified in the “Parameters” object[] property and get the result back which is typed to “TReturnType” and returned to the caller.&lt;/p&gt;
&lt;p&gt;Phew! that’s a mouthful and we are not done yet. For now just keep in mind that this template is merely a helper which encapsulates the details on dynamically invoking a WCF service in a strongly typed manner.&lt;/p&gt;
Now onto the main task of writing a template to solve our problem.&lt;br /&gt;
&lt;p&gt;Add another T4 template to the project and call it &lt;strong&gt;UserClass.tt&lt;/strong&gt;&lt;br /&gt;
&lt;img alt="T4_UserClass" src="http://gp6uig.bay.livefilestore.com/y1pxnWHffm5FACAV93QSMow_aDp-Q-Bv9A63pd46sqxABPdJh0NG2EEN_uIj9GXOI6qGW6gm_yDMMu9mZMT-SPKwQ/T4_UserClass.png" /&gt;&lt;br /&gt;
&lt;br /&gt;
As before delete the code from the .tt file and add the following:&lt;br /&gt;
 &lt;/p&gt;
&lt;div id="Div5" class="dp-highlighter"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol class="dp-xml"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;#@ assembly &lt;/span&gt;&lt;span class="attribute"&gt;name&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class="attribute-value"&gt;"System.ServiceModel"&lt;/span&gt;&lt;span&gt; #&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;#@ assembly &lt;/span&gt;&lt;span class="attribute"&gt;name&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class="attribute-value"&gt;"T4WCFService.dll"&lt;/span&gt;&lt;span&gt; #&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;#@ assembly &lt;/span&gt;&lt;span class="attribute"&gt;name&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span class="attribute-value"&gt;"System.ServiceModel"&lt;/span&gt;&lt;span&gt; #&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;#@ import &lt;/span&gt;&lt;span class="attribute"&gt;namespace&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"System.Collections.Generic"&lt;/span&gt;&lt;span&gt;#&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;#@ import &lt;/span&gt;&lt;span class="attribute"&gt;namespace&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"System.Reflection"&lt;/span&gt;&lt;span&gt;#&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;#@ import &lt;/span&gt;&lt;span class="attribute"&gt;namespace&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"System.ServiceModel.Channels"&lt;/span&gt;&lt;span&gt;#&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;#@ import &lt;/span&gt;&lt;span class="attribute"&gt;namespace&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"System.ServiceModel"&lt;/span&gt;&lt;span&gt;#&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;#@ import &lt;/span&gt;&lt;span class="attribute"&gt;namespace&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"T4WCFService"&lt;/span&gt;&lt;span&gt;#&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;#@ include &lt;/span&gt;&lt;span class="attribute"&gt;file&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"WCFServiceInvoker.tt"&lt;/span&gt;&lt;span&gt; #&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;using System.Collections.Generic;  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;namespace T4ClassFromDict  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    public class User  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;#  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        WCFServiceInvoker&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;IT4WCFService&lt;/span&gt;&lt;span&gt;,Dictionary&lt;/span&gt;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;string&lt;/span&gt;&lt;span&gt;,string&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="attribute"&gt;invoker&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span class="attribute-value"&gt;new&lt;/span&gt;&lt;span&gt; WCFServiceInvoker&lt;/span&gt;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;IT4WCFService&lt;/span&gt;&lt;span&gt;,Dictionary&lt;/span&gt;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;string&lt;/span&gt;&lt;span&gt;,string&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="attribute"&gt;invoker.EndPointAddress&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span class="attribute-value"&gt;"http://localhost:24551/Service1.svc/WsHttpT4Service"&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        &lt;span class="attribute"&gt;invoker.EndPointName&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span class="attribute-value"&gt;"WsHttpT4Service"&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="attribute"&gt;invoker.ServiceInterfaceType&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span class="attribute-value"&gt;typeof&lt;/span&gt;&lt;span&gt;(IT4WCFService);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        &lt;span class="attribute"&gt;invoker.Binding&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span class="attribute-value"&gt;new&lt;/span&gt;&lt;span&gt; WSHttpBinding();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="attribute"&gt;invoker.MethodName&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span class="attribute-value"&gt;"GetUser"&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        &lt;span class="attribute"&gt;invoker.Parameters&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span class="attribute-value"&gt;new&lt;/span&gt;&lt;span&gt; object[]{"jsmith"};      &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        Dictionary&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;string&lt;/span&gt;&lt;span&gt;,string&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="attribute"&gt;result&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span class="attribute-value"&gt;invoker&lt;/span&gt;&lt;span&gt;.InvokeMethod();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        #&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;         &lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;#foreach(KeyValuePair&lt;/span&gt;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;string&lt;/span&gt;&lt;span&gt;,string&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; item in result){  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;         #&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;         public &lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;#= item.Key.GetType().Name.ToLower()#&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;#=item.Key#&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;         {  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;             get;         &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;             set;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;         }  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;         &lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;#}#&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;           &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;         public static User GetUser(Dictionary&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;string&lt;/span&gt;&lt;span&gt;,string&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; dict)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;         {  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;             var &lt;span class="attribute"&gt;user&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span class="attribute-value"&gt;new&lt;/span&gt;&lt;span&gt; User();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;             foreach(KeyValuePair&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;string&lt;/span&gt;&lt;span&gt;,string&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; kvp in dict)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;             {  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                typeof(User).GetProperty(kvp.Key).SetValue(user,kvp.Value,null);                  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;             }  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;             return user;  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;         }  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;We've included the template file we created before so that we can reuse it to invoke any WCF Service.&lt;br /&gt;
We then proceed to create an instance of &lt;strong&gt;WCFServiceInvoker&lt;/strong&gt; and set it's properties to invoke the WCF service we've created.&lt;br /&gt;
The result of "invoker.InvokeMethod()" is a &lt;strong&gt;Dictionary&amp;lt;string,string&amp;gt;&lt;/strong&gt; which we then loop through creating public properties.&lt;br /&gt;
&lt;br /&gt;
We use the type of the Key as the type of the property and the Key itself as the property name.&lt;br /&gt;
 &lt;/p&gt;
&lt;p&gt;We've also created the definition of factory method which accepts a &lt;strong&gt;Dictionary&amp;lt;string,string&amp;gt;&lt;/strong&gt; and returns a &lt;strong&gt;User&lt;/strong&gt; object.&lt;/p&gt;
&lt;p&gt;Note that we've added a direct reference to the service assembly in this template so that we can get a reference to &lt;strong&gt;IT4WCFService&lt;/strong&gt;.&lt;br /&gt;
This is just to keep the example simple, ideally you would want to seperate the interface and implementation assemblies and have a reference to just the interface assembly.&lt;/p&gt;
&lt;p&gt;T4 templates are executed typically when saved or by right clicking on the .tt file and selecting "Run Custom Tool".&lt;br /&gt;
Before running the template, ensure that the WCF service is up and running.&lt;br /&gt;
&lt;br /&gt;
On running/saving the template, the following class definition is generated.&lt;br /&gt;
 &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div id="Div6" class="dp-highlighter"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;using&lt;/span&gt;&lt;span&gt; System.Collections.Generic;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&lt;span class="keyword"&gt;namespace&lt;/span&gt;&lt;span&gt; T4ClassFromDict  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; User  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                           &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;         &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Name  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;         {  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;             &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;;         &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;             &lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;         }  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;         &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Age  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;         {  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;             &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;;         &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;             &lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;         }  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;         &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; City  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;         {  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;             &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;;         &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;             &lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;         }  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;         &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; State  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;         {  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;             &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;;         &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;             &lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;         }  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;         &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Zip  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;         {  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;             &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;;         &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;             &lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;         }  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;         &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Country  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;         {  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;             &lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;;         &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;             &lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;         }  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                   &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;         &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; User GetUser(Dictionary&amp;lt;&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;&amp;gt; dict)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;         {  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;             var user = &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; User();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;             &lt;span class="keyword"&gt;foreach&lt;/span&gt;&lt;span&gt;(KeyValuePair&amp;lt;&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;&amp;gt; kvp &lt;/span&gt;&lt;span class="keyword"&gt;in&lt;/span&gt;&lt;span&gt; dict)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;             {  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                &lt;span class="keyword"&gt;typeof&lt;/span&gt;&lt;span&gt;(User).GetProperty(kvp.Key).SetValue(user,kvp.Value,&lt;/span&gt;&lt;span class="keyword"&gt;null&lt;/span&gt;&lt;span&gt;);                  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;             }  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;             &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; user;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;         }  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;A client can then use the generates class as follows:&lt;br /&gt;
 &lt;/p&gt;
&lt;div id="Div7" class="dp-highlighter"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;using&lt;/span&gt;&lt;span&gt; System;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&lt;span class="keyword"&gt;using&lt;/span&gt;&lt;span&gt; System.Collections.Generic;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;using&lt;/span&gt;&lt;span&gt; System.Linq;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&lt;span class="keyword"&gt;using&lt;/span&gt;&lt;span&gt; System.Text;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;using&lt;/span&gt;&lt;span&gt; System.Net;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&lt;span class="keyword"&gt;using&lt;/span&gt;&lt;span&gt; System.IO;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;using&lt;/span&gt;&lt;span&gt; System.ServiceModel;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&lt;span class="keyword"&gt;using&lt;/span&gt;&lt;span&gt; T4WCFService;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;using&lt;/span&gt;&lt;span&gt; System.Reflection;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&lt;span class="keyword"&gt;namespace&lt;/span&gt;&lt;span&gt; T4ClassFromDict  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;{    &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; Program  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; Foo { &lt;/span&gt;&lt;span class="keyword"&gt;get&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span class="keyword"&gt;set&lt;/span&gt;&lt;span&gt;; }  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Main(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;[] args)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;        {            &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            var client = &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; T4Service.T4WCFServiceClient(&lt;/span&gt;&lt;span class="string"&gt;"WsHttpT4Service"&lt;/span&gt;&lt;span&gt;);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;            var data = User.GetUser(client.GetUser(&lt;span class="string"&gt;"jsmith"&lt;/span&gt;&lt;span&gt;));  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        }  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
NOTE: The console app hosting the project has a direct project reference to WCF service project since it needs the &lt;strong&gt;IT4WCFService&lt;/strong&gt; definition. and since T4 engine is running inside Visual studio it locks the assembly, so rebuilding the WCF service after template generation does not work.&lt;br /&gt;
As mentioned previously the solution to this is to have seperate assemblies for the interface and service implementation. &lt;br /&gt;
&lt;a href="http://cid-63b8402f37be7dd6.skydrive.live.com/self.aspx/Public/UTIOC/T4ClassFromDict.zip"&gt;Download Code&lt;/a&gt;&lt;/div&gt; &lt;img src="http://geekswithblogs.net/abhijeetp/aggbug/135525.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Abhijeet Patel</dc:creator>
            <guid>http://geekswithblogs.net/abhijeetp/archive/2009/10/18/t4-template-consuming-a-wcf-service.aspx</guid>
            <pubDate>Sun, 18 Oct 2009 07:06:49 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/abhijeetp/comments/135525.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/abhijeetp/archive/2009/10/18/t4-template-consuming-a-wcf-service.aspx#feedback</comments>
            <slash:comments>17</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/abhijeetp/comments/commentRss/135525.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/abhijeetp/services/trackbacks/135525.aspx</trackback:ping>
        </item>
        <item>
            <title>Why no Anonymous Iterators in C#</title>
            <category>C#</category>
            <link>http://geekswithblogs.net/abhijeetp/archive/2009/08/24/why-no-anonymous-iterators-in-c.aspx</link>
            <description>&lt;link type="text/css" rel="stylesheet" href="customcss.ashx.css" /&gt;
&lt;div class="defaultText"&gt;
&lt;p&gt;Yes I’m a language geek and yes the awesome  &lt;a target="_blank" href="http://blogs.msdn.com/ericlippert/default.aspx" title="Eric Lippert"&gt;Eric Lippert&lt;/a&gt; is my idol when it comes to anything C# and the CLR, I’ve been following his blog for a long time and recently Eric wrote an awesome series on the how and why of &lt;a target="_blank" href="http://blogs.msdn.com/ericlippert/archive/tags/Iterators/default.aspx"&gt; Iterator Blocks&lt;/a&gt;. The entire series is very well worth a read, but then again I’d read almost anything Eric writes from why the sky is blue to why the &lt;a target="_blank" href="http://en.wikipedia.org/wiki/Falkirk_Wheel"&gt;Falkirk Wheel&lt;/a&gt; has &lt;a target="_blank" href="http://blogs.msdn.com/ericlippert/archive/2009/03/05/what-are-the-horns-for.aspx"&gt;horns&lt;/a&gt;.  &lt;/p&gt;
&lt;p&gt; I had posed a question on &lt;a target="_blank" href="http://blogs.msdn.com/ericlippert/archive/2009/07/23/iterator-blocks-part-five-push-vs-pull.aspx"&gt;this post&lt;/a&gt; about why there are no anonymous iterators in C#. Eric provided a very good answer to that comment and I was highly flattered when he did a follow up post on this very question &lt;a target="_blank" href="http://blogs.msdn.com/ericlippert/archive/2009/08/24/iterator-blocks-part-seven-why-no-anonymous-iterators.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Thanks Eric!&lt;/p&gt;
&lt;/div&gt; &lt;img src="http://geekswithblogs.net/abhijeetp/aggbug/134297.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Abhijeet Patel</dc:creator>
            <guid>http://geekswithblogs.net/abhijeetp/archive/2009/08/24/why-no-anonymous-iterators-in-c.aspx</guid>
            <pubDate>Tue, 25 Aug 2009 04:55:53 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/abhijeetp/comments/134297.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/abhijeetp/archive/2009/08/24/why-no-anonymous-iterators-in-c.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/abhijeetp/comments/commentRss/134297.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/abhijeetp/services/trackbacks/134297.aspx</trackback:ping>
        </item>
        <item>
            <title>Creating Higher Level APIs with TPL</title>
            <category>C#</category>
            <category>Parallellism</category>
            <link>http://geekswithblogs.net/abhijeetp/archive/2009/08/23/creating-higher-level-apis-with-tpl.aspx</link>
            <description>&lt;link href="customcss.ashx.css" rel="stylesheet" type="text/css" /&gt;
&lt;div class="defaultText"&gt;
&lt;p&gt;         The BCL has a bunch of APIs which provide asynchronous versions of operations         in the form of either Beginxxx/Endxxx or XyzCompleted, the former known as Asynchronous         Programming Model(APM) and the latter known as Event Based Asynchronous Pattern (EAP). TPL provides a nice abstraction for performing asynchronous operations         as Tasks using delegates, but what can you do for working with these existing BCL         classes which already have an async version?         &lt;br /&gt;
&lt;/p&gt;
Here is an example.&lt;br /&gt;
Let's say we need to download some data from the web and save         it to a file, you would typically use the WebClient class and write something like         this today (wrapped in a method of course)&lt;br /&gt;
&lt;div id="hlDiv" class="dp-highlighter"&gt;
&lt;div class="bar"&gt;             &lt;/div&gt;
&lt;ol class="dp-c" start="1"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt;WebClient client = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; WebClient();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;           client.DownloadDataAsync(&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Uri(&lt;/span&gt;&lt;span class="string"&gt;"http://www.bing.com"&lt;/span&gt;&lt;span&gt;));  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           client.DownloadDataCompleted += &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; DownloadDataCompletedEventHandler((s, e) =&amp;gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;           {  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;               &lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt; (e.Error != &lt;/span&gt;&lt;span class="keyword"&gt;null&lt;/span&gt;&lt;span&gt;)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;               {  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                   &lt;span class="keyword"&gt;throw&lt;/span&gt;&lt;span&gt; e.Error;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;               }  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;               &lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt; (!e.Cancelled)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;               {  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                   &lt;span class="keyword"&gt;using&lt;/span&gt;&lt;span&gt; (FileStream fs = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; FileStream(&lt;/span&gt;&lt;span class="string"&gt;"bing.htm"&lt;/span&gt;&lt;span&gt;, FileMode.CreateNew))  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;                   {  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                       fs.Write(e.Result,0,e.Result.Length);  &lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;                       fs.Flush();  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                       fs.Close();  &lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;                   }  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;               }  &lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;           }  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           );  &lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;           Console.Read();  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;         Yuck not very pretty is it! It's kinda smelly and looking at the code, it doesn't really capture the essense of what         we are trying to do, besides if the client were to call a method which does this work, we'd have to ensure that the         client thread blocks till the continuation completes or conversely provide a mechanism such as a &lt;a href="http://www.google.com/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Fmsdn.microsoft.com%2Fen-us%2Flibrary%2Fsystem.threading.waithandle.aspx&amp;amp;ei=TqCRSrGYOZTUsQP-wJUM&amp;amp;rct=j&amp;amp;q=WaitHandle&amp;amp;usg=AFQjCNFjJsyAFFW6wIQh24LymNnqTKAtvg"&gt;WaitHandle&lt;/a&gt;         that the client can wait on, not very expressive is it?         &lt;/p&gt;
&lt;br /&gt;
Let's see how we can achieve the same results using the Task API.
&lt;div id="Div1" class="dp-highlighter"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol class="dp-c" start="1"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; TaskCompletionSource&amp;lt;&lt;/span&gt;&lt;span class="keyword"&gt;byte&lt;/span&gt;&lt;span&gt;[]&amp;gt; CreateSource(&lt;/span&gt;&lt;span class="keyword"&gt;object&lt;/span&gt;&lt;span&gt; state)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; TaskCompletionSource&amp;lt;&lt;/span&gt;&lt;span class="keyword"&gt;byte&lt;/span&gt;&lt;span&gt;[]&amp;gt;(state);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;&lt;span class="keyword"&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; SetCompletionSource&amp;lt;T&amp;gt;(  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    TaskCompletionSource&amp;lt;T&amp;gt; tcs,  &lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;    AsyncCompletedEventArgs e,  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    Func&amp;lt;T&amp;gt; getResult)  &lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt; (e.UserState == tcs)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt; (e.Cancelled)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;            tcs.TrySetCanceled();  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;else&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;            &lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt; (e.Error != &lt;/span&gt;&lt;span class="keyword"&gt;null&lt;/span&gt;&lt;span&gt;) tcs.TrySetException(e.Error);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;else&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;            tcs.TrySetResult(getResult());  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; Task&amp;lt;&lt;/span&gt;&lt;span class="keyword"&gt;byte&lt;/span&gt;&lt;span&gt;[]&amp;gt; DownloadBytesTask(&lt;/span&gt;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span&gt; WebClient webClient, &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; uri)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;    var source = CreateSource(uri);  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    DownloadDataCompletedEventHandler handler = &lt;span class="keyword"&gt;null&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;    handler = (&lt;span class="keyword"&gt;object&lt;/span&gt;&lt;span&gt; s, DownloadDataCompletedEventArgs e) =&amp;gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;        SetCompletionSource(source, e, () =&amp;gt; e.Result);  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        webClient.DownloadDataCompleted -= handler;  &lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;    };  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    webClient.DownloadDataAsync(&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Uri(uri), source);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;    webClient.DownloadDataCompleted += handler;  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; source.Task;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;         We've wrapped up the async network operation into a Task as an extension method.&lt;br /&gt;
Let's dig in a little... &lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;         In DownloadBytesTask, we first create a &lt;a href="http://www.google.com/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=3&amp;amp;url=http%3A%2F%2Fmsdn.microsoft.com%2Fen-us%2Flibrary%2Fdd449174%2528VS.100%2529.aspx&amp;amp;ei=zpqRSpXxOIiAswOjl7UL&amp;amp;rct=j&amp;amp;q=taskcompletionsource&amp;amp;usg=AFQjCNG1IfqT2AE-mfpzaZ1egZ3j883juA"&gt;TaskCompletionSource&lt;/a&gt;         which provides a mechanism to create a Task to hand out to consumers such that the         only legal state modification to the Task can be performed via the methods available         on the TaskCompletionSource itself and not on the instance of the Task directly,         this is precisely the behavior needed for a Task that is downloading content from the web         asynchronously;it doesn't make sense for the client to explicitly start such a Task which has already started          downloading data and such an operation should really be considered illegal, TaskCompletionSource enables this behavior. &lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;         In the callback we call SetCompletionSource which is responsible for transitioning         the state of the Task based on the results of the asynchronous operation such as whether it errored out, or completed         or whether it was cancelled.         &lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;         We then proceed to start the asynchronous download by calling DownloadDataAsync method of the WebClient instance.&lt;br /&gt;
&lt;br /&gt;
Couple of things to note:&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;             The callback has been unhooked from the event in the callback to ensure that we don't have a memory leak.            &lt;/li&gt;
    &lt;li&gt;            The Task has already started since "DownloadDataAsync" has already been invoked, and it is this started Task that            we return from the method.            &lt;/li&gt;
&lt;/ul&gt;
The client can now perform the asynchronous download and saving of content like so:&lt;br /&gt;
&lt;div id="Div2" class="dp-highlighter"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol class="dp-c" start="1"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt; Program  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        &lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; Task WriteToFileTask(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; fileName, &lt;/span&gt;&lt;span class="keyword"&gt;byte&lt;/span&gt;&lt;span&gt;[] bytes)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            FileStream fs = &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; FileStream(fileName, FileMode.CreateNew);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;            var task = Task.Factory.FromAsync(fs.BeginWrite, fs.EndWrite, bytes, 0, bytes.Length, &lt;span class="keyword"&gt;null&lt;/span&gt;&lt;span&gt;);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; task;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;        }  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; Main(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;[] args)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;            WebClient wc = &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; WebClient();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            var task = wc.DownloadBytesTask(&lt;span class="string"&gt;"http://www.bing.com/"&lt;/span&gt;&lt;span&gt;);                                     &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;            var continuationTask = task.ContinueWith(a =&amp;gt; WriteToFileTask(&lt;span class="string"&gt;"bing.htm"&lt;/span&gt;&lt;span&gt;, a.Result));  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;            continuationTask.Wait();              &lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;        }  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;         The DownloadBytes extension method on the WebClient returns a Task which has already started, we then  specify          a &lt;strong&gt;continuation&lt;/strong&gt; to execute "after" the Task completes by calling the "ContinueWith" method on the Task         instance which in this case is itself a Task which works on the result of the antecedent task (a byte[])          obtained by calling the "WriteToFileTask" method which is responsible for writing out the byte[] to a file.&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt; It's important to note that we have to wait for the "continuation" to          complete by calling continuationTask.Wait(), otherwise the process will terminate since we are running on a console app.         The same would hold true in case of a Webforms client since the calling Page would continue processing and not wait         for the Task to complete.         &lt;/p&gt;
Notice how the client code seems pretty terse in terms of expressing the intent. One can easily read the code and          figure out what's going on.&lt;br /&gt;
As always happy coding!     &lt;/div&gt; &lt;img src="http://geekswithblogs.net/abhijeetp/aggbug/134268.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Abhijeet Patel</dc:creator>
            <guid>http://geekswithblogs.net/abhijeetp/archive/2009/08/23/creating-higher-level-apis-with-tpl.aspx</guid>
            <pubDate>Sun, 23 Aug 2009 22:46:02 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/abhijeetp/comments/134268.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/abhijeetp/archive/2009/08/23/creating-higher-level-apis-with-tpl.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/abhijeetp/comments/commentRss/134268.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/abhijeetp/services/trackbacks/134268.aspx</trackback:ping>
        </item>
    </channel>
</rss>
