<feed 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="http://www.w3.org/2005/Atom" xml:lang="en-US">
    <title>Under The Influence(of code)</title>
    <link rel="self" type="application/xml" href="http://geekswithblogs.net/abhijeetp/Atom.aspx" />
    <subtitle type="html">Abhijeet Patel's blog</subtitle>
    <id>http://geekswithblogs.net/abhijeetp/Default.aspx</id>
    <author>
        <name>Abhijeet Patel</name>
        <uri>http://geekswithblogs.net/abhijeetp/Default.aspx</uri>
    </author>
    <generator uri="http://subtextproject.com" version="Subtext Version 0.0.0.0">Subtext</generator>
    <updated>2009-11-14T16:22:29Z</updated>
    <entry>
        <title>T4 template consuming a WCF service</title>
        <link rel="self" type="text/html" href="http://geekswithblogs.net/abhijeetp/archive/2009/10/18/t4-template-consuming-a-wcf-service.aspx" />
        <id>http://geekswithblogs.net/abhijeetp/archive/2009/10/18/t4-template-consuming-a-wcf-service.aspx</id>
        <published>2009-10-18T00:06:49-07:00:00</published>
        <updated>2009-10-19T08:41:44Z</updated>
        <content type="html">&lt;link type="text/css" rel="stylesheet" href="customcss.ashx.css" /&gt;
