<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.microsoft.co.il/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Bnaya Eshet : WPF</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/WPF/default.aspx</link><description>Tags: WPF</description><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><item><title>Rx - for beginners (part 11): ObserveOn</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/29/rx-for-beginners-part-11-observeon.aspx</link><pubDate>Mon, 29 Mar 2010 15:19:49 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:565175</guid><dc:creator>bnaya</dc:creator><slash:comments>0</slash:comments><description>&lt;h2&gt;&lt;strong&gt;Rx&lt;/strong&gt; - for beginners (part 11): ObserveOn&lt;/h2&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;margin:0px 15px 0px 0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="IObservable,IObserver,Rx,Observable" border="0" alt="IObservable,IObserver,Rx,Observable" align="left" src="http://blogs.microsoft.co.il/blogs/bnaya/1266073365_kghostview_338F1DEE.jpg" width="84" height="84" /&gt; this post is the 11th in a series of posts about the new &lt;strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx"&gt;Reactive Framework&lt;/a&gt;&lt;/strong&gt; (&lt;strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx"&gt;Rx&lt;/a&gt;&lt;/strong&gt;).&lt;/p&gt;  &lt;p&gt;the series &lt;strong&gt;TOC&lt;/strong&gt; can found &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/02/25/rx-for-beginners-toc.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;in this post we will focus on the &lt;strong&gt;ObserveOn…&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the &lt;strong&gt;code&lt;/strong&gt; sample for this post can be found &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/Rx/Rx%20for%20beginners/Part%2011?uc=1&amp;amp;isFromRichUpload=1" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;sometime it is important that the &lt;strong&gt;observation&lt;/strong&gt; will occurs on &lt;strong&gt;specific thread&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;font color="#404040"&gt;for example GUI application like (&lt;strong&gt;WinForm&lt;/strong&gt;, &lt;strong&gt;WPF&lt;/strong&gt; and &lt;strong&gt;Silverlight&lt;/strong&gt;) throw exception whenever&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#404040"&gt;UI component accessed on thread different than its creation thread&lt;/font&gt;. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;ObserveOn &lt;/strong&gt;instruct the &lt;strong&gt;producer&lt;/strong&gt; (observable) to &lt;strong&gt;call&lt;/strong&gt; the &lt;strong&gt;consumer&lt;/strong&gt; (observer) &lt;strong&gt;on specific thread&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;having the following &lt;strong&gt;Xaml&lt;/strong&gt;:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:fa6434de-5740-498b-bb74-1fd5012282b5" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Window&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; x&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Class&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;ObserveOnSample.Window1&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#ff0000;"&gt; xmlns&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#ff0000;"&gt; xmlns&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;x&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#ff0000;"&gt; Title&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Window1&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Height&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;300&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Width&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;300&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Grid&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;TextBlock&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; x&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;_txt&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Text&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Not set&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Grid&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Window&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;if we want to change the Text property of the text box, we mast do it on the &lt;strong&gt;Dispatcher thread&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;doing it we have to add the &lt;strong&gt;ObserveOnDispather&lt;/strong&gt;, as shown in the next snippet (&lt;strong&gt;line 8&lt;/strong&gt;):&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:c07c6315-d0db-4ab1-8b45-ab068fe508a7" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;partial&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Window1&lt;/span&gt;:&lt;span style="color:#2b91af;"&gt;Window&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Window1()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;InitializeComponent();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; timeStream = &lt;span style="color:#2b91af;"&gt;Observable&lt;/span&gt;.Interval(&lt;span style="color:#2b91af;"&gt;TimeSpan&lt;/span&gt;.FromSeconds(1));&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; timeStreamDispather = timeStream.ObserveOnDispatcher();&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;timeStreamDispather.Subscribe(value =&amp;gt; _txt.Text = value.ToString());&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;the sample create &lt;strong&gt;interval producer&lt;/strong&gt; (observable) on&lt;strong&gt; line 7&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;then it ensure that &lt;strong&gt;observation&lt;/strong&gt; will occurs at the &lt;strong&gt;dispatcher thread&lt;/strong&gt; (&lt;strong&gt;line 8&lt;/strong&gt;).&lt;/p&gt;  &lt;p&gt;and &lt;strong&gt;subscribe&lt;/strong&gt; to the &lt;strong&gt;synchronized&lt;/strong&gt; &lt;strong&gt;producer&lt;/strong&gt; (observable) on &lt;strong&gt;line 9&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Summary&lt;/h5&gt;  &lt;p&gt;you can use &lt;strong&gt;Rx&lt;/strong&gt; to &lt;strong&gt;synchronize&lt;/strong&gt; your operation to the right &lt;strong&gt;thread&lt;/strong&gt;. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the &lt;strong&gt;code&lt;/strong&gt; sample for this post can be found &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/Rx/Rx%20for%20beginners/Part%2011?uc=1&amp;amp;isFromRichUpload=1" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;a href="http://dotnetshoutout.com/Rx-for-beginners-part-11-ObserveOn-Export-Bnaya-Eshet"&gt;&lt;img style="border-right-width:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" alt="Shout it" src="http://dotnetshoutout.com/image.axd?url=http%3A%2F%2Fblogs.microsoft.co.il%2Fblogs%2Fbnaya%2Farchive%2F2010%2F03%2F29%2Frx-for-beginners-part-11-observeon.aspx" /&gt;&lt;/a&gt;&lt;div class="wlWriterHeaderFooter" style="margin:0px;padding:0px 0px 0px 0px;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;
&lt;/script&gt;
&lt;script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=565175" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx">SELA</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net/default.aspx">.net</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Rx/default.aspx">Rx</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObserver/default.aspx">IObserver</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Reactive+Extensions/default.aspx">Reactive Extensions</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Parallel/default.aspx">Parallel</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObservable/default.aspx">IObservable</category></item><item><title>recommending VS 2010 XAML IntelliSense Extension</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/26/recommending-vs-2010-xaml-intellisense-extension.aspx</link><pubDate>Fri, 26 Mar 2010 18:12:38 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:563202</guid><dc:creator>bnaya</dc:creator><slash:comments>0</slash:comments><description>&lt;h5&gt;recommending VS 2010 XAML IntelliSense Extension&lt;/h5&gt;  &lt;p&gt;a pal named Karl had published a very useful &lt;strong&gt;plug-in&lt;/strong&gt; to &lt;strong&gt;VS 2010&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;this &lt;strong&gt;plug-in&lt;/strong&gt; is making &lt;strong&gt;Xaml&lt;/strong&gt; writing so much better experience with enhanced &lt;strong&gt;IntelliSense&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;if you doing some &lt;strong&gt;Xaml&lt;/strong&gt; work using &lt;strong&gt;VS 2010&lt;/strong&gt; you should consider to download this plug-in.&lt;/p&gt;  &lt;p&gt;the download is available from the following link:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://karlshifflett.wordpress.com/2010/03/21/visual-studio-2010-xaml-editor-intellisense-presenter-extension/#comment-2228" href="http://karlshifflett.wordpress.com/2010/03/21/visual-studio-2010-xaml-editor-intellisense-presenter-extension/#comment-2228"&gt;http://karlshifflett.wordpress.com/2010/03/21/visual-studio-2010-xaml-editor-intellisense-presenter-extension/#comment-2228&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h6&gt;Features&lt;/h6&gt;  &lt;ul&gt;   &lt;li&gt;Pascal case lookup &lt;/li&gt;    &lt;li&gt;Optional narrowing list filter &lt;/li&gt;    &lt;li&gt;Filtering based on item type &lt;/li&gt;    &lt;li&gt;xmlns IntelliSense options      &lt;ul&gt;       &lt;li&gt;Show/hide only solution assemblies &lt;/li&gt;        &lt;li&gt;Show/hide schemas &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Filter settings persist for the current Visual Studio session &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;img style="display:inline;margin-left:0px;margin-right:0px;" title="FullControls" border="0" alt="FullControls" align="left" src="http://karlshifflett.files.wordpress.com/2010/03/fullcontrols.png?w=308&amp;amp;h=304" width="308" height="304" /&gt;&lt;img style="display:inline;margin-left:0px;margin-right:0px;" title="FullProperties" border="0" alt="FullProperties" align="left" src="http://karlshifflett.files.wordpress.com/2010/03/fullproperties.png?w=305&amp;amp;h=305" width="305" height="305" /&gt;&lt;img title="FullNamespace" border="0" alt="FullNamespace" src="http://karlshifflett.files.wordpress.com/2010/03/fullnamespace.png?w=509&amp;amp;h=282" width="509" height="282" /&gt;     &lt;br /&gt;&lt;/p&gt;&lt;div class="wlWriterHeaderFooter" style="margin:0px;padding:0px 0px 0px 0px;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;
&lt;/script&gt;
&lt;script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=563202" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx">SELA</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/extension/default.aspx">extension</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net/default.aspx">.net</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IntelliSense/default.aspx">IntelliSense</category></item><item><title>MEF for Beginner (Import from Xaml) - part 11</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/20/mef-for-beginner-import-from-xaml-part-11.aspx</link><pubDate>Sat, 20 Mar 2010 21:28:23 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:552959</guid><dc:creator>bnaya</dc:creator><slash:comments>0</slash:comments><description>&lt;h2&gt;MEF for Beginner (Import from Xaml) - part 11&lt;/h2&gt;  &lt;p&gt;this is the 11th post of the &lt;a href="http://mef.codeplex.com/"&gt;&lt;strong&gt;MEF&lt;/strong&gt;&lt;/a&gt; for Beginner series, the series &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/01/09/mef-for-beginner-toc.aspx"&gt;TOC&lt;/a&gt; is available &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/01/09/mef-for-beginner-toc.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;this post will focus on &lt;strong&gt;Importing mef parts &lt;/strong&gt;directly from the &lt;strong&gt;Xaml&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/iStock_000005438250VerySmallXmXorl_0339C5C9.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Import, ImportMany, MEF, composition, CLR 4" border="0" alt="Import, ImportMany, MEF, composition, CLR 4" src="http://blogs.microsoft.co.il/blogs/bnaya/iStock_000005438250VerySmallXmXorl_thumb_2E6E3703.jpg" width="303" height="77" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;the code sample for this post is available &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/MEF/MEF%20for%20Beginners/Part%2011?uc=1&amp;amp;isFromRichUpload=1" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;assuming that we have the following &lt;strong&gt;exports&lt;/strong&gt;:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:3c19987e-7cb2-4576-8452-1bb91342eeae" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DemoStrings&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;[&lt;span style="color:#2b91af;"&gt;Export&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;MyTag&amp;quot;&lt;/span&gt;)]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Text1 { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#a31515;"&gt;&amp;quot;Hello world&amp;quot;&lt;/span&gt;; } }&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;[&lt;span style="color:#2b91af;"&gt;Export&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;MyTag&amp;quot;&lt;/span&gt;)]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Text2 { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#a31515;"&gt;&amp;quot;export using custom attribute&amp;quot;&lt;/span&gt;; } }&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;[&lt;span style="color:#2b91af;"&gt;Export&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;NotMyTag&amp;quot;&lt;/span&gt;)]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Text3 { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#a31515;"&gt;&amp;quot;not included (Not My Tag contract)&amp;quot;&lt;/span&gt;; } }&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;[&lt;span style="color:#2b91af;"&gt;Export&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;MyTag&amp;quot;&lt;/span&gt;)]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Text4 { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#a31515;"&gt;&amp;quot;Wpf markup extension&amp;quot;&lt;/span&gt;; } }&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;[&lt;span style="color:#2b91af;"&gt;Export&lt;/span&gt;]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Text5 { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#a31515;"&gt;&amp;quot;not included (have no contract)&amp;quot;&lt;/span&gt;; } }&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;we may want to have it &lt;strong&gt;import&lt;/strong&gt; into the &lt;strong&gt;Xaml&lt;/strong&gt; as follow:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:8f4b3bb2-cced-4c46-9881-b1d7f42810a4" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Window&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; x&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Class&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Bnaya.Samples.MainWindow&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#ff0000;"&gt; xmlns&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#ff0000;"&gt; xmlns&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;x&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#ff0000;"&gt; xmlns&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;mef&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;clr-namespace:Bnaya.Samples&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#ff0000;"&gt; Title&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;MainWindow&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Height&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;350&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Width&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;525&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Grid&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ListBox&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#ff0000;"&gt; DataContext&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515;"&gt;mef&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ImportManyStrings&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; MyTag}&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;quot;&lt;/span&gt; &lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#ff0000;"&gt; ItemsSource&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Binding}&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Grid&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Window&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;as you can see at &lt;strong&gt;line 8&lt;/strong&gt; the &lt;strong&gt;data context&lt;/strong&gt; is using special definition for &lt;strong&gt;importing&lt;/strong&gt; all &lt;strong&gt;exported&lt;/strong&gt; &lt;strong&gt;strings&lt;/strong&gt; that     &lt;br /&gt;define the their &lt;strong&gt;contract&lt;/strong&gt; as &lt;strong&gt;MyTag&lt;/strong&gt; (&lt;font color="#808080"&gt;looking at the &lt;strong&gt;exports&lt;/strong&gt; it will &lt;strong&gt;import&lt;/strong&gt; the exports at&lt;strong&gt; lines 4,6,10&lt;/strong&gt;&lt;/font&gt;).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;what should we have in order to achieve that functionality?&lt;/h5&gt;  &lt;p&gt;actually very little, all we have to do is to define a&lt;strong&gt; markup extension&lt;/strong&gt; that return the &lt;strong&gt;exported&lt;/strong&gt; &lt;strong&gt;parts&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the following code is how the &lt;strong&gt;markup extension&lt;/strong&gt; should be define:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:ce4d674f-f189-46ff-82bc-0b4ea7447c79" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;[&lt;span style="color:#2b91af;"&gt;MarkupExtensionReturnType&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt;))]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ImportManyStringsExtension&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;MarkupExtension&lt;/span&gt;&lt;/li&gt; &lt;li&gt;{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;readonly&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt; _dataSource;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; ImportManyStringsExtension(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; contract)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;_dataSource = &lt;span style="color:#2b91af;"&gt;CompositionHost&lt;/span&gt;.Provider.GetExportedValues&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt;(contract);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; ProvideValue(&lt;span style="color:#2b91af;"&gt;IServiceProvider&lt;/span&gt; serviceProvider)&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; _dataSource;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&amp;#160;&amp;#160;&amp;#160;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 1&lt;/strong&gt;, decorate that our &lt;strong&gt;markup extension&lt;/strong&gt; for returning &lt;strong&gt;IEnumerable&amp;lt;string&amp;gt;&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 2&lt;/strong&gt;, derive from &lt;strong&gt;MarkupExtension&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 7&lt;/strong&gt;, at the construction time, dynamically ask &lt;strong&gt;mef&lt;/strong&gt; for any &lt;strong&gt;discoverable parts&lt;/strong&gt; that follow the &lt;strong&gt;contract&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;the CompositionHost is a very small helper class that was taken from the &lt;strong&gt;MEF Silverlight&lt;/strong&gt; implementation &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;with some very minor enhancements&lt;/font&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;lines 10-13&lt;/strong&gt;, returning the &lt;strong&gt;discoverable parts&lt;/strong&gt; to the &lt;strong&gt;Xaml&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;One last thing&lt;/h5&gt;  &lt;p&gt;we should remove the &lt;strong&gt;StartupUri&lt;/strong&gt; from the &lt;strong&gt;App.Xaml&lt;/strong&gt; and using the &lt;strong&gt;OnStartup override&lt;/strong&gt; instead:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:a18e7edc-77f1-43b8-8db2-338a4a86aea3" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; OnStartup(&lt;span style="color:#2b91af;"&gt;StartupEventArgs&lt;/span&gt; e)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;base&lt;/span&gt;.OnStartup(e);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (!&lt;span style="color:#2b91af;"&gt;Utils&lt;/span&gt;.IsInDesignTool)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; asmCatalog = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;AssemblyCatalog&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;App&lt;/span&gt;).Assembly);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; catalogs = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;AggregateCatalog&lt;/span&gt;(asmCatalog);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; container = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CompositionContainer&lt;/span&gt;(catalogs);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#2b91af;"&gt;CompositionHost&lt;/span&gt;.Initialize(container);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;container.Compose(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CompositionBatch&lt;/span&gt;());&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; root = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MainWindow&lt;/span&gt;(); &lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;root.ShowDialog();&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;strong&gt;line 5&lt;/strong&gt;, preventing &lt;strong&gt;MEF&lt;/strong&gt; operation during&lt;strong&gt; design time&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;lines 7-9&lt;/strong&gt;, setting the&lt;strong&gt; MEF container&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 10&lt;/strong&gt;, setting the &lt;strong&gt;MEF container&lt;/strong&gt; as the &lt;strong&gt;main container&lt;/strong&gt; of the application &lt;/p&gt;  &lt;p&gt;(this way it can be &lt;strong&gt;reachable anywhere&lt;/strong&gt;).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 11&lt;/strong&gt;, do the &lt;strong&gt;composition&lt;/strong&gt;, &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;IMPOERANT&lt;/font&gt;&lt;/strong&gt;: the &lt;strong&gt;composition&lt;/strong&gt; should happens &lt;strong&gt;before&lt;/strong&gt; the &lt;strong&gt;window instantiation&lt;/strong&gt;, &lt;/p&gt;  &lt;p&gt;because that when the &lt;strong&gt;markup extension&lt;/strong&gt; will be invoke.&lt;/p&gt;  &lt;p&gt;the &lt;strong&gt;exported part&lt;/strong&gt; should be available at this time. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;lines 13-14&lt;/strong&gt;, starting the application.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Summary&lt;/h5&gt;  &lt;p&gt;we can extend the &lt;strong&gt;Xaml&lt;/strong&gt; very easily in order to get better &lt;strong&gt;Xaml&lt;/strong&gt;-&amp;gt;&lt;strong&gt;Mef&lt;/strong&gt; experience.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the code sample for this post is available &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/MEF/MEF%20for%20Beginners/Part%2011?uc=1&amp;amp;isFromRichUpload=1" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:1bd718e5-fd3d-4d99-80e3-d80d7f7d4f74" class="wlWriterSmartContent"&gt;תגים של Technorati:‏ &lt;a href="http://technorati.com/tags/Import" rel="tag"&gt;Import&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ImportMany" rel="tag"&gt;ImportMany&lt;/a&gt;,&lt;a href="http://technorati.com/tags/MEF" rel="tag"&gt;MEF&lt;/a&gt;,&lt;a href="http://technorati.com/tags/composition" rel="tag"&gt;composition&lt;/a&gt;,&lt;a href="http://technorati.com/tags/CLR+4" rel="tag"&gt;CLR 4&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f03%2f20%2fmef-for-beginner-import-from-xaml-part-11.aspx"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f03%2f20%2fmef-for-beginner-import-from-xaml-part-11.aspx" /&gt;&lt;/a&gt;&lt;div class="wlWriterHeaderFooter" style="margin:0px;padding:0px 0px 0px 0px;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;
&lt;/script&gt;
&lt;script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=552959" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/MEF/default.aspx">MEF</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Extensibility/default.aspx">Extensibility</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Beginner/default.aspx">Beginner</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx">SELA</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/extension/default.aspx">extension</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net/default.aspx">.net</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Composition/default.aspx">Composition</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/ImportMany/default.aspx">ImportMany</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Export/default.aspx">Export</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Import/default.aspx">Import</category></item><item><title>Recommendation</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/20/recommendation.aspx</link><pubDate>Sat, 20 Mar 2010 15:25:41 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:552386</guid><dc:creator>bnaya</dc:creator><slash:comments>0</slash:comments><description>&lt;h2&gt;Recommendation&lt;/h2&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;this is a &lt;a href="http://geekswithblogs.net/bdiaz/archive/2010/03/14/updated-the-whiteboard-demo.aspx" target="_blank"&gt;post&lt;/a&gt; recommendation about using &lt;strong&gt;Rx&lt;/strong&gt; framework with &lt;strong&gt;WPF events&lt;/strong&gt;,&lt;/p&gt;  &lt;p&gt;I&amp;#39;m recommending &lt;a href="http://geekswithblogs.net/bdiaz/archive/2010/03/14/updated-the-whiteboard-demo.aspx" target="_blank"&gt;this&lt;/a&gt; post from &lt;a href="http://geekswithblogs.net/bdiaz/Default.aspx"&gt;bobby&amp;#39;s blog&lt;/a&gt;, the post is demonstrating the&lt;/p&gt;  &lt;p&gt;use of creating &lt;strong&gt;observable&lt;/strong&gt; stream from &lt;strong&gt;WPF&lt;/strong&gt; event.&lt;/p&gt;  &lt;p&gt;it is a short post with nice little &lt;a href="http://www.bmdiaz.com/Files/Whiteboard.zip" target="_blank"&gt;code sample&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;bobby did a real good job by wrapping the &lt;strong&gt;observable&lt;/strong&gt; event (&lt;strong&gt;&lt;font color="#404040"&gt;Observable.FromEvent&lt;/font&gt;&lt;/strong&gt;) &lt;/p&gt;  &lt;p&gt;into more human readable format (using T4 template).&lt;/p&gt;&lt;div class="wlWriterHeaderFooter" style="margin:0px;padding:0px 0px 0px 0px;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;
&lt;/script&gt;
&lt;script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=552386" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx">SELA</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/CLR+4/default.aspx">CLR 4</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net/default.aspx">.net</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Rx/default.aspx">Rx</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Reactive+Extensions/default.aspx">Reactive Extensions</category></item><item><title>Rx - Reactive Extension – for beginners (part 2)</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/02/22/rx-reactive-extension-for-beginners-part-2.aspx</link><pubDate>Tue, 23 Feb 2010 01:53:30 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:526335</guid><dc:creator>bnaya</dc:creator><slash:comments>0</slash:comments><description>&lt;h2&gt;&lt;strong&gt;Rx&lt;/strong&gt; - Reactive Extension (part 2)&lt;/h2&gt;  &lt;p&gt;this post is the second in a series of posts about the new &lt;strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx"&gt;Reactive Framework&lt;/a&gt;&lt;/strong&gt; (&lt;strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx"&gt;Rx&lt;/a&gt;&lt;/strong&gt;).&lt;/p&gt;  &lt;p&gt;the previous &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/02/19/rx-reactive-extension-for-beginner-part-1.aspx" target="_blank"&gt;post&lt;/a&gt; discuss the concept of &lt;strong&gt;Rx (Reactive Framework Extension)&lt;/strong&gt;,&lt;/p&gt;  &lt;p&gt;this post will focus on some basic practice.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/image_08519FBD.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Rx, reactive framework, IObservable, IObserver" border="0" alt="Rx, reactive framework, IObservable, IObserver" src="http://blogs.microsoft.co.il/blogs/bnaya/image_thumb_5E6DD92F.png" width="253" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In this post we will create small &lt;strong&gt;WPF&lt;/strong&gt; application that got images from different&lt;/p&gt;  &lt;p&gt;image feeds providers (the source code can be found &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/Rx/Rx%20for%20beginners/Part%202?uc=1&amp;amp;isFromRichUpload=1" target="_blank"&gt;here&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Application layout&lt;/h5&gt;  &lt;p&gt;The application layout is described in the following diagram.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/image_717EE00E.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Rx, reactive framework, IObservable, IObserver" border="0" alt="Rx, reactive framework, IObservable, IObserver" src="http://blogs.microsoft.co.il/blogs/bnaya/image_thumb_4E5E48D1.png" width="544" height="286" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the image data will be &lt;strong&gt;pushed&lt;/strong&gt; into the &lt;strong&gt;PhotoDataSourceProvider&lt;/strong&gt; class which implement &lt;strong&gt;IObserver&lt;/strong&gt;.&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:15e910c7-9a2c-452e-91d8-6d75dab07b1f" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;PhotoDataSourceProvider&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;DataSourceProvider&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;IObserver&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;ImageData&lt;/span&gt;&amp;gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;...&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;the class will take the pushed data and expose it to the &lt;strong&gt;UI&lt;/strong&gt; through the &lt;strong&gt;DataSourceProvider&lt;/strong&gt; overrides.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;DataSourceProvider&lt;/strong&gt; is used as &lt;strong&gt;mediator&lt;/strong&gt; between the &lt;strong&gt;UI&lt;/strong&gt; and the &lt;strong&gt;Feeders&lt;/strong&gt; in order to make the UI data &lt;strong&gt;thread safe&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;In short the &lt;strong&gt;IObserver&lt;/strong&gt; is where the &lt;strong&gt;data&lt;/strong&gt; get &lt;strong&gt;pushed&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;The feeders implement &lt;strong&gt;IObservable&lt;/strong&gt;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:cc56d179-0fdb-4245-84d4-b95b274221db" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;abstract&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ImageFeederBase&lt;/span&gt;: &lt;span style="color:#2b91af;"&gt;IObservable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;ImageData&lt;/span&gt;&amp;gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IDisposable&lt;/span&gt; Subscribe(&lt;span style="color:#2b91af;"&gt;IObserver&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;ImageData&lt;/span&gt;&amp;gt; observer)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;..&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;all feeders inherit from &lt;strong&gt;ImageFeederBase&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;IObservable&lt;/strong&gt; expose the &lt;strong&gt;Subscribe&lt;/strong&gt; method, which can be use for subscribing the&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;PhotoDataSourceProvider&lt;/strong&gt; (because it is an observer).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;this is how the &lt;strong&gt;PhotoDataSourceProvider&lt;/strong&gt; constructor look like:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:79048ed2-0964-4df3-95af-5097eb21d6ca" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; PhotoDataSourceProvider()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; picasaFeeder = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;PicasaImageFeeder&lt;/span&gt;();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;picasaFeeder.Subscribe(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; flickrAircraftFeeder = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;FlickrImageFeeder&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Aircraft&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;flickrAircraftFeeder.Subscribe(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; flickrFlowerFeeder = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;FlickrImageFeeder&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Flower&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;flickrFlowerFeeder.Subscribe(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; flickrSmileyFeeder = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;FlickrImageFeeder&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Smiley&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;flickrSmileyFeeder.Subscribe(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; fileSystemJpgFeeder = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;FileSystemImageFeeder&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;*.jpg&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;fileSystemJpgFeeder.Subscribe(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; fileSystemPngFeeder = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;FileSystemImageFeeder&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;*.png&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;fileSystemPngFeeder.Subscribe(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;it &lt;strong&gt;subscribing&lt;/strong&gt; itself for different feeders. &lt;/p&gt;  &lt;p&gt;then whenever the feeder &lt;strong&gt;Has new image&lt;/strong&gt;, &lt;strong&gt;Complete&lt;/strong&gt; or &lt;strong&gt;Has Error&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;the &lt;strong&gt;PhotoDataSourceProvider&lt;/strong&gt; will be notify through it &lt;strong&gt;IObserver&lt;/strong&gt; implementation.&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:941776ad-7d4d-4b56-8b35-93cabd5d2286" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IObserver&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;ImageData&lt;/span&gt;&amp;gt;.OnCompleted()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;...&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IObserver&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;ImageData&lt;/span&gt;&amp;gt;.OnError(&lt;span style="color:#2b91af;"&gt;Exception&lt;/span&gt; exception)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;...&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IObserver&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;ImageData&lt;/span&gt;&amp;gt;.OnNext(&lt;span style="color:#2b91af;"&gt;ImageData&lt;/span&gt; value)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;...&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Summary&lt;/h5&gt;  &lt;p&gt;the &lt;strong&gt;Rx &lt;/strong&gt;is using the &lt;strong&gt;IObservable&lt;/strong&gt; and &lt;strong&gt;IObserver&lt;/strong&gt; in order to formalize &lt;strong&gt;push&lt;/strong&gt; based operation.&lt;/p&gt;  &lt;p&gt;the &lt;strong&gt;IObservable&lt;/strong&gt; is the &lt;strong&gt;push supplier&lt;/strong&gt;, while the &lt;strong&gt;IObserver&lt;/strong&gt; is the &lt;strong&gt;push target&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;IObserver&lt;/strong&gt; can be subscribe to one or more &lt;strong&gt;IObservable&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Source Code&lt;/h5&gt;  &lt;p&gt;the source code can be found &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/Rx/Rx%20for%20beginners/Part%202?uc=1&amp;amp;isFromRichUpload=1" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:f9106b21-f2da-4bdf-9775-9e671667ac3d" class="wlWriterSmartContent"&gt;תגים של Technorati:‏ &lt;a href="http://technorati.com/tags/IObserver" rel="tag"&gt;IObserver&lt;/a&gt;,&lt;a href="http://technorati.com/tags/IObservable" rel="tag"&gt;IObservable&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Rx" rel="tag"&gt;Rx&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f02%2f22%2frx-reactive-extension-for-beginners-part-2.aspx"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f02%2f22%2frx-reactive-extension-for-beginners-part-2.aspx" /&gt;&lt;/a&gt;&lt;div class="wlWriterHeaderFooter" style="margin:0px;padding:0px 0px 0px 0px;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;
&lt;/script&gt;
&lt;script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=526335" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Beginner/default.aspx">Beginner</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx">SELA</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/CLR+4/default.aspx">CLR 4</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Rx/default.aspx">Rx</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObserver/default.aspx">IObserver</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Parallel/default.aspx">Parallel</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IObservable/default.aspx">IObservable</category></item><item><title>MEF for Beginner (repeatable metadata) - part 9</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/01/29/mef-for-beginner-repeatable-metadata-part-9.aspx</link><pubDate>Fri, 29 Jan 2010 20:02:27 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:511919</guid><dc:creator>bnaya</dc:creator><slash:comments>0</slash:comments><description>&lt;h3&gt;MEF for Beginner (repeatable metadata) - part 9&lt;/h3&gt;  &lt;p&gt;this is the 9th post of the &lt;a href="http://mef.codeplex.com/"&gt;&lt;strong&gt;MEF&lt;/strong&gt;&lt;/a&gt; for Beginner series, the series &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/01/09/mef-for-beginner-toc.aspx"&gt;TOC&lt;/a&gt; is available &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/01/09/mef-for-beginner-toc.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;this post will focus on having &lt;strong&gt;repeatable&lt;/strong&gt; &lt;strong&gt;metadata&lt;/strong&gt; definition (cases like definition of multiple categories).&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;if you not familiar with the &lt;strong&gt;MEF metadata&lt;/strong&gt; concept you may want to read &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/01/20/mef-for-beginner-metadata-part-8.aspx" target="_blank"&gt;part 8&lt;/a&gt;.&lt;/font&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/MultiTag_2ED4D45E.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;margin-left:0px;border-left-width:0px;margin-right:0px;" title="MEF extensibility compose import export importmany" border="0" alt="MEF extensibility compose import export importmany" src="http://blogs.microsoft.co.il/blogs/bnaya/MultiTag_thumb_03EC4A7F.jpg" width="146" height="117" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h5&gt;Bad practice for repeatable metadata&lt;/h5&gt;  &lt;p&gt;In order to explain &lt;strong&gt;repeatable metadata&lt;/strong&gt;, we will start by &lt;strong&gt;decorating export&lt;/strong&gt; with&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#800000"&gt;untyped metadata declaration&lt;/font&gt;&lt;/strong&gt; (&lt;font color="#404040"&gt;which consider as &lt;strong&gt;bad practice&lt;/strong&gt;, use typed metadata &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#404040"&gt;whenever you can, it is mach usable and reducing runtime failure&lt;/font&gt;).&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:6bf3e7d2-2d7a-4f8b-98f9-afdca9586a1f" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;[&lt;span style="color:#2b91af;"&gt;Export&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;IPlug&lt;/span&gt;))]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#008000;"&gt;// using untyped metadata considered as bad practice&lt;/span&gt;&lt;/li&gt; &lt;li&gt;[&lt;span style="color:#2b91af;"&gt;ExportMetadata&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Categories&amp;quot;&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;Category&lt;/span&gt;.Travel, IsMultiple = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;)]&amp;#160;&amp;#160;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;[&lt;span style="color:#2b91af;"&gt;ExportMetadata&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Categories&amp;quot;&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;Category&lt;/span&gt;.City, IsMultiple = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;)]&amp;#160;&amp;#160;&amp;#160;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;NewYork&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;IPlug&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Write() { &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515;"&gt;&amp;quot;New York&amp;quot;&lt;/span&gt;); }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;the above code snippet &lt;strong&gt;decorate&lt;/strong&gt; the plug-in with &lt;strong&gt;categories&lt;/strong&gt;&amp;#160; &lt;strong&gt;metadata&lt;/strong&gt; for both Travel and City (line 3,4).&lt;/p&gt;  &lt;p&gt;notice that we should explicitly declare that those decoration is multiple (&lt;strong&gt;IsMultiple=true&lt;/strong&gt;). &lt;/p&gt;  &lt;p&gt;line 1: define the &lt;strong&gt;export&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;latter on this post we will see the &lt;strong&gt;best practice&lt;/strong&gt; of declaring the metadata using &lt;strong&gt;custom attribute&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Metadata view contract for repeatable metadata definition&lt;/h5&gt;  &lt;p&gt;the &lt;strong&gt;metadata view contract&lt;/strong&gt; properties type, &lt;font color="#404040"&gt;for repeatable metadata decoration&lt;/font&gt;, should be &lt;strong&gt;Array&lt;/strong&gt;, or &lt;strong&gt;IEnumerable&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;the following &lt;strong&gt;metadata view contract&lt;/strong&gt; is capable to handle the above &lt;strong&gt;metadata&lt;/strong&gt; decoration:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:305d4f93-6b66-4bb2-8eb3-c5025ca60cf3" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;interface&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IMetadataView&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#2b91af;"&gt;Category&lt;/span&gt;[] Categories { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;as you can see, line 3, define property that match the name of our &lt;strong&gt;metadata&lt;/strong&gt; decoration (Categories)&lt;/p&gt;  &lt;p&gt;and it is using array for its data type.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Best practice for metadata definition&lt;/h5&gt;  &lt;p&gt;as in the previous part, the&lt;strong&gt; best practice&lt;/strong&gt; for &lt;strong&gt;metadata&lt;/strong&gt; definition is &lt;/p&gt;  &lt;p&gt;using&amp;#160; &lt;strong&gt;typed&lt;/strong&gt; &lt;strong&gt;metadata&lt;/strong&gt;, which mean to define &lt;strong&gt;attribute&lt;/strong&gt; for the &lt;strong&gt;metadata&lt;/strong&gt;.&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:55cd2761-2a1a-45cf-a7bd-d75caa7bdbd1" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;[&lt;span style="color:#2b91af;"&gt;MetadataAttribute&lt;/span&gt;]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;[&lt;span style="color:#2b91af;"&gt;AttributeUsage&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;AttributeTargets&lt;/span&gt;.Class, AllowMultiple = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;)]&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CategoryAttribute&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;Attribute&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; CategoryAttribute(&lt;span style="color:#2b91af;"&gt;Category&lt;/span&gt; category)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;Categories = category;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Category&lt;/span&gt; Categories { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;as you can see it is almost identical for the definition of non-repeatable &lt;strong&gt;metadata&lt;/strong&gt; attribute,&lt;/p&gt;  &lt;p&gt;but with 2 differences:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;we should declare that the attribute &lt;strong&gt;allow multiple&lt;/strong&gt; occurrence (at the end of line 2),       &lt;br /&gt;&lt;font color="#808080"&gt;this definition is equivalent to the &lt;strong&gt;IsMultiple&lt;/strong&gt; definition on the untyped metadata&lt;/font&gt;. &lt;/li&gt;    &lt;li&gt;we should &lt;strong&gt;derive&lt;/strong&gt; from &lt;strong&gt;Attribute&lt;/strong&gt; (&lt;font color="#808080"&gt;instead of &lt;strong&gt;ExportAttribute&lt;/strong&gt;, otherwise we will get multiple         &lt;br /&gt;instantiation of our plug-in&lt;/font&gt;). &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the plug-in decoration will look as follow:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:bcfaa5de-75d6-490c-877e-b9762cfb3720" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;[&lt;span style="color:#2b91af;"&gt;Export&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;IPlug&lt;/span&gt;))]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;[&lt;span style="color:#2b91af;"&gt;Category&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;Category&lt;/span&gt;.Game)]&lt;/li&gt; &lt;li&gt;[&lt;span style="color:#2b91af;"&gt;Category&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;Category&lt;/span&gt;.News)]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Football&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;IPlug&lt;/span&gt;&lt;/li&gt; &lt;li&gt;{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Write() { &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515;"&gt;&amp;quot;Football&amp;quot;&lt;/span&gt;); }&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;font color="#404040"&gt;in term of code safety &lt;strong&gt;typed metadata&lt;/strong&gt; leaving&lt;strong&gt; less margin for errors&lt;/strong&gt;,&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#404040"&gt;and it is match &lt;strong&gt;more usable&lt;/strong&gt; because it is easier to understand which value are expected.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;The &lt;strong&gt;Import&lt;/strong&gt; decoration&lt;/h5&gt;  &lt;p&gt;our &lt;strong&gt;import&lt;/strong&gt; should use the &lt;strong&gt;Lazy&amp;lt;IPlug, IMetadataView&amp;gt;&lt;/strong&gt; in order to get the &lt;strong&gt;metadata&lt;/strong&gt; information&lt;/p&gt;  &lt;p&gt;(&lt;font color="#404040"&gt;through the &lt;strong&gt;IMetadataView&lt;/strong&gt; &lt;strong&gt;contract&lt;/strong&gt;&lt;/font&gt; ).&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:df187334-8e24-4b8b-ae6b-d1f0eeb89508" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;[&lt;span style="color:#2b91af;"&gt;ImportMany&lt;/span&gt;]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Lazy&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;IPlug&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;IMetadataView&lt;/span&gt;&amp;gt;[] Plugins { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Interrogating the metadata&lt;/h5&gt;  &lt;p&gt;the following code will &lt;strong&gt;compose&lt;/strong&gt; and &lt;strong&gt;interrogate&lt;/strong&gt; the &lt;strong&gt;metadata&lt;/strong&gt;.&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:fa064d3c-5d94-41a7-b7e7-ed96c3695806" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Program&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Main(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;[] args)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; instance = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Program&lt;/span&gt;();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; cat = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;AssemblyCatalog&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;Program&lt;/span&gt;).Assembly);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; container = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CompositionContainer&lt;/span&gt;(cat);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;container.ComposeParts(instance);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; plug &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; instance.Plugins)&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;plug.Value.Write();&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; category &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; plug.Metadata.Categories)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.Write(&lt;span style="color:#a31515;"&gt;&amp;quot;, {0}&amp;quot;&lt;/span&gt;, category);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;[&lt;span style="color:#2b91af;"&gt;ImportMany&lt;/span&gt;]&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Lazy&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;IPlug&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;IMetadataView&lt;/span&gt;&amp;gt;[] Plugins { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;lines 6-8, is handling the &lt;strong&gt;composition&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;line 10, &lt;strong&gt;iterating&lt;/strong&gt; for each of the &lt;strong&gt;discovered plug-in&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;line 13, &lt;strong&gt;iterating&lt;/strong&gt; for each of the items in the &lt;strong&gt;metadata&lt;/strong&gt; categories property upon &lt;strong&gt;specific plug-in&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Summary&lt;/h5&gt;  &lt;p&gt;having &lt;strong&gt;multiple&lt;/strong&gt; &lt;strong&gt;metadata&lt;/strong&gt; on the same &lt;strong&gt;export&lt;/strong&gt; is slightly more challenging.&lt;/p&gt;  &lt;p&gt;the main &lt;strong&gt;difference&lt;/strong&gt; between working with repeatable metadata relate to the metadata decoration (&lt;strong&gt;AllowMultiple=true&lt;/strong&gt;)&lt;/p&gt;  &lt;p&gt;and having &lt;strong&gt;Array&lt;/strong&gt; or &lt;strong&gt;IEnumerable&lt;/strong&gt; at the &lt;strong&gt;metadata view&lt;/strong&gt; properties level.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Download the code&lt;/h5&gt;  &lt;p&gt;the full &lt;a href="http://codepaste.net/jnheqa" target="_blank"&gt;code snippet&lt;/a&gt; for the samples covered by this post available in &lt;a href="http://codepaste.net/jnheqa" target="_blank"&gt;here&lt;/a&gt;,&lt;/p&gt;  &lt;p&gt;full project &lt;strong&gt;download&lt;/strong&gt; for the &lt;strong&gt;post sample&lt;/strong&gt; and for &lt;strong&gt;WPF&lt;/strong&gt; &lt;strong&gt;sample&lt;/strong&gt; that using this post concept for&lt;/p&gt;  &lt;p&gt;dynamic filtering of widgets by categories (as shown bellow), is available here for &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/MEF/MEF%20for%20Beginners/Part%209/2008" target="_blank"&gt;2008&lt;/a&gt;, and here for &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/MEF/MEF%20for%20Beginners/Part%209/2010" target="_blank"&gt;2010&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/image_1B374EF0.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/bnaya/image_thumb_3205FA9F.png" width="380" height="270" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;filtering widgets by categories sample (&lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/MEF/MEF%20for%20Beginners/Part%209/2010" target="_blank"&gt;2010&lt;/a&gt;, &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/MEF/MEF%20for%20Beginners/Part%209/2008" target="_blank"&gt;2008&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Point of interest&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;do not&lt;/strong&gt; use &lt;strong&gt;setter&lt;/strong&gt; on your &lt;strong&gt;metadata view&lt;/strong&gt; interface. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;do not&lt;/strong&gt; use the &lt;strong&gt;[InheritedExport]&lt;/strong&gt; because for some some strange reason it doesn&amp;#39;t functioning well along with metadata. &lt;/li&gt;    &lt;li&gt;if you want to build &lt;strong&gt;advance metadata view contract&lt;/strong&gt; you can use &lt;strong&gt;class instead of interface&lt;/strong&gt;,       &lt;br /&gt;but that class must have &lt;strong&gt;constructor&lt;/strong&gt; with the following signature:       &lt;br /&gt;&lt;strong&gt;public ClassName (IDictionary&amp;lt;string, object&amp;gt; metadata)        &lt;br /&gt;&lt;/strong&gt;&lt;font color="#404040"&gt;inside the constructor you should map the metadata dictionary to the class properties&lt;/font&gt;. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:59aca6b9-8e23-4511-8c85-35e94da56465" class="wlWriterSmartContent"&gt;תגים של Technorati:‏ &lt;a href="http://technorati.com/tags/MEF" rel="tag"&gt;MEF&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Extensibility" rel="tag"&gt;Extensibility&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Importmany" rel="tag"&gt;Importmany&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Export" rel="tag"&gt;Export&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Import" rel="tag"&gt;Import&lt;/a&gt;,&lt;a href="http://technorati.com/tags/IoC" rel="tag"&gt;IoC&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SELA" rel="tag"&gt;SELA&lt;/a&gt;,&lt;a href="http://technorati.com/tags/composition" rel="tag"&gt;composition&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;br /&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f01%2f29%2fmef-for-beginner-repeatable-metadata-part-9.aspx"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f01%2f29%2fmef-for-beginner-repeatable-metadata-part-9.aspx" /&gt;&lt;/a&gt;&lt;div class="wlWriterHeaderFooter" style="margin:0px;padding:0px 0px 0px 0px;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;
&lt;/script&gt;
&lt;script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=511919" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/MEF/default.aspx">MEF</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Extensibility/default.aspx">Extensibility</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Beginner/default.aspx">Beginner</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx">SELA</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/CLR+4/default.aspx">CLR 4</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/extension/default.aspx">extension</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net/default.aspx">.net</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IoC/default.aspx">IoC</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Composition/default.aspx">Composition</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/ImportMany/default.aspx">ImportMany</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Export/default.aspx">Export</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Import/default.aspx">Import</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Metadata/default.aspx">Metadata</category></item><item><title>MEF for Beginner (Metadata) - part 8</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/01/20/mef-for-beginner-metadata-part-8.aspx</link><pubDate>Wed, 20 Jan 2010 06:33:14 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:503593</guid><dc:creator>bnaya</dc:creator><slash:comments>0</slash:comments><description>&lt;h3&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/PuzzleMetadata_7139892E.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;margin-left:0px;border-left-width:0px;margin-right:0px;" title="MEF extensibility metadata" border="0" alt="MEF extensibility metadata" align="left" src="http://blogs.microsoft.co.il/blogs/bnaya/PuzzleMetadata_thumb_121CD609.jpg" width="141" height="113" /&gt;&lt;/a&gt; MEF for Beginner (Metadata) - part 8&lt;/h3&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;this is the 8th post of the &lt;a href="http://mef.codeplex.com/"&gt;&lt;strong&gt;MEF&lt;/strong&gt;&lt;/a&gt; for Beginner series, the series &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/01/09/mef-for-beginner-toc.aspx"&gt;TOC&lt;/a&gt; is available &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/01/09/mef-for-beginner-toc.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;this post will focus on the basics of &lt;strong&gt;MEF&lt;/strong&gt; &lt;strong&gt;metadata&lt;/strong&gt; capabilities,&lt;/p&gt;  &lt;p&gt;&lt;font color="#404040"&gt;the next post discuss the ability of multiple metadata decorations&lt;/font&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;What is Metadata?&lt;/h5&gt;  &lt;p&gt;metadata is piece of compile-time information that can be &lt;strong&gt;attached&lt;/strong&gt; to &lt;strong&gt;exported part&lt;/strong&gt;.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;metadata is adding peripheral information to the part,      &lt;br /&gt;&lt;font color="#808080"&gt;(metadata information may define which operation system supported by the plug-in)&lt;/font&gt;. &lt;/li&gt;    &lt;li&gt;metadata can be &lt;strong&gt;read before&lt;/strong&gt; the &lt;strong&gt;instantiation&lt;/strong&gt; of the part. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Typed metadata&lt;/h5&gt;  &lt;p&gt;&lt;strong&gt;MEF&lt;/strong&gt; support both &lt;strong&gt;typed&lt;/strong&gt; and&lt;strong&gt; non typed&lt;/strong&gt; metadata, as is the case in other .net component&lt;/p&gt;  &lt;p&gt;the &lt;strong&gt;best practice&lt;/strong&gt; suggest using the &lt;strong&gt;typed metadata &lt;/strong&gt;paradigm.&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;(our series will focus on the best practice of type metadata)&lt;/font&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Which steps is needed for working with typed metadata?&lt;/h5&gt;  &lt;p&gt;the steps is needed is:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;define the metadata (&lt;strong&gt;attribute&lt;/strong&gt;) &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;decorate&lt;/strong&gt; the&lt;strong&gt; exported part&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;define the &lt;strong&gt;metadata view contract&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;add the &lt;strong&gt;metadata view contract&lt;/strong&gt; into the &lt;strong&gt;import signature&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;how to define typed metadata&lt;/h5&gt;  &lt;p&gt;defining &lt;strong&gt;metadata&lt;/strong&gt; is very simple, all its take is to define attribute which &lt;/p&gt;  &lt;p&gt;having public properties and is decorated with the &lt;strong&gt;[MetadataAttribute]&lt;/strong&gt;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:fffdf7e6-e7c0-4303-a599-273065e0ddf2" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;[&lt;span style="color:#2b91af;"&gt;MetadataAttribute&lt;/span&gt;]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;WeatherAttribute&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;Attribute&lt;/span&gt;&lt;/li&gt; &lt;li&gt;{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;WeatherConditions&lt;/span&gt; Conditions { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; MinWindLimit { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; MaxWindLimit { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;as you can see it is no different from any other .net attribute definition,&lt;/p&gt;  &lt;p&gt;except of the decoration of &lt;strong&gt;[MetadataAttribute] &lt;/strong&gt;in &lt;strong&gt;line 1&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Decorate the exported part&lt;/h5&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:dfd7bbfb-a57e-49e3-8f81-8d1650050966" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;[&lt;span style="color:#2b91af;"&gt;Export&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;PluginBase&lt;/span&gt;))]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;[&lt;span style="color:#2b91af;"&gt;WeatherAttribute&lt;/span&gt;(MinWindLimit=&lt;span style="color:#a52a2a;"&gt;0&lt;/span&gt;, MaxWindLimit=&lt;span style="color:#a52a2a;"&gt;15&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;Conditions = &lt;span style="color:#2b91af;"&gt;WeatherConditions&lt;/span&gt;.SnowyDays)]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Rollerblading&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;PluginBase&lt;/span&gt; {... }&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;as you can see in &lt;strong&gt;line 2&lt;/strong&gt; the exported part is decorated with some &lt;strong&gt;metadata&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 1&lt;/strong&gt; is decorating for the &lt;strong&gt;export&lt;/strong&gt; &lt;font color="#808080"&gt;(see the Improving the usability section for &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;learning how it can be more usable).&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Define the metadata view contract&lt;/h5&gt;  &lt;p&gt;&lt;strong&gt;metadata view&lt;/strong&gt; present the &lt;strong&gt;portion&lt;/strong&gt; of the &lt;strong&gt;metadata&lt;/strong&gt; that we want to &lt;strong&gt;interrogate&lt;/strong&gt;,&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;(this contract can be class of interface and it &lt;/font&gt;&lt;font color="#808080"&gt;can reflect all or part of the attribute public fields)&lt;/font&gt;.&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:5f5437c4-5e0f-4fcf-93d2-6cdd933d15dd" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;interface&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IWeatherMetadata&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#2b91af;"&gt;WeatherConditions&lt;/span&gt; Conditions { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; MinWindLimit { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; }&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; MaxWindLimit { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;font color="#808080"&gt;in the above case the metadata view contract is reflecting all of the public properties&lt;/font&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Import signature&lt;/h5&gt;  &lt;p&gt;the &lt;strong&gt;import&lt;/strong&gt; definition should use &lt;strong&gt;Lazy&lt;/strong&gt; type with&lt;strong&gt; 2 generics definitions&lt;/strong&gt;,&lt;/p&gt;  &lt;p&gt;the first definition for the &lt;strong&gt;plug-in contract,&lt;/strong&gt; and the second for the &lt;strong&gt;metadata view contract&lt;/strong&gt;.&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:7b739867-cd97-4977-a3b1-84ae160b17d8" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;[&lt;span style="color:#2b91af;"&gt;ImportMany&lt;/span&gt;]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Lazy&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;PluginBase&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;IWeatherMetadata&lt;/span&gt;&amp;gt;&amp;gt; AllPlugIns { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;as you can see in &lt;strong&gt;line 2&lt;/strong&gt;, &lt;strong&gt;MEF&lt;/strong&gt; will create enumerable of lazy plug-ins which having typed weather metadata.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Inquiring the metadata&lt;/h5&gt;  &lt;p&gt;having the above &lt;strong&gt;import&lt;/strong&gt; we may use &lt;strong&gt;Linq&lt;/strong&gt; query (or any other technique) to &lt;strong&gt;filter&lt;/strong&gt; the &lt;strong&gt;plug-in&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;portion&lt;/strong&gt; that suite our needs (without having to instantiate the unneeded plug-ins).&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:1ade4071-e58a-4797-aeb1-d58627dc60a6" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;PluginBase&lt;/span&gt;&amp;gt; SunnyActivities&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; plugins = &lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; lazyPlugin &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; AllPlugIns&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;let&lt;/span&gt; metadata = lazyPlugin.Metadata &lt;span style="color:#008000;"&gt;// typed metadata (IWeatherMetadata)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;where&lt;/span&gt; metadata.Conditions == &lt;span style="color:#2b91af;"&gt;WeatherConditions&lt;/span&gt;.Sunny&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; lazyPlugin.Value;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; plugins;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;the above sample is using the typed metadata to filter the sunny activities.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Behind the scenes&lt;/h5&gt;  &lt;p&gt;what is happening behind the scenes it that &lt;strong&gt;MEF&lt;/strong&gt; is using &lt;strong&gt;reflection emit&lt;/strong&gt; in order to construct &lt;/p&gt;  &lt;p&gt;the&lt;strong&gt; typed metadata view&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Improving the usability&lt;/h5&gt;  &lt;p&gt;we can &lt;strong&gt;improve&lt;/strong&gt; the &lt;strong&gt;usability&lt;/strong&gt; of the previous sample by &lt;strong&gt;inheriting&lt;/strong&gt; the &lt;strong&gt;ExportAttribute&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;(instead of Attribute), that way we can have &lt;strong&gt;single&lt;/strong&gt; simple &lt;strong&gt;decoration&lt;/strong&gt; for our &lt;strong&gt;export&lt;/strong&gt; part.&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:c6c61b4d-9076-4fbc-a1f4-83d100a1be4c" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;[&lt;span style="color:#2b91af;"&gt;MetadataAttribute&lt;/span&gt;]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;[&lt;span style="color:#2b91af;"&gt;AttributeUsage&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;AttributeTargets&lt;/span&gt;.Class)]&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;WeatherAttribute&lt;/span&gt;:&lt;span style="color:#2b91af;"&gt;ExportAttribute&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; WeatherAttribute(&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; minWindLimit, &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; maxWindLimit, &lt;span style="color:#2b91af;"&gt;WeatherConditions&lt;/span&gt; conditions) :&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;base&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;PluginBase&lt;/span&gt;))&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;Conditions = conditions;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;MaxWindLimit = maxWindLimit;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;MinWindLimit = minWindLimit;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;WeatherConditions&lt;/span&gt; Conditions { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; MinWindLimit { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; MaxWindLimit { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;the above attribute define both typed &lt;strong&gt;metadata&lt;/strong&gt; and &lt;strong&gt;export&lt;/strong&gt; for the PluginBase type.&lt;/p&gt;  &lt;p&gt;line 3: is inheriting the ExportAttribute.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the &lt;strong&gt;exported&lt;/strong&gt; type decoration can be define using &lt;strong&gt;single simple&lt;/strong&gt; attribute &lt;strong&gt;decoration&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:d1c2c7ac-3a00-410c-aedc-d137239dd662" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;[&lt;span style="color:#2b91af;"&gt;WeatherAttribute&lt;/span&gt;(&lt;span style="color:#a52a2a;"&gt;0&lt;/span&gt;, &lt;span style="color:#a52a2a;"&gt;15&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;WeatherConditions&lt;/span&gt;.SnowyDays)]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Rollerblading&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;PluginBase&lt;/span&gt; {...}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;font color="#808080"&gt;you are no longer having to use different attribute for &lt;strong&gt;export&lt;/strong&gt; and &lt;strong&gt;metadata&lt;/strong&gt;,&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;and as in this case the &lt;strong&gt;export&lt;/strong&gt; type definition is handled by the attribute, &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;which enhance the consumer &lt;strong&gt;usability&lt;/strong&gt; by having less area for errors&lt;/font&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Code sample&lt;/h5&gt;  &lt;p&gt;the code sample is demonstrating scenario were we want to present only plug-ins that suit&lt;/p&gt;  &lt;p&gt;the current weather &lt;font color="#808080"&gt;(the sample is using Google API for getting the NY weather)&lt;/font&gt;&lt;font color="#000000"&gt;.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;you can download the sample for &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/MEF/MEF%20for%20Beginners/Part%208/2010?uc=1&amp;amp;isFromRichUpload=1"&gt;VS 2010 from here&lt;/a&gt; and for &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/MEF/MEF%20for%20Beginners/Part%208/2008?uc=1&amp;amp;isFromRichUpload=1"&gt;VS 2008 from here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:259382eb-05c5-4c0f-8aee-e4e831a50059" class="wlWriterSmartContent"&gt;תגים של Technorati:‏ &lt;a href="http://technorati.com/tags/MEF" rel="tag"&gt;MEF&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Extensibility" rel="tag"&gt;Extensibility&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Importmany" rel="tag"&gt;Importmany&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Export" rel="tag"&gt;Export&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Import" rel="tag"&gt;Import&lt;/a&gt;,&lt;a href="http://technorati.com/tags/IoC" rel="tag"&gt;IoC&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SELA" rel="tag"&gt;SELA&lt;/a&gt;&lt;/div&gt;  &lt;br /&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f01%2f20%2fmef-for-beginner-metadata-part-8.aspx"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f01%2f20%2fmef-for-beginner-metadata-part-8.aspx" /&gt;&lt;/a&gt;&lt;div class="wlWriterHeaderFooter" style="margin:0px;padding:0px 0px 0px 0px;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;
&lt;/script&gt;
&lt;script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=503593" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/MEF/default.aspx">MEF</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Extensibility/default.aspx">Extensibility</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Beginner/default.aspx">Beginner</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx">SELA</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/CLR+4/default.aspx">CLR 4</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net/default.aspx">.net</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Composition/default.aspx">Composition</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/ImportMany/default.aspx">ImportMany</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Export/default.aspx">Export</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Import/default.aspx">Import</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Metadata/default.aspx">Metadata</category></item><item><title>MEF for Beginner: TOC</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/01/09/mef-for-beginner-toc.aspx</link><pubDate>Sat, 09 Jan 2010 16:26:22 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:491209</guid><dc:creator>bnaya</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;&lt;a href="http://mef.codeplex.com/" target="_blank"&gt;MEF&lt;/a&gt; for beginner is a blog series for developers that want to learn&lt;/p&gt;  &lt;p&gt;How To use the MEF (Manage Extensibility Framework) technology.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the following post is currently available for this series:&lt;/p&gt;  &lt;li&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2009/11/28/mef-for-beginner-concept-part-1.aspx"&gt;Concept&lt;/a&gt; &lt;/li&gt;  &lt;li&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2009/12/05/mef-for-beginner-part-2-vs-2010.aspx"&gt;How To build your first MEF application&lt;/a&gt; &lt;/li&gt;  &lt;li&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2009/12/19/mef-for-beginner-part-3-hello-silverlight.aspx"&gt;Hello Silverlight&lt;/a&gt; &lt;/li&gt;  &lt;li&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2009/12/26/mef-for-beginner-part-4-a-sync-silverlight-loading.aspx"&gt;A-sync Silverlight loading&lt;/a&gt; &lt;/li&gt;  &lt;li&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/01/02/mef-for-beginner-part-5-import.aspx"&gt;Import&lt;/a&gt;&amp;#160; &lt;/li&gt;  &lt;li&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/01/09/mef-for-beginner-part-creation-policy-part-6.aspx"&gt;Part Creation policy&lt;/a&gt; &lt;/li&gt;  &lt;li&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/01/15/mef-for-beginner-recomposition-policy-part-7.aspx"&gt;Recomposition policy&lt;/a&gt;&amp;#160; &lt;/li&gt;  &lt;li&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/01/20/mef-for-beginner-metadata-part-8.aspx"&gt;Metadata (part 1)&lt;/a&gt;&amp;#160; &lt;/li&gt;  &lt;li&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/01/29/mef-for-beginner-repeatable-metadata-part-9.aspx"&gt;Metadata (part 2 – repeatable)&lt;/a&gt; &lt;/li&gt;  &lt;li&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/02/13/mef-for-beginner-catalogs-part-10.aspx"&gt;Catalogs&lt;/a&gt;&amp;#160; &lt;/li&gt;  &lt;li&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/20/mef-for-beginner-import-from-xaml-part-11.aspx" target="_blank"&gt;Import from Xaml&lt;/a&gt;&amp;#160; &lt;/li&gt;  &lt;li&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/04/01/mef-for-beginner-deployment-catalog-part-12.aspx" target="_blank"&gt;Deployment Catalog&lt;/a&gt;&lt;/li&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;   &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:683be722-3d3a-4bc6-ba65-1fa172dc3eb6" class="wlWriterSmartContent"&gt;תגים של Technorati:‏ &lt;a href="http://technorati.com/tags/MEF" rel="tag"&gt;MEF&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Beginner" rel="tag"&gt;Beginner&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Composition" rel="tag"&gt;Composition&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Extensibility" rel="tag"&gt;Extensibility&lt;/a&gt;,&lt;a href="http://technorati.com/tags/IoC" rel="tag"&gt;IoC&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SELA" rel="tag"&gt;SELA&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Silverlight" rel="tag"&gt;Silverlight&lt;/a&gt;,&lt;a href="http://technorati.com/tags/WPF" rel="tag"&gt;WPF&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Plug-in" rel="tag"&gt;Plug-in&lt;/a&gt;&lt;/div&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;script type="text/javascript"&gt;
var gaJsHost = ((&amp;quot;https:&amp;quot; == document.location.protocol) ? &amp;quot;https://ssl.&amp;quot; : &amp;quot;http://www.&amp;quot;);
document.write(unescape(&amp;quot;%3Cscript src=&amp;#39;&amp;quot; + gaJsHost + &amp;quot;google-analytics.com/ga.js&amp;#39; type=&amp;#39;text/javascript&amp;#39;%3E%3C/script%3E&amp;quot;));
&lt;/script&gt;&lt;script type="text/javascript"&gt;
try {
var pageTracker = _gat._getTracker(&amp;quot;UA-8980498-2&amp;quot;);
pageTracker._trackPageview();
} catch(err) {}&lt;/script&gt;&lt;/p&gt;&lt;div class="wlWriterHeaderFooter" style="margin:0px;padding:0px 0px 0px 0px;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;
&lt;/script&gt;
&lt;script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=491209" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/MEF/default.aspx">MEF</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Extensibility/default.aspx">Extensibility</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Beginner/default.aspx">Beginner</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx">SELA</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/CLR+4/default.aspx">CLR 4</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/extension/default.aspx">extension</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net/default.aspx">.net</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Composition/default.aspx">Composition</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/ImportMany/default.aspx">ImportMany</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Export/default.aspx">Export</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Import/default.aspx">Import</category></item><item><title>MEF for Beginner – Part 3 (Hello Silverlight)</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2009/12/19/mef-for-beginner-part-3-hello-silverlight.aspx</link><pubDate>Sun, 20 Dec 2009 02:21:42 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:473247</guid><dc:creator>bnaya</dc:creator><slash:comments>1</slash:comments><description>&lt;h1&gt;MEF for Beginner – Part 3 (Hello Silverlight)&lt;/h1&gt;  &lt;p&gt;in this post we will cover the&lt;strong&gt; basic steps&lt;/strong&gt; that is needed for building your first &lt;strong&gt;Silverlight&lt;/strong&gt; &lt;a href="http://mef.codeplex.com/"&gt;&lt;strong&gt;MEF&lt;/strong&gt;&lt;/a&gt; application.&lt;/p&gt;  &lt;p&gt;you can find more about the &lt;strong&gt;MEF&lt;/strong&gt; on &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2009/11/28/mef-for-beginner-concept-part-1.aspx"&gt;part 1&lt;/a&gt;, &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2009/12/05/mef-for-beginner-part-2-vs-2010.aspx"&gt;part 2&lt;/a&gt; of this series, the series &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/01/09/mef-for-beginner-toc.aspx"&gt;TOC&lt;/a&gt; is available &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/01/09/mef-for-beginner-toc.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;the following instructions will lead you through very simple steps of building simple &lt;strong&gt;Silverlight shell application &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;that can consume &lt;strong&gt;plug-ins&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;this post is written on &lt;strong&gt;Visual Studio 2010&lt;/strong&gt; and &lt;strong&gt;Silverlight 4.0 (&lt;/strong&gt;using &lt;strong&gt;Visual studio 2008&lt;/strong&gt; and &lt;strong&gt;Silverlight 3&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;will need some minor modification and download the &lt;strong&gt;MEF&lt;/strong&gt; &lt;strong&gt;Silverlight 3&lt;/strong&gt; bits from the &lt;a href="http://mef.codeplex.com/"&gt;&lt;strong&gt;MEF&lt;/strong&gt;&lt;/a&gt; site).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;in the &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/self.aspx/Code%20Samples/MEF/MEF%20for%20Beginners/Part%204/A-sync%20Sliverlight%20plug-ins%20loading.zip"&gt;next post&lt;/a&gt;&lt;strong&gt;&lt;/strong&gt; on this series, we will extend the current post by learning how to consume &lt;strong&gt;external plug-ins&lt;/strong&gt; using &lt;strong&gt;a-sync loading&lt;/strong&gt; .&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the &lt;strong&gt;code sample&lt;/strong&gt; for this post can be &lt;strong&gt;download&lt;/strong&gt; from &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/self.aspx/Code%20Samples/MEF/MEF%20for%20Beginners/Part%203/SilverlightShell.zip"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Step 1: Creating Silverlight Application&lt;/h5&gt;  &lt;p&gt;Create solution using the Silverlight application template.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/image_7BFC4EA2.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="MEF, IoC, Silverlight 4, Extesibility" border="0" alt="MEF, IoC, Silverlight 4, Extesibility" src="http://blogs.microsoft.co.il/blogs/bnaya/image_thumb_31353B3B.png" width="576" height="326" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Step 2: Setting the Shell layout&lt;/h5&gt;  &lt;p&gt;the layout of the shell will have 2 area (plug-in command area and main area):&lt;/p&gt;  &lt;p&gt;the &lt;strong&gt;plug-ins commands&lt;/strong&gt; will host in &lt;strong&gt;StackPanel&lt;/strong&gt; control&lt;/p&gt;  &lt;p&gt;and the main content area will have a &lt;strong&gt;Border&lt;/strong&gt; and &lt;strong&gt;TextBlock&lt;/strong&gt; controls within a &lt;strong&gt;Canvas&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;add the following &lt;strong&gt;Xaml&lt;/strong&gt; into the &lt;strong&gt;Grid&lt;/strong&gt; element of the main page.&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:e204c639-32ec-4e19-a093-5933aa3fabf7" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Grid.ColumnDefinitions&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ColumnDefinition&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Width&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;150&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ColumnDefinition&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Width&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;308*&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Grid.ColumnDefinitions&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;StackPanel&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Orientation&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Vertical&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Grid.Column&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;0&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;StackPanel&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Canvas&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; x&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;_mainContentPlaceHolder&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Grid.Column&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;1&amp;quot; &amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Border&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; x&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;_mainBorder&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Width&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;250&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Height&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;100&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; BorderThickness&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; CornerRadius&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Margin&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;4&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;TextBlock&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; x&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;_mainText&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Text&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Some content&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Border&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Canvas&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Step 3: Binding the StackPanel to plug-ins list&lt;/h5&gt;  &lt;p&gt;add the &lt;strong&gt;ItemControl&lt;/strong&gt; element into the &lt;strong&gt;StackPanel&lt;/strong&gt; (see it&amp;#39;s binding definition)&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:490e7a7c-3b97-4008-947f-e45bbc3a9b48" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;StackPanel&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Orientation&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Vertical&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Grid.Column&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;0&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ItemsControl&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; ItemsSource&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Path&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=ToolbarItems}&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;StackPanel&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;add &lt;strong&gt;ObservableCollection&lt;/strong&gt; of UserControl property called &lt;strong&gt;ToolbarItems&lt;/strong&gt; into the Shell code behind     &lt;br /&gt;(the binding definition at the &lt;strong&gt;Xaml&lt;/strong&gt; level refer to this property)&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:32b9653e-628a-43dd-a5d0-1ec8fdbdff6f" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; ObservableCollection&amp;lt;&lt;span style="color:#2b91af;"&gt;UserControl&lt;/span&gt;&amp;gt; ToolbarItems { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;initialize the ToolbarItems property and the Context at the &lt;strong&gt;constructor,&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;(the following lines should be add to the constructor).&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:5a0a9700-4f58-4e29-ac72-cda9853e3113" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;ToolbarItems = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ObservableCollection&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;UserControl&lt;/span&gt;&amp;gt;();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;DataContext = &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Step 4: add reference to MEF&lt;/h5&gt;  &lt;p&gt;before adding the &lt;strong&gt;plug-able functionality&lt;/strong&gt;, we have to add &lt;strong&gt;reference&lt;/strong&gt; to &lt;strong&gt;MEF&lt;/strong&gt;. &lt;/p&gt;  &lt;p&gt;add new reference and browse for &lt;strong&gt;System.ComponentModel.Composition.dll&lt;/strong&gt; under the following folder:&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;64 bit: C:\Program Files (x86)\Microsoft SDKs\Silverlight\v4.0\Libraries\Client&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;32 bit: C:\Program Files\Microsoft SDKs\Silverlight\v4.0\Libraries\Client&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/image_6388E8ED.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="MEF, IoC, Silverlight 4, Extesibility" border="0" alt="MEF, IoC, Silverlight 4, Extesibility" src="http://blogs.microsoft.co.il/blogs/bnaya/image_thumb_7072A331.png" width="524" height="424" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Step 5: decorate the ToolbarItems property &lt;/h5&gt;  &lt;p&gt;decorating the ToolbarItems property with &lt;strong&gt;ImportMany&lt;/strong&gt; attribute, will shift the responsibility of&lt;/p&gt;  &lt;p&gt;filling it with &lt;strong&gt;UserControl&lt;/strong&gt; instances to &lt;strong&gt;MEF&lt;/strong&gt; (which is basically saying to &lt;strong&gt;MEF&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;that it should add any item that was &lt;strong&gt;Export&lt;/strong&gt; and match the &lt;strong&gt;contract &lt;/strong&gt;(in our case &lt;strong&gt;UserControl&lt;/strong&gt;).&lt;/p&gt;  &lt;p&gt;the ToolbarItems should now look like this:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:709de7fc-2e49-403e-a7b3-d9e4a31c94f9" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;[ImportMany]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; ObservableCollection&amp;lt;&lt;span style="color:#2b91af;"&gt;UserControl&lt;/span&gt;&amp;gt; ToolbarItems { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Step 6: expose the Element within the main area&lt;/h5&gt;  &lt;p&gt;the shell will expose the &lt;strong&gt;Border&lt;/strong&gt; and the &lt;strong&gt;TextBlock&lt;/strong&gt; within it &lt;strong&gt;main area&lt;/strong&gt; so it can be &lt;/p&gt;  &lt;p&gt;discoverable by the plug-ins.&lt;/p&gt;  &lt;p&gt;to achieve this task we will add 2 properties (at the code behind) and decorate it with &lt;strong&gt;Export&lt;/strong&gt; attribute.&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:7b440ff5-a742-4c17-a5b5-20ac46da0d53" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;[&lt;span style="color:#2b91af;"&gt;Export&lt;/span&gt;]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TextBlock&lt;/span&gt; MainText&lt;/li&gt; &lt;li&gt;{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; _mainText; }&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;[&lt;span style="color:#2b91af;"&gt;Export&lt;/span&gt;]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Border&lt;/span&gt; MainBorder&lt;/li&gt; &lt;li&gt;{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; _mainBorder; }&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Step 7: Create exportable entities (create plug-ins)&lt;/h5&gt;  &lt;p&gt;&lt;em&gt;&lt;font color="#808080"&gt;Note: on this post we will add the plug-ins within the same package as our Shell, &lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;font color="#808080"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; but in the next post in this series we will show how to discover exportable &lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;font color="#808080"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; parts within external packages.&lt;/font&gt;&lt;/em&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Create Parts folder in the project and add &lt;strong&gt;Silverlight User Control &lt;/strong&gt;(PlugableEffect1.xaml)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/image_42752AAC.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="MEF, IoC, Silverlight 4, Extesibility" border="0" alt="MEF, IoC, Silverlight 4, Extesibility" src="http://blogs.microsoft.co.il/blogs/bnaya/image_thumb_6E15CEDB.png" width="569" height="322" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h6&gt;Step 7.1: Stet the look and feel of the effect command&lt;/h6&gt;  &lt;p&gt;add the following Xaml into the Grid element (of the effect xaml)&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:fce7f548-0c28-48a0-8d0c-13b50a667d3f" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Button&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Command&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Binding}&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Width&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Auto&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Height&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Auto&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;TextBlock&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Text&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Effect 1&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Button&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h6&gt;Step 7.2: Add TextBlock property that present the TextBlock at the Shell main area&lt;/h6&gt;  &lt;p&gt;also this plug-in is capable of manipulate a &lt;strong&gt;TextBlock&lt;/strong&gt;, it shouldn&amp;#39;t be aware of &lt;/p&gt;  &lt;p&gt;the &lt;strong&gt;TextBlock&lt;/strong&gt; origin.&lt;/p&gt;  &lt;p&gt;to achieve the above requirements we will once again add decorated property, &lt;/p&gt;  &lt;p&gt;which will be assigned by &lt;strong&gt;MEF&lt;/strong&gt; at &lt;strong&gt;runtime&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;this time we expecting single value, therefore we will decorate the property with the &lt;strong&gt;Import&lt;/strong&gt; attribute &lt;/p&gt;  &lt;p&gt;rather the &lt;strong&gt;ImportMany&lt;/strong&gt; attribute.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;font color="#808080"&gt;Note: MEF will find the exported TextBlock which we expose at step 6 and assign it into the following property.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:8f2c5978-89dd-41ff-95c5-84fd272b3f7d" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;[&lt;span style="color:#2b91af;"&gt;Import&lt;/span&gt;]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TextBlock&lt;/span&gt; ShellText { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h6&gt;Step 7.3: Set the effect command&lt;/h6&gt;  &lt;p&gt;looking at the &lt;strong&gt;Xaml&lt;/strong&gt; of the &lt;strong&gt;button&lt;/strong&gt; we can see that it use the &lt;strong&gt;Command=&amp;quot;Binding&amp;quot;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;this mean that the button expect &lt;strong&gt;ICommand&lt;/strong&gt; implementation within it&amp;#39;s data context.&lt;/p&gt;  &lt;p&gt;at the code behind of this effect, add the following line to the constructor.&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:4dc1613b-6176-4ad2-9b6d-b51923cd4c43" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;DataContext = &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;and implement &lt;strong&gt;ICommand&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:653e0585-3ca5-45e4-93e5-6865c5b09446" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;partial&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;PlagableEffect1&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;UserControl&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;ICommand&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:8867b10e-ad9c-432c-8328-482d19cdcccc" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; CanExecute(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; parameter)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;event&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt; CanExecuteChanged;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Execute(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; parameter)&lt;/li&gt; &lt;li&gt;{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;ShellText.Text = &lt;span style="color:#a31515;"&gt;&amp;quot;Effect 1&amp;quot;&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;ShellText.FontSize = &lt;span style="color:#a52a2a;"&gt;32.0&lt;/span&gt;;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;ShellText.Foreground = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SolidColorBrush&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;Colors&lt;/span&gt;.Red);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;ShellText.FontFamily = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;FontFamily&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Comic Sans MS&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;h5&gt;&amp;#160;&lt;/h5&gt;  &lt;h6&gt;Step 7.4: Export our effect&lt;/h6&gt;  &lt;p&gt;making the effect visible to MEF done by decorating the class with &lt;strong&gt;Export&lt;/strong&gt; attribute.&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:5daa828a-50c0-4d29-a15a-db895a6f2e94" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;[&lt;span style="color:#2b91af;"&gt;Export&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;UserControl&lt;/span&gt;))]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;partial&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;PlugableEffect1&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;UserControl&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;ICommand&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Step 8: Create another exportable entities (create plug-ins)&lt;/h5&gt;  &lt;p&gt;repeat step 7 for Effect 2 (replace the Effect 1 text to Effect 2).&lt;/p&gt;  &lt;p&gt;then add another property decorated with Import for the shell &lt;strong&gt;Border&lt;/strong&gt; element.&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:a9e7a789-c714-4641-9536-c08b9e3394c8" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;[&lt;span style="color:#2b91af;"&gt;Import&lt;/span&gt;]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Border&lt;/span&gt; ShellBorder { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;replace the Execute method implementation of the Effect 2 command to the following: &lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:c2d66fca-72be-49bf-a08f-408b5afa5d90" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Execute(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; parameter)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;ShellText.Text = &lt;span style="color:#a31515;"&gt;&amp;quot;Effect 2&amp;quot;&lt;/span&gt;;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;ShellText.FontSize = &lt;span style="color:#a52a2a;"&gt;24.0&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;ShellText.Foreground = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SolidColorBrush&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;Color&lt;/span&gt;.FromArgb(&lt;span style="color:#a52a2a;"&gt;255&lt;/span&gt;, &lt;span style="color:#a52a2a;"&gt;33&lt;/span&gt;, &lt;span style="color:#a52a2a;"&gt;33&lt;/span&gt;, &lt;span style="color:#a52a2a;"&gt;33&lt;/span&gt;));&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;ShellText.FontFamily = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;FontFamily&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Comic Sans MS&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;ShellText.FontWeight = &lt;span style="color:#2b91af;"&gt;FontWeights&lt;/span&gt;.ExtraBold;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;ShellText.VerticalAlignment = System.Windows.&lt;span style="color:#2b91af;"&gt;VerticalAlignment&lt;/span&gt;.Center;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;ShellText.HorizontalAlignment = &lt;span style="color:#2b91af;"&gt;HorizontalAlignment&lt;/span&gt;.Center;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;ShellBorder.BorderThickness = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Thickness&lt;/span&gt;(&lt;span style="color:#a52a2a;"&gt;8&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;ShellBorder.BorderBrush = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SolidColorBrush&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;Colors&lt;/span&gt;.Gray);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;ShellBorder.CornerRadius = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CornerRadius&lt;/span&gt;(&lt;span style="color:#a52a2a;"&gt;10.0&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;ShellBorder.Background = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SolidColorBrush&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;Colors&lt;/span&gt;.Orange);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;ShellBorder.Width = &lt;span style="color:#a52a2a;"&gt;250&lt;/span&gt;;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; rt = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;RotateTransform&lt;/span&gt;();&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;rt.Angle = &lt;span style="color:#a52a2a;"&gt;45&lt;/span&gt;;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;rt.CenterX = &lt;span style="color:#a52a2a;"&gt;1.5&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;rt.CenterY = &lt;span style="color:#a52a2a;"&gt;30&lt;/span&gt;;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;ShellBorder.RenderTransform = rt;&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Step 9: Compose it all together &lt;/h5&gt;  &lt;p&gt;before we continue we have to add reference to &lt;strong&gt;System.ComponentModel.Composition.Packaging.Toolkit.dll&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;this dll is part of &lt;a href="http://silverlight.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=36060"&gt;the MEF Silverlight Toolkit&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://silverlight.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=36060"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/bnaya/image11_363364EB.png" width="324" height="257" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;after installing the toolkit you can find the &lt;strong&gt;System.ComponentModel.Composition.Packaging.Toolkit.dll&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;at C:\Program Files (x86)\Microsoft SDKs\Silverlight\v4.0\Toolkit\Nov09\Bin (for 64 bit)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;and at C:\Program Files\Microsoft SDKs\Silverlight\v4.0\Toolkit\Nov09\Bin (for 32 bit)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h6&gt;Step 9.1: Compose&lt;/h6&gt;  &lt;p&gt;the last step involve is asking &lt;strong&gt;MEF&lt;/strong&gt; to compose.&lt;/p&gt;  &lt;p&gt;we will supply &lt;strong&gt;MEF&lt;/strong&gt; with some basics instruction and ask it to assign all the &lt;strong&gt;Import&lt;/strong&gt; with&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Export &lt;/strong&gt;that matches the Import&amp;#39;s needs.&lt;/p&gt;  &lt;p&gt;Add the following method to the App.xaml code behind.&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:ac5fb2f5-c6de-4834-93b4-30436276d89c" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; InitializeContainer(&lt;span style="color:#2b91af;"&gt;UIElement&lt;/span&gt; mainWin)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; catalogs = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;PackageCatalog&lt;/span&gt;();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;catalogs.AddPackage(&lt;span style="color:#2b91af;"&gt;Package&lt;/span&gt;.Current);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; mainWinPart = &lt;span style="color:#2b91af;"&gt;AttributedModelServices&lt;/span&gt;.CreatePart(mainWin);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; batch = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CompositionBatch&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;[] { mainWinPart }, &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; container = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CompositionContainer&lt;/span&gt;(catalogs);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;container.Compose(batch);&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;the above code create a C&lt;strong&gt;atalog&lt;/strong&gt; (at lines 3,4) ,&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Catalog&lt;/strong&gt; used as &lt;strong&gt;instruction&lt;/strong&gt; for where to search for the &lt;strong&gt;compose-able parts&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;in this case we instruct &lt;strong&gt;MEF&lt;/strong&gt; to look for&lt;strong&gt; compose-able parts&lt;/strong&gt; within the &lt;strong&gt;current Silverlight package&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;at lines 5,6 we add the current instance of the Shell into &lt;strong&gt;CompositionBatch&lt;/strong&gt;, this will instruct the &lt;strong&gt;MEF container &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;to use this instance rather of creating new one.&lt;/p&gt;  &lt;p&gt;line 7, 8 add the &lt;strong&gt;Catalog&lt;/strong&gt; and the &lt;strong&gt;CompositionBatch &lt;/strong&gt;to a &lt;strong&gt;CompositionContainer&lt;/strong&gt; and perform the composition.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the last peace of code is calling the above method from the application startup.&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:00a19420-b68f-4643-804d-31f069da2850" class="wlWriterSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Application_Startup(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, &lt;span style="color:#2b91af;"&gt;StartupEventArgs&lt;/span&gt; e)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.RootVisual = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MainPage&lt;/span&gt;();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;InitializeContainer(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.RootVisual);&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Summary&lt;/h5&gt;  &lt;p&gt;this post had demonstrate how to build &lt;strong&gt;compose-able&lt;/strong&gt; shell using &lt;strong&gt;Silverlight 4.0.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;in the next post we will continue to enhance the sample by adding &lt;strong&gt;a-sync loading&lt;/strong&gt; capability &lt;/p&gt;  &lt;p&gt;to external &lt;strong&gt;Silverlight&lt;/strong&gt; packages that holding &lt;strong&gt;compose-able&lt;/strong&gt; parts (Plug-ins).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Downloads&lt;/h5&gt;  &lt;p&gt;the &lt;strong&gt;code sample&lt;/strong&gt; for this post can be &lt;strong&gt;download&lt;/strong&gt; from &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/self.aspx/Code%20Samples/MEF/MEF%20for%20Beginners/Part%203/SilverlightShell.zip"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;you will need &lt;strong&gt;Silverlight 4&lt;/strong&gt; and the &lt;strong&gt;Silverlight 4 toolkit&lt;/strong&gt;. You can download &lt;strong&gt;Silverlight 4&lt;/strong&gt; beta&amp;#160; &lt;a href="http://www.silverlight.net/getstarted/silverlight-4-beta"&gt;here&lt;/a&gt; and the &lt;strong&gt;toolkit&lt;/strong&gt; &lt;a href="http://silverlight.codeplex.com/"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Learn More&lt;/h5&gt;  &lt;p&gt;you can find more information on how to use &lt;strong&gt;MEF&lt;/strong&gt; over &lt;strong&gt;Silverlight&lt;/strong&gt; in the following posts (by &lt;strong&gt;Glenn Block&lt;/strong&gt;):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/glenn.block/archive/2009/11/30/building-the-hello-mef-dashboard-in-silverlight-4-part-i.aspx"&gt;Building the Hello MEF dashboard in Silverlight 4 - Part I&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/glenn.block/archive/2009/12/04/building-hello-mef-part-ii-metadata-and-why-being-lazy-is-a-good-thing.aspx"&gt;Building Hello MEF – Part II – Metadata and why being Lazy is a good thing.&lt;/a&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/glenn.block/archive/2009/12/15/building-hello-mef-part-iii-xap-partitioning-with-the-host-s-permission-and-the-sweetness-of-recomposition.aspx"&gt;Building Hello MEF – Part III – XAP Partitioning (with the host’s permission) and the sweetness of recomposition.&lt;/a&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;&lt;font color="#800000"&gt;&lt;strong&gt;Updates&lt;/strong&gt;&lt;/font&gt;&lt;/h5&gt;  &lt;p&gt;the &lt;strong&gt;MEF API&lt;/strong&gt; for &lt;strong&gt;Silverlight&lt;/strong&gt; Catalog has changed,&lt;/p&gt;  &lt;p&gt;instead using the &lt;strong&gt;PackageCatalog&lt;/strong&gt; you should now use the &lt;strong&gt;DeploymentCatalog&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;other changes were:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;PartIntializer&lt;/strong&gt; renamed to &lt;strong&gt;CompositionInitializer&lt;/strong&gt; (Silverlight only)&lt;/p&gt;  &lt;p&gt;and &lt;strong&gt;PartCreator&lt;/strong&gt; renamed to &lt;strong&gt;ExportFactory&amp;lt;T&amp;gt;&lt;/strong&gt; and moved to System.ComponentModel.Composition.Initialization assembly (Silverlight only)&lt;/p&gt;  &lt;p&gt;   &lt;p&gt;&lt;a href="http://www.sela.co.il/s/sdp/default.html"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/p&gt;&lt;div class="wlWriterHeaderFooter" style="margin:0px;padding:0px 0px 0px 0px;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;
&lt;/script&gt;
&lt;script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=473247" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/MEF/default.aspx">MEF</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Extensibility/default.aspx">Extensibility</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Beginner/default.aspx">Beginner</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx">SELA</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/CLR+4/default.aspx">CLR 4</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/extension/default.aspx">extension</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net/default.aspx">.net</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IoC/default.aspx">IoC</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/ImportMany/default.aspx">ImportMany</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Export/default.aspx">Export</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Import/default.aspx">Import</category></item><item><title>MEF Recomposition</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2009/11/05/mef-recomposition.aspx</link><pubDate>Fri, 06 Nov 2009 04:59:45 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:439538</guid><dc:creator>bnaya</dc:creator><slash:comments>6</slash:comments><description>&lt;p&gt;thinking about &lt;a href="http://mef.codeplex.com/" target="_blank"&gt;MEF&lt;/a&gt; as another &lt;a href="http://en.wikipedia.org/wiki/Inversion_of_control" target="_blank"&gt;IoC&lt;/a&gt; container led us into misconception.     &lt;br /&gt;MEF design goal was being a generic extensibility infrastructure,     &lt;br /&gt;its just happens that it overlap with the &lt;a href="http://en.wikipedia.org/wiki/Inversion_of_control" target="_blank"&gt;IoC&lt;/a&gt; world (and yes it has most of the &lt;a href="http://en.wikipedia.org/wiki/Inversion_of_control" target="_blank"&gt;IoC&lt;/a&gt; feature).&lt;/p&gt;  &lt;p&gt;this post address the challenge of building extensions over none CLR types (like image files)&lt;/p&gt;  &lt;p&gt;from the technical perspective it will discuss the following techniques:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Building &lt;a href="http://codebetter.com/blogs/glenn.block/archive/2008/12/25/using-exportprovider-to-customize-container-behavior-part-i.aspx" target="_blank"&gt;Export Providers&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Design recomposable extensions &lt;/li&gt;    &lt;li&gt;Creating &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.data.datasourceprovider.aspx" target="_blank"&gt;DataSourceProvider&lt;/a&gt; (which will used for WPF binding) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;the source code for this post can be found &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/self.aspx/Code%20Samples/MEF/Images%20Export%20Providers.zip" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Prerequisite&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;this is advance post which assume basic understanding of the &lt;a href="http://mef.codeplex.com/"&gt;MEF&lt;/a&gt; technology (for MEF introduction read &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2009/06/03/mef-introduction.aspx"&gt;this&lt;/a&gt; post).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Our Test Case&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;in order to demonstrate the above techniques I choose common scenario of building    &lt;br /&gt;very simple WPF application that display pictures which came from heterogeneous data source providers.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/image_61556385.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/bnaya/image_thumb_0AB8BD52.png" width="244" height="135" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;The Solution Modeling&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/image_4F5531C6.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/bnaya/image_thumb_62C245CD.png" width="558" height="384" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;ComponentModel.Initialization.dll&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;this components design by the MEF team as centric handle for the MEF container functionality&lt;/p&gt;  &lt;p&gt;(i did very minor changes to the CompositionHost class, basically exposing the underline container as Export Provider)&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;ImageExportProviders.dll&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;this is the heart of this post,.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://codebetter.com/blogs/glenn.block/archive/2008/12/25/using-exportprovider-to-customize-container-behavior-part-i.aspx" target="_blank"&gt;Export providers&lt;/a&gt; (not the catalog) is the underline MEF unit that responsible for the instantiation of the exported parts.&lt;/p&gt;  &lt;p&gt;the different providers implementations (local, Picasa, Fickr) has the knowledge of    &lt;br /&gt;how to instantiate the discovered photo files into CLR type that implement IPhotoInfo.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;MEFPhotoDataSourceProvider&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;this class is responsible for abstracting the WPF application from it actual photos sources.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;WpfImageViewerUI.exe&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;is the UI implementation&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Application flow &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;from this point i will start to explain the different techniques used in the application,    &lt;br /&gt;starting with the UI.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;UI (WpfImageViewerUI&amp;#160; project)&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;img align="middle" src="http://www.dotnetscraps.com/samples/bullets/C001.gif" alt="" /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;strong&gt;App.xaml&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;At the code behind level, it initial the Container with custom MEF &lt;strong&gt;Export Providers&lt;/strong&gt; &lt;/p&gt;    &lt;p&gt;and pass the container to the Composition Host (the composition host used as&lt;/p&gt;    &lt;p&gt;the default container, it is reachable from anywhere in the code) &lt;/p&gt;    &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:52ef84e8-4363-4d12-8493-77594891b33b" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; OnStartup(&lt;span style="color:#2b91af;"&gt;StartupEventArgs&lt;/span&gt; e)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;base&lt;/span&gt;.OnStartup(e);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; providers = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ExportProvider&lt;/span&gt;[] {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;LocalImageExportProvider&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Images&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;&amp;quot;*.jpg&amp;quot;&lt;/span&gt;),&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;PicasaImageExportProvider&lt;/span&gt;(URL_PICASA_GENERAL),&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;FlickrImageExportProvider&lt;/span&gt;(URL_FLICKR_PEOPLE)&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;};&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; container = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CompositionContainer&lt;/span&gt;(providers);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#2b91af;"&gt;CompositionHost&lt;/span&gt;.InitializeContainer(container);&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;    &lt;p&gt;At the &lt;strong&gt;Xaml&lt;/strong&gt; level we embed the &lt;strong&gt;Style.xaml&lt;/strong&gt;&lt;/p&gt;    &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:0f643538-575b-42f6-9107-f5966c596798" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Application.Resources&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ResourceDictionary&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ResourceDictionary.MergedDictionaries&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ResourceDictionary&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Source&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Style.xaml&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ResourceDictionary.MergedDictionaries&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ResourceDictionary&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Application.Resources&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;    &lt;p&gt;     &lt;br /&gt;&lt;img align="middle" src="http://www.dotnetscraps.com/samples/bullets/C001.gif" alt="" /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;strong&gt;Style.xaml&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;For better separation between the graphical designer and the developer, I&amp;#39;m using the style.xaml      &lt;br /&gt;as the designer own xaml (only the designer should touch this file, he can change styles and templates).&lt;/p&gt;    &lt;p&gt;     &lt;br /&gt;&lt;img align="middle" src="http://www.dotnetscraps.com/samples/bullets/C001.gif" alt="" /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;strong&gt;PictureShell.xaml&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;this is the developer own xaml, which the designer shouldn&amp;#39;t touch.&lt;/p&gt;    &lt;p&gt;it should contain the minimal xaml needed, from the functionality perspective &lt;/p&gt;    &lt;p&gt;(it should not have any beauty factor actually it should be really ugly without the style.xaml)&lt;/p&gt;    &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:2c5cc736-8a16-4fa5-90bd-982876097020" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Window&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; x&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Class&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Bnaya.Samples.PictureShell&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#ff0000;"&gt; xmlns&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#ff0000;"&gt; xmlns&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;x&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#ff0000;"&gt; xmlns&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;local&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;clr-namespace:Bnaya.Samples.Data...&amp;quot;&lt;/span&gt; &lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#ff0000;"&gt; Title&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;PictureShell&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Height&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;300&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Width&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;600&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Window.DataContext&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;local&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;MEFPhotoDataSourceProvider&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Window.DataContext&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ListBox&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; x&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;_lst&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; ItemsSource&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; IsAsync&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=True}&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Window&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;    &lt;p&gt;&amp;#160;&amp;#160; &lt;br /&gt;as you can see it kept short, clean and easy to understand.&lt;/p&gt;    &lt;p&gt;from the debugging perspective you can disembed the style.xaml and check whether the      &lt;br /&gt;bug came from the functionality or the design.&lt;/p&gt;    &lt;p&gt;this xaml contain:&lt;/p&gt;    &lt;blockquote&gt;     &lt;p&gt;&lt;img align="middle" src="http://www.dotnetscraps.com/samples/bullets/004.gif" alt="" /&gt;&amp;#160;&amp;#160;&amp;#160; ListBox declaration         &lt;br /&gt;&lt;img align="middle" src="http://www.dotnetscraps.com/samples/bullets/004.gif" alt="" /&gt;&amp;#160;&amp;#160;&amp;#160; MEFPhotoDataSourceProvider (which is the binding source of the list&amp;#39;s ItemSource)&lt;/p&gt;      &lt;p&gt;&amp;#160;&lt;/p&gt;   &lt;/blockquote&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;UI.Components &lt;/strong&gt;(define the MEFPhotoDataSourceProvider class)&lt;/p&gt;  &lt;p&gt;as we mention earlier we using data source provider to abstract the actual origin of the data.&lt;/p&gt;  &lt;p&gt;the xaml won&amp;#39;t have to be changed whenever adding or removing data sources.&lt;/p&gt;  &lt;p&gt;another benefit is the ability of &lt;strong&gt;a-sync loading&lt;/strong&gt; (data source that expose hundreds of photos cannot expose synchronously)&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:470909e8-69e0-4663-bc2f-746900c11143" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;max-height:500px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MEFPhotoDataSourceProvider&lt;/span&gt; : DataSourceProvider&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; ObservableCollection&amp;lt;IPhotoInfo&amp;gt; _photos =&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ObservableCollection&amp;lt;IPhotoInfo&amp;gt;();&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; MEFPhotoDataSourceProvider()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#008000;"&gt;// register for MEF ewcomposable discovery&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;CompositionHost.Host.ExportsChanged += OnPhotosChangedHandler; &lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; BeginQuery()&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#008000;"&gt;// a-sync initialization&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;ThreadPool.QueueUserWorkItem(Init);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;[ImportMany(&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(IPhotoInfo), AllowRecomposition = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;)]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; IEnumerable&amp;lt;Lazy&amp;lt;IPhotoInfo&amp;gt;&amp;gt; PhotosInternal { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Init(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; state)&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;PartInitializer.SatisfyImports(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;); &lt;span style="color:#008000;"&gt;// load the picture through MEF&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;PhotosInternal.ForEach(lazy =&amp;gt; _photos.Add(lazy.Value)); &lt;span style="color:#008000;"&gt;// add &lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;base&lt;/span&gt;.OnQueryFinished(_photos);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; OnPhotosChangedHandler(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender,ExportsChangeEventArgs e)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; expDef &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; e.AddedExports) {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (expDef.Metadata.ContainsKey(&lt;span style="color:#a31515;"&gt;&amp;quot;Export&amp;quot;&lt;/span&gt;)) {&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;Invoke(() =&amp;gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;Export exp = expDef.Metadata[&lt;span style="color:#a31515;"&gt;&amp;quot;Export&amp;quot;&lt;/span&gt;] &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; Export;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;_photos.Add(exp.Value &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; IPhotoInfo);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;});&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;     &lt;br /&gt;&lt;img align="middle" src="http://www.dotnetscraps.com/samples/bullets/022.gif" alt="" /&gt;&amp;#160;&amp;#160;&amp;#160; at line 15, you can see that we using the &lt;strong&gt;ImportMany&lt;/strong&gt; decoration with &lt;strong&gt;AllowRecomposition = true&lt;/strong&gt;&amp;#160; &lt;br /&gt;this is the key of the a-sync capabilities (lazy loading).       &lt;br /&gt;you can download the source code from &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/self.aspx/Code%20Samples/MEF/Images%20Export%20Providers.zip" target="_blank"&gt;here&lt;/a&gt; and run the application with and without &lt;strong&gt;AllowRecomposition&amp;#160; &lt;br /&gt;&lt;/strong&gt;in order to see its effect.&lt;/p&gt;    &lt;p&gt;&lt;img align="middle" src="http://www.dotnetscraps.com/samples/bullets/022.gif" alt="" /&gt;&amp;#160;&amp;#160;&amp;#160; at line 20, &lt;strong&gt;PartInitializer.SatisfyImports(this)&lt;/strong&gt; is actually asking the default MEF container (which we define at the app.xaml)       &lt;br /&gt;for the discovered export parts that match the import.&lt;/p&gt;    &lt;p&gt;&lt;img align="middle" src="http://www.dotnetscraps.com/samples/bullets/022.gif" alt="" /&gt;&amp;#160;&amp;#160;&amp;#160; at line 22, we introduce the base class with our data source collection.&lt;/p&gt;    &lt;p&gt;&lt;img align="middle" src="http://www.dotnetscraps.com/samples/bullets/022.gif" alt="" /&gt;&amp;#160;&amp;#160;&amp;#160; at the constructor level line 7, &lt;strong&gt;CompositionHost.Host.ExportsChanged += OnPhotosChangedHandler &lt;/strong&gt;we register to the       &lt;br /&gt;default&amp;#160; MEF container changed event (again the a-sync lazy loading)&lt;/p&gt;    &lt;p&gt;&lt;img align="middle" src="http://www.dotnetscraps.com/samples/bullets/022.gif" alt="" /&gt;&amp;#160;&amp;#160;&amp;#160; at the &lt;strong&gt;OnPhotosChangedHandler&lt;/strong&gt;, line 25, we adding any new composed instances into the bind-able collection.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Finally we got into the heart of extensibility model, the Export Providers&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;we use custom Export Provider for discovering none CLR entities (in our case photo files) and introduce it to the CLR world    &lt;br /&gt;via the MEF infrastructure as instances that implement IPhotoInfo.&lt;/p&gt;  &lt;p&gt;the &lt;strong&gt;ImageExportProviders&lt;/strong&gt; project contain 4 files (one base class and 3 providers)&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;img align="middle" src="http://www.dotnetscraps.com/samples/bullets/C001.gif" alt="" /&gt;&amp;#160;&amp;#160;&amp;#160; ImageExportProviderBase is the provider base class       &lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:412472f8-2c6c-44ab-b95e-932d0e40548f" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;max-height:500px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;abstract&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ImageExportProviderBase&lt;/span&gt; : ExportProvider&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;readonly&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; CONTRACT_NAME = &lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(IPhotoInfo).FullName;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;readonly&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; _path;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; ImageExportProviderBase(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; path) {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;_path = path;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;Export&amp;gt; GetExportsCore(&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;ImportDefinition definition, AtomicComposition atomicComposition)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;Export&amp;gt; exports = &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (definition.IsRecomposable) &lt;span style="color:#008000;"&gt;// Async&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#2b91af;"&gt;ThreadPool&lt;/span&gt;.QueueUserWorkItem(LoadPhotos, definition); &lt;span style="color:#008000;"&gt;// we will use recomposition &lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;exports = OnLoadPhotos(definition);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; exports;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;abstract&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;Export&amp;gt; OnLoadPhotos(ImportDefinition definition);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; LoadPhotos(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; state) {&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;OnLoadPhotos(state &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; ImportDefinition);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; IntroduceNewExport(Export e) {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; metadata = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;&amp;gt;();&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;metadata.Add(&lt;span style="color:#a31515;"&gt;&amp;quot;Export&amp;quot;&lt;/span&gt;, e);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; expDef = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ExportDefinition(CONTRACT_NAME, metadata);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; atomic = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; AtomicComposition())&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;{&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; argsChanging = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ExportsChangeEventArgs(&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ExportDefinition[] { expDef }, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ExportDefinition[0], atomic);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;atomic.AddCompleteAction(() =&amp;gt; { });&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;base&lt;/span&gt;.OnExportsChanging(argsChanging);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;atomic.Complete();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; argsChanged = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ExportsChangeEventArgs(&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ExportDefinition[] { expDef }, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ExportDefinition[0], &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;base&lt;/span&gt;.OnExportsChanged(argsChanged);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;The &lt;strong&gt;GetExportsCore &lt;/strong&gt;is what we have to override when creating custom Export Provider.       &lt;br /&gt;you can see at line 12, that we check whether the import definition is recomposable and act accordingly.&lt;/p&gt;    &lt;p&gt;in case of recomposable the &lt;strong&gt;IntroduceNewExport &lt;/strong&gt;method is where we notify about the new available exports.&lt;/p&gt;    &lt;p&gt;the 3 derived class is just a parser for specific source type.&lt;/p&gt;    &lt;p&gt;     &lt;br /&gt;&lt;img align="middle" src="http://www.dotnetscraps.com/samples/bullets/C001.gif" alt="" /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;strong&gt;LocalImageExportProvider&lt;/strong&gt; discover and parse file on the&lt;strong&gt; local file system&lt;/strong&gt;.&lt;/p&gt;    &lt;p&gt;&lt;img align="middle" src="http://www.dotnetscraps.com/samples/bullets/C001.gif" alt="" /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;strong&gt;FlickrImageExportProvider&lt;/strong&gt; discover and parse file from the &lt;strong&gt;Flickr&lt;/strong&gt; web site.&lt;/p&gt;    &lt;p&gt;Flickr API does not support thumbnails, which results that pictures discovered on Flickr will appear with delay.&lt;/p&gt;    &lt;p&gt;&lt;img align="middle" src="http://www.dotnetscraps.com/samples/bullets/C001.gif" alt="" /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;strong&gt;PicasaImageExportProvider&lt;/strong&gt; discover and parse file from the &lt;strong&gt;Picasa&lt;/strong&gt; web site.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;the MEF ability to compose beyond the CLR world is one of its underline extensibility design that    &lt;br /&gt;differentiate MEF from typical IoC containers.&lt;/p&gt;  &lt;p&gt;and we can use MEF to abstract our data sources achieving a-sync and loosely coupled advantage. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the source code for this post can be found &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/self.aspx/Code%20Samples/MEF/Images%20Export%20Providers.zip" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=439538" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/MEF/default.aspx">MEF</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/WPF/default.aspx">WPF</category></item><item><title>Who own that XAML?</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2009/09/05/who-own-that-xaml.aspx</link><pubDate>Sat, 05 Sep 2009 22:27:20 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:397302</guid><dc:creator>bnaya</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;This post is about WPF / Silverlight separation of concern and on the continues question &lt;strong&gt;Who own that XAML?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Before we begin here is my &lt;strong&gt;proper disclosure&lt;/strong&gt;:    &lt;br /&gt;I&amp;#39;m not an expert in WPF nor in Silverlight&amp;#160; though take this post as a thought sharing and i would like to get your comments on that subject.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Background&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The all subject emerge while i was listening to &lt;a href="http://herdingcode.com/?p=208" target="_blank"&gt;Herding Code&lt;/a&gt; podcast about MVVM.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;So i was asking myself&lt;/strong&gt;, how would i assemble UI team and have them working with great productivity and without ruin each other work?&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;The problem&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The main failure point that everybody going around is that XAML thing, but some time it seem that the questions people asking isn’t the right one.&lt;/p&gt;  &lt;p&gt;I’m thinking that the main question should be    &lt;br /&gt;&lt;strong&gt;who own the XAML?&lt;/strong&gt; rather then    &lt;br /&gt;&lt;strong&gt;who’s touching the it and when?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;I will go farther and argue that we should separate the XAML into 2 separate XAMLs.&lt;/p&gt;  &lt;p&gt;1. Developer XAML&lt;/p&gt;  &lt;p&gt;2. Designer XAML&lt;/p&gt;  &lt;p&gt;each of the XAML has very clear ownership and very clear goal.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;The developer XAML&lt;/strong&gt; should be limit to hold sheer functionality without any beauty factor (target for the minimal view developer need in order to get it functioning).    &lt;br /&gt;Events wiring actions (not animation) will fall under the developer responsibility, MVVM command is even better.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;The Designer XAML&lt;/strong&gt; should target the followings:    &lt;br /&gt;- Styling     &lt;br /&gt;- Animation    &lt;br /&gt;- Enriched data templates&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Binding the beauty factor&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Farther thinking of switching between the developer view and the designer view, i come to the following idea.   &lt;br /&gt;I believe that the code behind should have properties which the data templates and styling should be bind to.     &lt;br /&gt;This properties can be initialize form configuration and this way (for testing purpose) we can switch to the developer view to see whether our problem cause by the design or functionality fault.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;I believe that following that pattern we will end up with mach clearer separation of concern and higher productivity and maintainability.&lt;/p&gt;  &lt;p&gt;I know that there is lot more aspects that i didn’t touch in this post (like unit testing and other) and i encourage you to leave comment expressing your thought on this subject.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=397302" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Silverlight/default.aspx">Silverlight</category></item></channel></rss>