<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Watson Jon</title>
        <link>http://geekswithblogs.net/watsonjon/Default.aspx</link>
        <description>Code and ramblings from Watson</description>
        <language>en-US</language>
        <copyright>Jon Dalberg</copyright>
        <managingEditor>jdalberg@antaresnet.com</managingEditor>
        <generator>Subtext Version 0.0.0.0</generator>
        <image>
            <title>Watson Jon</title>
            <url>http://geekswithblogs.net/images/RSS2Image.gif</url>
            <link>http://geekswithblogs.net/watsonjon/Default.aspx</link>
            <width>77</width>
            <height>60</height>
        </image>
        <item>
            <title>OData &amp;ndash; The easiest service I can create: now with updates</title>
            <category>OData</category>
            <link>http://geekswithblogs.net/watsonjon/archive/2010/05/13/odata-ndash-the-easiest-service-i-can-create-now-with.aspx</link>
            <description>&lt;p&gt;The other day I created a simple &lt;a href="http://geekswithblogs.net/watsonjon/archive/2010/05/12/odata-ndash-the-easiest-service-i-can-create.aspx" target="_blank"&gt;NastyWord&lt;/a&gt; service exposed via &lt;a href="http://www.odata.org/" target="_blank"&gt;OData&lt;/a&gt;. It was read-only and used an in-memory backing store for the words. Today I’ll modify it to use a file instead of a list and I’ll accept new nasty words by implementing &lt;a href="http://msdn.microsoft.com/en-us/library/system.data.services.iupdatable_members(v=VS.100).aspx?appId=Dev10IDEF1&amp;amp;l=EN-US&amp;amp;k=k(SYSTEM.DATA.SERVICES.IUPDATABLE);k(TargetFrameworkMoniker-&amp;quot;.NETFRAMEWORK&amp;amp;k=VERSION=V4.0&amp;quot;);k(DevLang-CSHARP)&amp;amp;rd=true" target="_blank"&gt;IUpdatable&lt;/a&gt; directly.&lt;/p&gt;  &lt;p&gt;The first thing to do is enable the service to accept new entries. This is done at configuration time by adding the “WriteAppend” access rule:&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; NastyWords : DataService&amp;lt;NastyWordsDataSource&amp;gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        &lt;span class="rem"&gt;// This method is called only once to initialize service-wide policies.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; InitializeService(DataServiceConfiguration config)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;            config.SetEntitySetAccessRule(&lt;span class="str"&gt;"*"&lt;/span&gt;, EntitySetRights.AllRead | EntitySetRights.WriteAppend);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;            config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Next I placed a file, NastyWords.txt, in the “App_Data” folder and added a few *choice* words to start. This required one simple change to our NastyWordDataSource.cs file:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; NastyWordsDataSource()&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;            UpdateFromSource();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; UpdateFromSource()&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;            var words = File.ReadAllLines(pathToFile);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;            NastyWords = (from w &lt;span class="kwrd"&gt;in&lt;/span&gt; words&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;                          select &lt;span class="kwrd"&gt;new&lt;/span&gt; NastyWord { Word = w }).AsQueryable();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Nothing too shocking here, just reading each line from the NastyWords.txt file and exposing them. Next, I implemented &lt;a href="http://msdn.microsoft.com/en-us/library/system.data.services.iupdatable_members(v=VS.100).aspx?appId=Dev10IDEF1&amp;amp;l=EN-US&amp;amp;k=k(SYSTEM.DATA.SERVICES.IUPDATABLE);k(TargetFrameworkMoniker-&amp;quot;.NETFRAMEWORK&amp;amp;k=VERSION=V4.0&amp;quot;);k(DevLang-CSHARP)&amp;amp;rd=true" target="_blank"&gt;IUpdatable&lt;/a&gt; which comes with a boat-load of methods. We don’t need all of them for now since we are only concerned with allowing new values. Here are the methods we must implement, all the others throw a NotImplementedException:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; CreateResource(&lt;span class="kwrd"&gt;string&lt;/span&gt; containerName, &lt;span class="kwrd"&gt;string&lt;/span&gt; fullTypeName)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;            var nastyWord = &lt;span class="kwrd"&gt;new&lt;/span&gt; NastyWord();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;            pendingUpdates.Add(nastyWord);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; nastyWord;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; ResolveResource(&lt;span class="kwrd"&gt;object&lt;/span&gt; resource)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; resource;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SaveChanges()&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;            var intersect = (from w &lt;span class="kwrd"&gt;in&lt;/span&gt; pendingUpdates&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;                             select w.Word).Intersect(from n &lt;span class="kwrd"&gt;in&lt;/span&gt; NastyWords&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;                                                      select n.Word);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (intersect.Count() &amp;gt; 0)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;                &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; DataServiceException(500, &lt;span class="str"&gt;"duplicate entry"&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;            var lines = from w &lt;span class="kwrd"&gt;in&lt;/span&gt; pendingUpdates&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;                        select w.Word;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;            File.AppendAllLines(pathToFile,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;                lines,&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;                Encoding.UTF8);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;            pendingUpdates.Clear();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;            UpdateFromSource();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SetValue(&lt;span class="kwrd"&gt;object&lt;/span&gt; targetResource, &lt;span class="kwrd"&gt;string&lt;/span&gt; propertyName, &lt;span class="kwrd"&gt;object&lt;/span&gt; propertyValue)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;            targetResource.GetType().GetProperty(propertyName).SetValue(targetResource, propertyValue, &lt;span class="kwrd"&gt;null&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;I use a simple list to contain the pending updates and only commit them when the “SaveChanges” method is called. Here’s the order these methods are called in our service during an insert:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;CreateResource – here we just instantiate a new NastyWord and stick a reference to it in our pending updates list. &lt;/li&gt;

  &lt;li&gt;SetValue – this is where the “Word” property of the NastyWord instance is set. &lt;/li&gt;

  &lt;li&gt;SaveChanges – get the list of pending updates, barfing on duplicates, write them to the file and clear our pending list. &lt;/li&gt;

  &lt;li&gt;ResolveResource – the newly created resource will be returned directly here since we aren’t dealing with “handles” to objects but the actual objects themselves. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Not too bad, eh? I didn’t find this documented anywhere but a little bit of digging in the OData spec and use of &lt;a href="http://www.fiddlertool.com" target="_blank"&gt;Fiddler&lt;/a&gt; made it pretty easy to figure out. Here is some client code which would add a new nasty word:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;            var svc = &lt;span class="kwrd"&gt;new&lt;/span&gt; ServiceReference1.NastyWordsDataSource(&lt;span class="kwrd"&gt;new&lt;/span&gt; Uri(&lt;span class="str"&gt;"http://localhost.:60921/NastyWords.svc"&lt;/span&gt;));&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;            svc.AddToNastyWords(&lt;span class="kwrd"&gt;new&lt;/span&gt; ServiceReference1.NastyWord() { Word = &lt;span class="str"&gt;"shat"&lt;/span&gt; });&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;            svc.SaveChanges();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Here’s all of the code so far for to implement the service:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Data.Services;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Data.Services.Common;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Linq;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.ServiceModel.Web;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.IO;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; ONasty&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;    [DataServiceKey(&lt;span class="str"&gt;"Word"&lt;/span&gt;)]&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; NastyWord&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Word { get; set; }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;    }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; NastyWordsDataSource : IUpdatable&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; List&amp;lt;NastyWord&amp;gt; pendingUpdates = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;NastyWord&amp;gt;();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; pathToFile = &lt;span class="str"&gt;@"path to your\App_Data\NastyWords.txt"&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; NastyWordsDataSource()&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;            UpdateFromSource();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; UpdateFromSource()&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;            var words = File.ReadAllLines(pathToFile);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;            NastyWords = (from w &lt;span class="kwrd"&gt;in&lt;/span&gt; words&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;                          select &lt;span class="kwrd"&gt;new&lt;/span&gt; NastyWord { Word = w }).AsQueryable();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; IQueryable&amp;lt;NastyWord&amp;gt; NastyWords { get; &lt;span class="kwrd"&gt;private&lt;/span&gt; set; }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  38:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; AddReferenceToCollection(&lt;span class="kwrd"&gt;object&lt;/span&gt; targetResource, &lt;span class="kwrd"&gt;string&lt;/span&gt; propertyName, &lt;span class="kwrd"&gt;object&lt;/span&gt; resourceToBeAdded)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  39:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  40:  &lt;/span&gt;            &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NotImplementedException();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  41:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  42:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  43:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ClearChanges()&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  44:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  45:  &lt;/span&gt;            pendingUpdates.Clear();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  46:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  47:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  48:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; CreateResource(&lt;span class="kwrd"&gt;string&lt;/span&gt; containerName, &lt;span class="kwrd"&gt;string&lt;/span&gt; fullTypeName)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  49:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  50:  &lt;/span&gt;            var nastyWord = &lt;span class="kwrd"&gt;new&lt;/span&gt; NastyWord();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  51:  &lt;/span&gt;            pendingUpdates.Add(nastyWord);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  52:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; nastyWord;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  53:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  54:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  55:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; DeleteResource(&lt;span class="kwrd"&gt;object&lt;/span&gt; targetResource)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  56:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  57:  &lt;/span&gt;            &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NotImplementedException();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  58:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  59:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  60:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; GetResource(IQueryable query, &lt;span class="kwrd"&gt;string&lt;/span&gt; fullTypeName)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  61:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  62:  &lt;/span&gt;            &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NotImplementedException();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  63:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  64:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  65:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; GetValue(&lt;span class="kwrd"&gt;object&lt;/span&gt; targetResource, &lt;span class="kwrd"&gt;string&lt;/span&gt; propertyName)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  66:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  67:  &lt;/span&gt;            &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NotImplementedException();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  68:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  69:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  70:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; RemoveReferenceFromCollection(&lt;span class="kwrd"&gt;object&lt;/span&gt; targetResource, &lt;span class="kwrd"&gt;string&lt;/span&gt; propertyName, &lt;span class="kwrd"&gt;object&lt;/span&gt; resourceToBeRemoved)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  71:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  72:  &lt;/span&gt;            &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NotImplementedException();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  73:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  74:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  75:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; ResetResource(&lt;span class="kwrd"&gt;object&lt;/span&gt; resource)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  76:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  77:  &lt;/span&gt;            &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NotImplementedException();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  78:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  79:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  80:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; ResolveResource(&lt;span class="kwrd"&gt;object&lt;/span&gt; resource)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  81:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  82:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; resource;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  83:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  84:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  85:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SaveChanges()&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  86:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  87:  &lt;/span&gt;            var intersect = (from w &lt;span class="kwrd"&gt;in&lt;/span&gt; pendingUpdates&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  88:  &lt;/span&gt;                             select w.Word).Intersect(from n &lt;span class="kwrd"&gt;in&lt;/span&gt; NastyWords&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  89:  &lt;/span&gt;                                                      select n.Word);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  90:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  91:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (intersect.Count() &amp;gt; 0)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  92:  &lt;/span&gt;                &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; DataServiceException(500, &lt;span class="str"&gt;"duplicate entry"&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  93:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  94:  &lt;/span&gt;            var lines = from w &lt;span class="kwrd"&gt;in&lt;/span&gt; pendingUpdates&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  95:  &lt;/span&gt;                        select w.Word;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  96:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  97:  &lt;/span&gt;            File.AppendAllLines(pathToFile,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  98:  &lt;/span&gt;                lines,&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  99:  &lt;/span&gt;                Encoding.UTF8);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt; 100:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 101:  &lt;/span&gt;            pendingUpdates.Clear();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt; 102:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 103:  &lt;/span&gt;            UpdateFromSource();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt; 104:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 105:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt; 106:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SetReference(&lt;span class="kwrd"&gt;object&lt;/span&gt; targetResource, &lt;span class="kwrd"&gt;string&lt;/span&gt; propertyName, &lt;span class="kwrd"&gt;object&lt;/span&gt; propertyValue)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 107:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt; 108:  &lt;/span&gt;            &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NotImplementedException();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 109:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt; 110:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 111:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SetValue(&lt;span class="kwrd"&gt;object&lt;/span&gt; targetResource, &lt;span class="kwrd"&gt;string&lt;/span&gt; propertyName, &lt;span class="kwrd"&gt;object&lt;/span&gt; propertyValue)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt; 112:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 113:  &lt;/span&gt;            targetResource.GetType().GetProperty(propertyName).SetValue(targetResource, propertyValue, &lt;span class="kwrd"&gt;null&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt; 114:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 115:  &lt;/span&gt;    }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt; 116:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 117:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; NastyWords : DataService&amp;lt;NastyWordsDataSource&amp;gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt; 118:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 119:  &lt;/span&gt;        &lt;span class="rem"&gt;// This method is called only once to initialize service-wide policies.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt; 120:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; InitializeService(DataServiceConfiguration config)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 121:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt; 122:  &lt;/span&gt;            config.SetEntitySetAccessRule(&lt;span class="str"&gt;"*"&lt;/span&gt;, EntitySetRights.AllRead | EntitySetRights.WriteAppend);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 123:  &lt;/span&gt;            config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt; 124:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 125:  &lt;/span&gt;    }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt; 126:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;Next time we’ll allow removing nasty words. Enjoy!&lt;/p&gt; &lt;img src="http://geekswithblogs.net/watsonjon/aggbug/139795.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jon Dalberg</dc:creator>
            <guid>http://geekswithblogs.net/watsonjon/archive/2010/05/13/odata-ndash-the-easiest-service-i-can-create-now-with.aspx</guid>
            <pubDate>Thu, 13 May 2010 15:26:19 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/watsonjon/comments/139795.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/watsonjon/archive/2010/05/13/odata-ndash-the-easiest-service-i-can-create-now-with.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/watsonjon/comments/commentRss/139795.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/watsonjon/services/trackbacks/139795.aspx</trackback:ping>
        </item>
        <item>
            <title>OData &amp;ndash; The easiest service I can create</title>
            <category>OData</category>
            <link>http://geekswithblogs.net/watsonjon/archive/2010/05/12/odata-ndash-the-easiest-service-i-can-create.aspx</link>
            <description>&lt;p&gt;I wanted to create an &lt;a href="http://www.odata.org" target="_blank"&gt;OData&lt;/a&gt; service with the least amount of code so I fired up Visual Studio and got cracking. I decided to serve up a list of naughty words and make them read-only.&lt;/p&gt;  &lt;p&gt;Create a new web project. I created an empty MVC 2 application but MVC is not required for OData.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geekswithblogs.net/images/geekswithblogs_net/watsonjon/WindowsLiveWriter/ODataTheeasiestserviceIcancreate_AF28/empty_web_app.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="empty_web_app" border="0" alt="empty_web_app" src="http://geekswithblogs.net/images/geekswithblogs_net/watsonjon/WindowsLiveWriter/ODataTheeasiestserviceIcancreate_AF28/empty_web_app_thumb.png" width="244" height="123" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Add a new WCF Data Service to the project. I named mine NastyWords.svc since I’m serving up a list of nasty words.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geekswithblogs.net/images/geekswithblogs_net/watsonjon/WindowsLiveWriter/ODataTheeasiestserviceIcancreate_AF28/new_data_service.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="new_data_service" border="0" alt="new_data_service" src="http://geekswithblogs.net/images/geekswithblogs_net/watsonjon/WindowsLiveWriter/ODataTheeasiestserviceIcancreate_AF28/new_data_service_thumb.png" width="244" height="149" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Add a class to expose via the service: NastyWord&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;    [DataServiceKey(&lt;span class="str"&gt;"Word"&lt;/span&gt;)]&lt;/pre&gt;

  &lt;pre&gt;&lt;span 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; NastyWord&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Word { get; set; }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;I need to be able to uniquely identify instances of NastyWords for the DataService so I used the DataServiceKey attribute with the “Word” property as the key. I could have added an “ID” property which would have uniquely identified them and would then not need the “DataServiceKey” attribute because the DataService would apply some reflection and heuristics to guess at which property would be the unique identifier. However, the words themselves are unique so adding an “ID” property would be redundantly repetitive.&lt;/p&gt;

&lt;p&gt;Then I created a data source to expose my NastyWord objects to the service. This is just a simple class with IQueryable&amp;lt;T&amp;gt; properties exposing the entities for my service:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; NastyWordsDataSource&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; IList&amp;lt;NastyWord&amp;gt; words = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;NastyWord&amp;gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; NastyWord{ Word=&lt;span class="str"&gt;"crap"&lt;/span&gt;},&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; NastyWord{ Word=&lt;span class="str"&gt;"darn"&lt;/span&gt;},&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; NastyWord{ Word=&lt;span class="str"&gt;"hell"&lt;/span&gt;},&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; NastyWord{ Word=&lt;span class="str"&gt;"shucks"&lt;/span&gt;}&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;            };&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; NastyWordsDataSource()&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;            NastyWords = words.AsQueryable();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; IQueryable&amp;lt;NastyWord&amp;gt; NastyWords { get; &lt;span class="kwrd"&gt;private&lt;/span&gt; set; }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Now I can go to the NastyWords.svc class and tell it which data source to use and which entities to expose:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; NastyWords : DataService&amp;lt;NastyWordsDataSource&amp;gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        &lt;span class="rem"&gt;// This method is called only once to initialize service-wide policies.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; InitializeService(DataServiceConfiguration config)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;            config.SetEntitySetAccessRule(&lt;span class="str"&gt;"*"&lt;/span&gt;, EntitySetRights.AllRead);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;            config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Compile and browse to my NastWords.svc and weep with joy&lt;/p&gt;