&lt;div class="defaultText"&gt; It’s been a while since I’ve blogged and but I have a valid excuse; I moved to WA state recently and 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 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;class&lt;/span&gt;&lt;span&gt; User  &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 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 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 class=""&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 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;using&lt;/span&gt;&lt;span&gt; System;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&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 class=""&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 class=""&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 class=""&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 class=""&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 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;        [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 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;
and its implementation...&lt;br /&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 class="keyword"&gt;using&lt;/span&gt;&lt;span&gt; System;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&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 class=""&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 class=""&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 class=""&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 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; 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 class=""&gt;&lt;span&gt;&lt;span class="preprocessor"&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 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; 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 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; (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 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; 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 class=""&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 class=""&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 class=""&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 class=""&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 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;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 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; 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 class=""&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 class=""&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 class=""&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 class=""&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 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; 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 class=""&gt;&lt;span&gt;        }  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="preprocessor"&gt;&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&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 class=""&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 class="dp-highlighter" id="Div3"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol start="1" 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 class=""&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 class=""&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 class=""&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 class=""&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 class=""&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 class=""&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 class=""&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 class=""&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 class=""&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 class=""&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 class=""&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 class=""&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 class=""&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 class=""&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 class=""&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 src="http://gp6uig.bay.livefilestore.com/y1pH4gEhJsrQ7D61CSACzHPcK1UxcASBsBWX7ptqSRbNwFV9JYBhpY53POkxiTmotKCkYqzuqrAjNd3Ftj9yJvdUg/T4_WCFServiceInvoker.png" alt="T4_WCFServiceInvoker" title="T4_WCFServiceInvoker" /&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 class="dp-highlighter" id="Div4"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol start="1" 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 class=""&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 class=""&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 class=""&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 class=""&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 class=""&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 class=""&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 class=""&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 class=""&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 class=""&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 class=""&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 class=""&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 class=""&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 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="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 src="http://gp6uig.bay.livefilestore.com/y1pxnWHffm5FACAV93QSMow_aDp-Q-Bv9A63pd46sqxABPdJh0NG2EEN_uIj9GXOI6qGW6gm_yDMMu9mZMT-SPKwQ/T4_UserClass.png" alt="T4_UserClass" /&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 class="dp-highlighter" id="Div5"&gt;
&lt;div class="bar"&gt; &lt;/div&gt;
&lt;ol start="1" 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 class=""&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 class=""&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 class=""&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 class=""&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 class=""&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 class=""&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 class=""&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 class=""&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 class=""&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 class=""&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 class=""&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 class=""&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 class=""&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 class=""&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 class=""&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 class=""&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 class=""&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 class=""&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 class=""&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 class=""&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 class=""&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 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;
&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 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;using&lt;/span&gt;&lt;span&gt; System.Collections.Generic;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&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 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; 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 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 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;string&lt;/span&gt;&lt;span&gt; Age  &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;string&lt;/span&gt;&lt;span&gt; City  &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;string&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;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;string&lt;/span&gt;&lt;span&gt; Zip  &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;string&lt;/span&gt;&lt;span&gt; Country  &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;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 class=""&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 class=""&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 class=""&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 class=""&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 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 client can then use the generates class as follows:&lt;br /&gt;
&lt;/p&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;using&lt;/span&gt;&lt;span&gt; System;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&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 class=""&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 class=""&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 class=""&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 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;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 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 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 class=""&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 class=""&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 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;/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;</content>
        <wfw:comment>http://geekswithblogs.net/abhijeetp/comments/135525.aspx</wfw:comment>
        <slash:comments>7</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>
    </entry>
    <entry>
        <title>Why no Anonymous Iterators in C#</title>
        <link rel="self" type="text/html" href="http://geekswithblogs.net/abhijeetp/archive/2009/08/24/why-no-anonymous-iterators-in-c.aspx" />
        <id>http://geekswithblogs.net/abhijeetp/archive/2009/08/24/why-no-anonymous-iterators-in-c.aspx</id>
        <published>2009-08-24T21:55:53-07:00:00</published>
        <updated>2009-08-24T21:58:50Z</updated>
        <content type="html">&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;</content>
        <wfw:comment>http://geekswithblogs.net/abhijeetp/comments/134297.aspx</wfw:comment>
        <slash:comments>0</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>
    </entry>
    <entry>
        <title>Creating Higher Level APIs with TPL</title>
        <link rel="self" type="text/html" href="http://geekswithblogs.net/abhijeetp/archive/2009/08/23/creating-higher-level-apis-with-tpl.aspx" />
        <id>http://geekswithblogs.net/abhijeetp/archive/2009/08/23/creating-higher-level-apis-with-tpl.aspx</id>
        <published>2009-08-23T15:46:02-07:00:00</published>
        <updated>2009-08-23T16:02:40Z</updated>
        <content type="html">&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;</content>
        <wfw:comment>http://geekswithblogs.net/abhijeetp/comments/134268.aspx</wfw:comment>
        <slash:comments>0</slash: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>
    </entry>
    <entry>
        <title>CLR via C# 3rd Edition</title>
        <link rel="self" type="text/html" href="http://geekswithblogs.net/abhijeetp/archive/2009/08/16/clr-via-c-3rd-edition.aspx" />
        <id>http://geekswithblogs.net/abhijeetp/archive/2009/08/16/clr-via-c-3rd-edition.aspx</id>
        <published>2009-08-16T15:06:25-07:00:00</published>
        <updated>2009-08-16T15:07:28Z</updated>
        <content type="html">&lt;link type="text/css" rel="stylesheet" href="customcss.ashx.css" /&gt;
&lt;div class="defaultText"&gt;
&lt;p&gt;Some book news…Jeff Richter is one of my favorite authors and I’ll read just about anything he writes. His last book &lt;a target="_blank" href="http://www.amazon.com/CLR-via-Second-Pro-Developer/dp/0735621632/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1250452783&amp;amp;sr=8-1"&gt;CLR via C#, 2nd Edition&lt;/a&gt; left me wanting more, luckily Jeff has signed into a contract for writing a &lt;a target="_blank" href="http://www.wintellect.com/CS/blogs/jeffreyr/archive/2009/06/17/clr-via-c-3rd-edition.aspx"&gt;3rd edition&lt;/a&gt; of the book updated for C#3.0/4.0 and .NET 4.0&lt;/p&gt;
&lt;/div&gt;&lt;img src="http://geekswithblogs.net/abhijeetp/aggbug/134120.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://geekswithblogs.net/abhijeetp/comments/134120.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://geekswithblogs.net/abhijeetp/comments/commentRss/134120.aspx</wfw:commentRss>
        <trackback:ping>http://geekswithblogs.net/abhijeetp/services/trackbacks/134120.aspx</trackback:ping>
    </entry>
    <entry>
        <title>Retrieving Added Entities from the ObjectStateManager to avoid duplication</title>
        <link rel="self" type="text/html" href="http://geekswithblogs.net/abhijeetp/archive/2009/07/23/retrieving-added-entities-from-the-objectstatemanager-to-avoid-duplication.aspx" />
        <id>http://geekswithblogs.net/abhijeetp/archive/2009/07/23/retrieving-added-entities-from-the-objectstatemanager-to-avoid-duplication.aspx</id>
        <published>2009-07-23T01:41:23-07:00:00</published>
        <updated>2009-07-23T01:48:33Z</updated>
        <content type="html">&lt;link href="customcss.ashx.css" rel="stylesheet" type="text/css" /&gt;
&lt;div class="defaultText"&gt;             Let's say we neede to process a bunch of entities coming from an XML file, create             EDM entites for each XML element and eventually persist them. Very trivial to accomplish             using a little bit of LINQ.&lt;br /&gt;
&lt;p&gt;                 &lt;/p&gt;
&lt;div class="dp-highlighter" id="Div7"&gt;
&lt;div class="bar"&gt;                     &lt;/div&gt;
&lt;ol start="1" 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;Roles&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=""&gt;&lt;span&gt;  &lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;Role&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;"Admin"&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;Role&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;"Reader"&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=""&gt;&lt;span&gt;  &lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;Role&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;"Writer"&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;Roles&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;br /&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 start="1" class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt;var doc = XDocument.Load(&lt;/span&gt;&lt;span class="string"&gt;"Roles.xml"&lt;/span&gt;&lt;span&gt;);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;                                 &lt;span&gt;var roles = doc.Element(&lt;span class="string"&gt;"Roles"&lt;/span&gt;&lt;span&gt;).Elements(&lt;/span&gt;&lt;span class="string"&gt;"Role"&lt;/span&gt;&lt;span&gt;).Select(x =&amp;gt; &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Role { RoleName = (&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;)x.Attribute(&lt;/span&gt;&lt;span class="string"&gt;"name"&lt;/span&gt;&lt;span&gt;) });  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;PermissionsAPIContext context = &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; PermissionsAPIContext();  &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;foreach&lt;/span&gt;&lt;span&gt; (var role &lt;/span&gt;&lt;span class="keyword"&gt;in&lt;/span&gt;&lt;span&gt; roles)  &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;  context.AddToRoleSet(role);  &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;context.Savechanges()  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
But wait, let's make this a little interesting...&lt;br /&gt;
&lt;p&gt;                             &lt;/p&gt;
&lt;div class="dp-highlighter" id="Div8"&gt;
&lt;div class="bar"&gt;                     &lt;/div&gt;
&lt;ol start="1" 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;Roles&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=""&gt;&lt;span&gt;  &lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;Role&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;"Admin"&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;Role&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;"Reader"&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=""&gt;&lt;span&gt;  &lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;Role&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;"Writer"&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;Role&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;"Reader"&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=""&gt;&lt;span&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag-name"&gt;Roles&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;
See the problem now? If we process the above XML using the code from before, we             end up adding the same entity twice!&lt;br /&gt;
So what do we do now?             &lt;br /&gt;
ObjectStateManager to the rescue, let's rewrite the piece of code as follows:&lt;br /&gt;
&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;var doc = XDocument.Load(&lt;/span&gt;&lt;span class="string"&gt;"Roles.xml"&lt;/span&gt;&lt;span&gt;);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;                                 &lt;span&gt;var roles = doc.Element(&lt;span class="string"&gt;"Roles"&lt;/span&gt;&lt;span&gt;).Elements(&lt;/span&gt;&lt;span class="string"&gt;"Role"&lt;/span&gt;&lt;span&gt;).Select(x =&amp;gt; (&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;)x.Attribute(&lt;/span&gt;&lt;span class="string"&gt;"name"&lt;/span&gt;&lt;span&gt;));  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;                                             &lt;span&gt;PermissionsAPIContext context = &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; PermissionsAPIContext();  &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 role &lt;/span&gt;&lt;span class="keyword"&gt;in&lt;/span&gt;&lt;span&gt; roles)  &lt;/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;   Role roleEntity = GetRole(role, context);  &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; (roleEntity.EntityState == EntityState.Added || roleEntity.EntityState == EntityState.Detached)  &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;      context.AddToRoleSet(roleEntity);  &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;context.SaveChanges();  &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;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; Role GetRole(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; roleName,PermissionsAPIContext context)  &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="comment"&gt;//NOTE: we could have used string.Compare(r.RoleName,roleName,true) == 0 inside the body of the lambda as a cleaner &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="comment"&gt;//way to do this but this translates to some pretty snarly and inefficient SQL!&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    var roleEntity = context.RoleSet.FirstOrDefault(r =&amp;gt; r.RoleName.Trim().ToLower() == roleName.Trim().ToLower());  &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; (roleEntity == &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 class=""&gt;&lt;span&gt;           var stateEntries = context.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EtityState.Modified | EntityState.Unchanged);  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           var roleEntityEntries = stateEntries.Select(s =&amp;gt; s.Entity).OfType&amp;lt;Role&amp;gt;();  &lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;           roleEntity = roleEntityEntries.FirstOrDefault(r =&amp;gt; r.RoleName.Trim().ToLower() == roleName.Trim().ToLower());  &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; (roleEntity == &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;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Role { RoleName = roleName };  &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;return&lt;/span&gt;&lt;span&gt; roleEntity;  &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;
A few of things note worthy here&lt;br /&gt;
1) In GetRoles() we first query the ObjectContext to check whether there is already                a role present with the given name, if so we  &lt;br /&gt;
    simply return a reference to the existing                entity instance             &lt;br /&gt;
