<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Mark Woodhall&#039;s Blog</title>
	<atom:link href="http://mwoodhall.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://mwoodhall.wordpress.com</link>
	<description>.NET, NHibernate, ASP.NET MVC, Silverlight</description>
	<lastBuildDate>Sat, 19 Dec 2009 21:44:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='mwoodhall.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Mark Woodhall&#039;s Blog</title>
		<link>http://mwoodhall.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://mwoodhall.wordpress.com/osd.xml" title="Mark Woodhall&#039;s Blog" />
	<atom:link rel='hub' href='http://mwoodhall.wordpress.com/?pushpress=hub'/>
		<item>
		<title>New Home..</title>
		<link>http://mwoodhall.wordpress.com/2009/12/19/new-home/</link>
		<comments>http://mwoodhall.wordpress.com/2009/12/19/new-home/#comments</comments>
		<pubDate>Sat, 19 Dec 2009 21:44:12 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[new home]]></category>

		<guid isPermaLink="false">http://mwoodhall.wordpress.com/?p=143</guid>
		<description><![CDATA[I&#8217;m migrating my blog over to here. Head over there, there will be more code sample available there.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=mwoodhall.wordpress.com&amp;blog=10716929&amp;post=143&amp;subd=mwoodhall&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m migrating my blog over to <a href="http://hiberlog.com/cs/blogs/markwoodhall/default.aspx">here</a>.</p>
<p>Head over there, there will be more code sample available there. </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mwoodhall.wordpress.com/143/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mwoodhall.wordpress.com/143/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mwoodhall.wordpress.com/143/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mwoodhall.wordpress.com/143/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/mwoodhall.wordpress.com/143/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/mwoodhall.wordpress.com/143/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/mwoodhall.wordpress.com/143/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/mwoodhall.wordpress.com/143/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mwoodhall.wordpress.com/143/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mwoodhall.wordpress.com/143/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mwoodhall.wordpress.com/143/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mwoodhall.wordpress.com/143/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mwoodhall.wordpress.com/143/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mwoodhall.wordpress.com/143/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=mwoodhall.wordpress.com&amp;blog=10716929&amp;post=143&amp;subd=mwoodhall&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://mwoodhall.wordpress.com/2009/12/19/new-home/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/21171513bc9d366bdeaa97247a814270?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Mark</media:title>
		</media:content>
	</item>
		<item>
		<title>Getting started with Silverlight and MEF, Import and Export</title>
		<link>http://mwoodhall.wordpress.com/2009/12/18/getting-started-with-silverlight-and-mef-import-and-export/</link>
		<comments>http://mwoodhall.wordpress.com/2009/12/18/getting-started-with-silverlight-and-mef-import-and-export/#comments</comments>
		<pubDate>Fri, 18 Dec 2009 23:53:43 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Managed Extensibility Framework]]></category>
		<category><![CDATA[mef]]></category>
		<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://mwoodhall.wordpress.com/?p=134</guid>
		<description><![CDATA[For this example, I am using Silverlight 3 and the appropriate version of MEF. The example works in Silverlight 4 as well. The first thing to do is create a new Silverlight application project. I called mine MEFDemo and didnt select the option to create a new website. I then added two new Silverlight controls, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=mwoodhall.wordpress.com&amp;blog=10716929&amp;post=134&amp;subd=mwoodhall&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>For this example, I am using Silverlight 3 and the appropriate version of <a href="http://download.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=MEF&amp;DownloadId=88937&amp;FileTime=129024602040970000&amp;Build=16135">MEF</a>. The example works in Silverlight 4 as well.</p>
<p>The first thing to do is create a new Silverlight application project. I called mine MEFDemo and didnt select the option to create a new website. I then added two new Silverlight controls, Control1 and Control2.</p>
<p>I also modified the MainPage control, here is the xaml.</p>
<div id='iframeDiv0f4df5c6-0d6d-4e43-8f46-3e9bbe0a35a7' style='display:none;margin:0;'></div>
<div id='noIframeDiv0f4df5c6-0d6d-4e43-8f46-3e9bbe0a35a7' style='display:block;margin:0;'>
<pre>
<div><span style="color:#000000;">&lt;</span><span style="color:#000000;">UserControl x:Class</span><span style="color:#000000;">=</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">MEFDemo.MainPage</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">
    xmlns</span><span style="color:#000000;">=</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">http://schemas.microsoft.com/winfx/2006/xaml/presentation</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">
    xmlns:x</span><span style="color:#000000;">=</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">http://schemas.microsoft.com/winfx/2006/xaml</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">
    xmlns:d</span><span style="color:#000000;">=</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">http://schemas.microsoft.com/expression/blend/2008</span><span style="color:#800000;">&quot;</span><span style="color:#000000;"> xmlns:mc</span><span style="color:#000000;">=</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">http://schemas.openxmlformats.org/markup-compatibility/2006</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">
    mc:Ignorable</span><span style="color:#000000;">=</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">d</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">&gt;</span><span style="color:#000000;">
  </span><span style="color:#000000;">&lt;</span><span style="color:#000000;">Grid x:Name</span><span style="color:#000000;">=</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">LayoutRoot</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">&gt;</span><span style="color:#000000;">
        </span><span style="color:#000000;">&lt;</span><span style="color:#000000;">StackPanel Orientation</span><span style="color:#000000;">=</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">Vertical</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">&gt;</span><span style="color:#000000;">
            </span><span style="color:#000000;">&lt;</span><span style="color:#000000;">StackPanel Name</span><span style="color:#000000;">=</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">Top</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">&gt;</span><span style="color:#000000;">

        </span><span style="color:#000000;">&lt;/</span><span style="color:#000000;">StackPanel</span><span style="color:#000000;">&gt;</span><span style="color:#000000;">
        </span><span style="color:#000000;">&lt;</span><span style="color:#000000;">StackPanel Name</span><span style="color:#000000;">=</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">Main</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">&gt;</span><span style="color:#000000;">

        </span><span style="color:#000000;">&lt;/</span><span style="color:#000000;">StackPanel</span><span style="color:#000000;">&gt;</span><span style="color:#000000;">
            </span><span style="color:#000000;">&lt;/</span><span style="color:#000000;">StackPanel</span><span style="color:#000000;">&gt;</span><span style="color:#000000;">
    </span><span style="color:#000000;">&lt;/</span><span style="color:#000000;">Grid</span><span style="color:#000000;">&gt;</span><span style="color:#000000;">
</span><span style="color:#000000;">&lt;/</span><span style="color:#000000;">UserControl</span><span style="color:#000000;">&gt;</span><span style="color:#000000;">
</span></div>
</pre>
</div>
<p>I defined StackPanels called Top and Main, these represent areas that we can add controls into later on. </p>
<p>I then added a reference to System.ComponentModel.Composition and System.ComponentModel.Compisition.Initialization. </p>
<p>I then added a new item called Location.cs with the following code.</p>
<div id='iframeDivfe47f83d-f0e9-4615-a6f7-684fd74b2c67' style='display:none;margin:0;'></div>
<div id='noIframeDivfe47f83d-f0e9-4615-a6f7-684fd74b2c67' style='display:block;margin:0;'>
<pre>
<div><span style="color:#0000FF;">namespace</span><span style="color:#000000;"> MEFDemo
{
    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">enum</span><span style="color:#000000;"> Location
    {
        Top,
        Main
    }
}</span></div>
</pre>
</div>
<p>This is going to be used so that we can configure our controls to appear in a place holder. We are going to use this by defining meta data on our control. We need to define an interface for this meta data, so that MEF can dynamically generate a proxy for us. The interface I have looks like so. </p>
<div id='iframeDiv398da25d-7c39-4fd1-b746-04e57c0677db' style='display:none;margin:0;'></div>
<div id='noIframeDiv398da25d-7c39-4fd1-b746-04e57c0677db' style='display:block;margin:0;'>
<pre>
<div><span style="color:#0000FF;">namespace</span><span style="color:#000000;"> MEFDemo
{
    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">interface</span><span style="color:#000000;"> IMefMetaData
    {
        Location Location { </span><span style="color:#0000FF;">get</span><span style="color:#000000;">; }
    }
}
</span></div>
</pre>
</div>
<p>The next thing to do is change our MainPage control to get a collection of controls using the [ImportMany] attribute. The code for MainPage looks like so.</p>
<div id='iframeDivc5749359-6ba0-41c2-9191-3c4eb28675e2' style='display:none;margin:0;'></div>
<div id='noIframeDivc5749359-6ba0-41c2-9191-3c4eb28675e2' style='display:block;margin:0;'>
<pre>
<div><span style="color:#0000FF;">using</span><span style="color:#000000;"> System;
</span><span style="color:#0000FF;">using</span><span style="color:#000000;"> System.ComponentModel.Composition;
</span><span style="color:#0000FF;">using</span><span style="color:#000000;"> System.Windows.Controls;

</span><span style="color:#0000FF;">namespace</span><span style="color:#000000;"> MEFDemo
{

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">partial</span><span style="color:#000000;"> </span><span style="color:#0000FF;">class</span><span style="color:#000000;"> MainPage : UserControl
    {
        [ImportMany]
        </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> Lazy</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">UserControl, IMefMetaData</span><span style="color:#000000;">&gt;</span><span style="color:#000000;">[] Controls { </span><span style="color:#0000FF;">get</span><span style="color:#000000;">; </span><span style="color:#0000FF;">set</span><span style="color:#000000;">; }

        </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> MainPage()
        {
            InitializeComponent();
            PartInitializer.SatisfyImports(</span><span style="color:#0000FF;">this</span><span style="color:#000000;">);
            </span><span style="color:#0000FF;">foreach</span><span style="color:#000000;"> (var control </span><span style="color:#0000FF;">in</span><span style="color:#000000;"> Controls)
            {
                </span><span style="color:#0000FF;">if</span><span style="color:#000000;">(control.Metadata.Location </span><span style="color:#000000;">==</span><span style="color:#000000;"> Location.Top)
                    Top.Children.Add(control.Value);

                </span><span style="color:#0000FF;">if</span><span style="color:#000000;"> (control.Metadata.Location </span><span style="color:#000000;">==</span><span style="color:#000000;"> Location.Main)
                    Main.Children.Add(control.Value);
            }

        }
    }
}
</span></div>
</pre>
</div>
<p>Here we get a list of Controls, call the SatisfyImports method on the PartInitializer and then use our meta data to decide where to add the control. </p>
<p>In order to configure our 2 controls to get picked up by the [ImportMany] attribute we need change their code a little, the example for each is below. </p>
<p>Control1</p>
<div id='iframeDiv3dd869af-4d35-4763-8a54-3e3e3e4bd879' style='display:none;margin:0;'></div>
<div id='noIframeDiv3dd869af-4d35-4763-8a54-3e3e3e4bd879' style='display:block;margin:0;'>
<pre>
<div><span style="color:#000000;">
</span><span style="color:#0000FF;">using</span><span style="color:#000000;"> System.ComponentModel.Composition;
</span><span style="color:#0000FF;">using</span><span style="color:#000000;"> System.Windows.Controls;

</span><span style="color:#0000FF;">namespace</span><span style="color:#000000;"> MEFDemo
{
    [Export(</span><span style="color:#0000FF;">typeof</span><span style="color:#000000;">(UserControl))]
    [ExportMetadata(</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">Location</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">, Location.Top)]
    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">partial</span><span style="color:#000000;"> </span><span style="color:#0000FF;">class</span><span style="color:#000000;"> Control1 : UserControl
    {
        </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> Control1()
        {
            InitializeComponent();
        }
    }
}</span></div>
</pre>
</div>
<p>Control2</p>
<div id='iframeDiv1dae86a4-8a14-40e2-91e8-ac6c2930c088' style='display:none;margin:0;'></div>
<div id='noIframeDiv1dae86a4-8a14-40e2-91e8-ac6c2930c088' style='display:block;margin:0;'>
<pre>
<div><span style="color:#000000;">
</span><span style="color:#0000FF;">using</span><span style="color:#000000;"> System.ComponentModel.Composition;
</span><span style="color:#0000FF;">using</span><span style="color:#000000;"> System.Windows.Controls;

</span><span style="color:#0000FF;">namespace</span><span style="color:#000000;"> MEFDemo
{
    [Export(</span><span style="color:#0000FF;">typeof</span><span style="color:#000000;">(UserControl))]
    [ExportMetadata(</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">Location</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">, Location.Main)]
    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">partial</span><span style="color:#000000;"> </span><span style="color:#0000FF;">class</span><span style="color:#000000;"> Control2 : UserControl
    {
        </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> Control2()
        {
            InitializeComponent();
        }
    }
}</span></div>
</pre>
</div>
<p>In control 1 we configure the Location property on the meta data to Top, and in control 2 we configure it to Main. If we run this, control 1 will load above control 2. If it doesnt, then my explanation was rubbish and you should go <a href="http://hiberlog.com/MEFDemo.zip">download the code</a>.</p>
<p>Obviously you can be clever with this, you could use Linq on the list of Controls, and filter them based on User Roles or preferences. </p>
<p><a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fmwoodhall.wordpress.com%2f2009%2f12%2f18%2fgetting-started-with-silverlight-and-mef-import-and-export%2f"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fmwoodhall.wordpress.com%2f2009%2f12%2f18%2fgetting-started-with-silverlight-and-mef-import-and-export%2f" border="0" alt="kick it on DotNetKicks.com" /></a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mwoodhall.wordpress.com/134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mwoodhall.wordpress.com/134/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mwoodhall.wordpress.com/134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mwoodhall.wordpress.com/134/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/mwoodhall.wordpress.com/134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/mwoodhall.wordpress.com/134/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/mwoodhall.wordpress.com/134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/mwoodhall.wordpress.com/134/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mwoodhall.wordpress.com/134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mwoodhall.wordpress.com/134/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mwoodhall.wordpress.com/134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mwoodhall.wordpress.com/134/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mwoodhall.wordpress.com/134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mwoodhall.wordpress.com/134/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=mwoodhall.wordpress.com&amp;blog=10716929&amp;post=134&amp;subd=mwoodhall&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://mwoodhall.wordpress.com/2009/12/18/getting-started-with-silverlight-and-mef-import-and-export/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/21171513bc9d366bdeaa97247a814270?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Mark</media:title>
		</media:content>

		<media:content url="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fmwoodhall.wordpress.com%2f2009%2f12%2f18%2fgetting-started-with-silverlight-and-mef-import-and-export%2f" medium="image">
			<media:title type="html">kick it on DotNetKicks.com</media:title>
		</media:content>
	</item>
		<item>
		<title>RIA Services Examples &#8211; Using InvokeOperation</title>
		<link>http://mwoodhall.wordpress.com/2009/12/17/ria-services-examples-using-invokeoperation/</link>
		<comments>http://mwoodhall.wordpress.com/2009/12/17/ria-services-examples-using-invokeoperation/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 22:19:32 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[RIA Services Examples]]></category>
		<category><![CDATA[boolean]]></category>
		<category><![CDATA[invoke]]></category>
		<category><![CDATA[invokeoperation]]></category>
		<category><![CDATA[operation]]></category>
		<category><![CDATA[Ria]]></category>
		<category><![CDATA[Services]]></category>
		<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://mwoodhall.wordpress.com/?p=121</guid>
		<description><![CDATA[I&#8217;m going to start a list of RIA services examples, keeping them short and sweet. This one shows how to call a method that returns a Boolean and use InvokeOperation. Consider the following RIA service. public class AuthenticationService : DomainService { private readonly IApplicationConfigurationService _appConfigService; private readonly IAuthenticationService _authService; public AuthenticationService() { _appConfigService = With.IoC.GetService&#60;IApplicationConfigurationService&#62;(); [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=mwoodhall.wordpress.com&amp;blog=10716929&amp;post=121&amp;subd=mwoodhall&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m going to start a list of RIA services examples, keeping them short and sweet. </p>
<p>This one shows how to call a method that returns a Boolean and use InvokeOperation.</p>
<p>Consider the following RIA service.</p>
<div id='iframeDivcd8e8826-012e-4865-b165-97fb1419a32d' style='display:none;margin:0;'></div>
<div id='noIframeDivcd8e8826-012e-4865-b165-97fb1419a32d' style='display:block;margin:0;'>
<pre>
<div><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">class</span><span style="color:#000000;"> AuthenticationService : DomainService
{
    </span><span style="color:#0000FF;">private</span><span style="color:#000000;"> </span><span style="color:#0000FF;">readonly</span><span style="color:#000000;"> IApplicationConfigurationService _appConfigService;
    </span><span style="color:#0000FF;">private</span><span style="color:#000000;"> </span><span style="color:#0000FF;">readonly</span><span style="color:#000000;"> IAuthenticationService _authService;

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> AuthenticationService()
    {
        _appConfigService </span><span style="color:#000000;">=</span><span style="color:#000000;"> With.IoC.GetService</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">IApplicationConfigurationService</span><span style="color:#000000;">&gt;</span><span style="color:#000000;">();
        _authService </span><span style="color:#000000;">=</span><span style="color:#000000;"> With.IoC.GetService</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">IAuthenticationService</span><span style="color:#000000;">&gt;</span><span style="color:#000000;">();
    }

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> Boolean Authenticate(String email, String password)
    {
        var user </span><span style="color:#000000;">=</span><span style="color:#000000;"> With.IoC.GetService</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">IUser</span><span style="color:#000000;">&gt;</span><span style="color:#000000;">();

        user.EmailAddress </span><span style="color:#000000;">=</span><span style="color:#000000;"> email;
        user.Password </span><span style="color:#000000;">=</span><span style="color:#000000;"> password.Encrypt(_appConfigService.FindByGroupAndKey(
                                             ApplicationConfigurationGroups.CommonEncryption.ToString(),
                                             ApplicationConfigurationKeys.CommonEncryptionKey.ToString()
                                             )
                                             .Value);

        </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> _authService.Authenticate(user);
    }
}</span></div>
</pre>
</div>
<p>You can call the Authenticate method in a Silverlight application like so, using a delegate to capture the InvokeOperation</p>
<div id='iframeDiv9de54665-404e-4329-9d11-81ade6cb3480' style='display:none;margin:0;'></div>
<div id='noIframeDiv9de54665-404e-4329-9d11-81ade6cb3480' style='display:block;margin:0;'>
<pre>
<div><span style="color:#0000FF;">private</span><span style="color:#000000;"> </span><span style="color:#0000FF;">readonly</span><span style="color:#000000;"> AuthenticationContext _authContext </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> AuthenticationContext();

 _authContext.Authenticate(
                Username.Text, Password.Password,
                   </span><span style="color:#0000FF;">delegate</span><span style="color:#000000;">(InvokeOperation</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">Boolean</span><span style="color:#000000;">&gt;</span><span style="color:#000000;"> inv)
                   {
                       IsAuthenticated </span><span style="color:#000000;">=</span><span style="color:#000000;"> inv.Value;
                       </span><span style="color:#008000;">//</span><span style="color:#008000;">do something else</span><span style="color:#008000;">
</span><span style="color:#000000;">                   },
                </span><span style="color:#0000FF;">null</span><span style="color:#000000;">);</span></div>
</pre>
</div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mwoodhall.wordpress.com/121/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mwoodhall.wordpress.com/121/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mwoodhall.wordpress.com/121/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mwoodhall.wordpress.com/121/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/mwoodhall.wordpress.com/121/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/mwoodhall.wordpress.com/121/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/mwoodhall.wordpress.com/121/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/mwoodhall.wordpress.com/121/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mwoodhall.wordpress.com/121/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mwoodhall.wordpress.com/121/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mwoodhall.wordpress.com/121/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mwoodhall.wordpress.com/121/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mwoodhall.wordpress.com/121/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mwoodhall.wordpress.com/121/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=mwoodhall.wordpress.com&amp;blog=10716929&amp;post=121&amp;subd=mwoodhall&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://mwoodhall.wordpress.com/2009/12/17/ria-services-examples-using-invokeoperation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/21171513bc9d366bdeaa97247a814270?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Mark</media:title>
		</media:content>
	</item>
		<item>
		<title>Entity framework profiler beta</title>
		<link>http://mwoodhall.wordpress.com/2009/12/12/entity-framework-profiler-beta/</link>
		<comments>http://mwoodhall.wordpress.com/2009/12/12/entity-framework-profiler-beta/#comments</comments>
		<pubDate>Sat, 12 Dec 2009 21:25:15 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[EFProf]]></category>
		<category><![CDATA[entity framework profiler beta]]></category>
		<category><![CDATA[NHProf]]></category>

		<guid isPermaLink="false">http://mwoodhall.wordpress.com/?p=112</guid>
		<description><![CDATA[I&#8217;ve been using NHProf since the beta now, and its become a pretty vital tool to me. Its great that Ayende has been working on an Entity Framework version, this has just made public beta. If you use Entity Framework then you should really check it out.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=mwoodhall.wordpress.com&amp;blog=10716929&amp;post=112&amp;subd=mwoodhall&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been using <a href="http://www.nhprof.com/">NHProf</a> since the beta now, and its become a pretty vital tool to me. </p>
<p>Its great that <a href="http://ayende.com/blog/default.aspx">Ayende</a> has been working on an <a href="http://efprof.com/">Entity Framework version</a>, this has just made public beta. If you use Entity Framework then you should really check it out. </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mwoodhall.wordpress.com/112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mwoodhall.wordpress.com/112/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mwoodhall.wordpress.com/112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mwoodhall.wordpress.com/112/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/mwoodhall.wordpress.com/112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/mwoodhall.wordpress.com/112/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/mwoodhall.wordpress.com/112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/mwoodhall.wordpress.com/112/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mwoodhall.wordpress.com/112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mwoodhall.wordpress.com/112/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mwoodhall.wordpress.com/112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mwoodhall.wordpress.com/112/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mwoodhall.wordpress.com/112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mwoodhall.wordpress.com/112/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=mwoodhall.wordpress.com&amp;blog=10716929&amp;post=112&amp;subd=mwoodhall&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://mwoodhall.wordpress.com/2009/12/12/entity-framework-profiler-beta/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/21171513bc9d366bdeaa97247a814270?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Mark</media:title>
		</media:content>
	</item>
		<item>
		<title>Dynamically loading controls in Silverlight</title>
		<link>http://mwoodhall.wordpress.com/2009/12/12/dynamically-loading-controls-in-silverlight/</link>
		<comments>http://mwoodhall.wordpress.com/2009/12/12/dynamically-loading-controls-in-silverlight/#comments</comments>
		<pubDate>Sat, 12 Dec 2009 17:24:51 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[control]]></category>
		<category><![CDATA[dynamically]]></category>
		<category><![CDATA[initParams]]></category>
		<category><![CDATA[load]]></category>
		<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://mwoodhall.wordpress.com/?p=104</guid>
		<description><![CDATA[Recently I found myself wanting to specify at &#8216;start up&#8217; time which Control loaded by default in a Silverlight application. For those of you that dont know, you can pass initParams into the Silverlight application that are available at Application Start. An example of this could be like. &#60;div id=&#34;silverlightControlHost&#34;&#62; &#60;object data=&#34;data:application/x-silverlight-2,&#34; type=&#34;application/x-silverlight-2&#34; width=&#34;100%&#34; height=&#34;100%&#34;&#62; [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=mwoodhall.wordpress.com&amp;blog=10716929&amp;post=104&amp;subd=mwoodhall&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Recently I found myself wanting to specify at &#8216;start up&#8217; time which Control loaded by default in a Silverlight application. For those of you that dont know, you can pass initParams into the Silverlight application that are available at Application Start. </p>
<p>An example of this could be like. </p>
<div id='iframeDiv8ac41936-14ef-4092-8124-924e549b50b0' style='display:none;margin:0;'></div>
<div id='noIframeDiv8ac41936-14ef-4092-8124-924e549b50b0' style='display:block;margin:0;'>
<pre>
<div><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">div </span><span style="color:#FF0000;">id</span><span style="color:#0000FF;">=&quot;silverlightControlHost&quot;</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">
    </span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">object </span><span style="color:#FF0000;">data</span><span style="color:#0000FF;">=&quot;data:application/x-silverlight-2,&quot;</span><span style="color:#FF0000;"> type</span><span style="color:#0000FF;">=&quot;application/x-silverlight-2&quot;</span><span style="color:#FF0000;"> width</span><span style="color:#0000FF;">=&quot;100%&quot;</span><span style="color:#FF0000;"> height</span><span style="color:#0000FF;">=&quot;100%&quot;</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">
      </span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">param </span><span style="color:#FF0000;">name</span><span style="color:#0000FF;">=&quot;source&quot;</span><span style="color:#FF0000;"> value</span><span style="color:#0000FF;">=&quot;ClientBin/EMASolutions.CMS.Plugins.Silverlight.xap&quot;</span><span style="color:#0000FF;">/&gt;</span><span style="color:#000000;">
      </span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">param </span><span style="color:#FF0000;">name</span><span style="color:#0000FF;">=&quot;onError&quot;</span><span style="color:#FF0000;"> value</span><span style="color:#0000FF;">=&quot;onSilverlightError&quot;</span><span style="color:#FF0000;"> </span><span style="color:#0000FF;">/&gt;</span><span style="color:#000000;">
      </span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">param </span><span style="color:#FF0000;">name</span><span style="color:#0000FF;">=&quot;background&quot;</span><span style="color:#FF0000;"> value</span><span style="color:#0000FF;">=&quot;white&quot;</span><span style="color:#FF0000;"> </span><span style="color:#0000FF;">/&gt;</span><span style="color:#000000;">
      </span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">param </span><span style="color:#FF0000;">name</span><span style="color:#0000FF;">=&quot;minRuntimeVersion&quot;</span><span style="color:#FF0000;"> value</span><span style="color:#0000FF;">=&quot;3.0.40818.0&quot;</span><span style="color:#FF0000;"> </span><span style="color:#0000FF;">/&gt;</span><span style="color:#000000;">
      </span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">param </span><span style="color:#FF0000;">name</span><span style="color:#0000FF;">=&quot;autoUpgrade&quot;</span><span style="color:#FF0000;"> value</span><span style="color:#0000FF;">=&quot;true&quot;</span><span style="color:#FF0000;"> </span><span style="color:#0000FF;">/&gt;</span><span style="color:#000000;">
      </span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">param </span><span style="color:#FF0000;">name</span><span style="color:#0000FF;">=&quot;initParams&quot;</span><span style="color:#FF0000;"> value</span><span style="color:#0000FF;">=&quot;firstControl=EMASolutions.CMS.Plugins.Silverlight.FolderBrowser&quot;</span><span style="color:#FF0000;"> </span><span style="color:#0000FF;">/&gt;</span><span style="color:#000000;">
      </span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">a </span><span style="color:#FF0000;">href</span><span style="color:#0000FF;">=&quot;http://go.microsoft.com/fwlink/?LinkID=149156&amp;v=3.0.40818.0&quot;</span><span style="color:#FF0000;"> style</span><span style="color:#0000FF;">=&quot;text-decoration:none&quot;</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">
          </span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">img </span><span style="color:#FF0000;">src</span><span style="color:#0000FF;">=&quot;http://go.microsoft.com/fwlink/?LinkId=108181&quot;</span><span style="color:#FF0000;"> alt</span><span style="color:#0000FF;">=&quot;Get Microsoft Silverlight&quot;</span><span style="color:#FF0000;"> style</span><span style="color:#0000FF;">=&quot;border-style:none&quot;</span><span style="color:#0000FF;">/&gt;</span><span style="color:#000000;">
      </span><span style="color:#0000FF;">&lt;/</span><span style="color:#800000;">a</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">
    </span><span style="color:#0000FF;">&lt;/</span><span style="color:#800000;">object</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">
    </span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">iframe </span><span style="color:#FF0000;">id</span><span style="color:#0000FF;">=&quot;_sl_historyFrame&quot;</span><span style="color:#FF0000;"> style</span><span style="color:#0000FF;">=&quot;visibility:hidden;height:0px;width:0px;border:0px&quot;</span><span style="color:#0000FF;">&gt;&lt;/</span><span style="color:#800000;">iframe</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">
</span><span style="color:#0000FF;">&lt;/</span><span style="color:#800000;">div</span><span style="color:#0000FF;">&gt;</span></div>
</pre>
</div>
<p>The initParams take the following format, key=value,key1=value1. Notice in this example we passover the fully qualified type name of the control to load on Application Start. This is a simple example, in reality the type name would be driven from user actions and would probably be a persisted value rather than a &#8216;magic string&#8217;.</p>
<p>Anyway, we can access our &#8216;firstControl&#8217; value like so. </p>
<div id='iframeDiv5f1f29dd-9221-427c-990b-e84807a20b73' style='display:none;margin:0;'></div>
<div id='noIframeDiv5f1f29dd-9221-427c-990b-e84807a20b73' style='display:block;margin:0;'>
<pre>
<div><span style="color:#0000FF;">private</span><span style="color:#000000;"> </span><span style="color:#0000FF;">void</span><span style="color:#000000;"> Application_Startup(</span><span style="color:#0000FF;">object</span><span style="color:#000000;"> sender, StartupEventArgs e)
{
    </span><span style="color:#0000FF;">if</span><span style="color:#000000;"> (</span><span style="color:#000000;">!</span><span style="color:#000000;">NetworkInterface.GetIsNetworkAvailable()) </span><span style="color:#0000FF;">return</span><span style="color:#000000;">;
    </span><span style="color:#0000FF;">if</span><span style="color:#000000;"> (e.InitParams.Any())
    {
        </span><span style="color:#0000FF;">if</span><span style="color:#000000;"> (e.InitParams[</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">firstControl</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">] </span><span style="color:#000000;">!=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">null</span><span style="color:#000000;">)
            LoadControl(
                (Control)
                Activator.CreateInstance(
                    sender.GetType().Assembly.GetType(e.InitParams[</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">firstControl</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">])));
    }
    </span><span style="color:#0000FF;">else</span><span style="color:#000000;">
    {
        LoadControl(
            (Control)
            Activator.CreateInstance(
                sender.GetType().Assembly.GetType(</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">EMASolutions.CMS.Plugins.Silverlight.FolderBrowser</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">)));
    }
    RootVisual </span><span style="color:#000000;">=</span><span style="color:#000000;"> Container;
}</span></div>
</pre>
</div>
<p>Notice, if the type was not specified, we can load a default control. Again, this is a simple example and the default control could be a persisted value also. </p>
<p>In this example, I am making use of a variable called Container, defined like so. </p>
<div id='iframeDivd05a500d-04f8-4fcc-810e-35618cce17f2' style='display:none;margin:0;'></div>
<div id='noIframeDivd05a500d-04f8-4fcc-810e-35618cce17f2' style='display:block;margin:0;'>
<pre>
<div><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">static</span><span style="color:#000000;"> </span><span style="color:#0000FF;">readonly</span><span style="color:#000000;"> Master Container </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> Master();</span></div>
</pre>
</div>
<p>Master has the following xaml and the default code behind. </p>
<div id='iframeDiv7177f2c2-3b50-480b-80b1-7fcfa24981f6' style='display:none;margin:0;'></div>
<div id='noIframeDiv7177f2c2-3b50-480b-80b1-7fcfa24981f6' style='display:block;margin:0;'>
<pre>
<div><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">UserControl </span><span style="color:#FF0000;">x:Class</span><span style="color:#0000FF;">=&quot;EMASolutions.CMS.Plugins.Silverlight.Master&quot;</span><span style="color:#FF0000;">
    xmlns</span><span style="color:#0000FF;">=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;</span><span style="color:#FF0000;">
    xmlns:x</span><span style="color:#0000FF;">=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;</span><span style="color:#FF0000;">
    </span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">
    </span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">Grid </span><span style="color:#FF0000;">x:Name</span><span style="color:#0000FF;">=&quot;LayoutRoot&quot;</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">

        </span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">Grid.RowDefinitions</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">
            </span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">RowDefinition </span><span style="color:#FF0000;">Height</span><span style="color:#0000FF;">=&quot;30&quot;</span><span style="color:#FF0000;"> </span><span style="color:#0000FF;">/&gt;</span><span style="color:#000000;">
            </span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">RowDefinition </span><span style="color:#FF0000;">Height</span><span style="color:#0000FF;">=&quot;*&quot;</span><span style="color:#FF0000;"> </span><span style="color:#0000FF;">/&gt;</span><span style="color:#000000;">
        </span><span style="color:#0000FF;">&lt;/</span><span style="color:#800000;">Grid.RowDefinitions</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">

        </span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">Grid.ColumnDefinitions</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">
            </span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">ColumnDefinition </span><span style="color:#FF0000;">Width</span><span style="color:#0000FF;">=&quot;*&quot;</span><span style="color:#FF0000;"> </span><span style="color:#0000FF;">/&gt;</span><span style="color:#000000;">
        </span><span style="color:#0000FF;">&lt;/</span><span style="color:#800000;">Grid.ColumnDefinitions</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">

        </span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">Grid </span><span style="color:#FF0000;">Name</span><span style="color:#0000FF;">=&quot;TopBar&quot;</span><span style="color:#FF0000;"> Grid.Column</span><span style="color:#0000FF;">=&quot;0&quot;</span><span style="color:#FF0000;">  Grid.Row</span><span style="color:#0000FF;">=&quot;0&quot;</span><span style="color:#0000FF;">&gt;&lt;/</span><span style="color:#800000;">Grid</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">
        </span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">Grid </span><span style="color:#FF0000;">Name</span><span style="color:#0000FF;">=&quot;Main&quot;</span><span style="color:#FF0000;"> Grid.Column</span><span style="color:#0000FF;">=&quot;0&quot;</span><span style="color:#FF0000;"> Grid.Row</span><span style="color:#0000FF;">=&quot;1&quot;</span><span style="color:#0000FF;">&gt;&lt;/</span><span style="color:#800000;">Grid</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">

    </span><span style="color:#0000FF;">&lt;/</span><span style="color:#800000;">Grid</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">
</span><span style="color:#0000FF;">&lt;/</span><span style="color:#800000;">UserControl</span><span style="color:#0000FF;">&gt;</span></div>
</pre>
</div>
<p>All that master does, is give us place holders to load our control into, one called Main and one called TopBar. In the Application_Startup method you will also notice the use of a method called LoadControl. This is what loads controls into our container. It is defined like so. </p>
<div id='iframeDiv98a6b503-6408-4f49-9ac3-58c0017e71a1' style='display:none;margin:0;'></div>
<div id='noIframeDiv98a6b503-6408-4f49-9ac3-58c0017e71a1' style='display:block;margin:0;'>
<pre>
<div><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">static</span><span style="color:#000000;"> </span><span style="color:#0000FF;">void</span><span style="color:#000000;"> LoadControl(Control control)
{
    </span><span style="color:#0000FF;">if</span><span style="color:#000000;"> (Container.Main.Children.Any())
        LastControl </span><span style="color:#000000;">=</span><span style="color:#000000;"> (Control)Container.Main.Children.First();
    Container.Main.Children.Clear();
    Container.TopBar.Children.Add(</span><span style="color:#0000FF;">new</span><span style="color:#000000;"> TopBar());
    Container.Main.Children.Add(control);
}</span></div>
</pre>
</div>
<p>We set a LastControl value if there was one, so that we can navigate backwards and then we clear the current controls and add our new control and a TopBar control.</p>
<p>We can also make use of the LoadControl method in other controls. For example, if we have an Authenticate control that logs in a user, we may wish to load another control if authentication failed. We could do this like so.</p>
<div id='iframeDiva22b6777-81a2-4c64-b3e7-66bbd7b14621' style='display:none;margin:0;'></div>
<div id='noIframeDiva22b6777-81a2-4c64-b3e7-66bbd7b14621' style='display:block;margin:0;'>
<pre>
<div><span style="color:#0000FF;">if</span><span style="color:#000000;"> (OnFailedAuthentication </span><span style="color:#000000;">!=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">null</span><span style="color:#000000;">)
{
    OnFailedAuthentication(sender,e);
    App.LoadControl(</span><span style="color:#0000FF;">new</span><span style="color:#000000;"> Unauthorised());
}</span></div>
</pre>
</div>
<p><a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fmwoodhall.wordpress.com%2f2009%2f12%2f12%2fdynamically-loading-controls-in-silverlight%2f"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fmwoodhall.wordpress.com%2f2009%2f12%2f12%2fdynamically-loading-controls-in-silverlight%2f" border="0" alt="kick it on DotNetKicks.com" /></a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mwoodhall.wordpress.com/104/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mwoodhall.wordpress.com/104/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mwoodhall.wordpress.com/104/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mwoodhall.wordpress.com/104/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/mwoodhall.wordpress.com/104/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/mwoodhall.wordpress.com/104/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/mwoodhall.wordpress.com/104/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/mwoodhall.wordpress.com/104/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mwoodhall.wordpress.com/104/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mwoodhall.wordpress.com/104/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mwoodhall.wordpress.com/104/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mwoodhall.wordpress.com/104/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mwoodhall.wordpress.com/104/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mwoodhall.wordpress.com/104/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=mwoodhall.wordpress.com&amp;blog=10716929&amp;post=104&amp;subd=mwoodhall&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://mwoodhall.wordpress.com/2009/12/12/dynamically-loading-controls-in-silverlight/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/21171513bc9d366bdeaa97247a814270?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Mark</media:title>
		</media:content>

		<media:content url="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fmwoodhall.wordpress.com%2f2009%2f12%2f12%2fdynamically-loading-controls-in-silverlight%2f" medium="image">
			<media:title type="html">kick it on DotNetKicks.com</media:title>
		</media:content>
	</item>
		<item>
		<title>Creating a reusable Silverlight login window &#8211; part 2</title>
		<link>http://mwoodhall.wordpress.com/2009/12/12/creating-a-reusable-silverlight-login-window-part-2/</link>
		<comments>http://mwoodhall.wordpress.com/2009/12/12/creating-a-reusable-silverlight-login-window-part-2/#comments</comments>
		<pubDate>Sat, 12 Dec 2009 09:52:16 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[login]]></category>
		<category><![CDATA[reusable]]></category>
		<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://mwoodhall.wordpress.com/?p=94</guid>
		<description><![CDATA[This is part 2 on how to create a reusable login window for Silverlight, part 1 is here. The Authenticate.xaml child window created in the last post has evolved a little, instead of using Actions it now uses regular old events. public partial class Authenticate : ChildWindow { #region &#34;Properties&#34; private readonly AuthenticationContext _authContext = [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=mwoodhall.wordpress.com&amp;blog=10716929&amp;post=94&amp;subd=mwoodhall&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>This is part 2 on how to create a reusable login window for Silverlight, part 1 is <a href="http://mwoodhall.wordpress.com/2009/12/10/creating-a-reusable-silverlight-login-window/">here</a>.</p>
<p>The Authenticate.xaml child window created in the last post has evolved a little, instead of using Actions it now uses regular old events. </p>
<div id='iframeDiv53d5126e-ef05-46d0-8999-281eca6ac106' style='display:none;margin:0;'></div>
<div id='noIframeDiv53d5126e-ef05-46d0-8999-281eca6ac106' style='display:block;margin:0;'>
<pre>
<div><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">partial</span><span style="color:#000000;"> </span><span style="color:#0000FF;">class</span><span style="color:#000000;"> Authenticate : ChildWindow
    {

        </span><span style="color:#0000FF;">#region</span><span style="color:#000000;"> &quot;Properties&quot;</span><span style="color:#000000;">
        </span><span style="color:#0000FF;">private</span><span style="color:#000000;"> </span><span style="color:#0000FF;">readonly</span><span style="color:#000000;"> AuthenticationContext _authContext </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> AuthenticationContext();
        </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">static</span><span style="color:#000000;"> String Email { </span><span style="color:#0000FF;">get</span><span style="color:#000000;">; </span><span style="color:#0000FF;">set</span><span style="color:#000000;">; }
        </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">static</span><span style="color:#000000;"> </span><span style="color:#0000FF;">event</span><span style="color:#000000;"> EventHandler OnBeforeAuthentication;
        </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">static</span><span style="color:#000000;"> </span><span style="color:#0000FF;">event</span><span style="color:#000000;"> EventHandler OnAuthenticated;
        </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">static</span><span style="color:#000000;"> </span><span style="color:#0000FF;">event</span><span style="color:#000000;"> EventHandler OnAfterAuthentication;
        </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">static</span><span style="color:#000000;"> </span><span style="color:#0000FF;">event</span><span style="color:#000000;"> EventHandler OnFailedAuthentication;

        </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">static</span><span style="color:#000000;"> Boolean IsAuthenticated { </span><span style="color:#0000FF;">get</span><span style="color:#000000;">; </span><span style="color:#0000FF;">set</span><span style="color:#000000;">; }
        </span><span style="color:#0000FF;">#endregion</span><span style="color:#000000;">

        </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> Authenticate()
        {
            InitializeComponent();
            </span><span style="color:#0000FF;">if</span><span style="color:#000000;"> (IsAuthenticated)
                </span><span style="color:#0000FF;">if</span><span style="color:#000000;"> (OnAuthenticated </span><span style="color:#000000;">!=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">null</span><span style="color:#000000;">)
                    OnAuthenticated(</span><span style="color:#0000FF;">this</span><span style="color:#000000;">, </span><span style="color:#0000FF;">null</span><span style="color:#000000;">);
        }

        </span><span style="color:#0000FF;">private</span><span style="color:#000000;"> </span><span style="color:#0000FF;">void</span><span style="color:#000000;"> OKButton_Click(</span><span style="color:#0000FF;">object</span><span style="color:#000000;"> sender, RoutedEventArgs e)
        {
            DialogResult </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">true</span><span style="color:#000000;">;
            </span><span style="color:#0000FF;">if</span><span style="color:#000000;"> (OnBeforeAuthentication </span><span style="color:#000000;">!=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">null</span><span style="color:#000000;">) OnBeforeAuthentication(sender,e);
            _authContext.Authenticate(
                Username.Text, Password.Password,
                   </span><span style="color:#0000FF;">delegate</span><span style="color:#000000;">(InvokeOperation</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">Boolean</span><span style="color:#000000;">&gt;</span><span style="color:#000000;"> inv)
                   {
                       IsAuthenticated </span><span style="color:#000000;">=</span><span style="color:#000000;"> inv.Value;
                       </span><span style="color:#0000FF;">if</span><span style="color:#000000;"> (inv.Value)
                       {
                           Email </span><span style="color:#000000;">=</span><span style="color:#000000;"> Username.Text;
                           IsAuthenticated </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">true</span><span style="color:#000000;">;
                           </span><span style="color:#0000FF;">if</span><span style="color:#000000;"> (OnAuthenticated </span><span style="color:#000000;">!=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">null</span><span style="color:#000000;">)
                               OnAuthenticated(sender, e);
                       }
                       </span><span style="color:#0000FF;">else</span><span style="color:#000000;">
                       {
                           IsAuthenticated </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">false</span><span style="color:#000000;">;
                           </span><span style="color:#0000FF;">if</span><span style="color:#000000;"> (OnFailedAuthentication </span><span style="color:#000000;">!=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">null</span><span style="color:#000000;">)
                           {
                               OnFailedAuthentication(sender,e);
                           }
                       }
                   },
                </span><span style="color:#0000FF;">null</span><span style="color:#000000;">);
            </span><span style="color:#0000FF;">if</span><span style="color:#000000;"> (OnAfterAuthentication </span><span style="color:#000000;">!=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">null</span><span style="color:#000000;">) OnAfterAuthentication(sender,e);
        }

        </span><span style="color:#0000FF;">private</span><span style="color:#000000;"> </span><span style="color:#0000FF;">void</span><span style="color:#000000;"> CancelButton_Click(</span><span style="color:#0000FF;">object</span><span style="color:#000000;"> sender, RoutedEventArgs e)
        {
            </span><span style="color:#0000FF;">if</span><span style="color:#000000;"> (OnFailedAuthentication </span><span style="color:#000000;">!=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">null</span><span style="color:#000000;">)
            {
                OnFailedAuthentication(sender,e);
                App.LoadControl(</span><span style="color:#0000FF;">new</span><span style="color:#000000;"> Unauthorised());
            }
            DialogResult </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">false</span><span style="color:#000000;">;
        }
    }</span></div>
</pre>
</div>
<p>I also made the EventHandlers static so that multiple controls can wire up delegates. </p>
<p>I added a new UserControl (AuthenticateControl.xaml) in order to house the Authenticate child window. The xaml for this control only contains the following.</p>
<div id='iframeDivdf220df6-9c72-4319-a617-af0410a5ee1c' style='display:none;margin:0;'></div>
<div id='noIframeDivdf220df6-9c72-4319-a617-af0410a5ee1c' style='display:block;margin:0;'>
<pre>
<div><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">UserControl </span><span style="color:#FF0000;">x:Class</span><span style="color:#0000FF;">=&quot;EMASolutions.CMS.Plugins.Silverlight.Controls.AuthenticateControl&quot;</span><span style="color:#FF0000;">
    xmlns</span><span style="color:#0000FF;">=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;</span><span style="color:#FF0000;">
    xmlns:x</span><span style="color:#0000FF;">=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;</span><span style="color:#FF0000;">
              </span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">

</span><span style="color:#0000FF;">&lt;/</span><span style="color:#800000;">UserControl</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">
</span></div>
</pre>
</div>
<p>The code behind contains the following.</p>
<div id='iframeDiva74eef24-7677-4b63-8492-7294f6f2b229' style='display:none;margin:0;'></div>
<div id='noIframeDiva74eef24-7677-4b63-8492-7294f6f2b229' style='display:block;margin:0;'>
<pre>
<div><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">partial</span><span style="color:#000000;"> </span><span style="color:#0000FF;">class</span><span style="color:#000000;"> AuthenticateControl : UserControl
{
    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> Boolean RequiresAuthentication { </span><span style="color:#0000FF;">get</span><span style="color:#000000;">; </span><span style="color:#0000FF;">set</span><span style="color:#000000;">; }
    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> Authenticate LoginControl { </span><span style="color:#0000FF;">get</span><span style="color:#000000;">; </span><span style="color:#0000FF;">set</span><span style="color:#000000;">; }

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> AuthenticateControl()
    {
        InitializeComponent();
        LoginControl </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> Authenticate();
        Loaded </span><span style="color:#000000;">+=</span><span style="color:#000000;"> Control_Loaded;
    }

    </span><span style="color:#0000FF;">void</span><span style="color:#000000;"> Control_Loaded(</span><span style="color:#0000FF;">object</span><span style="color:#000000;"> sender, RoutedEventArgs e)
    {
        </span><span style="color:#0000FF;">if</span><span style="color:#000000;"> (</span><span style="color:#000000;">!</span><span style="color:#000000;">RequiresAuthentication) </span><span style="color:#0000FF;">return</span><span style="color:#000000;">;
        LoginControl </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> Authenticate { Title </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#800000;">&quot;</span><span style="color:#800000;">Authenticate</span><span style="color:#800000;">&quot;</span><span style="color:#000000;"> };
        </span><span style="color:#0000FF;">if</span><span style="color:#000000;"> (</span><span style="color:#000000;">!</span><span style="color:#000000;">Authenticate.IsAuthenticated)
            LoginControl.Show();

        Authenticate.OnFailedAuthentication </span><span style="color:#000000;">+=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">delegate</span><span style="color:#000000;"> { LoginControl.Show(); };
    }
}</span></div>
</pre>
</div>
<p>This control is going to become a base control for our others to inherit from. In our other controls we can then set the RequiresAuthentication property to true and if the user has not yet authenticated they will be prompted to do so. </p>
<p>Here is an example of how we can use it in a control. </p>
<div id='iframeDivc01e74c6-1478-481e-8c78-df6fe6b626aa' style='display:none;margin:0;'></div>
<div id='noIframeDivc01e74c6-1478-481e-8c78-df6fe6b626aa' style='display:block;margin:0;'>
<pre>
<div><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">partial</span><span style="color:#000000;"> </span><span style="color:#0000FF;">class</span><span style="color:#000000;"> FolderBrowser : AuthenticateControl
{
    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> FolderBrowser()
    {
        _folderContext </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> FolderContext();
        _documentContext </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> DocumentContext();
        InitializeComponent();
        Loaded </span><span style="color:#000000;">+=</span><span style="color:#000000;"> MainPage_Loaded;
    }

    </span><span style="color:#0000FF;">void</span><span style="color:#000000;"> MainPage_Loaded(</span><span style="color:#0000FF;">object</span><span style="color:#000000;"> sender, RoutedEventArgs e)
    {
        RequiresAuthentication </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">true</span><span style="color:#000000;">;
        Authenticate.OnBeforeAuthentication </span><span style="color:#000000;">+=</span><span style="color:#000000;">
            </span><span style="color:#0000FF;">delegate</span><span style="color:#000000;">
             {
                 Dispatcher.BeginInvoke(
                     () </span><span style="color:#000000;">=&gt;</span><span style="color:#000000;">
                     {
                        IsBusy </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">true</span><span style="color:#000000;">;
                     });
             };

        Authenticate.OnAuthenticated </span><span style="color:#000000;">+=</span><span style="color:#000000;">
            </span><span style="color:#0000FF;">delegate</span><span style="color:#000000;">
            {
                _folderContext.Load(
                    _folderContext.GetFoldersQuery(),
                    LoadBehavior.RefreshCurrent,
                    </span><span style="color:#0000FF;">delegate</span><span style="color:#000000;">
                        {
                            Dispatcher.BeginInvoke
                                (
                                () </span><span style="color:#000000;">=&gt;</span><span style="color:#000000;">
                                    {
                                        folders.ItemsSource </span><span style="color:#000000;">=</span><span style="color:#000000;">
                                            _folderContext.Folders.Where(f </span><span style="color:#000000;">=&gt;</span><span style="color:#000000;"> f.ParentId </span><span style="color:#000000;">==</span><span style="color:#000000;"> </span><span style="color:#800080;">0</span><span style="color:#000000;">);
                                        IsBusy </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">false</span><span style="color:#000000;">;
                                    }
                                );
                        },
                    </span><span style="color:#0000FF;">null</span><span style="color:#000000;">);
            };
    }
}</span></div>
</pre>
</div>
<p>Notice this control now inherits from AuthenticateControl, the xaml must also be changed to include the AuthenticateControl as its root tag in place of UserControl.</p>
<p>In other controls, that do not require any sort of authentication we dont have to inherit from AuthenticateControl, we can just inherit from UserControl.</p>
<p>We can still make use of the static event handlers in the Authenticate child window, consider the following as an example. </p>
<div id='iframeDiv033851ec-705f-4516-99e5-1a3ccd434a22' style='display:none;margin:0;'></div>
<div id='noIframeDiv033851ec-705f-4516-99e5-1a3ccd434a22' style='display:block;margin:0;'>
<pre>
<div><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">partial</span><span style="color:#000000;"> </span><span style="color:#0000FF;">class</span><span style="color:#000000;"> TopBar : UserControl
{
    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> TopBar()
    {
        InitializeComponent();
        Authenticate.OnAuthenticated </span><span style="color:#000000;">+=</span><span style="color:#000000;">
            </span><span style="color:#0000FF;">delegate</span><span style="color:#000000;">
            {
                Email.Text </span><span style="color:#000000;">=</span><span style="color:#000000;"> Authenticate.Email;
            };
    }
}</span></div>
</pre>
</div>
<p>This simply appends an additional action to the OnAuthenticated event handler, so if a user has Authenticated using a control that required it we can tap in an use the email address they authenticated with to display it on screen. </p>
<p>Using this method we can be flexible in displaying authentication prompts and we can also allow dynamic loading of any control as the RootVisual in our Silverlight application. </p>
<p>This means we can pass a parameter from the server when the Silverlight application launches and define which control we want as our root visual based on something a user did. We dont have to direct them to a login area by default. We just allow our control to handle that.</p>
<p>I hope this makes sense, it seems like a nice way of doing things to me but I&#8217;m not sure I&#8217;ve explained it well. I&#8217;m still learning about the best way of doing things with Silverlight, so take everything with a &#8216;large&#8217; pinch of salt. </p>
<p><a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fmwoodhall.wordpress.com%2f2009%2f12%2f12%2fcreating-a-reusable-silverlight-login-window-part-2%2f"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fmwoodhall.wordpress.com%2f2009%2f12%2f12%2fcreating-a-reusable-silverlight-login-window-part-2%2f" border="0" alt="kick it on DotNetKicks.com" /></a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mwoodhall.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mwoodhall.wordpress.com/94/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mwoodhall.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mwoodhall.wordpress.com/94/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/mwoodhall.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/mwoodhall.wordpress.com/94/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/mwoodhall.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/mwoodhall.wordpress.com/94/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mwoodhall.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mwoodhall.wordpress.com/94/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mwoodhall.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mwoodhall.wordpress.com/94/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mwoodhall.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mwoodhall.wordpress.com/94/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=mwoodhall.wordpress.com&amp;blog=10716929&amp;post=94&amp;subd=mwoodhall&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://mwoodhall.wordpress.com/2009/12/12/creating-a-reusable-silverlight-login-window-part-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/21171513bc9d366bdeaa97247a814270?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Mark</media:title>
		</media:content>

		<media:content url="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fmwoodhall.wordpress.com%2f2009%2f12%2f12%2fcreating-a-reusable-silverlight-login-window-part-2%2f" medium="image">
			<media:title type="html">kick it on DotNetKicks.com</media:title>
		</media:content>
	</item>
		<item>
		<title>Creating a reusable Silverlight login window &#8211; part 1</title>
		<link>http://mwoodhall.wordpress.com/2009/12/10/creating-a-reusable-silverlight-login-window/</link>
		<comments>http://mwoodhall.wordpress.com/2009/12/10/creating-a-reusable-silverlight-login-window/#comments</comments>
		<pubDate>Thu, 10 Dec 2009 22:36:00 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[login]]></category>
		<category><![CDATA[reuseable]]></category>
		<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://mwoodhall.wordpress.com/?p=82</guid>
		<description><![CDATA[This post is an example showing how to create a reusable child window to allow a user to login to a silverlight application. The first thing to do is add a new child window to your existing Silverlight project and name it Authenticate.xaml Once we have added this item we can modify the xaml to [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=mwoodhall.wordpress.com&amp;blog=10716929&amp;post=82&amp;subd=mwoodhall&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>This post is an example showing how to create a reusable child window to allow a user to login to a silverlight application.</p>
<p>The first thing to do is add a new child window to your existing Silverlight project and name it Authenticate.xaml</p>
<p><img src="http://mwoodhall.files.wordpress.com/2009/12/cwindow.png?w=600" alt="child window" /></p>
<p>Once we have added this item we can modify the xaml to meet our needs. I added a small message, a text box and a passsword box. I made use of the 2 buttons created in a child window by default. This is the xaml I ended up with. </p>
<div id='iframeDiv8e8f2dbf-a8b1-43e5-a4f6-0c0caffd927b' style='display:none;margin:0;'></div>
<div id='noIframeDiv8e8f2dbf-a8b1-43e5-a4f6-0c0caffd927b' style='display:block;margin:0;'>
<pre>
<div><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">controls:ChildWindow </span><span style="color:#FF0000;">xmlns:expressionDark</span><span style="color:#0000FF;">=&quot;clr-namespace:System.Windows.Controls.Theming;assembly=System.Windows.Controls.Theming.ExpressionDark&quot;</span><span style="color:#FF0000;">  x:Class</span><span style="color:#0000FF;">=&quot;EMASolutions.CMS.Plugins.Silverlight.FolderBrowser.Authenticate&quot;</span><span style="color:#FF0000;">
           xmlns</span><span style="color:#0000FF;">=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;</span><span style="color:#FF0000;">
           xmlns:x</span><span style="color:#0000FF;">=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;</span><span style="color:#FF0000;">
           xmlns:controls</span><span style="color:#0000FF;">=&quot;clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls&quot;</span><span style="color:#FF0000;">
    xmlns:themeing</span><span style="color:#0000FF;">=&quot;clr-namespace:System.Windows.Controls.Theming;assembly=System.Windows.Controls.Theming.Toolkit&quot;</span><span style="color:#FF0000;">

           Width</span><span style="color:#0000FF;">=&quot;400&quot;</span><span style="color:#FF0000;"> Height</span><span style="color:#0000FF;">=&quot;300&quot;</span><span style="color:#FF0000;">
           Title</span><span style="color:#0000FF;">=&quot;Authenticate&quot;</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">
    </span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">Grid </span><span style="color:#FF0000;">x:Name</span><span style="color:#0000FF;">=&quot;LayoutRoot&quot;</span><span style="color:#FF0000;"> Margin</span><span style="color:#0000FF;">=&quot;2&quot;</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">

        </span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">expressionDark:ExpressionDarkTheme</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">
            </span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">StackPanel</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">
                </span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">StackPanel </span><span style="color:#FF0000;">Orientation</span><span style="color:#0000FF;">=&quot;Vertical&quot;</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">

                    </span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">Border </span><span style="color:#FF0000;">Margin</span><span style="color:#0000FF;">=&quot;2,2,2,2&quot;</span><span style="color:#FF0000;"> Padding</span><span style="color:#0000FF;">=&quot;2,2,2,2&quot;</span><span style="color:#FF0000;"> Background</span><span style="color:#0000FF;">=&quot;#333333&quot;</span><span style="color:#FF0000;"> BorderThickness</span><span style="color:#0000FF;">=&quot;1&quot;</span><span style="color:#FF0000;"> BorderBrush</span><span style="color:#0000FF;">=&quot;#000000&quot;</span><span style="color:#FF0000;"> CornerRadius</span><span style="color:#0000FF;">=&quot;2,2,2,2&quot;</span><span style="color:#FF0000;"> </span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">

                        </span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">TextBlock </span><span style="color:#FF0000;">Height</span><span style="color:#0000FF;">=&quot;130&quot;</span><span style="color:#FF0000;"> TextWrapping</span><span style="color:#0000FF;">=&quot;Wrap&quot;</span><span style="color:#FF0000;"> Foreground</span><span style="color:#0000FF;">=&quot;#FFFFFF&quot;</span><span style="color:#FF0000;"> Text</span><span style="color:#0000FF;">=&quot;Please login&quot;</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">
                        </span><span style="color:#0000FF;">&lt;/</span><span style="color:#800000;">TextBlock</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">

                    </span><span style="color:#0000FF;">&lt;/</span><span style="color:#800000;">Border</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">

                    </span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">TextBox </span><span style="color:#FF0000;">Margin</span><span style="color:#0000FF;">=&quot;2,2,2,2&quot;</span><span style="color:#FF0000;"> themeing:ImplicitStyleManager.ApplyMode</span><span style="color:#0000FF;">=&quot;Auto&quot;</span><span style="color:#FF0000;"> Name</span><span style="color:#0000FF;">=&quot;Username&quot;</span><span style="color:#FF0000;"> Text</span><span style="color:#0000FF;">=&quot;Enter username&quot;</span><span style="color:#FF0000;"> </span><span style="color:#0000FF;">/&gt;</span><span style="color:#000000;">
                    </span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">PasswordBox </span><span style="color:#FF0000;">Margin</span><span style="color:#0000FF;">=&quot;2,2,2,2&quot;</span><span style="color:#FF0000;"> themeing:ImplicitStyleManager.ApplyMode</span><span style="color:#0000FF;">=&quot;Auto&quot;</span><span style="color:#FF0000;">  Name</span><span style="color:#0000FF;">=&quot;Password&quot;</span><span style="color:#FF0000;"> PasswordChar</span><span style="color:#0000FF;">=&quot;*&quot;</span><span style="color:#FF0000;"> </span><span style="color:#0000FF;">/&gt;</span><span style="color:#000000;">
                    </span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">StackPanel  </span><span style="color:#FF0000;">Orientation</span><span style="color:#0000FF;">=&quot;Horizontal&quot;</span><span style="color:#FF0000;"> HorizontalAlignment</span><span style="color:#0000FF;">=&quot;Right&quot;</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">
                        </span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">Button </span><span style="color:#FF0000;">x:Name</span><span style="color:#0000FF;">=&quot;CancelButton&quot;</span><span style="color:#FF0000;"> HorizontalAlignment</span><span style="color:#0000FF;">=&quot;Right&quot;</span><span style="color:#FF0000;">   themeing:ImplicitStyleManager.ApplyMode</span><span style="color:#0000FF;">=&quot;Auto&quot;</span><span style="color:#FF0000;"> Content</span><span style="color:#0000FF;">=&quot;Cancel&quot;</span><span style="color:#FF0000;"> Click</span><span style="color:#0000FF;">=&quot;CancelButton_Click&quot;</span><span style="color:#FF0000;"> Width</span><span style="color:#0000FF;">=&quot;75&quot;</span><span style="color:#FF0000;"> Height</span><span style="color:#0000FF;">=&quot;23&quot;</span><span style="color:#FF0000;"> Margin</span><span style="color:#0000FF;">=&quot;2,2,2,2&quot;</span><span style="color:#FF0000;"> </span><span style="color:#0000FF;">/&gt;</span><span style="color:#000000;">
                        </span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">Button </span><span style="color:#FF0000;">x:Name</span><span style="color:#0000FF;">=&quot;OKButton&quot;</span><span style="color:#FF0000;">  HorizontalAlignment</span><span style="color:#0000FF;">=&quot;Right&quot;</span><span style="color:#FF0000;">  themeing:ImplicitStyleManager.ApplyMode</span><span style="color:#0000FF;">=&quot;Auto&quot;</span><span style="color:#FF0000;"> Content</span><span style="color:#0000FF;">=&quot;Login&quot;</span><span style="color:#FF0000;"> Click</span><span style="color:#0000FF;">=&quot;OKButton_Click&quot;</span><span style="color:#FF0000;"> Width</span><span style="color:#0000FF;">=&quot;75&quot;</span><span style="color:#FF0000;"> Height</span><span style="color:#0000FF;">=&quot;23&quot;</span><span style="color:#FF0000;"> Margin</span><span style="color:#0000FF;">=&quot;2,2,2,2&quot;</span><span style="color:#FF0000;">  </span><span style="color:#0000FF;">/&gt;</span><span style="color:#000000;">
                    </span><span style="color:#0000FF;">&lt;/</span><span style="color:#800000;">StackPanel</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">
                </span><span style="color:#0000FF;">&lt;/</span><span style="color:#800000;">StackPanel</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">
            </span><span style="color:#0000FF;">&lt;/</span><span style="color:#800000;">StackPanel</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">
        </span><span style="color:#0000FF;">&lt;/</span><span style="color:#800000;">expressionDark:ExpressionDarkTheme</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">
    </span><span style="color:#0000FF;">&lt;/</span><span style="color:#800000;">Grid</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">
</span><span style="color:#0000FF;">&lt;/</span><span style="color:#800000;">controls:ChildWindow</span><span style="color:#0000FF;">&gt;</span></div>
</pre>
</div>
<p>This gives us a child window that looks like the image below.</p>
<p><a href="http://mwoodhall.files.wordpress.com/2009/12/authexample.png"><img src="http://mwoodhall.files.wordpress.com/2009/12/authexample.png?w=590&#038;h=424" alt="" title="authexample" width="590" height="424" class="alignnone size-medium wp-image-84" /></a></p>
<p>Next we need to open the code behind for this file. In this file we have added some actions to execute in various scenarios. The code looks like so.</p>
<div id='iframeDiv537c15a3-e7a5-4a16-b807-cbc59e60da63' style='display:none;margin:0;'></div>
<div id='noIframeDiv537c15a3-e7a5-4a16-b807-cbc59e60da63' style='display:block;margin:0;'>
<pre>
<div><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">partial</span><span style="color:#000000;"> </span><span style="color:#0000FF;">class</span><span style="color:#000000;"> Authenticate : ChildWindow
{

    </span><span style="color:#0000FF;">#region</span><span style="color:#000000;"> &quot;Properties&quot;</span><span style="color:#000000;">

    </span><span style="color:#0000FF;">private</span><span style="color:#000000;"> </span><span style="color:#0000FF;">readonly</span><span style="color:#000000;"> AuthenticationContext _authContext </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> AuthenticationContext();

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> Action BeforeAuthentication { </span><span style="color:#0000FF;">get</span><span style="color:#000000;">; </span><span style="color:#0000FF;">set</span><span style="color:#000000;">; }
    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> Action OnAuthenticated { </span><span style="color:#0000FF;">get</span><span style="color:#000000;">; </span><span style="color:#0000FF;">set</span><span style="color:#000000;">; }
    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> Action AfterAuthentication { </span><span style="color:#0000FF;">get</span><span style="color:#000000;">; </span><span style="color:#0000FF;">set</span><span style="color:#000000;">; }
    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> Action OnFailedAuthentication { </span><span style="color:#0000FF;">get</span><span style="color:#000000;">; </span><span style="color:#0000FF;">set</span><span style="color:#000000;">; }

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">bool</span><span style="color:#000000;"> IsAuthenticated
    {
        </span><span style="color:#0000FF;">get</span><span style="color:#000000;"> { </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> (</span><span style="color:#0000FF;">bool</span><span style="color:#000000;">)GetValue(IsAuthenticatedProperty); }
        </span><span style="color:#0000FF;">set</span><span style="color:#000000;"> { SetValue(IsAuthenticatedProperty, value); }
    }

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">static</span><span style="color:#000000;"> </span><span style="color:#0000FF;">readonly</span><span style="color:#000000;"> DependencyProperty IsAuthenticatedProperty </span><span style="color:#000000;">=</span><span style="color:#000000;">
        DependencyProperty.Register(</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">IsAuthenticated</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">, </span><span style="color:#0000FF;">typeof</span><span style="color:#000000;">(</span><span style="color:#0000FF;">bool</span><span style="color:#000000;">), </span><span style="color:#0000FF;">typeof</span><span style="color:#000000;">(Authenticate), </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> PropertyMetadata(</span><span style="color:#0000FF;">false</span><span style="color:#000000;">));

    </span><span style="color:#0000FF;">#endregion</span><span style="color:#000000;">

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> Authenticate()
    {
        InitializeComponent();
    }

    </span><span style="color:#0000FF;">private</span><span style="color:#000000;"> </span><span style="color:#0000FF;">void</span><span style="color:#000000;"> OKButton_Click(</span><span style="color:#0000FF;">object</span><span style="color:#000000;"> sender, RoutedEventArgs e)
    {
        DialogResult </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">true</span><span style="color:#000000;">;
        </span><span style="color:#0000FF;">if</span><span style="color:#000000;"> (BeforeAuthentication </span><span style="color:#000000;">!=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">null</span><span style="color:#000000;">) BeforeAuthentication();
        _authContext.Authenticate(
            Username.Text, Password.Password,
               </span><span style="color:#0000FF;">delegate</span><span style="color:#000000;">(InvokeOperation</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">Boolean</span><span style="color:#000000;">&gt;</span><span style="color:#000000;"> inv)
               {
                   IsAuthenticated </span><span style="color:#000000;">=</span><span style="color:#000000;"> inv.Value;
                   </span><span style="color:#0000FF;">if</span><span style="color:#000000;"> (inv.Value)
                   {
                       IsAuthenticated </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">true</span><span style="color:#000000;">;
                       </span><span style="color:#0000FF;">if</span><span style="color:#000000;"> (OnAuthenticated </span><span style="color:#000000;">!=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">null</span><span style="color:#000000;">)
                           OnAuthenticated();
                   }
                   </span><span style="color:#0000FF;">else</span><span style="color:#000000;">
                   {
                       </span><span style="color:#0000FF;">if</span><span style="color:#000000;"> (OnFailedAuthentication </span><span style="color:#000000;">!=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">null</span><span style="color:#000000;">)
                           OnFailedAuthentication();
                   }
               },
            </span><span style="color:#0000FF;">null</span><span style="color:#000000;">);
        </span><span style="color:#0000FF;">if</span><span style="color:#000000;"> (AfterAuthentication </span><span style="color:#000000;">!=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">null</span><span style="color:#000000;">) AfterAuthentication();
    }

    </span><span style="color:#0000FF;">private</span><span style="color:#000000;"> </span><span style="color:#0000FF;">void</span><span style="color:#000000;"> CancelButton_Click(</span><span style="color:#0000FF;">object</span><span style="color:#000000;"> sender, RoutedEventArgs e)
    {
        DialogResult </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">false</span><span style="color:#000000;">;
    }
}</span></div>
</pre>
</div>
<p>In this example I call out to a RIA service to validate the username and password supplied by the user. Obviously this can be replaced to use other methods.</p>
<p>You can then make use of this child window in your xaml user control with code similar to the following. </p>
<div id='iframeDiv6341613d-f8db-48ab-9f8f-c6e9556964bf' style='display:none;margin:0;'></div>
<div id='noIframeDiv6341613d-f8db-48ab-9f8f-c6e9556964bf' style='display:block;margin:0;'>
<pre>
<div><span style="color:#0000FF;">void</span><span style="color:#000000;"> MainPage_Loaded(</span><span style="color:#0000FF;">object</span><span style="color:#000000;"> sender, RoutedEventArgs e)
{
    var login </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> Authenticate {Title </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#800000;">&quot;</span><span style="color:#800000;">Authenticate</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">};
    </span><span style="color:#0000FF;">if</span><span style="color:#000000;"> (</span><span style="color:#000000;">!</span><span style="color:#000000;">login.IsAuthenticated)
        login.Show();

    login.BeforeAuthentication </span><span style="color:#000000;">=</span><span style="color:#000000;">
        () </span><span style="color:#000000;">=&gt;</span><span style="color:#000000;">
         {
             Dispatcher.BeginInvoke(
                 () </span><span style="color:#000000;">=&gt;</span><span style="color:#000000;">
                 {
                    IsBusy </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">true</span><span style="color:#000000;">;
                 });
         };

    login.OnAuthenticated </span><span style="color:#000000;">=</span><span style="color:#000000;">
        ()</span><span style="color:#000000;">=&gt;</span><span style="color:#000000;">
        {
            _folderContext.Load(
                _folderContext.GetFoldersQuery(),
                LoadBehavior.RefreshCurrent,
                </span><span style="color:#0000FF;">delegate</span><span style="color:#000000;">
                    {
                        Dispatcher.BeginInvoke
                            (
                            () </span><span style="color:#000000;">=&gt;</span><span style="color:#000000;">
                                {
                                    folders.ItemsSource </span><span style="color:#000000;">=</span><span style="color:#000000;">
                                        _folderContext.Folders.Where(f </span><span style="color:#000000;">=&gt;</span><span style="color:#000000;"> f.ParentId </span><span style="color:#000000;">==</span><span style="color:#000000;"> </span><span style="color:#800080;">0</span><span style="color:#000000;">);
                                    IsBusy </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">false</span><span style="color:#000000;">;
                                }
                            );
                    },
                </span><span style="color:#0000FF;">null</span><span style="color:#000000;">);
        };

    login.OnFailedAuthentication </span><span style="color:#000000;">=</span><span style="color:#000000;"> () </span><span style="color:#000000;">=&gt;</span><span style="color:#000000;"> { login.Show(); };

}
</span></div>
</pre>
</div>
<p>In this example, we set a busy indicator using the BeforeAuthentication action, then using the OnAuthentication action we load some data and finally we wire up the OnFailedAuthentication to show the login window again. </p>
<p>This example is by no means perfect, but its a start, it only really works well in the context of simple Silverlight projects consisting of 1 user control. In a future post I&#8217;m going to expand on this and show it working in a more complex situation.</p>
<p><a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fmwoodhall.wordpress.com%2f2009%2f12%2f10%2fcreating-a-reusable-silverlight-login-window%2f"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fmwoodhall.wordpress.com%2f2009%2f12%2f10%2fcreating-a-reusable-silverlight-login-window%2f" border="0" alt="kick it on DotNetKicks.com" /></a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mwoodhall.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mwoodhall.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mwoodhall.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mwoodhall.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/mwoodhall.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/mwoodhall.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/mwoodhall.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/mwoodhall.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mwoodhall.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mwoodhall.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mwoodhall.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mwoodhall.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mwoodhall.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mwoodhall.wordpress.com/82/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=mwoodhall.wordpress.com&amp;blog=10716929&amp;post=82&amp;subd=mwoodhall&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://mwoodhall.wordpress.com/2009/12/10/creating-a-reusable-silverlight-login-window/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/21171513bc9d366bdeaa97247a814270?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Mark</media:title>
		</media:content>

		<media:content url="http://mwoodhall.files.wordpress.com/2009/12/cwindow.png" medium="image">
			<media:title type="html">child window</media:title>
		</media:content>

		<media:content url="http://mwoodhall.files.wordpress.com/2009/12/authexample.png?w=590" medium="image">
			<media:title type="html">authexample</media:title>
		</media:content>

		<media:content url="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fmwoodhall.wordpress.com%2f2009%2f12%2f10%2fcreating-a-reusable-silverlight-login-window%2f" medium="image">
			<media:title type="html">kick it on DotNetKicks.com</media:title>
		</media:content>
	</item>
		<item>
		<title>Taking Amazon S3, RIA Services a step further</title>
		<link>http://mwoodhall.wordpress.com/2009/12/08/taking-amazon-s3-ria-services-a-step-furthet/</link>
		<comments>http://mwoodhall.wordpress.com/2009/12/08/taking-amazon-s3-ria-services-a-step-furthet/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 12:25:58 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Amazon]]></category>
		<category><![CDATA[castle]]></category>
		<category><![CDATA[ioc]]></category>
		<category><![CDATA[Ria]]></category>
		<category><![CDATA[S3]]></category>
		<category><![CDATA[Services]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[SOAP]]></category>
		<category><![CDATA[windsor]]></category>

		<guid isPermaLink="false">http://mwoodhall.wordpress.com/?p=73</guid>
		<description><![CDATA[I wrote a post about using silverlight, RIA services and the Amazon S3 SOAP API. This post aims to take that a little further. The idea is to make our code cloud agnostic and encapsulate the Amazon S3 API and any other cloud based simple storage within a common component. In the previous post we [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=mwoodhall.wordpress.com&amp;blog=10716929&amp;post=73&amp;subd=mwoodhall&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I wrote a <a href="http://mwoodhall.wordpress.com/2009/12/03/using-amazon-s3-with-silverlight-and-ria-services/">post about using silverlight, RIA services and the Amazon S3 SOAP API</a>. </p>
<p>This post aims to take that a little further. The idea is to make our code cloud agnostic and encapsulate the Amazon S3 API and any other cloud based simple storage within a common component. </p>
<p>In the previous post we used a RIA service to distribute calls to an Amazon S3 wrapper class. In this example we will replace this with a call to a common component. </p>
<p>We will still make use of the following wrapper class. </p>
<div id='iframeDiv40065d4b-a16a-434c-8113-2acde53f5884' style='display:none;margin:0;'></div>
<div id='noIframeDiv40065d4b-a16a-434c-8113-2acde53f5884' style='display:block;margin:0;'>
<pre>
<div><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">class</span><span style="color:#000000;"> AmazonS3Wrapper : IAmazonS3Wrapper
{
    </span><span style="color:#0000FF;">private</span><span style="color:#000000;"> </span><span style="color:#0000FF;">readonly</span><span style="color:#000000;"> IApplicationConfigurationService _appConfigService </span><span style="color:#000000;">=</span><span style="color:#000000;"> With.IoC.GetService</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">IApplicationConfigurationService</span><span style="color:#000000;">&gt;</span><span style="color:#000000;">();

    </span><span style="color:#0000FF;">internal</span><span style="color:#000000;"> </span><span style="color:#0000FF;">static</span><span style="color:#000000;"> String Salt;
    </span><span style="color:#0000FF;">internal</span><span style="color:#000000;"> </span><span style="color:#0000FF;">static</span><span style="color:#000000;"> String MainApiKey;
    </span><span style="color:#0000FF;">internal</span><span style="color:#000000;"> </span><span style="color:#0000FF;">static</span><span style="color:#000000;"> String SecretApiKey;
    </span><span style="color:#0000FF;">internal</span><span style="color:#000000;"> </span><span style="color:#0000FF;">static</span><span style="color:#000000;"> String RootBucket;

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> AmazonS3Wrapper()
    {

        Salt </span><span style="color:#000000;">=</span><span style="color:#000000;"> _appConfigService.FindByGroupAndKey(
                ApplicationConfigurationGroups.CommonEncryption.ToString(),
                ApplicationConfigurationKeys.CommonEncryptionKey.ToString()
            )
            .Value;

        MainApiKey </span><span style="color:#000000;">=</span><span style="color:#000000;"> _appConfigService.FindByGroupAndKey(
                ApplicationConfigurationGroups.CommonAmazonAws.ToString(),
                ApplicationConfigurationKeys.CommonAmazonAwsMainKey.ToString()
            )
            .Value.Decrypt(Salt);

        SecretApiKey </span><span style="color:#000000;">=</span><span style="color:#000000;"> _appConfigService.FindByGroupAndKey(
                ApplicationConfigurationGroups.CommonAmazonAws.ToString(),
                ApplicationConfigurationKeys.CommonAmazonAwsSecretKey.ToString()
            )
            .Value.Decrypt(Salt);

        RootBucket </span><span style="color:#000000;">=</span><span style="color:#000000;"> _appConfigService.FindByGroupAndKey(
                ApplicationConfigurationGroups.CommonAmazonAws.ToString(),
                ApplicationConfigurationKeys.CommonAmazonAwsRootBucket.ToString()
            )
            .Value.Decrypt(Salt);
    }

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> ListAllMyBucketsEntry[] ListAllMyBuckets()
    {
        </span><span style="color:#0000FF;">try</span><span style="color:#000000;">
        {
            var s3 </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> AmazonS3();
            </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> s3.ListAllMyBuckets(
                MainApiKey,
               Helper.TimeStamp,
               </span><span style="color:#0000FF;">true</span><span style="color:#000000;">,
               Helper.GetSignature(
                    SecretApiKey,
                    Operations.ListAllMyBuckets,
                    Helper.TimeStamp
                    )
                ).Buckets;
        }
        </span><span style="color:#0000FF;">catch</span><span style="color:#000000;"> (Exception e)
        {
            e.RecursiveLog();
            </span><span style="color:#0000FF;">throw</span><span style="color:#000000;">;
        }
    }

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> IList</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">ListEntry</span><span style="color:#000000;">&gt;</span><span style="color:#000000;"> ListBucket(String bucket)
    {
        </span><span style="color:#0000FF;">try</span><span style="color:#000000;">
        {
            var s3 </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> AmazonS3();
            </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> s3.ListBucket(
                bucket,
                </span><span style="color:#0000FF;">null</span><span style="color:#000000;">,
                </span><span style="color:#0000FF;">null</span><span style="color:#000000;">,
                </span><span style="color:#800080;">100</span><span style="color:#000000;">,
                </span><span style="color:#0000FF;">true</span><span style="color:#000000;">,
                </span><span style="color:#800000;">&quot;</span><span style="color:#800000;">/</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">,
                MainApiKey,
                Helper.TimeStamp,
                </span><span style="color:#0000FF;">true</span><span style="color:#000000;">,
                Helper.GetSignature(
                    SecretApiKey,
                    Operations.ListBucket,
                    Helper.TimeStamp
                    ),
                </span><span style="color:#0000FF;">null</span><span style="color:#000000;">
                ).Contents.ToList();
        }
        </span><span style="color:#0000FF;">catch</span><span style="color:#000000;"> (Exception e)
        {
            e.RecursiveLog();
            </span><span style="color:#0000FF;">throw</span><span style="color:#000000;">;
        }
    }

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> List</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">PutObjectResult</span><span style="color:#000000;">&gt;</span><span style="color:#000000;"> PutObject(String key, Byte[] data)
    {
        </span><span style="color:#0000FF;">try</span><span style="color:#000000;">
        {
            var s3 </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> AmazonS3();
            var results </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> List</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">PutObjectResult</span><span style="color:#000000;">&gt;</span><span style="color:#000000;">();
            var metadataEntries </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> MetadataEntry[</span><span style="color:#800080;">2</span><span style="color:#000000;">];

            metadataEntries[</span><span style="color:#800080;">0</span><span style="color:#000000;">] </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> MetadataEntry { Name </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#800000;">&quot;</span><span style="color:#800000;">Content-Type</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">, Value </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#800000;">&quot;</span><span style="color:#800000;">text/xml</span><span style="color:#800000;">&quot;</span><span style="color:#000000;"> };
            metadataEntries[</span><span style="color:#800080;">1</span><span style="color:#000000;">] </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> MetadataEntry
            { Name</span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#800000;">&quot;</span><span style="color:#800000;">ContentLength</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">, Value </span><span style="color:#000000;">=</span><span style="color:#000000;"> data.Length.ToString() };

            var result </span><span style="color:#000000;">=</span><span style="color:#000000;"> s3.PutObjectInline(
                RootBucket,
                key,
                metadataEntries,
                data,
                data.Length,
                </span><span style="color:#0000FF;">null</span><span style="color:#000000;">,
                StorageClass.STANDARD,
                </span><span style="color:#0000FF;">true</span><span style="color:#000000;">,
                MainApiKey,
                Helper.TimeStamp,
                </span><span style="color:#0000FF;">true</span><span style="color:#000000;">,
                Helper.GetSignature(
                    SecretApiKey,
                    Operations.PutObjectInline,
                    Helper.TimeStamp
                    ),
                </span><span style="color:#0000FF;">null</span><span style="color:#000000;">
                );
            result.FileName </span><span style="color:#000000;">=</span><span style="color:#000000;"> key;

            results.Add(result);
            </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> results;
        }
        </span><span style="color:#0000FF;">catch</span><span style="color:#000000;"> (Exception e)
        {
            e.RecursiveLog();
            </span><span style="color:#0000FF;">throw</span><span style="color:#000000;">;
        }
    }

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> List</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">GetObjectResult</span><span style="color:#000000;">&gt;</span><span style="color:#000000;"> GetObject(String key)
    {
        </span><span style="color:#0000FF;">try</span><span style="color:#000000;">
        {
            var s3 </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> AmazonS3();
            var results </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> List</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">GetObjectResult</span><span style="color:#000000;">&gt;</span><span style="color:#000000;">();
            results.Add(s3.GetObject(
                RootBucket,
                key,
               </span><span style="color:#0000FF;">true</span><span style="color:#000000;">,
               </span><span style="color:#0000FF;">true</span><span style="color:#000000;">,
               </span><span style="color:#0000FF;">true</span><span style="color:#000000;">,
               MainApiKey,
               Helper.TimeStamp,
               </span><span style="color:#0000FF;">true</span><span style="color:#000000;">,
               Helper.GetSignature(
                    SecretApiKey,
                    Operations.GetObject,
                    Helper.TimeStamp
                    ),
                </span><span style="color:#0000FF;">null</span><span style="color:#000000;">
                ));
            </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> results;
        }
        </span><span style="color:#0000FF;">catch</span><span style="color:#000000;"> (Exception e)
        {
            e.RecursiveLog();
            </span><span style="color:#0000FF;">throw</span><span style="color:#000000;">;
        }
    }
}</span></div>
</pre>
</div>
<p>In the previous post the RIA service made use of this wrapper class like so.</p>
<div id='iframeDiva4156ce4-9c07-470f-be18-48c4aafdaa25' style='display:none;margin:0;'></div>
<div id='noIframeDiva4156ce4-9c07-470f-be18-48c4aafdaa25' style='display:block;margin:0;'>
<pre>
<div><span style="color:#000000;">[EnableClientAccess]
</span><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">class</span><span style="color:#000000;"> AmazonS3Service : DomainService
{
    </span><span style="color:#0000FF;">private</span><span style="color:#000000;"> </span><span style="color:#0000FF;">static</span><span style="color:#000000;"> </span><span style="color:#0000FF;">readonly</span><span style="color:#000000;"> IWrapper AmazonS3Wrapper </span><span style="color:#000000;">=</span><span style="color:#000000;"> With.IoC.GetService</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">IWrapper</span><span style="color:#000000;">&gt;</span><span style="color:#000000;">();

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> ListAllMyBucketsEntry[] ListAllMyBuckets()
    {
        </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> AmazonS3Wrapper.ListAllMyBuckets();
    }

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> IList</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">ListEntry</span><span style="color:#000000;">&gt;</span><span style="color:#000000;"> ListBucket(String bucket)
    {
        </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> AmazonS3Wrapper.ListBucket(bucket);
    }

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> List</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">PutObjectResult</span><span style="color:#000000;">&gt;</span><span style="color:#000000;"> PutObject(String key, Byte[] data)
    {
        </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> AmazonS3Wrapper.PutObject(key, data);
    }

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> List</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">GetObjectResult</span><span style="color:#000000;">&gt;</span><span style="color:#000000;"> GetObject(String key)
    {
        </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> AmazonS3Wrapper.GetObject(key);
    }

}</span></div>
</pre>
</div>
<p>However, we can change this a little, and make it work with multiple storage providers. </p>
<p>To start with, I created the following interface.</p>
<div id='iframeDive3b7c17f-4469-43b1-abe9-db1352584935' style='display:none;margin:0;'></div>
<div id='noIframeDive3b7c17f-4469-43b1-abe9-db1352584935' style='display:block;margin:0;'>
<pre>
<div><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">interface</span><span style="color:#000000;"> IStorageProvider
{
    Boolean PutObject(HttpPostedFileBase file, String key);
    Boolean PutObject(Byte[] data, String key);

    Byte[] GetObject(String key);
}</span></div>
</pre>
</div>
<p>And a custom implementation of this interface to represent the local file system (I dont have another cloud service to try).</p>
<div id='iframeDiv05dd2877-7ec7-46a9-b877-9df438326d0d' style='display:none;margin:0;'></div>
<div id='noIframeDiv05dd2877-7ec7-46a9-b877-9df438326d0d' style='display:block;margin:0;'>
<pre>
<div><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">class</span><span style="color:#000000;"> LocalStorageProvider : IStorageProvider
{
    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">virtual</span><span style="color:#000000;"> Boolean PutObject(HttpPostedFileBase file, String key)
    {
        With.Guard.Against</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">ArgumentException</span><span style="color:#000000;">&gt;</span><span style="color:#000000;">(
            String.IsNullOrEmpty(key)
        );

        With.Guard.Against</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">ArgumentException</span><span style="color:#000000;">&gt;</span><span style="color:#000000;">(
            file </span><span style="color:#000000;">==</span><span style="color:#000000;"> </span><span style="color:#0000FF;">null</span><span style="color:#000000;">
        );

        </span><span style="color:#0000FF;">try</span><span style="color:#000000;">
        {
            file.SaveAs(key);
            </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> </span><span style="color:#0000FF;">true</span><span style="color:#000000;">;
        }
        </span><span style="color:#0000FF;">catch</span><span style="color:#000000;"> (Exception e)
        {
            e.RecursiveLog();
            </span><span style="color:#0000FF;">throw</span><span style="color:#000000;">;
        }
    }

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">virtual</span><span style="color:#000000;"> Boolean PutObject(Byte[] data, String key)
    {

        With.Guard.Against</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">ArgumentException</span><span style="color:#000000;">&gt;</span><span style="color:#000000;">(
            String.IsNullOrEmpty(key)
        );

        With.Guard.Against</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">ArgumentException</span><span style="color:#000000;">&gt;</span><span style="color:#000000;">(
            data </span><span style="color:#000000;">==</span><span style="color:#000000;"> </span><span style="color:#0000FF;">null</span><span style="color:#000000;">
        );

        </span><span style="color:#0000FF;">try</span><span style="color:#000000;">
        {
            </span><span style="color:#0000FF;">using</span><span style="color:#000000;">(var stream </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> FileStream(key, FileMode.Create))
            {
                stream.Write(data, </span><span style="color:#800080;">0</span><span style="color:#000000;">, data.Length);
                </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> </span><span style="color:#0000FF;">true</span><span style="color:#000000;">;
            }
        }
        </span><span style="color:#0000FF;">catch</span><span style="color:#000000;"> (Exception e)
        {
            e.RecursiveLog();
            </span><span style="color:#0000FF;">throw</span><span style="color:#000000;">;
        }

    }

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">virtual</span><span style="color:#000000;"> Byte[] GetObject(String key)
    {
        With.Guard.Against</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">ArgumentException</span><span style="color:#000000;">&gt;</span><span style="color:#000000;">(
            String.IsNullOrEmpty(key)
        ); 

        </span><span style="color:#0000FF;">using</span><span style="color:#000000;">(var stream </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> FileStream(key, FileMode.Open))
        {
            var data </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> Byte[stream.Length];
            stream.Read(data, </span><span style="color:#800080;">0</span><span style="color:#000000;">, data.Length);
            </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> data;
        }
    }
}</span></div>
</pre>
</div>
<p>And an AmazonS3 implementation, still making use of the wrapper class</p>
<div id='iframeDivec588464-989d-4993-bc68-ce2a05f15ccc' style='display:none;margin:0;'></div>
<div id='noIframeDivec588464-989d-4993-bc68-ce2a05f15ccc' style='display:block;margin:0;'>
<pre>
<div><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">class</span><span style="color:#000000;"> AmazonS3StorageProvider : IStorageProvider
{
    </span><span style="color:#0000FF;">private</span><span style="color:#000000;"> </span><span style="color:#0000FF;">readonly</span><span style="color:#000000;"> IAmazonS3Wrapper _wrapper;

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> AmazonS3StorageProvider(IAmazonS3Wrapper wrapper)
    {
        _wrapper </span><span style="color:#000000;">=</span><span style="color:#000000;"> wrapper;
    }

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> Byte[] GetObject(String key)
    {
        </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> _wrapper.GetObject(key).First().Data;
    }

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> Boolean PutObject(</span><span style="color:#0000FF;">byte</span><span style="color:#000000;">[] data, </span><span style="color:#0000FF;">string</span><span style="color:#000000;"> key)
    {
        _wrapper.PutObject(key, data);
        </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> </span><span style="color:#0000FF;">true</span><span style="color:#000000;">;
    }

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> Boolean PutObject(HttpPostedFileBase file, </span><span style="color:#0000FF;">string</span><span style="color:#000000;"> key)
    {
        </span><span style="color:#0000FF;">throw</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> NotImplementedException();
    }
}</span></div>
</pre>
</div>
<p>In the RIA service we can do the following</p>
<div id='iframeDivdf4a89fb-0d25-4cb9-a92d-3529dfe7ff06' style='display:none;margin:0;'></div>
<div id='noIframeDivdf4a89fb-0d25-4cb9-a92d-3529dfe7ff06' style='display:block;margin:0;'>
<pre>
<div><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">void</span><span style="color:#000000;"> CreateDocument(Document document)
{
    var cloudStorage </span><span style="color:#000000;">=</span><span style="color:#000000;"> _appConfigService.FindByGroupAndKey(
        ApplicationConfigurationGroups.CmsDocuments.ToString(),
        ApplicationConfigurationKeys.CmsCloudStorage.ToString()
    ).Value;
    var store </span><span style="color:#000000;">=</span><span style="color:#000000;"> With.IoC.GetService</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">IStorageProvider</span><span style="color:#000000;">&gt;</span><span style="color:#000000;">(cloudStorage);
    store.PutObject(document.Data, newDocument.Path);
}</span></div>
</pre>
</div>
<p>The call to the _appConfigService simply returns a string config key value indicating the required cloud storage provider, LocalStorageProvider or AmazonS3StorageProvider.</p>
<p>For this example, the call to With.IoC uses Castle Windsor behind the scenes. In the Castle config file we have two definitions for our storage providers:</p>
<div id='iframeDivab342893-a2f9-4ef1-a8d3-3d2e769a1ee9' style='display:none;margin:0;'></div>
<div id='noIframeDivab342893-a2f9-4ef1-a8d3-3d2e769a1ee9' style='display:block;margin:0;'>
<pre>
<div><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">component </span><span style="color:#FF0000;">id</span><span style="color:#0000FF;">=&quot;AmazonS3StorageProvider&quot;</span><span style="color:#FF0000;">
           service</span><span style="color:#0000FF;">=&quot;EMASolutions.Common.Web.File.IStorageProvider, EMASolutions.Common&quot;</span><span style="color:#FF0000;">
           type</span><span style="color:#0000FF;">=&quot;EMASolutions.CMS.Service.AmazonS3.AmazonS3StorageProvider, EMASolutions.CMS.Service&quot;</span><span style="color:#FF0000;">
           lifestyle</span><span style="color:#0000FF;">=&quot;transient&quot;</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">
</span><span style="color:#0000FF;">&lt;/</span><span style="color:#800000;">component</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">
</span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">component </span><span style="color:#FF0000;">id</span><span style="color:#0000FF;">=&quot;LocalStorageProvider&quot;</span><span style="color:#FF0000;">
           service</span><span style="color:#0000FF;">=&quot;EMASolutions.Common.Web.File.IStorageProvider, EMASolutions.Common&quot;</span><span style="color:#FF0000;">
           type</span><span style="color:#0000FF;">=&quot;EMASolutions.Common.Web.File.LocalStorageProvider, EMASolutions.Common&quot;</span><span style="color:#FF0000;">
           lifestyle</span><span style="color:#0000FF;">=&quot;transient&quot;</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">
</span><span style="color:#0000FF;">&lt;/</span><span style="color:#800000;">component</span><span style="color:#0000FF;">&gt;</span></div>
</pre>
</div>
<p>Using this method we can simply change our config key and use a different cloud service. Obviously this doesnt handle migration to another cloud service, so files would need to be migrated manually. </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mwoodhall.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mwoodhall.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mwoodhall.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mwoodhall.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/mwoodhall.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/mwoodhall.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/mwoodhall.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/mwoodhall.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mwoodhall.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mwoodhall.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mwoodhall.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mwoodhall.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mwoodhall.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mwoodhall.wordpress.com/73/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=mwoodhall.wordpress.com&amp;blog=10716929&amp;post=73&amp;subd=mwoodhall&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://mwoodhall.wordpress.com/2009/12/08/taking-amazon-s3-ria-services-a-step-furthet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/21171513bc9d366bdeaa97247a814270?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Mark</media:title>
		</media:content>
	</item>
		<item>
		<title>Using Amazon S3 with Silverlight and RIA services</title>
		<link>http://mwoodhall.wordpress.com/2009/12/03/using-amazon-s3-with-silverlight-and-ria-services/</link>
		<comments>http://mwoodhall.wordpress.com/2009/12/03/using-amazon-s3-with-silverlight-and-ria-services/#comments</comments>
		<pubDate>Thu, 03 Dec 2009 08:20:28 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Amazon]]></category>
		<category><![CDATA[Download]]></category>
		<category><![CDATA[File]]></category>
		<category><![CDATA[Ria]]></category>
		<category><![CDATA[S3]]></category>
		<category><![CDATA[Services]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[SOAP]]></category>
		<category><![CDATA[Upload]]></category>

		<guid isPermaLink="false">http://mwoodhall.wordpress.com/?p=54</guid>
		<description><![CDATA[I've been working on something recently that gave me a chance to try out Amazon S3 services. The first thing to mention is that I am using the SOAP API and not REST. Another thing worth noting is that I used a web reference rather than a service reference to link to the S3 services.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=mwoodhall.wordpress.com&amp;blog=10716929&amp;post=54&amp;subd=mwoodhall&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been working on something recently that gave me a chance to try out Amazon S3 services. The first thing to mention is that I am using the SOAP API and not REST. Another thing worth noting is that I used a web reference rather than a service reference to link to the S3 services.</p>
<p>The rest of this post will assume you have an amazon S3 account. You can add a reference to the S3 services by right clicking on your web project and selecting &#8216;add web reference&#8217;. You will then see the dialog below. </p>
<p><a href="http://mwoodhall.files.wordpress.com/2009/12/webref.jpg"><img src="http://mwoodhall.files.wordpress.com/2009/12/webref.jpg?w=550&#038;h=407" alt="" title="webref" width="550" height="407" class="alignnone size-medium wp-image-64" /></a></p>
<p>After I added the web reference I changed the end point address in my web.config file to match the name of my S3 bucket. The end point will look something like this:</p>
<div id='iframeDiva0a4f4cf-4590-4d3d-81fd-f5b05974484f' style='display:none;margin:0;'></div>
<div id='noIframeDiva0a4f4cf-4590-4d3d-81fd-f5b05974484f' style='display:block;margin:0;'>
<pre>
<div><span style="color:#000000;">  </span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">applicationSettings</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">
    </span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">EMASolutions.CMS.Service.Properties.Settings</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">
      </span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">setting </span><span style="color:#FF0000;">name</span><span style="color:#0000FF;">=&quot;EMASolutions_CMS_Service_AWS_AmazonS3&quot;</span><span style="color:#FF0000;"> serializeAs</span><span style="color:#0000FF;">=&quot;String&quot;</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">
        </span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">value</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">https://s3.amazonaws.com/soap</span><span style="color:#0000FF;">&lt;/</span><span style="color:#800000;">value</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">
      </span><span style="color:#0000FF;">&lt;/</span><span style="color:#800000;">setting</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">
    </span><span style="color:#0000FF;">&lt;/</span><span style="color:#800000;">EMASolutions.CMS.Service.Properties.Settings</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">
  </span><span style="color:#0000FF;">&lt;/</span><span style="color:#800000;">applicationSettings</span><span style="color:#0000FF;">&gt;</span></div>
</pre>
</div>
<p>I changed it to point to my S3 Bucket by changing the value tag.</p>
<div id='iframeDiv745e1345-4a2d-4feb-9f07-9addb79a516a' style='display:none;margin:0;'></div>
<div id='noIframeDiv745e1345-4a2d-4feb-9f07-9addb79a516a' style='display:block;margin:0;'>
<pre>
<div><span style="color:#000000;">  </span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">applicationSettings</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">
    </span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">EMASolutions.CMS.Service.Properties.Settings</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">
      </span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">setting </span><span style="color:#FF0000;">name</span><span style="color:#0000FF;">=&quot;EMASolutions_CMS_Service_AWS_AmazonS3&quot;</span><span style="color:#FF0000;"> serializeAs</span><span style="color:#0000FF;">=&quot;String&quot;</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">
        </span><span style="color:#0000FF;">&lt;</span><span style="color:#800000;">value</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">https://hiberlog-storage.s3.amazonaws.com/soap</span><span style="color:#0000FF;">&lt;/</span><span style="color:#800000;">value</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">
      </span><span style="color:#0000FF;">&lt;/</span><span style="color:#800000;">setting</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">
    </span><span style="color:#0000FF;">&lt;/</span><span style="color:#800000;">EMASolutions.CMS.Service.Properties.Settings</span><span style="color:#0000FF;">&gt;</span><span style="color:#000000;">
  </span><span style="color:#0000FF;">&lt;/</span><span style="color:#800000;">applicationSettings</span><span style="color:#0000FF;">&gt;</span></div>
</pre>
</div>
<p>The common code required to generate a signature to pass to S3 services was pretty small and not really a maintenance headache but I didn&#8217;t want to include it in the silverlight app and the server side web app. I wanted to keep it common between the two platforms. Below is an example of the helper class I used, it is only concerned with generating timestamps in the correct format and an S3 signature.</p>
<div id='iframeDiv46aa6138-5be8-490a-896f-7c122b7d7063' style='display:none;margin:0;'></div>
<div id='noIframeDiv46aa6138-5be8-490a-896f-7c122b7d7063' style='display:block;margin:0;'>
<pre>
<div><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">enum</span><span style="color:#000000;"> Operations
{
    ListAllMyBuckets </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#800080;">0</span><span style="color:#000000;">,
    ListBucket </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#800080;">1</span><span style="color:#000000;">,
    GetObject </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#800080;">2</span><span style="color:#000000;">,
    GetObjectInline </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#800080;">3</span><span style="color:#000000;">,
    PutObject </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#800080;">4</span><span style="color:#000000;">,
    PutObjectInline </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#800080;">5</span><span style="color:#000000;">,
}

</span><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">class</span><span style="color:#000000;"> Helper
{
    </span><span style="color:#0000FF;">private</span><span style="color:#000000;"> </span><span style="color:#0000FF;">const</span><span style="color:#000000;"> String AwsTsFormat </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#800000;">&quot;</span><span style="color:#800000;">yyyy-MM-ddTHH:mm:ss.fffZ</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">;
    </span><span style="color:#0000FF;">private</span><span style="color:#000000;"> </span><span style="color:#0000FF;">const</span><span style="color:#000000;"> String AwsAction </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#800000;">&quot;</span><span style="color:#800000;">AmazonS3</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">;

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">static</span><span style="color:#000000;"> DateTime TimeStamp
    {
        </span><span style="color:#0000FF;">get</span><span style="color:#000000;">
        {
            var currentDateTime </span><span style="color:#000000;">=</span><span style="color:#000000;"> DateTime.Now;
            </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> DateTime(
                currentDateTime.Year,
                currentDateTime.Month,
                currentDateTime.Day,
                currentDateTime.Hour,
                currentDateTime.Minute,
                currentDateTime.Second,
                currentDateTime.Millisecond,
                DateTimeKind.Local
                );
        }
    }

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">static</span><span style="color:#000000;"> String GetSignature(String secret, Operations operation, DateTime timestamp)
    {
        var enc </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> UTF8Encoding();
        var hash </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> HMACSHA1(enc.GetBytes(secret));

        var sig </span><span style="color:#000000;">=</span><span style="color:#000000;"> AwsAction </span><span style="color:#000000;">+</span><span style="color:#000000;"> operation </span><span style="color:#000000;">+</span><span style="color:#000000;"> timestamp
            .ToUniversalTime()
            .ToString(AwsTsFormat);
        </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> Convert.ToBase64String(
                hash.ComputeHash(enc.GetBytes(sig.ToCharArray()))
            );
    }
}</span></div>
</pre>
</div>
<p>I couldn&#8217;t really see a nice way of not duplicating this code but in the end I settled with exposing the S3 methods in a RIA service and storing the common code on the server.</p>
<p>For example, the ListAllMyBuckets method on S3 returns a ListAllMyBucketsResult which has a property Buckets of type ListAllMyBucketsEntry, in order to expose this type to the client we need to define a key on the ListAllMyBucketsEntry class. Luckily the generated class from the web reference uses a partial class. This allows us to implement some Metadata, as follows:</p>
<div id='iframeDiv418c2582-91a6-4fdb-9df0-821eb8520022' style='display:none;margin:0;'></div>
<div id='noIframeDiv418c2582-91a6-4fdb-9df0-821eb8520022' style='display:block;margin:0;'>
<pre>
<div><span style="color:#000000;">[MetadataTypeAttribute(</span><span style="color:#0000FF;">typeof</span><span style="color:#000000;">(ListAllMyBucketsEntryMetadata))]
</span><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">partial</span><span style="color:#000000;"> </span><span style="color:#0000FF;">class</span><span style="color:#000000;"> ListAllMyBucketsEntry
{
    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> Guid Id
    {
        </span><span style="color:#0000FF;">get</span><span style="color:#000000;"> { </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> Guid.NewGuid(); }
        </span><span style="color:#0000FF;">set</span><span style="color:#000000;"> { </span><span style="color:#0000FF;">throw</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> InvalidOperationException(</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">The Id field on ListAllMyBucketsEntryMetadata is not meant to be set</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">); }
    }
    </span><span style="color:#0000FF;">internal</span><span style="color:#000000;"> </span><span style="color:#0000FF;">sealed</span><span style="color:#000000;"> </span><span style="color:#0000FF;">class</span><span style="color:#000000;"> ListAllMyBucketsEntryMetadata
    {
        </span><span style="color:#008000;">//</span><span style="color:#008000;"> Metadata classes are not meant to be instantiated.</span><span style="color:#008000;">
</span><span style="color:#000000;">        </span><span style="color:#0000FF;">private</span><span style="color:#000000;"> ListAllMyBucketsEntryMetadata()
        {
        }

        [Key]
        [Display(AutoGenerateField </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">false</span><span style="color:#000000;">)]
        </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> Guid Id;
    }
}</span></div>
</pre>
</div>
<p>This metadata defines a new property called Id that we can use to allow ListAllMyBucketsEntry to be projected to the client.</p>
<p>We can now call the RIA services as we would normally which would call the S3 services to get a list of ListAllMyBucketsEntry and bind to it as we wish.</p>
<p>In my example the RIA service was getting rather chunky so I refactored the common S3 stuff away into another class.</p>
<div id='iframeDiv072f3468-663d-4766-ad66-8b6e3ebce0f4' style='display:none;margin:0;'></div>
<div id='noIframeDiv072f3468-663d-4766-ad66-8b6e3ebce0f4' style='display:block;margin:0;'>
<pre>
<div><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">class</span><span style="color:#000000;"> Wrapper : IWrapper
    {
       </span><span style="color:#0000FF;">internal</span><span style="color:#000000;"> </span><span style="color:#0000FF;">static</span><span style="color:#000000;"> IRepository</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">IApplicationConfiguration</span><span style="color:#000000;">&gt;</span><span style="color:#000000;"> AppSettings </span><span style="color:#000000;">=</span><span style="color:#000000;">
            With.IoC.GetService</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">IRepository</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">IApplicationConfiguration</span><span style="color:#000000;">&gt;&gt;</span><span style="color:#000000;">();

        </span><span style="color:#0000FF;">internal</span><span style="color:#000000;"> </span><span style="color:#0000FF;">static</span><span style="color:#000000;"> String Salt;
        </span><span style="color:#0000FF;">internal</span><span style="color:#000000;"> </span><span style="color:#0000FF;">static</span><span style="color:#000000;"> String MainApiKey;
        </span><span style="color:#0000FF;">internal</span><span style="color:#000000;"> </span><span style="color:#0000FF;">static</span><span style="color:#000000;"> String SecretApiKey;
        </span><span style="color:#0000FF;">internal</span><span style="color:#000000;"> </span><span style="color:#0000FF;">static</span><span style="color:#000000;"> String RootBucket;

        </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> Wrapper()
        {

            Salt </span><span style="color:#000000;">=</span><span style="color:#000000;"> AppSettings
                .Matching(</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">Key</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">, </span><span style="color:#800000;">&quot;</span><span style="color:#800000;">common.encryptionkey</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">)
                .First().Value;

            MainApiKey </span><span style="color:#000000;">=</span><span style="color:#000000;"> AppSettings
                .Matching(</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">Key</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">, </span><span style="color:#800000;">&quot;</span><span style="color:#800000;">common.amazonaws.mainkey</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">)
                .First().Value.Decrypt(Salt);

            SecretApiKey </span><span style="color:#000000;">=</span><span style="color:#000000;"> AppSettings
                .Matching(</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">Key</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">, </span><span style="color:#800000;">&quot;</span><span style="color:#800000;">common.amazonaws.secretkey</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">)
                .First().Value.Decrypt(Salt);

            RootBucket </span><span style="color:#000000;">=</span><span style="color:#000000;"> AppSettings
                .Matching(</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">Key</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">, </span><span style="color:#800000;">&quot;</span><span style="color:#800000;">common.amazonaws.rootbucket</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">)
                .First().Value.Decrypt(Salt);
        }

        </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> ListAllMyBucketsEntry[] ListAllMyBuckets()
        {
            </span><span style="color:#0000FF;">try</span><span style="color:#000000;">
            {
                var s3 </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> AmazonS3();
                </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> s3.ListAllMyBuckets(
                    MainApiKey,
                   Helper.TimeStamp,
                   </span><span style="color:#0000FF;">true</span><span style="color:#000000;">,
                   Helper.GetSignature(
                        SecretApiKey,
                        Operations.ListAllMyBuckets,
                        Helper.TimeStamp
                        )
                    ).Buckets;
            }
            </span><span style="color:#0000FF;">catch</span><span style="color:#000000;"> (Exception e)
            {
                With.Logger.Get(</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">application</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">);
                With.Logger.Log(e.Message, e, LogInformationType.Error);
                </span><span style="color:#0000FF;">throw</span><span style="color:#000000;">;
            }
        }

        </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> IList</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">ListEntry</span><span style="color:#000000;">&gt;</span><span style="color:#000000;"> ListBucket(String bucket)
        {
            </span><span style="color:#0000FF;">try</span><span style="color:#000000;">
            {
                var s3 </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> AmazonS3();
                </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> s3.ListBucket(
                    bucket,
                    </span><span style="color:#0000FF;">null</span><span style="color:#000000;">,
                    </span><span style="color:#0000FF;">null</span><span style="color:#000000;">,
                    </span><span style="color:#800080;">100</span><span style="color:#000000;">,
                    </span><span style="color:#0000FF;">true</span><span style="color:#000000;">,
                    </span><span style="color:#800000;">&quot;</span><span style="color:#800000;">/</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">,
                    MainApiKey,
                    Helper.TimeStamp,
                    </span><span style="color:#0000FF;">true</span><span style="color:#000000;">,
                    Helper.GetSignature(
                        SecretApiKey,
                        Operations.ListBucket,
                        Helper.TimeStamp
                        ),
                    </span><span style="color:#0000FF;">null</span><span style="color:#000000;">
                    ).Contents.ToList();
            }
            </span><span style="color:#0000FF;">catch</span><span style="color:#000000;"> (Exception e)
            {
                With.Logger.Get(</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">application</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">);
                With.Logger.Log(e.Message, e, LogInformationType.Error);
                </span><span style="color:#0000FF;">throw</span><span style="color:#000000;">;
            }
        }

        </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> List</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">PutObjectResult</span><span style="color:#000000;">&gt;</span><span style="color:#000000;"> PutObject(String key, Byte[] data)
        {
            </span><span style="color:#0000FF;">try</span><span style="color:#000000;">
            {
                var s3 </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> AmazonS3();
                var results </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> List</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">PutObjectResult</span><span style="color:#000000;">&gt;</span><span style="color:#000000;">();
                var metadataEntries </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> MetadataEntry[</span><span style="color:#800080;">2</span><span style="color:#000000;">];

                metadataEntries[</span><span style="color:#800080;">0</span><span style="color:#000000;">] </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> MetadataEntry { Name </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#800000;">&quot;</span><span style="color:#800000;">Content-Type</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">, Value </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#800000;">&quot;</span><span style="color:#800000;">text/xml</span><span style="color:#800000;">&quot;</span><span style="color:#000000;"> };
                metadataEntries[</span><span style="color:#800080;">1</span><span style="color:#000000;">] </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> MetadataEntry
                { Name</span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#800000;">&quot;</span><span style="color:#800000;">ContentLength</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">, Value </span><span style="color:#000000;">=</span><span style="color:#000000;"> data.Length.ToString() };

                results.Add(s3.PutObjectInline(
                    RootBucket,
                     key,
                     metadataEntries,
                    data,
                    data.Length,
                    </span><span style="color:#0000FF;">null</span><span style="color:#000000;">,
                    StorageClass.STANDARD,
                    </span><span style="color:#0000FF;">true</span><span style="color:#000000;">,
                    MainApiKey,
                    Helper.TimeStamp,
                    </span><span style="color:#0000FF;">true</span><span style="color:#000000;">,
                    Helper.GetSignature(
                        SecretApiKey,
                        Operations.PutObjectInline,
                        Helper.TimeStamp
                        ),
                    </span><span style="color:#0000FF;">null</span><span style="color:#000000;">
                    ));
                </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> results;
            }
            </span><span style="color:#0000FF;">catch</span><span style="color:#000000;"> (Exception e)
            {
                With.Logger.Get(</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">application</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">);
                With.Logger.Log(e.Message, e, LogInformationType.Error);
                </span><span style="color:#0000FF;">throw</span><span style="color:#000000;">;
            }
        }

        </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> List</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">GetObjectResult</span><span style="color:#000000;">&gt;</span><span style="color:#000000;"> GetObject(String key)
        {
            </span><span style="color:#0000FF;">try</span><span style="color:#000000;">
            {
                var s3 </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> AmazonS3();
                var results </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> List</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">GetObjectResult</span><span style="color:#000000;">&gt;</span><span style="color:#000000;">();
                results.Add(s3.GetObject(
                    RootBucket,
                    key,
                   </span><span style="color:#0000FF;">true</span><span style="color:#000000;">,
                   </span><span style="color:#0000FF;">true</span><span style="color:#000000;">,
                   </span><span style="color:#0000FF;">true</span><span style="color:#000000;">,
                   MainApiKey,
                   Helper.TimeStamp,
                   </span><span style="color:#0000FF;">true</span><span style="color:#000000;">,
                   Helper.GetSignature(
                        SecretApiKey,
                        Operations.GetObject,
                        Helper.TimeStamp
                        ),
                    </span><span style="color:#0000FF;">null</span><span style="color:#000000;">
                    ));
                </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> results;
            }
            </span><span style="color:#0000FF;">catch</span><span style="color:#000000;"> (Exception e)
            {
                With.Logger.Get(</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">application</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">);
                With.Logger.Log(e.Message, e, LogInformationType.Error);
                </span><span style="color:#0000FF;">throw</span><span style="color:#000000;">;
            }
        }
    }</span></div>
</pre>
</div>
<p>This leaves the RIA service looking like so.</p>
<div id='iframeDiva4156ce4-9c07-470f-be18-48c4aafdaa25' style='display:none;margin:0;'></div>
<div id='noIframeDiva4156ce4-9c07-470f-be18-48c4aafdaa25' style='display:block;margin:0;'>
<pre>
<div><span style="color:#000000;">[EnableClientAccess]
</span><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">class</span><span style="color:#000000;"> AmazonS3Service : DomainService
{
    </span><span style="color:#0000FF;">private</span><span style="color:#000000;"> </span><span style="color:#0000FF;">static</span><span style="color:#000000;"> </span><span style="color:#0000FF;">readonly</span><span style="color:#000000;"> IWrapper AmazonS3Wrapper </span><span style="color:#000000;">=</span><span style="color:#000000;"> With.IoC.GetService</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">IWrapper</span><span style="color:#000000;">&gt;</span><span style="color:#000000;">();

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> ListAllMyBucketsEntry[] ListAllMyBuckets()
    {
        </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> AmazonS3Wrapper.ListAllMyBuckets();
    }

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> IList</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">ListEntry</span><span style="color:#000000;">&gt;</span><span style="color:#000000;"> ListBucket(String bucket)
    {
        </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> AmazonS3Wrapper.ListBucket(bucket);
    }

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> List</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">PutObjectResult</span><span style="color:#000000;">&gt;</span><span style="color:#000000;"> PutObject(String key, Byte[] data)
    {
        </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> AmazonS3Wrapper.PutObject(key, data);
    }

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> List</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">GetObjectResult</span><span style="color:#000000;">&gt;</span><span style="color:#000000;"> GetObject(String key)
    {
        </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> AmazonS3Wrapper.GetObject(key);
    }

}</span></div>
</pre>
</div>
<p>This works fine but I&#8217;m not sure about the hoping, we have to hit the RIA service and then the S3 service. </p>
<p>So, I figure it would be prudent to implement some kind of caching. If we take an online storage system as an example and assume a user has requested a file, there is nothing to stop us holding onto this file in a cache and releasing it at a later date. This minimises the number of calls made to the S3 services.</p>
<p>Anyway, we can call the RIA service from our silverlight app as follows. (Keep in mind this is just an example). _context is defined as private readonly AmazonS3Context _context2;</p>
<div id='iframeDiv08ad3564-afd7-404e-899f-a4171e360802' style='display:none;margin:0;'></div>
<div id='noIframeDiv08ad3564-afd7-404e-899f-a4171e360802' style='display:block;margin:0;'>
<pre>
<div><span style="color:#0000FF;">private</span><span style="color:#000000;"> </span><span style="color:#0000FF;">void</span><span style="color:#000000;"> StackPanel_MouseLeftButtonDown(</span><span style="color:#0000FF;">object</span><span style="color:#000000;"> sender, MouseButtonEventArgs e)
{
    </span><span style="color:#0000FF;">if</span><span style="color:#000000;"> (sfd.ShowDialog() </span><span style="color:#000000;">==</span><span style="color:#000000;"> </span><span style="color:#0000FF;">false</span><span style="color:#000000;">) </span><span style="color:#0000FF;">return</span><span style="color:#000000;">;

    _context2.Load(
              _context2.GetObjectQuery(</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">test0.txt</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">),
              LoadBehavior.RefreshCurrent, </span><span style="color:#0000FF;">delegate</span><span style="color:#000000;">
              {
                  Dispatcher.BeginInvoke(
                     </span><span style="color:#0000FF;">delegate</span><span style="color:#000000;">
                     {
                         var test </span><span style="color:#000000;">=</span><span style="color:#000000;"> _context2.GetObjectResults.First().Data;
                         </span><span style="color:#0000FF;">using</span><span style="color:#000000;"> (var fs </span><span style="color:#000000;">=</span><span style="color:#000000;"> sfd.OpenFile())
                         {
                             fs.Write(test, </span><span style="color:#800080;">0</span><span style="color:#000000;">, test.Length);
                             fs.Close();
                         }
                     }
                 );
              },
          </span><span style="color:#0000FF;">null</span><span style="color:#000000;">);
}</span></div>
</pre>
</div>
<p>Another example for uploading files is below, again its just an example.</p>
<div id='iframeDiv9b108603-83fb-4ade-975d-b748e98ccb1d' style='display:none;margin:0;'></div>
<div id='noIframeDiv9b108603-83fb-4ade-975d-b748e98ccb1d' style='display:block;margin:0;'>
<pre>
<div><span style="color:#000000;">ofd.Filter </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#800000;">&quot;</span><span style="color:#800000;">Text Files|*.txt|Xml Files|*.xml|All Files|*.*</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">;
ofd.FilterIndex </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#800080;">1</span><span style="color:#000000;">;
ofd.Multiselect </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">true</span><span style="color:#000000;">;

</span><span style="color:#0000FF;">if</span><span style="color:#000000;"> (ofd.ShowDialog() </span><span style="color:#000000;">==</span><span style="color:#000000;"> </span><span style="color:#0000FF;">false</span><span style="color:#000000;">) </span><span style="color:#0000FF;">return</span><span style="color:#000000;">;

</span><span style="color:#0000FF;">foreach</span><span style="color:#000000;">(var file </span><span style="color:#0000FF;">in</span><span style="color:#000000;"> ofd.Files)
{
    Byte[] data </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> Byte[file.Length];
    file.OpenRead().Read(data, </span><span style="color:#800080;">0</span><span style="color:#000000;">, data.Length);
    _context2.Load(
         _context2.PutObjectQuery(file.Name, data),
         LoadBehavior.RefreshCurrent, </span><span style="color:#0000FF;">delegate</span><span style="color:#000000;">
         {
             Dispatcher.BeginInvoke(
                </span><span style="color:#0000FF;">delegate</span><span style="color:#000000;">
                {
                    MessageBox.Show(</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">Uploaded</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">);
                }
            );
         },
     </span><span style="color:#0000FF;">null</span><span style="color:#000000;">);
}</span></div>
</pre>
</div>
<p><a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fmwoodhall.wordpress.com%2f2009%2f12%2f03%2fusing-amazon-s3-with-silverlight-and-ria-services%2f"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fmwoodhall.wordpress.com%2f2009%2f12%2f03%2fusing-amazon-s3-with-silverlight-and-ria-services%2f" border="0" alt="kick it on DotNetKicks.com" /></a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mwoodhall.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mwoodhall.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mwoodhall.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mwoodhall.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/mwoodhall.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/mwoodhall.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/mwoodhall.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/mwoodhall.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mwoodhall.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mwoodhall.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mwoodhall.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mwoodhall.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mwoodhall.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mwoodhall.wordpress.com/54/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=mwoodhall.wordpress.com&amp;blog=10716929&amp;post=54&amp;subd=mwoodhall&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://mwoodhall.wordpress.com/2009/12/03/using-amazon-s3-with-silverlight-and-ria-services/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/21171513bc9d366bdeaa97247a814270?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Mark</media:title>
		</media:content>

		<media:content url="http://mwoodhall.files.wordpress.com/2009/12/webref.jpg?w=300" medium="image">
			<media:title type="html">webref</media:title>
		</media:content>

		<media:content url="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fmwoodhall.wordpress.com%2f2009%2f12%2f03%2fusing-amazon-s3-with-silverlight-and-ria-services%2f" medium="image">
			<media:title type="html">kick it on DotNetKicks.com</media:title>
		</media:content>
	</item>
		<item>
		<title>RIA Services, Silverlight, Metadata and shared code</title>
		<link>http://mwoodhall.wordpress.com/2009/12/02/ria-services-silverlight-metadata-and-shared-code/</link>
		<comments>http://mwoodhall.wordpress.com/2009/12/02/ria-services-silverlight-metadata-and-shared-code/#comments</comments>
		<pubDate>Wed, 02 Dec 2009 09:26:23 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[meta]]></category>
		<category><![CDATA[Ria]]></category>
		<category><![CDATA[Services]]></category>
		<category><![CDATA[shared]]></category>
		<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://mwoodhall.wordpress.com/?p=50</guid>
		<description><![CDATA[In a previous post I tried to show a simple example of using shared code within the RIA Services, Silverlight space. I had a comment on the last post that said.. &#8220;Why would you go to all of this trouble and risk a breakdown in code generation when, based on what you ask of the [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=mwoodhall.wordpress.com&amp;blog=10716929&amp;post=50&amp;subd=mwoodhall&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>In a previous post I tried to show a simple example of using shared code within the RIA Services, Silverlight space.</p>
<p>I had a comment on the last post that said..</p>
<p><B><i>&#8220;Why would you go to all of this trouble and risk a breakdown in code generation when, based on what you ask of the Folder class here, you can simply link to Folder.cs from your Silverlight project?</p>
<p>Dont see a benefit from the Metadata file hack either; you wrote Folder, you can (and should) put the validation attributes in the Folder.cs class itself.</p>
<p>This approach is confusing. It suggests that BreadCrumbs is the &#8220;shared code&#8221; when in fact you&#8217;re using Folder.shared.cs to trick RIAS into projecting the class.</p>
<p>You&#8217;re asking the dev to maintain the code for a single simple class over three seperate files. Yuck.</p>
<p>Where is the RIA services added value to make this worthwhile. I&#8217;m missing something&#8221;</i></b></p>
<p>I felt the need to try and answer some of these points.</p>
<p><B><i>1. Why would you go to all of this trouble and risk a breakdown in code generation when, based on what you ask of the Folder class here, you can simply link to Folder.cs from your Silverlight project?</i></b></p>
<p>I&#8217;m not sure I really understand this point to be honest, if we feel that code generation is a risk then we would not be using RIA Services at all, the whole point is that it projects/generates code to be used by the client. I also dont understand &#8216;link to Folder.cs from your Silverlight project?&#8217;. If we could do that in a way that made entities useable across Silverlight and other platforms then obviously we wouldnt use RIA services to project the entity.</p>
<p><B><i>2. Dont see a benefit from the Metadata file hack either; you wrote Folder, you can (and should) put the validation attributes in the Folder.cs class itself.</i></b></p>
<p>I dont think I would class the Metadata file as a hack, its the suggested way in the <a href="http://msdn.microsoft.com/en-us/library/ee707338(VS.91).aspx">RIA services documentation</a>. Also, there is a good chance that I didnt actually write the Folder class, it may well have been generated from NHibernate, LinqToSQL or another ORM. so we have no choice but to seperate the Metadata into a seperate class.</p>
<p><B><i>3. This approach is confusing. It suggests that BreadCrumbs is the &#8220;shared code&#8221; when in fact you&#8217;re using Folder.shared.cs to trick RIAS into projecting the class. </i></b></p>
<p><b>Folder.shared.cs</b></p>
<div id='iframeDiv23a2d56c-6bf6-457f-b9ae-537469dde9e3' style='display:none;margin:0;'></div>
<div id='noIframeDiv23a2d56c-6bf6-457f-b9ae-537469dde9e3' style='display:block;margin:0;'>
<pre>
<div><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">partial</span><span style="color:#000000;"> </span><span style="color:#0000FF;">class</span><span style="color:#000000;"> Folder

{

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> String BreadCrumbs()

    {

        var breadCrumbs </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#800000;">&quot;&quot;</span><span style="color:#000000;">;

        var currentFolder </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">this</span><span style="color:#000000;">;

        </span><span style="color:#0000FF;">while</span><span style="color:#000000;"> (currentFolder </span><span style="color:#000000;">!=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">null</span><span style="color:#000000;">)

        {

            breadCrumbs </span><span style="color:#000000;">=</span><span style="color:#000000;"> String.Format(</span><span style="color:#800000;">@&quot;</span><span style="color:#800000;">{0}\{1}</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">, currentFolder.Name, breadCrumbs);

            currentFolder </span><span style="color:#000000;">=</span><span style="color:#000000;"> currentFolder.Parent;

        }

        </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> breadCrumbs;

    }

}</span></div>
</pre>
</div>
<p>I dont really see it as being confusing, perhaps it was just the example. The suggestion that BreadCrumbs is the shared code is correct, it is. It is not being used to trick RIA services into projecting the folder class, this happens regardless of the shared code.</p>
<p>If we tried to implement the above BreadCrumbs method in Folder.cs like the example below, then the BreadCrumbs method would not get projected onto the client.</p>
<div id='iframeDiv6a35902f-bb8c-4855-86e9-7e45b03755be' style='display:none;margin:0;'></div>
<div id='noIframeDiv6a35902f-bb8c-4855-86e9-7e45b03755be' style='display:block;margin:0;'>
<pre>
<div><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">partial</span><span style="color:#000000;"> </span><span style="color:#0000FF;">class</span><span style="color:#000000;"> Folder : IEditableObject

{

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> Int32 Id { </span><span style="color:#0000FF;">get</span><span style="color:#000000;">; </span><span style="color:#0000FF;">set</span><span style="color:#000000;">; }

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> String Name { </span><span style="color:#0000FF;">get</span><span style="color:#000000;">; </span><span style="color:#0000FF;">set</span><span style="color:#000000;">; }

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> String Description { </span><span style="color:#0000FF;">get</span><span style="color:#000000;">; </span><span style="color:#0000FF;">set</span><span style="color:#000000;">; }

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> Int32 ParentId { </span><span style="color:#0000FF;">get</span><span style="color:#000000;">; </span><span style="color:#0000FF;">set</span><span style="color:#000000;">; }

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> IList</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">Document</span><span style="color:#000000;">&gt;</span><span style="color:#000000;"> Documents { </span><span style="color:#0000FF;">get</span><span style="color:#000000;">; </span><span style="color:#0000FF;">set</span><span style="color:#000000;">; }

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> IList</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">Folder</span><span style="color:#000000;">&gt;</span><span style="color:#000000;"> SubFolders { </span><span style="color:#0000FF;">get</span><span style="color:#000000;">; </span><span style="color:#0000FF;">set</span><span style="color:#000000;">; }

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> IList</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">Tag</span><span style="color:#000000;">&gt;</span><span style="color:#000000;"> Tags { </span><span style="color:#0000FF;">get</span><span style="color:#000000;">; </span><span style="color:#0000FF;">set</span><span style="color:#000000;">; }

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> Folder Parent { </span><span style="color:#0000FF;">get</span><span style="color:#000000;">; </span><span style="color:#0000FF;">set</span><span style="color:#000000;">; }

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> String BreadCrumbs()

    {

        var breadCrumbs </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#800000;">&quot;&quot;</span><span style="color:#000000;">;

        var currentFolder </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">this</span><span style="color:#000000;">;

        </span><span style="color:#0000FF;">while</span><span style="color:#000000;"> (currentFolder </span><span style="color:#000000;">!=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">null</span><span style="color:#000000;">)

        {

            breadCrumbs </span><span style="color:#000000;">=</span><span style="color:#000000;"> String.Format(</span><span style="color:#800000;">@&quot;</span><span style="color:#800000;">{0}\{1}</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">, currentFolder.Name, breadCrumbs);

            currentFolder </span><span style="color:#000000;">=</span><span style="color:#000000;"> currentFolder.Parent;

        }

        </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> breadCrumbs;

    }

    </span><span style="color:#0000FF;">#region</span><span style="color:#000000;"> IEditableObject implementation</span><span style="color:#000000;">

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">void</span><span style="color:#000000;"> BeginEdit()

    {  

    }

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">void</span><span style="color:#000000;"> CancelEdit()

    {

    }

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">void</span><span style="color:#000000;"> EndEdit()

    {

    }

    </span><span style="color:#0000FF;">#endregion</span><span style="color:#000000;">

}</span></div>
</pre>
</div>
<p>The use of the above entity would project the following class from RIA services</p>
<div id='iframeDivc2c3df2b-9662-4782-9914-7c9718240d35' style='display:none;margin:0;'></div>
<div id='noIframeDivc2c3df2b-9662-4782-9914-7c9718240d35' style='display:block;margin:0;'>
<pre>
<div><span style="color:#000000;">

    </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">sealed</span><span style="color:#000000;"> </span><span style="color:#0000FF;">partial</span><span style="color:#000000;"> </span><span style="color:#0000FF;">class</span><span style="color:#000000;"> Folder : Entity

    {

        </span><span style="color:#0000FF;">private</span><span style="color:#000000;"> </span><span style="color:#0000FF;">string</span><span style="color:#000000;"> _description;

        </span><span style="color:#0000FF;">private</span><span style="color:#000000;"> EntityCollection</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">Document</span><span style="color:#000000;">&gt;</span><span style="color:#000000;"> _documents;

        </span><span style="color:#0000FF;">private</span><span style="color:#000000;"> </span><span style="color:#0000FF;">int</span><span style="color:#000000;"> _id;

        </span><span style="color:#0000FF;">private</span><span style="color:#000000;"> </span><span style="color:#0000FF;">string</span><span style="color:#000000;"> _name;

        </span><span style="color:#0000FF;">private</span><span style="color:#000000;"> EntityRef</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">Folder</span><span style="color:#000000;">&gt;</span><span style="color:#000000;"> _parent;

        </span><span style="color:#0000FF;">private</span><span style="color:#000000;"> </span><span style="color:#0000FF;">int</span><span style="color:#000000;"> _parentId;

        </span><span style="color:#0000FF;">private</span><span style="color:#000000;"> EntityCollection</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">Folder</span><span style="color:#000000;">&gt;</span><span style="color:#000000;"> _subFolders;

        </span><span style="color:#0000FF;">private</span><span style="color:#000000;"> EntityCollection</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">Tag</span><span style="color:#000000;">&gt;</span><span style="color:#000000;"> _tags;

        </span><span style="color:#0000FF;">#region</span><span style="color:#000000;"> Extensibility Method Definitions</span><span style="color:#000000;">

        </span><span style="color:#808080;">///</span><span style="color:#008000;"> </span><span style="color:#808080;">&lt;summary&gt;</span><span style="color:#008000;">

        </span><span style="color:#808080;">///</span><span style="color:#008000;"> This method is invoked from the constructor once initialization is complete and

        </span><span style="color:#808080;">///</span><span style="color:#008000;"> can be used for further object setup.

        </span><span style="color:#808080;">///</span><span style="color:#008000;"> </span><span style="color:#808080;">&lt;/summary&gt;</span><span style="color:#808080;">

</span><span style="color:#000000;">        </span><span style="color:#0000FF;">partial</span><span style="color:#000000;"> </span><span style="color:#0000FF;">void</span><span style="color:#000000;"> OnCreated();

        </span><span style="color:#0000FF;">partial</span><span style="color:#000000;"> </span><span style="color:#0000FF;">void</span><span style="color:#000000;"> OnDescriptionChanging(</span><span style="color:#0000FF;">string</span><span style="color:#000000;"> value);

        </span><span style="color:#0000FF;">partial</span><span style="color:#000000;"> </span><span style="color:#0000FF;">void</span><span style="color:#000000;"> OnDescriptionChanged();

        </span><span style="color:#0000FF;">partial</span><span style="color:#000000;"> </span><span style="color:#0000FF;">void</span><span style="color:#000000;"> OnIdChanging(</span><span style="color:#0000FF;">int</span><span style="color:#000000;"> value);

        </span><span style="color:#0000FF;">partial</span><span style="color:#000000;"> </span><span style="color:#0000FF;">void</span><span style="color:#000000;"> OnIdChanged();

        </span><span style="color:#0000FF;">partial</span><span style="color:#000000;"> </span><span style="color:#0000FF;">void</span><span style="color:#000000;"> OnNameChanging(</span><span style="color:#0000FF;">string</span><span style="color:#000000;"> value);

        </span><span style="color:#0000FF;">partial</span><span style="color:#000000;"> </span><span style="color:#0000FF;">void</span><span style="color:#000000;"> OnNameChanged();

        </span><span style="color:#0000FF;">partial</span><span style="color:#000000;"> </span><span style="color:#0000FF;">void</span><span style="color:#000000;"> OnParentIdChanging(</span><span style="color:#0000FF;">int</span><span style="color:#000000;"> value);

        </span><span style="color:#0000FF;">partial</span><span style="color:#000000;"> </span><span style="color:#0000FF;">void</span><span style="color:#000000;"> OnParentIdChanged();

        </span><span style="color:#0000FF;">#endregion</span><span style="color:#000000;">

        </span><span style="color:#808080;">///</span><span style="color:#008000;"> </span><span style="color:#808080;">&lt;summary&gt;</span><span style="color:#008000;">

        </span><span style="color:#808080;">///</span><span style="color:#008000;"> Default constructor.

        </span><span style="color:#808080;">///</span><span style="color:#008000;"> </span><span style="color:#808080;">&lt;/summary&gt;</span><span style="color:#808080;">

</span><span style="color:#000000;">        </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> Folder()

        {

            </span><span style="color:#0000FF;">this</span><span style="color:#000000;">.OnCreated();

        }

        [DataMember()]

        [Editable(</span><span style="color:#0000FF;">true</span><span style="color:#000000;">)]

        [Required()]

        </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">string</span><span style="color:#000000;"> Description

        {

            </span><span style="color:#0000FF;">get</span><span style="color:#000000;">

            {

                </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> </span><span style="color:#0000FF;">this</span><span style="color:#000000;">._description;

            }

            </span><span style="color:#0000FF;">set</span><span style="color:#000000;">

            {

                </span><span style="color:#0000FF;">if</span><span style="color:#000000;"> ((</span><span style="color:#0000FF;">this</span><span style="color:#000000;">._description </span><span style="color:#000000;">!=</span><span style="color:#000000;"> value))

                {

                    </span><span style="color:#0000FF;">this</span><span style="color:#000000;">.ValidateProperty(</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">Description</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">, value);

                    </span><span style="color:#0000FF;">this</span><span style="color:#000000;">.OnDescriptionChanging(value);

                    </span><span style="color:#0000FF;">this</span><span style="color:#000000;">.RaiseDataMemberChanging(</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">Description</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">);

                    </span><span style="color:#0000FF;">this</span><span style="color:#000000;">._description </span><span style="color:#000000;">=</span><span style="color:#000000;"> value;

                    </span><span style="color:#0000FF;">this</span><span style="color:#000000;">.RaiseDataMemberChanged(</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">Description</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">);

                    </span><span style="color:#0000FF;">this</span><span style="color:#000000;">.OnDescriptionChanged();

                }

            }

        }

        [Association(</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">tbl_Document</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">, </span><span style="color:#800000;">&quot;</span><span style="color:#800000;">Id</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">, </span><span style="color:#800000;">&quot;</span><span style="color:#800000;">ParentId</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">)]

        [Display(AutoGenerateField</span><span style="color:#000000;">=</span><span style="color:#0000FF;">false</span><span style="color:#000000;">)]

        </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> EntityCollection</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">Document</span><span style="color:#000000;">&gt;</span><span style="color:#000000;"> Documents

        {

            </span><span style="color:#0000FF;">get</span><span style="color:#000000;">

            {

                </span><span style="color:#0000FF;">if</span><span style="color:#000000;"> ((</span><span style="color:#0000FF;">this</span><span style="color:#000000;">._documents </span><span style="color:#000000;">==</span><span style="color:#000000;"> </span><span style="color:#0000FF;">null</span><span style="color:#000000;">))

                {

                    </span><span style="color:#0000FF;">this</span><span style="color:#000000;">._documents </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> EntityCollection</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">Document</span><span style="color:#000000;">&gt;</span><span style="color:#000000;">(</span><span style="color:#0000FF;">this</span><span style="color:#000000;">, </span><span style="color:#800000;">&quot;</span><span style="color:#800000;">Documents</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">, </span><span style="color:#0000FF;">this</span><span style="color:#000000;">.FilterDocuments);

                }

                </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> </span><span style="color:#0000FF;">this</span><span style="color:#000000;">._documents;

            }

        }

        [DataMember()]

        [Display(AutoGenerateField</span><span style="color:#000000;">=</span><span style="color:#0000FF;">false</span><span style="color:#000000;">)]

        [Key()]

        </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">int</span><span style="color:#000000;"> Id

        {

            </span><span style="color:#0000FF;">get</span><span style="color:#000000;">

            {

                </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> </span><span style="color:#0000FF;">this</span><span style="color:#000000;">._id;

            }

            </span><span style="color:#0000FF;">set</span><span style="color:#000000;">

            {

                </span><span style="color:#0000FF;">if</span><span style="color:#000000;"> ((</span><span style="color:#0000FF;">this</span><span style="color:#000000;">._id </span><span style="color:#000000;">!=</span><span style="color:#000000;"> value))

                {

                    </span><span style="color:#0000FF;">this</span><span style="color:#000000;">.ValidateProperty(</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">Id</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">, value);

                    </span><span style="color:#0000FF;">this</span><span style="color:#000000;">.OnIdChanging(value);

                    </span><span style="color:#0000FF;">this</span><span style="color:#000000;">.RaiseDataMemberChanging(</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">Id</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">);

                    </span><span style="color:#0000FF;">this</span><span style="color:#000000;">._id </span><span style="color:#000000;">=</span><span style="color:#000000;"> value;

                    </span><span style="color:#0000FF;">this</span><span style="color:#000000;">.RaiseDataMemberChanged(</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">Id</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">);

                    </span><span style="color:#0000FF;">this</span><span style="color:#000000;">.OnIdChanged();

                }

            }

        }

        [DataMember()]

        [Editable(</span><span style="color:#0000FF;">true</span><span style="color:#000000;">)]

        [Required()]

        </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">string</span><span style="color:#000000;"> Name

        {

            </span><span style="color:#0000FF;">get</span><span style="color:#000000;">

            {

                </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> </span><span style="color:#0000FF;">this</span><span style="color:#000000;">._name;

            }

            </span><span style="color:#0000FF;">set</span><span style="color:#000000;">

            {

                </span><span style="color:#0000FF;">if</span><span style="color:#000000;"> ((</span><span style="color:#0000FF;">this</span><span style="color:#000000;">._name </span><span style="color:#000000;">!=</span><span style="color:#000000;"> value))

                {

                    </span><span style="color:#0000FF;">this</span><span style="color:#000000;">.ValidateProperty(</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">Name</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">, value);

                    </span><span style="color:#0000FF;">this</span><span style="color:#000000;">.OnNameChanging(value);

                    </span><span style="color:#0000FF;">this</span><span style="color:#000000;">.RaiseDataMemberChanging(</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">Name</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">);

                    </span><span style="color:#0000FF;">this</span><span style="color:#000000;">._name </span><span style="color:#000000;">=</span><span style="color:#000000;"> value;

                    </span><span style="color:#0000FF;">this</span><span style="color:#000000;">.RaiseDataMemberChanged(</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">Name</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">);

                    </span><span style="color:#0000FF;">this</span><span style="color:#000000;">.OnNameChanged();

                }

            }

        }

        [Association(</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">tbl_Folder</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">, </span><span style="color:#800000;">&quot;</span><span style="color:#800000;">ParentId</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">, </span><span style="color:#800000;">&quot;</span><span style="color:#800000;">Id</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">, IsForeignKey</span><span style="color:#000000;">=</span><span style="color:#0000FF;">true</span><span style="color:#000000;">)]

        [Display(AutoGenerateField</span><span style="color:#000000;">=</span><span style="color:#0000FF;">false</span><span style="color:#000000;">)]

        [ReadOnly(</span><span style="color:#0000FF;">true</span><span style="color:#000000;">)]

        </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> Folder Parent

        {

            </span><span style="color:#0000FF;">get</span><span style="color:#000000;">

            {

                </span><span style="color:#0000FF;">if</span><span style="color:#000000;"> ((</span><span style="color:#0000FF;">this</span><span style="color:#000000;">._parent </span><span style="color:#000000;">==</span><span style="color:#000000;"> </span><span style="color:#0000FF;">null</span><span style="color:#000000;">))

                {

                    </span><span style="color:#0000FF;">this</span><span style="color:#000000;">._parent </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> EntityRef</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">Folder</span><span style="color:#000000;">&gt;</span><span style="color:#000000;">(</span><span style="color:#0000FF;">this</span><span style="color:#000000;">, </span><span style="color:#800000;">&quot;</span><span style="color:#800000;">Parent</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">, </span><span style="color:#0000FF;">this</span><span style="color:#000000;">.FilterParent);

                }

                </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> </span><span style="color:#0000FF;">this</span><span style="color:#000000;">._parent.Entity;

            }

            </span><span style="color:#0000FF;">set</span><span style="color:#000000;">

            {

                Folder previous </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">this</span><span style="color:#000000;">.Parent;

                </span><span style="color:#0000FF;">if</span><span style="color:#000000;"> ((previous </span><span style="color:#000000;">!=</span><span style="color:#000000;"> value))

                {

                    </span><span style="color:#0000FF;">this</span><span style="color:#000000;">.ValidateProperty(</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">Parent</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">, value);

                    </span><span style="color:#0000FF;">if</span><span style="color:#000000;"> ((previous </span><span style="color:#000000;">!=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">null</span><span style="color:#000000;">))

                    {

                        </span><span style="color:#0000FF;">this</span><span style="color:#000000;">._parent.Entity </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">null</span><span style="color:#000000;">;

                        previous.SubFolders.Remove(</span><span style="color:#0000FF;">this</span><span style="color:#000000;">);

                    }

                    </span><span style="color:#0000FF;">if</span><span style="color:#000000;"> ((value </span><span style="color:#000000;">!=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">null</span><span style="color:#000000;">))

                    {

                        </span><span style="color:#0000FF;">this</span><span style="color:#000000;">.ParentId </span><span style="color:#000000;">=</span><span style="color:#000000;"> value.Id;

                    }

                    </span><span style="color:#0000FF;">else</span><span style="color:#000000;">

                    {

                        </span><span style="color:#0000FF;">this</span><span style="color:#000000;">.ParentId </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">default</span><span style="color:#000000;">(</span><span style="color:#0000FF;">int</span><span style="color:#000000;">);

                    }

                    </span><span style="color:#0000FF;">this</span><span style="color:#000000;">._parent.Entity </span><span style="color:#000000;">=</span><span style="color:#000000;"> value;

                    </span><span style="color:#0000FF;">if</span><span style="color:#000000;"> ((value </span><span style="color:#000000;">!=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">null</span><span style="color:#000000;">))

                    {

                        value.SubFolders.Add(</span><span style="color:#0000FF;">this</span><span style="color:#000000;">);

                    }

                    </span><span style="color:#0000FF;">this</span><span style="color:#000000;">.RaisePropertyChanged(</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">Parent</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">);

                }

            }

        }

        [DataMember()]

        [Display(AutoGenerateField</span><span style="color:#000000;">=</span><span style="color:#0000FF;">false</span><span style="color:#000000;">)]

        [Editable(</span><span style="color:#0000FF;">false</span><span style="color:#000000;">)]

        [ReadOnly(</span><span style="color:#0000FF;">true</span><span style="color:#000000;">)]

        </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">int</span><span style="color:#000000;"> ParentId

        {

            </span><span style="color:#0000FF;">get</span><span style="color:#000000;">

            {

                </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> </span><span style="color:#0000FF;">this</span><span style="color:#000000;">._parentId;

            }

            </span><span style="color:#0000FF;">set</span><span style="color:#000000;">

            {

                </span><span style="color:#0000FF;">if</span><span style="color:#000000;"> ((</span><span style="color:#0000FF;">this</span><span style="color:#000000;">._parentId </span><span style="color:#000000;">!=</span><span style="color:#000000;"> value))

                {

                    </span><span style="color:#0000FF;">this</span><span style="color:#000000;">.ValidateProperty(</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">ParentId</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">, value);

                    </span><span style="color:#0000FF;">this</span><span style="color:#000000;">.OnParentIdChanging(value);

                    </span><span style="color:#0000FF;">this</span><span style="color:#000000;">._parentId </span><span style="color:#000000;">=</span><span style="color:#000000;"> value;

                    </span><span style="color:#0000FF;">this</span><span style="color:#000000;">.RaisePropertyChanged(</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">ParentId</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">);

                    </span><span style="color:#0000FF;">this</span><span style="color:#000000;">.OnParentIdChanged();

                }

            }

        }

        [Association(</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">tbl_Folder</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">, </span><span style="color:#800000;">&quot;</span><span style="color:#800000;">Id</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">, </span><span style="color:#800000;">&quot;</span><span style="color:#800000;">ParentId</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">)]

        [Display(AutoGenerateField</span><span style="color:#000000;">=</span><span style="color:#0000FF;">false</span><span style="color:#000000;">)]

        </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> EntityCollection</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">Folder</span><span style="color:#000000;">&gt;</span><span style="color:#000000;"> SubFolders

        {

            </span><span style="color:#0000FF;">get</span><span style="color:#000000;">

            {

                </span><span style="color:#0000FF;">if</span><span style="color:#000000;"> ((</span><span style="color:#0000FF;">this</span><span style="color:#000000;">._subFolders </span><span style="color:#000000;">==</span><span style="color:#000000;"> </span><span style="color:#0000FF;">null</span><span style="color:#000000;">))

                {

                    </span><span style="color:#0000FF;">this</span><span style="color:#000000;">._subFolders </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> EntityCollection</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">Folder</span><span style="color:#000000;">&gt;</span><span style="color:#000000;">(</span><span style="color:#0000FF;">this</span><span style="color:#000000;">, </span><span style="color:#800000;">&quot;</span><span style="color:#800000;">SubFolders</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">, </span><span style="color:#0000FF;">this</span><span style="color:#000000;">.FilterSubFolders, </span><span style="color:#0000FF;">this</span><span style="color:#000000;">.AttachSubFolders, </span><span style="color:#0000FF;">this</span><span style="color:#000000;">.DetachSubFolders);

                }

                </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> </span><span style="color:#0000FF;">this</span><span style="color:#000000;">._subFolders;

            }

        }

        [Association(</span><span style="color:#800000;">&quot;</span><span style="color:#800000;">tbl_FolderTag</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">, </span><span style="color:#800000;">&quot;</span><span style="color:#800000;">Id</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">, </span><span style="color:#800000;">&quot;</span><span style="color:#800000;">ParentId</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">)]

        [Display(AutoGenerateField</span><span style="color:#000000;">=</span><span style="color:#0000FF;">false</span><span style="color:#000000;">)]

        </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> EntityCollection</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">Tag</span><span style="color:#000000;">&gt;</span><span style="color:#000000;"> Tags

        {

            </span><span style="color:#0000FF;">get</span><span style="color:#000000;">

            {

                </span><span style="color:#0000FF;">if</span><span style="color:#000000;"> ((</span><span style="color:#0000FF;">this</span><span style="color:#000000;">._tags </span><span style="color:#000000;">==</span><span style="color:#000000;"> </span><span style="color:#0000FF;">null</span><span style="color:#000000;">))

                {

                    </span><span style="color:#0000FF;">this</span><span style="color:#000000;">._tags </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">new</span><span style="color:#000000;"> EntityCollection</span><span style="color:#000000;">&lt;</span><span style="color:#000000;">Tag</span><span style="color:#000000;">&gt;</span><span style="color:#000000;">(</span><span style="color:#0000FF;">this</span><span style="color:#000000;">, </span><span style="color:#800000;">&quot;</span><span style="color:#800000;">Tags</span><span style="color:#800000;">&quot;</span><span style="color:#000000;">, </span><span style="color:#0000FF;">this</span><span style="color:#000000;">.FilterTags);

                }

                </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> </span><span style="color:#0000FF;">this</span><span style="color:#000000;">._tags;

            }

        }

        </span><span style="color:#0000FF;">private</span><span style="color:#000000;"> </span><span style="color:#0000FF;">bool</span><span style="color:#000000;"> FilterDocuments(Document entity)

        {

            </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> (entity.ParentId </span><span style="color:#000000;">==</span><span style="color:#000000;"> </span><span style="color:#0000FF;">this</span><span style="color:#000000;">.Id);

        }

        </span><span style="color:#0000FF;">private</span><span style="color:#000000;"> </span><span style="color:#0000FF;">bool</span><span style="color:#000000;"> FilterParent(Folder entity)

        {

            </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> (entity.Id </span><span style="color:#000000;">==</span><span style="color:#000000;"> </span><span style="color:#0000FF;">this</span><span style="color:#000000;">.ParentId);

        }

        </span><span style="color:#0000FF;">private</span><span style="color:#000000;"> </span><span style="color:#0000FF;">void</span><span style="color:#000000;"> AttachSubFolders(Folder entity)

        {

            entity.Parent </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">this</span><span style="color:#000000;">;

        }

        </span><span style="color:#0000FF;">private</span><span style="color:#000000;"> </span><span style="color:#0000FF;">void</span><span style="color:#000000;"> DetachSubFolders(Folder entity)

        {

            entity.Parent </span><span style="color:#000000;">=</span><span style="color:#000000;"> </span><span style="color:#0000FF;">null</span><span style="color:#000000;">;

        }
        </span><span style="color:#0000FF;">private</span><span style="color:#000000;"> </span><span style="color:#0000FF;">bool</span><span style="color:#000000;"> FilterSubFolders(Folder entity)

        {
            </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> (entity.ParentId </span><span style="color:#000000;">==</span><span style="color:#000000;"> </span><span style="color:#0000FF;">this</span><span style="color:#000000;">.Id);

        }
        </span><span style="color:#0000FF;">private</span><span style="color:#000000;"> </span><span style="color:#0000FF;">bool</span><span style="color:#000000;"> FilterTags(Tag entity)
        {
            </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> (entity.ParentId </span><span style="color:#000000;">==</span><span style="color:#000000;"> </span><span style="color:#0000FF;">this</span><span style="color:#000000;">.Id);
        }

        </span><span style="color:#0000FF;">public</span><span style="color:#000000;"> </span><span style="color:#0000FF;">override</span><span style="color:#000000;"> </span><span style="color:#0000FF;">object</span><span style="color:#000000;"> GetIdentity()

        {
            </span><span style="color:#0000FF;">return</span><span style="color:#000000;"> </span><span style="color:#0000FF;">this</span><span style="color:#000000;">._id;
        }

    }</span></div>
</pre>
</div>
<p>Notice, there is no reference to the BreadCrumbs method, it was simply not projected. This is resolved by including it in Folder.shared.cs which will also get projected to the client &#8216;as is&#8217;.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mwoodhall.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mwoodhall.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mwoodhall.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mwoodhall.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/mwoodhall.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/mwoodhall.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/mwoodhall.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/mwoodhall.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mwoodhall.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mwoodhall.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mwoodhall.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mwoodhall.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mwoodhall.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mwoodhall.wordpress.com/50/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=mwoodhall.wordpress.com&amp;blog=10716929&amp;post=50&amp;subd=mwoodhall&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://mwoodhall.wordpress.com/2009/12/02/ria-services-silverlight-metadata-and-shared-code/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/21171513bc9d366bdeaa97247a814270?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Mark</media:title>
		</media:content>
	</item>
	</channel>
</rss>