&lt;p&gt;&lt;a href="http://geekswithblogs.net/images/geekswithblogs_net/watsonjon/WindowsLiveWriter/ODataTheeasiestserviceIcancreate_AF28/nasty_words.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="nasty_words" border="0" alt="nasty_words" src="http://geekswithblogs.net/images/geekswithblogs_net/watsonjon/WindowsLiveWriter/ODataTheeasiestserviceIcancreate_AF28/nasty_words_thumb.png" width="244" height="61" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="http://geekswithblogs.net/images/geekswithblogs_net/watsonjon/WindowsLiveWriter/ODataTheeasiestserviceIcancreate_AF28/nasty_words_crap.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="nasty_words_crap" border="0" alt="nasty_words_crap" src="http://geekswithblogs.net/images/geekswithblogs_net/watsonjon/WindowsLiveWriter/ODataTheeasiestserviceIcancreate_AF28/nasty_words_crap_thumb.png" width="244" height="102" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Now I can query my service just like any other OData service. Next time, I’ll modify this service to allow updates to sent so I can build up my list of nasty words.&lt;/p&gt;

&lt;p&gt;Enjoy!&lt;/p&gt; &lt;img src="http://geekswithblogs.net/watsonjon/aggbug/139783.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jon Dalberg</dc:creator>
            <guid>http://geekswithblogs.net/watsonjon/archive/2010/05/12/odata-ndash-the-easiest-service-i-can-create.aspx</guid>
            <pubDate>Wed, 12 May 2010 17:58:42 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/watsonjon/comments/139783.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/watsonjon/archive/2010/05/12/odata-ndash-the-easiest-service-i-can-create.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/watsonjon/comments/commentRss/139783.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/watsonjon/services/trackbacks/139783.aspx</trackback:ping>
        </item>
        <item>
            <title>OData Mix10 &amp;ndash; Part Dos</title>
            <category>OData</category>
            <category>Mix</category>
            <link>http://geekswithblogs.net/watsonjon/archive/2010/05/07/odata-mix10-ndash-part-dos.aspx</link>
            <description>&lt;p&gt;The other day I had a snazzy post on fetching all the video (WMV) files from Mix ‘10. A simple, console application that grabbed the urls from the OData feed and downloaded the videos. I wanted to change that app to fire the OData query asynchronously so here’s what resulted:&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;            var mix = &lt;span class="kwrd"&gt;new&lt;/span&gt; Mix.EventEntities(&lt;span class="kwrd"&gt;new&lt;/span&gt; Uri(&lt;span class="str"&gt;"http://api.visitmix.com/OData.svc"&lt;/span&gt;));&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;            var temp = mix.Files.Where(f =&amp;gt; f.TypeName == &lt;span class="str"&gt;"WMV"&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;            var query = temp &lt;span class="kwrd"&gt;as&lt;/span&gt; DataServiceQuery&amp;lt;Mix.File&amp;gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;            query.BeginExecute(OnFileQueryComplete, query);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;            &lt;span class="rem"&gt;// waiting...&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;            Console.ReadLine();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnFileQueryComplete(IAsyncResult result)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;            var query = result.AsyncState &lt;span class="kwrd"&gt;as&lt;/span&gt; DataServiceQuery&amp;lt;Mix.File&amp;gt;;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;            var response = query.EndExecute(result);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;            var web = &lt;span class="kwrd"&gt;new&lt;/span&gt; WebClient();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;            var myVideos = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyVideos), &lt;span class="str"&gt;"Mix10"&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;            Directory.CreateDirectory(myVideos);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (Mix.File f &lt;span class="kwrd"&gt;in&lt;/span&gt; response)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;                var fileName = &lt;span class="kwrd"&gt;new&lt;/span&gt; Uri(f.Url).Segments.Last();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;                Console.WriteLine(f.Url);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;                web.DownloadFile(f.Url, Path.Combine(myVideos, fileName));&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;There are two important things here that are not explained well in the &lt;a href="http://msdn.microsoft.com/en-us/library/dd756367(v=VS.100).aspx" target="_blank"&gt;MSDN docs&lt;/a&gt;:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;See lines 5 and 6? That’s where I query for the WMV files and it returns an IQueryable&amp;lt;T&amp;gt;. You &lt;strong&gt;*have*&lt;/strong&gt; to cast that to a DataServiceQuery&amp;lt;T&amp;gt; and then call BeginExecute. The documented example does not filter so it didn’t show that step. &lt;/li&gt;

  &lt;li&gt;Line 16 shows the correct way to get the previously executed DataServiceQuery&amp;lt;T&amp;gt; from the async result. If you looked at the MSDN example docs it shows (incorrectly) just casting the result, like this: 
    &lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;// wrong&lt;/span&gt;
var query = result &lt;span class="kwrd"&gt;as&lt;/span&gt; DataServiceQuery&amp;lt;Mix.File&amp;gt;;&lt;/pre&gt;
    &lt;/li&gt;&lt;style type="text/css"&gt;&lt;![CDATA[


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;
&lt;/ol&gt;

&lt;p&gt;Other than those items it is relatively straight forward and we’re all async-ified. Enjoy!&lt;/p&gt; &lt;img src="http://geekswithblogs.net/watsonjon/aggbug/139714.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jon Dalberg</dc:creator>
            <guid>http://geekswithblogs.net/watsonjon/archive/2010/05/07/odata-mix10-ndash-part-dos.aspx</guid>
            <pubDate>Fri, 07 May 2010 19:50:16 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/watsonjon/comments/139714.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/watsonjon/archive/2010/05/07/odata-mix10-ndash-part-dos.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/watsonjon/comments/commentRss/139714.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/watsonjon/services/trackbacks/139714.aspx</trackback:ping>
        </item>
        <item>
            <title>Using OData to get Mix10 files</title>
            <category>OData</category>
            <category>Mix</category>
            <link>http://geekswithblogs.net/watsonjon/archive/2010/05/06/using-odata-to-get-mix10-files.aspx</link>
            <description>&lt;p&gt;There has been a lot of talk around OData lately (go to odata.org for more information) and I wanted to get all the videos from Mix ‘10: two great tastes that taste great together. Luckily, Mix has exposed the ‘10 sessions via OData at http://api.visitmix.com/OData.svc, now all I have to do is slap together a bit of code to fetch the videos.&lt;/p&gt;  &lt;h2&gt;Step 1 &lt;/h2&gt;  &lt;p&gt;(cut a hole in the box)&lt;/p&gt;  &lt;p&gt;Create a new console application and add a new service reference.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geekswithblogs.net/images/geekswithblogs_net/watsonjon/WindowsLiveWriter/UsingODatatogetMix10files_CFA1/odata_ref.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="odata_ref" border="0" alt="odata_ref" src="http://geekswithblogs.net/images/geekswithblogs_net/watsonjon/WindowsLiveWriter/UsingODatatogetMix10files_CFA1/odata_ref_thumb.png" width="244" height="198" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h2&gt;Step 2 &lt;/h2&gt;  &lt;p&gt;(put your junk in the box)&lt;/p&gt;  &lt;p&gt;Write a smidgen of code:&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;            var mix = &lt;span class="kwrd"&gt;new&lt;/span&gt; Mix.EventEntities(&lt;span class="kwrd"&gt;new&lt;/span&gt; Uri(&lt;span class="str"&gt;"http://api.visitmix.com/OData.svc"&lt;/span&gt;));&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;            var files = from f &lt;span class="kwrd"&gt;in&lt;/span&gt; mix.Files&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;                        &lt;span class="kwrd"&gt;where&lt;/span&gt; f.TypeName == &lt;span class="str"&gt;"WMV"&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;                        select f;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;            var web = &lt;span class="kwrd"&gt;new&lt;/span&gt; WebClient();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;            &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;            var myVideos = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyVideos), &lt;span class="str"&gt;"Mix10"&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;            Directory.CreateDirectory(myVideos);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;            files.ToList().ForEach(f =&amp;gt; {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;                var fileName = &lt;span class="kwrd"&gt;new&lt;/span&gt; Uri(f.Url).Segments.Last();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;                Console.WriteLine(f.Url);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;                web.DownloadFile(f.Url, Path.Combine(myVideos, fileName));&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;            });&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2&gt;Step 3&lt;/h2&gt;

&lt;p&gt;(have her open the box)&lt;/p&gt;

&lt;p&gt;Compile and run.&lt;/p&gt;

&lt;p&gt;As you can see, the client reference created for the OData service handles almost everything for me. Yeah, I know there is some batch file to download the files, but it relies on cUrl being on the machine – and I wanted an excuse to work with an OData service.&lt;/p&gt;

&lt;p&gt;Enjoy!&lt;/p&gt; &lt;img src="http://geekswithblogs.net/watsonjon/aggbug/139697.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jon Dalberg</dc:creator>
            <guid>http://geekswithblogs.net/watsonjon/archive/2010/05/06/using-odata-to-get-mix10-files.aspx</guid>
            <pubDate>Thu, 06 May 2010 20:03:52 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/watsonjon/comments/139697.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/watsonjon/archive/2010/05/06/using-odata-to-get-mix10-files.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/watsonjon/comments/commentRss/139697.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/watsonjon/services/trackbacks/139697.aspx</trackback:ping>
        </item>
        <item>
            <title>Presentation Terrorists</title>
            <link>http://geekswithblogs.net/watsonjon/archive/2009/11/21/presentation-terrorists.aspx</link>
            <description>&lt;p&gt;I am currently reading Scott Berkun’s book “Confessions of a Public Speaker” and thought this was hilarious and true:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;…unless presentation terrorists steal your microphone midsentence or put up their own projector and start showing their     &lt;br /&gt;own slide deck—designed specifically to contradict your every      &lt;br /&gt;point—you’re free from the pressures other performers face      &lt;br /&gt;nightly. Small observations like this make it easier to laugh at      &lt;br /&gt;nerves, even if they won’t go away.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I do quite a few presentations to companies and other groups and still get nervous before each presentation. One point Scott is trying to make is that it is natural to be nervous and that most speakers don’t have people intentionally trying to derail them. I thought the idea of “presentation terrorists” was great!&lt;/p&gt;  &lt;p&gt;Enjoy!&lt;/p&gt; &lt;img src="http://geekswithblogs.net/watsonjon/aggbug/136453.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jon Dalberg</dc:creator>
            <guid>http://geekswithblogs.net/watsonjon/archive/2009/11/21/presentation-terrorists.aspx</guid>
            <pubDate>Sat, 21 Nov 2009 16:47:22 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/watsonjon/comments/136453.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/watsonjon/archive/2009/11/21/presentation-terrorists.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/watsonjon/comments/commentRss/136453.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/watsonjon/services/trackbacks/136453.aspx</trackback:ping>
        </item>
        <item>
            <title>Injecting an array of objects with Unity</title>
            <category>IoC</category>
            <category>Unity</category>
            <link>http://geekswithblogs.net/watsonjon/archive/2009/10/19/injecting-an-array-of-objects-with-unity.aspx</link>
            <description>&lt;p&gt;If you only have one implementation of a registered interface then it is pretty straight forward, but what do you do if you have multiple implementations of an interface? Now you have to get a little more explicit when registering items in your container. Let’s go through a simple example.&lt;/p&gt;  &lt;p&gt;Say you have a class, OrderProcessor, that takes one implementation of IMessageWriter:&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; OrderProcessor&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; IMessageWriter _messageWriter;&lt;/pre&gt;

  &lt;pre&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; OrderProcessor(IMessageWriter messageWriter)&lt;/pre&gt;

  &lt;pre&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;            _messageWriter = messageWriter;&lt;/pre&gt;

  &lt;pre&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt; &lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SubmitOrder()&lt;/pre&gt;

  &lt;pre class="alt"&gt;        {&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="rem"&gt;// do something special with the order&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt; &lt;/pre&gt;

  &lt;pre&gt;            _messageWriter.Write(&lt;span class="str"&gt;"Submitting order..."&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="rem"&gt;// do some more with the order&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;        }&lt;/pre&gt;

  &lt;pre&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;IMessageWriter is a simple interface:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; IMessageWriter&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;void&lt;/span&gt; Write(&lt;span class="kwrd"&gt;string&lt;/span&gt; message);&lt;/pre&gt;

  &lt;pre&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;If we have only one implementation of IMessageWriter then registration is simple:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;class&lt;/span&gt; Program&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;

  &lt;pre&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;            var container = &lt;span class="kwrd"&gt;new&lt;/span&gt; UnityContainer();&lt;/pre&gt;

  &lt;pre&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;            container.RegisterType&amp;lt;IMessageWriter, ConsoleMessageWriter&amp;gt;();&lt;/pre&gt;

  &lt;pre&gt;            &lt;/pre&gt;

  &lt;pre class="alt"&gt;            var orderProcessor = container.Resolve&amp;lt;OrderProcessor&amp;gt;();&lt;/pre&gt;

  &lt;pre&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;            orderProcessor.SubmitOrder();&lt;/pre&gt;

  &lt;pre&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;In this case our OrderProcessor will use the ConsoleMessageWriter when we call SubmitOrder to write the message to the console. Here’s the implementation of ConsoleMessageWriter:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ConsoleMessageWriter : IMessageWriter&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Write(&lt;span class="kwrd"&gt;string&lt;/span&gt; message)&lt;/pre&gt;

  &lt;pre&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;            Console.WriteLine(message);&lt;/pre&gt;

  &lt;pre&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;What if we have two implementations of IMessageWriter? Let’s add DebugMessageWriter:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; DebugMessageWriter : IMessageWriter&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Write(&lt;span class="kwrd"&gt;string&lt;/span&gt; message)&lt;/pre&gt;

  &lt;pre&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;            Debug.WriteLine(message);&lt;/pre&gt;

  &lt;pre&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;And when we register both types with our IoC container, which one will be used?&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;class&lt;/span&gt; Program&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;

  &lt;pre&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;            var container = &lt;span class="kwrd"&gt;new&lt;/span&gt; UnityContainer();&lt;/pre&gt;

  &lt;pre&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;            container.RegisterType&amp;lt;IMessageWriter, ConsoleMessageWriter&amp;gt;();&lt;/pre&gt;

  &lt;pre&gt;            container.RegisterType&amp;lt;IMessageWriter, DebugMessageWriter&amp;gt;();&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;/pre&gt;

  &lt;pre&gt;            var orderProcessor = container.Resolve&amp;lt;OrderProcessor&amp;gt;();&lt;/pre&gt;

  &lt;pre class="alt"&gt; &lt;/pre&gt;

  &lt;pre&gt;            orderProcessor.SubmitOrder();&lt;/pre&gt;

  &lt;pre class="alt"&gt;        }&lt;/pre&gt;

  &lt;pre&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;That’s right – the only one called will be the DebugMessageWriter implementation! The last one registered wins. &lt;/p&gt;

&lt;p&gt;Now let’s say you change your mind and decide to accept all the registered implementations of IMessageWriter:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; OrderProcessor&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; IMessageWriter[] _messageWriters;&lt;/pre&gt;

  &lt;pre&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; OrderProcessor(IMessageWriter[] messageWriters)&lt;/pre&gt;

  &lt;pre&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;            _messageWriters = messageWriters;&lt;/pre&gt;

  &lt;pre&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt; &lt;/pre&gt;

  &lt;pre&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SubmitOrder()&lt;/pre&gt;

  &lt;pre class="alt"&gt;        {&lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="rem"&gt;// do something special with the order&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt; &lt;/pre&gt;

  &lt;pre&gt;            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (var writer &lt;span class="kwrd"&gt;in&lt;/span&gt; _messageWriters)&lt;/pre&gt;

  &lt;pre class="alt"&gt;                writer.Write(&lt;span class="str"&gt;"Submit order..."&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;span class="rem"&gt;// do some more with the order&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Which implementation will be used? Neither. How can you get the container to use your implementations? It ends up you have to give each registered implementation a unique name, like this:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;class&lt;/span&gt; Program&lt;/pre&gt;

  &lt;pre&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;

  &lt;pre&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;            var container = &lt;span class="kwrd"&gt;new&lt;/span&gt; UnityContainer();&lt;/pre&gt;

  &lt;pre&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;            container.RegisterType&amp;lt;IMessageWriter, ConsoleMessageWriter&amp;gt;(&lt;span class="str"&gt;"console"&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;            container.RegisterType&amp;lt;IMessageWriter, DebugMessageWriter&amp;gt;(&lt;span class="str"&gt;"debug"&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre class="alt"&gt;            &lt;/pre&gt;

  &lt;pre&gt;            var orderProcessor = container.Resolve&amp;lt;OrderProcessor&amp;gt;();&lt;/pre&gt;

  &lt;pre class="alt"&gt; &lt;/pre&gt;

  &lt;pre&gt;            orderProcessor.SubmitOrder();&lt;/pre&gt;

  &lt;pre class="alt"&gt;        }&lt;/pre&gt;

  &lt;pre&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Now when you run the code both implementations will be called. This was not really clear to me when I started working with Unity so I hope this clears up some fog for others.&lt;/p&gt;

&lt;p&gt;Enjoy!&lt;/p&gt; &lt;img src="http://geekswithblogs.net/watsonjon/aggbug/135584.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jon Dalberg</dc:creator>
            <guid>http://geekswithblogs.net/watsonjon/archive/2009/10/19/injecting-an-array-of-objects-with-unity.aspx</guid>
            <pubDate>Tue, 20 Oct 2009 03:56:19 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/watsonjon/comments/135584.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/watsonjon/archive/2009/10/19/injecting-an-array-of-objects-with-unity.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/watsonjon/comments/commentRss/135584.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/watsonjon/services/trackbacks/135584.aspx</trackback:ping>
        </item>
        <item>
            <title>It is hard to know when to move on</title>
            <link>http://geekswithblogs.net/watsonjon/archive/2009/10/06/it-is-hard-to-know-when-to-move-on.aspx</link>
            <description>&lt;p&gt;A post, possibly flame-bait, was sent out to a group that I subscribe. It was a response to a previous post about the “&lt;a href="http://www.joelonsoftware.com/items/2009/09/23.html" target="_blank"&gt;Duct Tape Programmer&lt;/a&gt;.” Incase you’re not familiar, it was started by a post from Joel Spolsky and taken to several extremes by way too many people. Anyway, the poster said something like this:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“I used to idolize Joel Spolsky. However after reading his thoughts and listening to his podcast for the last couple of years I've come to realize he's an arrogant blowhard.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This made me pause to reflect on my feelings about Joel. You see, I’ve been reading &lt;a href="http://www.joelonsoftware.com/index.html" target="_blank"&gt;Joel’s blog&lt;/a&gt; for a long time. I have read several of his books. I even have a copy of the “&lt;a href="http://www.projectaardvark.com/movie/" target="_blank"&gt;Aardvark’d&lt;/a&gt;” DVD he put out. When he and &lt;a href="http://www.codinghorror.com/blog/" target="_blank"&gt;Jeff Atwood&lt;/a&gt; started out on &lt;a href="http://www.stackoverflow.com" target="_blank"&gt;StackOverflow&lt;/a&gt; I was excited because I was also an avid reader of Jeff’s blog. I even listened to their podcasts while StackOverflow was being constructed. But not so much any more.&lt;/p&gt;  &lt;p&gt;It’s not that I don’t like Jeff or Joel – they still have wonderful insight and information into the programming and business world. I guess I’ve just moved on. I don’t subscribe to either of their blogs anymore, but I do read them from time to time if an aggregator picks them up. There are times in your life when you need to be fed a certain diet and for a long time that was given to me by Joel and Jeff. I’ve used their technical and business advice on more than one occasion and still do refer others to their writings. &lt;/p&gt;  &lt;p&gt;I don’t always agree with Joel, but I wouldn’t feel right telling others he is not worth listening. It may not be my time but others might find just what they need with him. Eventually they will move on as well.&lt;/p&gt; &lt;img src="http://geekswithblogs.net/watsonjon/aggbug/135339.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jon Dalberg</dc:creator>
            <guid>http://geekswithblogs.net/watsonjon/archive/2009/10/06/it-is-hard-to-know-when-to-move-on.aspx</guid>
            <pubDate>Wed, 07 Oct 2009 02:42:11 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/watsonjon/comments/135339.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/watsonjon/archive/2009/10/06/it-is-hard-to-know-when-to-move-on.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/watsonjon/comments/commentRss/135339.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/watsonjon/services/trackbacks/135339.aspx</trackback:ping>
        </item>
        <item>
            <title>Go ahead and repeat yourself</title>
            <link>http://geekswithblogs.net/watsonjon/archive/2009/10/05/go-ahead-and-repeat-yourself.aspx</link>
            <description>&lt;p&gt;Did you know about the “Repeat” extension method? &lt;a href="http://msdn.microsoft.com/en-us/library/bb348899.aspx" target="_blank"&gt;Enumerable.Repeat&lt;/a&gt; generates a sequence of repeated values – perfect for some testing scenarios.&lt;/p&gt;  &lt;p&gt;Here’s how I’ve used it…&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; ISearchService CreateSearchServiceWithExpectedResults(&lt;span class="kwrd"&gt;string&lt;/span&gt; searchText, &lt;span class="kwrd"&gt;int&lt;/span&gt; ountOfResults)
{
     var results = Enumerable.Repeat(&lt;span class="kwrd"&gt;new&lt;/span&gt; SearchResult
                                                              {
                                                                  Id = searchText,
                                                                  Description = searchText,
                                                                  Title = searchText,
                                                                  Project = searchText
                                                              }, countOfResults);

     &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; MockSearchService(results.ToList());
}&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;This method takes in a string and sets it to some values of an object, SearchResult, and then creates ‘countOfResults’ copies of that object. A nice, quick way to get some test data. Now I can easily ask for 1, 10, or 100 values to fill my list for testing. Give it a whack and see if it helps your test writing!&lt;/p&gt; &lt;img src="http://geekswithblogs.net/watsonjon/aggbug/135319.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jon Dalberg</dc:creator>
            <guid>http://geekswithblogs.net/watsonjon/archive/2009/10/05/go-ahead-and-repeat-yourself.aspx</guid>
            <pubDate>Mon, 05 Oct 2009 21:13:56 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/watsonjon/comments/135319.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/watsonjon/archive/2009/10/05/go-ahead-and-repeat-yourself.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/watsonjon/comments/commentRss/135319.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/watsonjon/services/trackbacks/135319.aspx</trackback:ping>
        </item>
        <item>
            <title>Unity Convention Based Registration</title>
            <category>Unity</category>
            <category>IoC</category>
            <link>http://geekswithblogs.net/watsonjon/archive/2009/09/28/unity-convention-based-registration.aspx</link>
            <description>&lt;p&gt;Maybe it is just me, but I’m not a big fan of huge amounts of XML configuration. I can get by with a few name-value pairs in an app.config or a web.config but much more makes me nervous that I’m going to mistype something and not know about it until run time. I’ve been using Unity and it has the ability to load up its configuration from the app.config or web.config. Here’s a sample:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geekswithblogs.net/images/geekswithblogs_net/watsonjon/WindowsLiveWriter/UnityConventionBasedRegistration_12386/unity-xml-config_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="unity-xml-config" border="0" alt="unity-xml-config" src="http://geekswithblogs.net/images/geekswithblogs_net/watsonjon/WindowsLiveWriter/UnityConventionBasedRegistration_12386/unity-xml-config_thumb.png" width="226" height="244" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Yeah…..what else ya got?&lt;/p&gt;  &lt;p&gt;It offers a “fluent” API for programmatic registration. Sweet! Now I just have to convert all that XML into code. Hmmmm…Now I have a whole lotta&lt;/p&gt;  &lt;pre class="csharpcode"&gt;Container.RegisterType&amp;lt;IMyThing, MyThing&amp;gt;();&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;That works for a trivial class but I don’t want to write a bunch of repetitive code that simply registers interfaces for types. StructureMap has some sort of convention based registration, why not Unity? Let’s get busy…&lt;/p&gt;

&lt;p&gt;To start off I’ll add a few extension methods to make life a bit easier:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ExtensionMethods
    {
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; IEnumerable&amp;lt;Type&amp;gt; GetInterfaces(&lt;span class="kwrd"&gt;this&lt;/span&gt; Assembly assembly)
        {
            &lt;span class="kwrd"&gt;return&lt;/span&gt; assembly.GetTypes().Where(t =&amp;gt; t.IsInterface);
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; IList&amp;lt;Type&amp;gt; GetImplementationsOfInterface(&lt;span class="kwrd"&gt;this&lt;/span&gt; Assembly assembly, Type interfaceType)
        {
            var implementations = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;Type&amp;gt;();

            var concreteTypes = assembly.GetTypes().Where(t =&amp;gt;
                !t.IsInterface &amp;amp;&amp;amp;
                !t.IsAbstract &amp;amp;&amp;amp;
                interfaceType.IsAssignableFrom(t));

            concreteTypes.ToList().ForEach(implementations.Add);

            &lt;span class="kwrd"&gt;return&lt;/span&gt; implementations;
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ForEach&amp;lt;T&amp;gt;(&lt;span class="kwrd"&gt;this&lt;/span&gt; IEnumerable&amp;lt;T&amp;gt; enumerable, Action&amp;lt;T&amp;gt; action)
        {
            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (var item &lt;span class="kwrd"&gt;in&lt;/span&gt; enumerable)
            {
                action(item);
            }
        }
    }&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;These just offer some shortcuts for getting all the interface from an assembly and then finding all the types which implement a given interface in an assembly. Now we can use these to find and register our interfaces and implementations in our ConventionRegistrar:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ConventionRegistrar
    {
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Configure(IUnityContainer container)
        {
            var asm = Assembly.GetExecutingAssembly();

            var interfaces = asm.GetInterfaces();

            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (var interfaceType &lt;span class="kwrd"&gt;in&lt;/span&gt; interfaces)
            {
                var currentInterfaceType = interfaceType;

                var implementations = asm.GetImplementationsOfInterface(interfaceType);

                &lt;span class="kwrd"&gt;if&lt;/span&gt; (implementations.Count &amp;gt; 1)
                    implementations.ToList().ForEach(i =&amp;gt; container.RegisterType(currentInterfaceType, i, i.Name));
                &lt;span class="kwrd"&gt;else&lt;/span&gt;
                    implementations.ToList().ForEach(i =&amp;gt; container.RegisterType(currentInterfaceType, i));
            }
        }
    }&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;I have this one hard coded to use the executing assembly, but that could easily be changed. Essentially, this just looks up the interfaces then finds all the types that implement those interfaces. The only funky part is where I check if more than one type implements an interface. If that is the case I want to register it as a “named” type, otherwise Unity will only keep the last one registered. This way I can have multiple types implement an interface and get them all by calling&lt;/p&gt;

&lt;pre class="csharpcode"&gt;var startupTasks = Container.ResolveAll&amp;lt;IStartupTask&amp;gt;();&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;That will give me an array of all the classes that implement the IStartupTask interface. So now instead of all that XML or those repetitive Container.Register&amp;lt;I, T&amp;gt;() calls I can simple call ConventionRegistrar.Configure(Container) and &lt;strong&gt;most&lt;/strong&gt; of my work is done. Sure, I may have to do some custom registration for special cases but I’ve taken care of the tedious registration tasks.&lt;/p&gt;

&lt;p&gt;Enjoy!&lt;/p&gt; &lt;img src="http://geekswithblogs.net/watsonjon/aggbug/135150.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jon Dalberg</dc:creator>
            <guid>http://geekswithblogs.net/watsonjon/archive/2009/09/28/unity-convention-based-registration.aspx</guid>
            <pubDate>Tue, 29 Sep 2009 02:35:11 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/watsonjon/comments/135150.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/watsonjon/archive/2009/09/28/unity-convention-based-registration.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/watsonjon/comments/commentRss/135150.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/watsonjon/services/trackbacks/135150.aspx</trackback:ping>
        </item>
        <item>
            <title>BRDNUG &amp;ndash; Intro to WCF</title>
            <link>http://geekswithblogs.net/watsonjon/archive/2009/09/24/brdnug-ndash-intro-to-wcf.aspx</link>
            <description>&lt;p&gt;Tonight Joe Besse gave a great presentation on WCF to our .Net user group. &lt;a href="http://www.sparkhound.com" target="_blank"&gt;Sparkhound&lt;/a&gt; (thanks &lt;a href="http://www.geekswithblogs.net/mikehuguet" target="_blank"&gt;Mike&lt;/a&gt;!) and me were the sponsors and we had 23 people show up despite the nasty, rainy weather. Incase you don’t know, Baton Rouge pretty much shuts down when we get bad weather.&lt;/p&gt;  &lt;p&gt;Joe talked about the ABCs (Address Binding Contract) of WCF, showed how to configure a service in the config file as well as in code. He had a little trouble running his demo of a service that returned random pixel values. He’s not the first to run into trouble with demos, we’ve had Caleb Jenkins down here and his demo got derailed quite a bit, but both guys made a strong come back! The demo gremlins are always there…&lt;/p&gt;  &lt;p&gt;WCF can be quite daunting when you first dive into it. Hell, it’s still a bit to slug through even when you’ve worked with it for a while. Regardless we had a good turnout and a great presenter, thanks Joe!&lt;/p&gt;  &lt;p&gt;Enjoy!&lt;/p&gt; &lt;img src="http://geekswithblogs.net/watsonjon/aggbug/135064.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jon Dalberg</dc:creator>
            <guid>http://geekswithblogs.net/watsonjon/archive/2009/09/24/brdnug-ndash-intro-to-wcf.aspx</guid>
            <pubDate>Thu, 24 Sep 2009 13:10:34 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/watsonjon/comments/135064.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/watsonjon/archive/2009/09/24/brdnug-ndash-intro-to-wcf.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/watsonjon/comments/commentRss/135064.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/watsonjon/services/trackbacks/135064.aspx</trackback:ping>
        </item>
    </channel>
</rss>