2) If the role is not existing then we check to see whether a role with the given                name was added to the context, if so then we just &lt;br /&gt;
    get a handle to this previously                added(but not yet persisted) role and return that. &lt;br /&gt;
3) If the role is not existing and was not added previously then we create a new Role entity and return.&lt;br /&gt;
4) The caller checks whether the returned entity is an existing one and if not it's added                to the ObjectContext.&lt;br /&gt;
&lt;br /&gt;
After we are done processing all entities, we save all entities and we are done.             &lt;br /&gt;
&lt;br /&gt;
The above mechanism allows us to safely sidestep duplicates while processing based             on some equality rule(which in this case happens to be the role name).&lt;br /&gt;
&lt;br /&gt;
Hope this helps.     &lt;/div&gt;&lt;img src="http://geekswithblogs.net/abhijeetp/aggbug/133662.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://geekswithblogs.net/abhijeetp/comments/133662.aspx</wfw:comment>
        <slash:comments>1</slash:comments>
        <wfw:commentRss>http://geekswithblogs.net/abhijeetp/comments/commentRss/133662.aspx</wfw:commentRss>
        <trackback:ping>http://geekswithblogs.net/abhijeetp/services/trackbacks/133662.aspx</trackback:ping>
    </entry>
    <entry>
        <title>Inside TPL video</title>
        <link rel="self" type="text/html" href="http://geekswithblogs.net/abhijeetp/archive/2009/07/17/inside-tpl-video.aspx" />
        <id>http://geekswithblogs.net/abhijeetp/archive/2009/07/17/inside-tpl-video.aspx</id>
        <published>2009-07-17T14:36:56-07:00:00</published>
        <updated>2009-07-17T14:39:40Z</updated>
        <content type="html">&lt;link href="customcss.ashx.css" rel="stylesheet" type="text/css" /&gt;
&lt;div class="defaultText"&gt;
&lt;p&gt;No code today. Instead, here is a link to a &lt;a href="http://beta.channel9.msdn.com/shows/Going+Deep/Joe-Duffy-Huseyin-Yildiz-Daan-Leijen-Stephen-Toub-Parallel-Extensions-Inside-the-Task-Parallel/" target="_blank"&gt;great video&lt;/a&gt; from Channel9 I found, which takes a deep dive into the underlying mechanics of how TPL does what it does and some of the enhancements that the thread pool has undergone.  Albeit a year old, this video goes into details of the work stealing algorithm and local thread queues that helps increase throughput.&lt;/p&gt;
&lt;p&gt;From the perspective of being a consumer of TPL, you can be blissfully ignorant of what happens behind the scenes, but understanding the mechanics and some of the design decisions that the team made can help gain a deeper appreciation of TPL which ultimately can help write more thoughtful code. &lt;/p&gt;
&lt;p&gt;I was impressed by the clarity in which the concepts were presented and explained.  Plan on setting aside about an hour to watch this video, but every minute is time well spent!&lt;/p&gt;
&lt;/div&gt;&lt;img src="http://geekswithblogs.net/abhijeetp/aggbug/133561.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://geekswithblogs.net/abhijeetp/comments/133561.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://geekswithblogs.net/abhijeetp/comments/commentRss/133561.aspx</wfw:commentRss>
        <trackback:ping>http://geekswithblogs.net/abhijeetp/services/trackbacks/133561.aspx</trackback:ping>
    </entry>
    <entry>
        <title>Performing multiple Asynchronous Actions using TPL</title>
        <link rel="self" type="text/html" href="http://geekswithblogs.net/abhijeetp/archive/2009/06/17/performing-multiple-asynchronous-actions-using-tpl.aspx" />
        <id>http://geekswithblogs.net/abhijeetp/archive/2009/06/17/performing-multiple-asynchronous-actions-using-tpl.aspx</id>
        <published>2009-06-17T00:50:50-07:00:00</published>
        <updated>2009-11-14T16:22:29Z</updated>
        <content type="html">&lt;p&gt;
&lt;/p&gt;&lt;link type="text/css" rel="stylesheet" href="customcss.ashx.css" /&gt;
&lt;div class="defaultText"&gt;
&lt;p&gt;I finally had a chance to install VS2010 Beta 1.Full instruction on how to &lt;a href="http://channel9.msdn.com/shows/10-4/10-4-Episode-20-Downloading-and-Installing-Visual-Studio-2010-Beta-1/"&gt;here&lt;/a&gt;  &lt;br /&gt;
VS2010 has undergone a major overhaul since VS 2008, a peek are some of the cool new eye candy can be              found &lt;a href="http://blogs.msdn.com/jasonz/archive/2009/05/18/announcing-vs2010-net-framework-4-0-beta-1.aspx"&gt;here&lt;/a&gt; &lt;br /&gt;
I've been waiting to get my hands on the TPL/PLINQ stuff and the Beta was definitely worth the wait.             In a &lt;a href="http://geekswithblogs.net/abhijeetp/archive/2009/03/29/performing-multiple-asynchronous-actions-for-long-running-operations.aspx"&gt;previous post&lt;/a&gt; we talked about using asynchronous actions for performing long running operations.&lt;/p&gt;
&lt;p&gt;I was anxious to see how the new TPL stuff would help in achieving the same thing.&lt;/p&gt;
&lt;p&gt;Interestingly enough, the TPL API is based on Actions as well, allowing both the generic and non-generic versions to be              used for creating a Task(also supports Funcs).&lt;/p&gt;
&lt;p&gt;The Thread pool has undergone some major rework, especially the scheduling algorithm is much more smarter now than the              current implementation in.NET 3.5 &lt;/p&gt;
&lt;p&gt;The unit of abstraction is a Task as opposed to a Thread, so let's dive in and see how this looks and feels as opposed to              the abstraction we previously built for asynchronous Actions.             In the simplest form, the equivalent declaration for creating a Task that can execute an Action asynchronously looks like so:&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;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;void&lt;/span&gt;&lt;span&gt; SomeMethod()  &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="comment"&gt;// do something here....&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;     Console.WriteLine(&lt;span class="string"&gt;"In some method"&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&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;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 task = Task.Factory.StartNew(SomeMethod);  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;   task.Wait();  &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;You start a task and Wait for it to complete. Lets create a bunch of these tasks to execute on the GetUsers(), GetCountries()              and GetLanguages() method from the previous post.&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&gt;Task[] tasks = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Task[]  &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;   Task.Factory.StartNew(() =&amp;gt; countries = GetCountries()),  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;   Task.Factory.StartNew(() =&amp;gt; countries = GetUsers()),  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;   Task.Factory.StartNew(() =&amp;gt; countries = GetLanguages())  &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;Task.WaitAll(tasks);  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;This looks fairly similar from a usage persepctive to what we had for executing asynchronous actions&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;List&amp;lt;Action&amp;gt; actions = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; List&amp;lt;Action&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;    () =&amp;gt; countries = GetCountries(),  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;    () =&amp;gt; users = GetUsers(),  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;    () =&amp;gt; languages = GetLanguages(),  &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;actions.ExecAsync();  &lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;One obviously noticeable difference in using the Task is that you use the Factory method StartNew to create and execute the task at the point of declaration,              and what you get back is a handle to the executing Task. So the Task[] contains a handle to all the executing tasks. &lt;br /&gt;
The ExecAsync extension method on the other hand is passed a collection of Actions to execute. I find the idea of being able to create             and execute the Task in one statement very useful and terse. &lt;/p&gt;
Let's now compare the performance of executing Actions using Tasks v/s executing Actions using The ExecAsync()&lt;br /&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;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&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; &lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt; ExecAsync(&lt;/span&gt;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span&gt; IEnumerable&amp;lt;Action&amp;gt; actions)  &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; count = 0;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;           AutoResetEvent[] events = &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; AutoResetEvent[actions.Count()];  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           IAsyncResult[] results = &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; IAsyncResult[actions.Count()];  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&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; events.Length; i++)  &lt;/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;               events[i] = &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; AutoResetEvent(&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="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;foreach&lt;/span&gt;&lt;span&gt; (var action &lt;/span&gt;&lt;span class="keyword"&gt;in&lt;/span&gt;&lt;span&gt; actions)  &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; localCount = count;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;               results[count++] =  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                   action.BeginInvoke((r) =&amp;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;try&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;if&lt;/span&gt;&lt;span&gt; (r.IsCompleted)  &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;                               Action act = r.AsyncState &lt;span class="keyword"&gt;as&lt;/span&gt;&lt;span&gt; Action;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                               act.EndInvoke(results[localCount]);  &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;finally&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="comment"&gt;//set the event regardless of whether there is an exception so that the main thread&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;                           &lt;span class="comment"&gt;//is not blocked indefinitely.&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                           events[localCount].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;                   }, action);  &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;           WaitHandle.WaitAll(events);  &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;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&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; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;[] GetUsers()  &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="comment"&gt;//simulate a long running operation&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;           Thread.SpinWait(3000);  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           Console.WriteLine(&lt;span class="string"&gt;"Current Thread:{0}"&lt;/span&gt;&lt;span&gt;, Thread.CurrentThread.ManagedThreadId);  &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;[] { &lt;/span&gt;&lt;span class="string"&gt;"Jack"&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class="string"&gt;"Jon"&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class="string"&gt;"Jim"&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; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;[] GetCountries()  &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="comment"&gt;//simulate a long running operation&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;           Thread.SpinWait(3000);  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           Console.WriteLine(&lt;span class="string"&gt;"Current Thread:{0}"&lt;/span&gt;&lt;span&gt;, Thread.CurrentThread.ManagedThreadId);  &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;[] { &lt;/span&gt;&lt;span class="string"&gt;"US"&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class="string"&gt;"UK"&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class="string"&gt;"Canada"&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; &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;[] GetLanguages()  &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="comment"&gt;//simulate a long running operation&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;           Thread.SpinWait(3000);  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           Console.WriteLine(&lt;span class="string"&gt;"Current Thread:{0}"&lt;/span&gt;&lt;span&gt;, Thread.CurrentThread.ManagedThreadId);  &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;[] { &lt;/span&gt;&lt;span class="string"&gt;"English"&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class="string"&gt;"French"&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class="string"&gt;"German"&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;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&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;[] countries;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;           &lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;[] users;  &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;[] languages;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;           List&amp;lt;Action&amp;gt; actions = &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; List&amp;lt;Action&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;               () =&amp;gt; countries = GetCountries(),  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;               () =&amp;gt; users = GetUsers(),  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;               () =&amp;gt; languages = GetLanguages(),  &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;"Running Actions Asynchronously"&lt;/span&gt;&lt;span&gt;);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           Console.WriteLine(&lt;span class="string"&gt;"----------------------"&lt;/span&gt;&lt;span&gt;);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;           Stopwatch watch = Stopwatch.StartNew();  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           actions.ExecAsync();  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;           watch.Stop();  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           Console.WriteLine(&lt;span class="string"&gt;"Total time taken:{0} milliseconds"&lt;/span&gt;&lt;span&gt;, watch.ElapsedMilliseconds);  &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;           Console.WriteLine();  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;           Console.WriteLine(&lt;span class="string"&gt;"Running Actions using Tasks"&lt;/span&gt;&lt;span&gt;);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           Console.WriteLine(&lt;span class="string"&gt;"----------------------"&lt;/span&gt;&lt;span&gt;);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;           watch.Reset();  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           watch.Start();  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;           Task[] tasks = &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; Task[]  &lt;/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;              Task.Factory.StartNew(() =&amp;gt; countries = GetCountries()),  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;              Task.Factory.StartNew(() =&amp;gt; countries = GetUsers()),  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;              Task.Factory.StartNew(() =&amp;gt; countries = GetLanguages())  &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;           Task.WaitAll(tasks);  &lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           watch.Stop();  &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;           Console.WriteLine(&lt;span class="string"&gt;"Total time taken:{0} milliseconds"&lt;/span&gt;&lt;span&gt;, watch.ElapsedMilliseconds);  &lt;/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;
Let's give it a spin and see the numbers: &lt;br /&gt;
&lt;p&gt;&lt;img src="http://public.bay.livefilestore.com/y1pjq9v73P63I-RxCNZqkqNvDb_1LCXV5OLrFKrZjTyB6DznyxUg0qaC9ac4nzAMCM1_NLIbTRIq4aW9DaRhLpRPw/AsyncAction2_Output.JPG" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;The version using Tasks is almost 5 times faster! which suggests that TPL is doing a far superior job under the covers in              effectively scheduling and executing the Actions.&lt;br /&gt;
TPL has a host of goodness which I've barely started exploring.Among other goodies, is the ability to have parent-child             relationships between tasks and support for cancellation using a CancellationToken. &lt;br /&gt;
I hope to do more frequent posts especially around TPL since this has piqued my interest. &lt;br /&gt;
As always happy coding!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fgeekswithblogs.net%2fabhijeetp%2farchive%2f2009%2f06%2f17%2fperforming-multiple-asynchronous-actions-using-tpl.aspx"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fgeekswithblogs.net%2fabhijeetp%2farchive%2f2009%2f06%2f17%2fperforming-multiple-asynchronous-actions-using-tpl.aspx" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;img src="http://geekswithblogs.net/abhijeetp/aggbug/132871.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://geekswithblogs.net/abhijeetp/comments/132871.aspx</wfw:comment>
        <slash:comments>2</slash:comments>
        <wfw:commentRss>http://geekswithblogs.net/abhijeetp/comments/commentRss/132871.aspx</wfw:commentRss>
        <trackback:ping>http://geekswithblogs.net/abhijeetp/services/trackbacks/132871.aspx</trackback:ping>
    </entry>
    <entry>
        <title>Using multiple Object Contexts in a Transaction</title>
        <link rel="self" type="text/html" href="http://geekswithblogs.net/abhijeetp/archive/2009/05/13/using-multiple-object-contexts-in-a-transaction.aspx" />
        <id>http://geekswithblogs.net/abhijeetp/archive/2009/05/13/using-multiple-object-contexts-in-a-transaction.aspx</id>
        <published>2009-05-13T23:58:54-07:00:00</published>
        <updated>2009-05-16T20:51:27Z</updated>
        <content type="html">&lt;link type="text/css" rel="stylesheet" href="customcss.ashx.css" /&gt;
&lt;div class="defaultText"&gt;
&lt;p&gt; The scenario: You have 2 Entity Models, and you need to call operations on the ObjectContext of each of them, the operations should be  atomic, in that either both operations should succeed or fail so that your databases      are consistent.&lt;br /&gt;
This is fairly straightforward to accomplish using a &lt;code&gt;TransactionScope&lt;/code&gt;.&lt;br /&gt;
ObjectServices is smart enough to detect if the &lt;code&gt;ObjectContext&lt;/code&gt; is in a surrounding &lt;code&gt;TransactionScope&lt;/code&gt; and if so,use that scope.&lt;br /&gt;
NOTE:If a scope is not specified, then &lt;code&gt;ObjectContext&lt;/code&gt; by default creates a new scope internally      when saving changes.&lt;br /&gt;
&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 start="1" class="dp-c"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;using&lt;/span&gt;&lt;span&gt; (TransactionScope scope = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; TransactionScope())  &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; (RequestDBContext context = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; RequestDBContext())  &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;                   RequestType rt = &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; RequestType  &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;                        Name=&lt;span class="string"&gt;"Test-2"&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;                   context.AddToRequestTypeSet(rt);  &lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;                   context.SaveChanges();  &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;using&lt;/span&gt;&lt;span&gt; (RequestDBContext context = &lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; RequestDBContext())  &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="comment"&gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;                   Status stat = context.StatusSet.First(s =&amp;gt; s.Name == &lt;span class="string"&gt;"Pending Approval"&lt;/span&gt;&lt;span&gt;);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;                   context.DeleteObject(stat);  &lt;/span&gt;&lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;                   context.SaveChanges();  &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;               scope.Complete();  &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; In the above code I'm using the same EDM for both &lt;code&gt;ObjectContext&lt;/code&gt;s, but I could very well use different EDMs.&lt;br /&gt;
If we reach the end of the 2nd using statement, then we can complete the transaction and persist all our changes.&lt;br /&gt;
If an exception is thrown then nothing is changed in the database and the transaction aborts.&lt;br /&gt;
Hope this helps.  &lt;/p&gt;
&lt;br /&gt;
&lt;p&gt; &lt;font color="red"&gt;UPDATE:5/16/09&lt;/font&gt;&lt;br /&gt;
Using &lt;code&gt;TransactionScope&lt;/code&gt; requires MSDTC, the following links have good information to help setup/troubleshoot MSDTC for various environments &lt;br /&gt;
&lt;a href="http://msdn.microsoft.com/en-us/library/dd327979.aspx"&gt;How to Enable MSDTC on a Web Server&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://support.microsoft.com/kb/899191/"&gt;New functionality in the Distributed Transaction Coordinator service in Windows Server 2003 Service Pack 1 and in Windows XP Service Pack 2&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://blogs.catalystss.com/blogs/marek_mazur/archive/2009/02/19/in-this-blog-i-will-go-over-how-to-configure-and-troubleshoot-msdtc.aspx"&gt;Thursday, February 19, 2009 5:08 PM mmazur How to configure and troubleshoot MSDTC &lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fgeekswithblogs.net%2fabhijeetp%2farchive%2f2009%2f05%2f13%2fusing-multiple-object-contexts-in-a-transaction.aspx"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fgeekswithblogs.net%2fabhijeetp%2farchive%2f2009%2f05%2f13%2fusing-multiple-object-contexts-in-a-transaction.aspx" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;img src="http://geekswithblogs.net/abhijeetp/aggbug/132100.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://geekswithblogs.net/abhijeetp/comments/132100.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://geekswithblogs.net/abhijeetp/comments/commentRss/132100.aspx</wfw:commentRss>
        <trackback:ping>http://geekswithblogs.net/abhijeetp/services/trackbacks/132100.aspx</trackback:ping>
    </entry>
    <entry>
        <title>Handling WorkflowRuntime events for IIS hosted WCF + WF services</title>
        <link rel="self" type="text/html" href="http://geekswithblogs.net/abhijeetp/archive/2009/04/26/handling-workflowruntime-events-for-iis-hosted-wcf--wf-services.aspx" />
        <id>http://geekswithblogs.net/abhijeetp/archive/2009/04/26/handling-workflowruntime-events-for-iis-hosted-wcf--wf-services.aspx</id>
        <published>2009-04-26T22:38:11-07:00:00</published>
        <updated>2009-04-27T21:47:59Z</updated>
        <content type="html">&lt;div class="defaultText"&gt;
&lt;p&gt;The &lt;code&gt;WorkflowRuntime&lt;/code&gt; class has a host of interesting methods and useful events. Events such as Completed, Perssited, Idled are invaluable when debugging and in understanding how a workflow instance is behaving.&lt;br /&gt;
These events are easily accessible when self hosting the runtime since you can just hook up event handlers for these events and react to these events as you see fit. &lt;br /&gt;
But, when the workflow runtime is hosted in IIS/WAS/Cassini host, you don’t have a direct handle to the runtime for hooking up these events. &lt;br /&gt;
The .svc file for the WCF service contains the &lt;code&gt;WorkflowServiceHostFactory&lt;/code&gt; that WCF uses for servicing workflow service requests. &lt;/p&gt;
&lt;div class="dp-highlighter" id="hlDiv"&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;%@ ServiceHost &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#"&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="attribute"&gt;Debug&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&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="attribute"&gt;Service&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"RequestWFServiceLib.ApprovalWorkflow"&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="attribute"&gt;Factory&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"System.ServiceModel.Activation.WorkflowServiceHostFactory"&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;/ol&gt;
&lt;/div&gt;
&lt;p&gt;We can easily subclass &lt;code&gt;WorkflowServiceHostFactory&lt;/code&gt; and replace the Factory attribute in the .svc file with a custom implementation of this class where in we override the &lt;code&gt;CreateServiceHost&lt;/code&gt; Method and get a handle to the &lt;code&gt;WorkflowRuntime&lt;/code&gt; and hook up the event handlers we need.&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;   &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; CustomWorkflowServiceHost : WorkflowServiceHostFactory  &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;override&lt;/span&gt;&lt;span&gt; System.ServiceModel.ServiceHostBase CreateServiceHost(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; constructorString, Uri[] baseAddresses)  &lt;/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;           ServiceHostBase hostBase = &lt;span class="keyword"&gt;base&lt;/span&gt;&lt;span&gt;.CreateServiceHost(constructorString, baseAddresses);  &lt;/span&gt;&lt;/span&gt; &lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           WorkflowRuntimeBehavior runtimeBehavior = hostBase.Description.Behaviors.Find&amp;lt;WorkflowRuntimeBehavior&amp;gt;();  &lt;/span&gt; &lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;           WorkflowRuntime runtime = runtimeBehavior.WorkflowRuntime;  &lt;/span&gt; &lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           runtime.WorkflowIdled += runtime_WorkflowIdled;  &lt;/span&gt; &lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;           runtime.Started += runtime_Started;  &lt;/span&gt; &lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           runtime.Stopped += runtime_Stopped;  &lt;/span&gt; &lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;           runtime.WorkflowStarted += runtime_WorkflowStarted;  &lt;/span&gt; &lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           runtime.WorkflowSuspended += runtime_WorkflowSuspended;  &lt;/span&gt; &lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;           runtime.WorkflowUnloaded += runtime_WorkflowUnloaded;  &lt;/span&gt; &lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           runtime.WorkflowCreated += runtime_WorkflowCreated;  &lt;/span&gt; &lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;           runtime.WorkflowTerminated += runtime_WorkflowTerminated;  &lt;/span&gt; &lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           runtime.WorkflowResumed += runtime_WorkflowResumed;  &lt;/span&gt; &lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;           runtime.WorkflowPersisted += runtime_WorkflowPersisted;  &lt;/span&gt; &lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           runtime.WorkflowLoaded += runtime_WorkflowLoaded;  &lt;/span&gt; &lt;/li&gt;
    &lt;li class=""&gt;&lt;span&gt;           runtime.WorkflowCompleted += runtime_WorkflowCompleted;  &lt;/span&gt; &lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;           runtime.WorkflowAborted += runtime_WorkflowAborted;  &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; hostBase;  &lt;/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;void&lt;/span&gt;&lt;span&gt; runtime_WorkflowAborted(&lt;/span&gt;&lt;span class="keyword"&gt;object&lt;/span&gt;&lt;span&gt; sender, WorkflowEventArgs e)  &lt;/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;           Debug.WriteLine(&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;.Format(&lt;/span&gt;&lt;span class="string"&gt;"WorkflowInstance {0} Aborted"&lt;/span&gt;&lt;span&gt;, e.WorkflowInstance.InstanceId.ToString()));  &lt;/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;void&lt;/span&gt;&lt;span&gt; runtime_WorkflowCompleted(&lt;/span&gt;&lt;span class="keyword"&gt;object&lt;/span&gt;&lt;span&gt; sender, WorkflowCompletedEventArgs e)  &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;           Debug.WriteLine(&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;.Format(&lt;/span&gt;&lt;span class="string"&gt;"WorkflowInstance {0} Completed"&lt;/span&gt;&lt;span&gt;, e.WorkflowInstance.InstanceId.ToString()));  &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;void&lt;/span&gt;&lt;span&gt; runtime_WorkflowLoaded(&lt;/span&gt;&lt;span class="keyword"&gt;object&lt;/span&gt;&lt;span&gt; sender, WorkflowEventArgs e)  &lt;/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;           Debug.WriteLine(&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;.Format(&lt;/span&gt;&lt;span class="string"&gt;"WorkflowInstance {0} Loaded"&lt;/span&gt;&lt;span&gt;, e.WorkflowInstance.InstanceId.ToString()));  &lt;/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;void&lt;/span&gt;&lt;span&gt; runtime_WorkflowPersisted(&lt;/span&gt;&lt;span class="keyword"&gt;object&lt;/span&gt;&lt;span&gt; sender, WorkflowEventArgs e)  &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;           Debug.WriteLine(&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;.Format(&lt;/span&gt;&lt;span class="string"&gt;"WorkflowInstance {0} Persisted"&lt;/span&gt;&lt;span&gt;, e.WorkflowInstance.InstanceId.ToString()));  &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;void&lt;/span&gt;&lt;span&gt; runtime_WorkflowResumed(&lt;/span&gt;&lt;span class="keyword"&gt;object&lt;/span&gt;&lt;span&gt; sender, WorkflowEventArgs e)  &lt;/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;           Debug.WriteLine(&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;.Format(&lt;/span&gt;&lt;span class="string"&gt;"WorkflowInstance {0} Resumed"&lt;/span&gt;&lt;span&gt;, e.WorkflowInstance.InstanceId.ToString()));  &lt;/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;void&lt;/span&gt;&lt;span&gt; runtime_WorkflowTerminated(&lt;/span&gt;&lt;span class="keyword"&gt;object&lt;/span&gt;&lt;span&gt; sender, WorkflowTerminatedEventArgs e)  &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;           Debug.WriteLine(&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;.Format(&lt;/span&gt;&lt;span class="string"&gt;"WorkflowInstance {0} Terminated"&lt;/span&gt;&lt;span&gt;, e.WorkflowInstance.InstanceId.ToString()));  &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;void&lt;/span&gt;&lt;span&gt; runtime_WorkflowCreated(&lt;/span&gt;&lt;span class="keyword"&gt;object&lt;/span&gt;&lt;span&gt; sender, WorkflowEventArgs e)  &lt;/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;           Debug.WriteLine(&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;.Format(&lt;/span&gt;&lt;span class="string"&gt;"WorkflowInstance {0} Created"&lt;/span&gt;&lt;span&gt;, e.WorkflowInstance.InstanceId.ToString()));  &lt;/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;void&lt;/span&gt;&lt;span&gt; runtime_WorkflowUnloaded(&lt;/span&gt;&lt;span class="keyword"&gt;object&lt;/span&gt;&lt;span&gt; sender, WorkflowEventArgs e)  &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;           Debug.WriteLine(&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;.Format(&lt;/span&gt;&lt;span class="string"&gt;"WorkflowInstance {0} Unloaded"&lt;/span&gt;&lt;span&gt;, e.WorkflowInstance.InstanceId.ToString()));  &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;void&lt;/span&gt;&lt;span&gt; runtime_WorkflowSuspended(&lt;/span&gt;&lt;span class="keyword"&gt;object&lt;/span&gt;&lt;span&gt; sender, WorkflowSuspendedEventArgs e)  &lt;/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;           Debug.WriteLine(&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;.Format(&lt;/span&gt;&lt;span class="string"&gt;"WorkflowInstance {0} Suspended"&lt;/span&gt;&lt;span&gt;, e.WorkflowInstance.InstanceId.ToString()));  &lt;/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;void&lt;/span&gt;&lt;span&gt; runtime_WorkflowStarted(&lt;/span&gt;&lt;span class="keyword"&gt;object&lt;/span&gt;&lt;span&gt; sender, WorkflowEventArgs e)  &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;           Debug.WriteLine(&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;.Format(&lt;/span&gt;&lt;span class="string"&gt;"WorkflowInstance {0} Started"&lt;/span&gt;&lt;span&gt;, e.WorkflowInstance.InstanceId.ToString()));  &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;void&lt;/span&gt;&lt;span&gt; runtime_Stopped(&lt;/span&gt;&lt;span class="keyword"&gt;object&lt;/span&gt;&lt;span&gt; sender, WorkflowRuntimeEventArgs e)  &lt;/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;           Debug.WriteLine(&lt;span class="string"&gt;"Workflow runtime Stopped"&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;void&lt;/span&gt;&lt;span&gt; runtime_Started(&lt;/span&gt;&lt;span class="keyword"&gt;object&lt;/span&gt;&lt;span&gt; sender, WorkflowRuntimeEventArgs e)  &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;           Debug.WriteLine(&lt;span class="string"&gt;"Workflow runtime Started"&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;void&lt;/span&gt;&lt;span&gt; runtime_WorkflowIdled(&lt;/span&gt;&lt;span class="keyword"&gt;object&lt;/span&gt;&lt;span&gt; sender, WorkflowEventArgs e)  &lt;/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;           Debug.WriteLine(&lt;span class="string"&gt;"Workflow runtime Idled"&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;the .svc file is updated to include the name of our custom implementation. That’s all there is to it.&lt;/p&gt;
&lt;div class="dp-highlighter" id="Div2"&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;%@ ServiceHost &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#"&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="attribute"&gt;Debug&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&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="attribute"&gt;Service&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"RequestWFServiceLib.ApprovalWorkflow"&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="attribute"&gt;Factory&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"RequestWFServiceLib.CustomWorkflowServiceHost"&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;/ol&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fgeekswithblogs.net%2fabhijeetp%2farchive%2f2009%2f04%2f26%2fhandling-workflowruntime-events-for-iis-hosted-wcf--wf-services.aspx"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fgeekswithblogs.net%2fabhijeetp%2farchive%2f2009%2f04%2f26%2fhandling-workflowruntime-events-for-iis-hosted-wcf--wf-services.aspx" /&gt;&lt;/a&gt; &lt;/div&gt;&lt;img src="http://geekswithblogs.net/abhijeetp/aggbug/131481.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://geekswithblogs.net/abhijeetp/comments/131481.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://geekswithblogs.net/abhijeetp/comments/commentRss/131481.aspx</wfw:commentRss>
        <trackback:ping>http://geekswithblogs.net/abhijeetp/services/trackbacks/131481.aspx</trackback:ping>
    </entry>
    <entry>
        <title>ASP.NET Caching</title>
        <link rel="self" type="text/html" href="http://geekswithblogs.net/abhijeetp/archive/2009/04/24/asp.net-caching.aspx" />
        <id>http://geekswithblogs.net/abhijeetp/archive/2009/04/24/asp.net-caching.aspx</id>
        <published>2009-04-24T23:22:07-07:00:00</published>
        <updated>2009-04-24T23:25:25Z</updated>
        <content type="html">&lt;link href="customcss.ashx.css" rel="stylesheet" type="text/css" /&gt;
&lt;div class="defaultText"&gt;
&lt;p&gt;I needed a quick way to cache some data for a feature I’m currently working on. The scenario is that the user should be able to type ahead and be presented with a list of matching options (AJAX auto complete). This data is coming from an external web service and is exposed via the core API of the application which in turn is exposed over WCF. So for AJAX to be able to get to this data it must talk to the WCF service, but this is not directly possible since cross site scripting is not allowed in the browser(at least not directly). So for AJAX to be able to consume this data I had to create a proxy WCF service implemented in the same project as the web application which in turn invokes the core WCF service to return this data. &lt;/p&gt;
&lt;p&gt;Hence the proxy WCF service acts as an intermediary to fetch the data for auto complete. Now, the data is fairly static for the most part and might change every now and then. Moreover the data set is arguably large(approx 1000 items), so we now have 3 service layers (1 for the proxy WCF service, one for the core API WCF service and one for the external service which provides the actual data) to navigate through before the data is sent to the browser, clearly this is a performance bottleneck since I can’t afford to have this chatty behavior every single time a user types something in. &lt;/p&gt;
&lt;p&gt;This leads us to caching the data, I could cache the data either in the core API object which invokes the remote service, OR in the core WCF service OR in the proxy WCF service.&lt;/p&gt;
&lt;p&gt;Each has its own caveats. If I cache in the core API object or in the core WCF service I would need to either implement a custom caching mechanism or use an out of the box caching API such as the Enterprise Library Caching Application Block, I would also need to implement a expiration policy to ensure that the cache is flushed periodically, this would help provide some performance boost but there is still the overhead involved in marshalling this data to the client itself on every call.&lt;/p&gt;
&lt;p&gt;If I cache at the client side (ASP.NET) then I can use the ASP.NET Cache object out of the box, and set up a time/file based dependency to periodically purge the cache, the downside is that when other clients invoke the core WCF service then the core API will invoke the external service every single time, and we could end up swamping both, the core WCF service and also the external service.&lt;/p&gt;
&lt;p&gt;So, to address this we can cache at 2 levels; on the client side we can leverage ASP.NET Cache object and on the core API side we can use local caching. &lt;/p&gt;
&lt;p&gt;The proxy WCF service has ASPNET compatibility mode turned on so that its invocable by Javascript/AJAX, this also allows us to tie into the ASP.NET execution pipeline and hence access the Cache object, &lt;/p&gt;
&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;
&lt;div id="codeSnippet" class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span id="lnum1" class="lnum"&gt;   1:&lt;/span&gt; [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre class="alteven"&gt;&lt;span id="lnum2" class="lnum"&gt;   2:&lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Service1 : IService1&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre class="alt"&gt;&lt;span id="lnum3" class="lnum"&gt;   3:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre class="alteven"&gt;&lt;span id="lnum4" class="lnum"&gt;   4:&lt;/span&gt;  &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre class="alt"&gt;&lt;span id="lnum5" class="lnum"&gt;   5:&lt;/span&gt;     &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;[] GetList(&lt;span class="kwrd"&gt;string&lt;/span&gt; prefixText, &lt;span class="kwrd"&gt;int&lt;/span&gt; count)&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre class="alteven"&gt;&lt;span id="lnum6" class="lnum"&gt;   6:&lt;/span&gt;     {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre class="alt"&gt;&lt;span id="lnum7" class="lnum"&gt;   7:&lt;/span&gt;         &lt;span class="kwrd"&gt;if&lt;/span&gt; (HttpContext.Current.Cache[&lt;span class="str"&gt;"items"&lt;/span&gt;] == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre class="alteven"&gt;&lt;span id="lnum8" class="lnum"&gt;   8:&lt;/span&gt;         {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre class="alt"&gt;&lt;span id="lnum9" class="lnum"&gt;   9:&lt;/span&gt;             Debug.WriteLine(&lt;span class="str"&gt;"Adding Item to Cache"&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre class="alteven"&gt;&lt;span id="lnum10" class="lnum"&gt;  10:&lt;/span&gt;             var items = Enumerable.Range(1, 10).Select(i =&amp;gt; i.ToString()).ToArray();&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre class="alt"&gt;&lt;span id="lnum11" class="lnum"&gt;  11:&lt;/span&gt;             HttpContext.Current.Cache.Insert&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre class="alteven"&gt;&lt;span id="lnum12" class="lnum"&gt;  12:&lt;/span&gt;                 (   &lt;span class="str"&gt;"items"&lt;/span&gt;, &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre class="alt"&gt;&lt;span id="lnum13" class="lnum"&gt;  13:&lt;/span&gt;                     items, &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre class="alteven"&gt;&lt;span id="lnum14" class="lnum"&gt;  14:&lt;/span&gt;                     &lt;span class="kwrd"&gt;new&lt;/span&gt; CacheDependency(HttpContext.Current.Server.MapPath(&lt;span class="str"&gt;"Web.config"&lt;/span&gt;)),&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre class="alt"&gt;&lt;span id="lnum15" class="lnum"&gt;  15:&lt;/span&gt;                     DateTime.UtcNow.AddMinutes(&lt;span class="kwrd"&gt;int&lt;/span&gt;.Parse(ConfigurationManager.AppSettings[&lt;span class="str"&gt;"CacheExpirationInMinutes"&lt;/span&gt;])),&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre class="alteven"&gt;&lt;span id="lnum16" class="lnum"&gt;  16:&lt;/span&gt;                     Cache.NoSlidingExpiration&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre class="alt"&gt;&lt;span id="lnum17" class="lnum"&gt;  17:&lt;/span&gt;                 );&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre class="alteven"&gt;&lt;span id="lnum18" class="lnum"&gt;  18:&lt;/span&gt;             &lt;span class="kwrd"&gt;return&lt;/span&gt; items;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre class="alt"&gt;&lt;span id="lnum19" class="lnum"&gt;  19:&lt;/span&gt;         }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre class="alteven"&gt;&lt;span id="lnum20" class="lnum"&gt;  20:&lt;/span&gt;         &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre class="alt"&gt;&lt;span id="lnum21" class="lnum"&gt;  21:&lt;/span&gt;         {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre class="alteven"&gt;&lt;span id="lnum22" class="lnum"&gt;  22:&lt;/span&gt;             Debug.WriteLine(&lt;span class="str"&gt;"Read Item from Cache"&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre class="alt"&gt;&lt;span id="lnum23" class="lnum"&gt;  23:&lt;/span&gt;             &lt;span class="kwrd"&gt;return&lt;/span&gt; HttpContext.Current.Cache[&lt;span class="str"&gt;"items"&lt;/span&gt;] &lt;span class="kwrd"&gt;as&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;[];&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre class="alteven"&gt;&lt;span id="lnum24" class="lnum"&gt;  24:&lt;/span&gt;  &lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre class="alt"&gt;&lt;span id="lnum25" class="lnum"&gt;  25:&lt;/span&gt;         }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre class="alteven"&gt;&lt;span id="lnum26" class="lnum"&gt;  26:&lt;/span&gt;     }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre class="alt"&gt;&lt;span id="lnum27" class="lnum"&gt;  27:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Basically we’ve set up a dependency to changes in web.config and also to a time interval in minutes specified in web.config as an AppSetting, this means that if the time specified elapses or web.config changes, the cache is invalidated.&lt;/p&gt;
&lt;p&gt;This does the trick for now, if I get a chance I’ll put in the caching mechanism in the core API as well. My primary choice is using the Caching application block, but that is a post for another day.&lt;/p&gt;
&lt;p&gt;Happy coding.&lt;/p&gt;
&lt;/div&gt;&lt;img src="http://geekswithblogs.net/abhijeetp/aggbug/131451.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://geekswithblogs.net/abhijeetp/comments/131451.aspx</wfw:comment>
        <slash:comments>2</slash:comments>
        <wfw:commentRss>http://geekswithblogs.net/abhijeetp/comments/commentRss/131451.aspx</wfw:commentRss>
        <trackback:ping>http://geekswithblogs.net/abhijeetp/services/trackbacks/131451.aspx</trackback:ping>
    </entry>
</feed>