<?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 : IoC</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/IoC/default.aspx</link><description>Tags: IoC</description><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><item><title>MEF for Beginner (Deployment Catalog) - part 12</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/04/01/mef-for-beginner-deployment-catalog-part-12.aspx</link><pubDate>Fri, 02 Apr 2010 01:20:55 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:572185</guid><dc:creator>bnaya</dc:creator><slash:comments>0</slash:comments><description>&lt;h2&gt;MEF for Beginner (Deployment Catalog) - part 12&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="deployment catalog,MEF,Import,Importmany,export,compose,composition" border="0" alt="deployment catalog,MEF,Import,Importmany,export,compose,composition" align="left" src="http://blogs.microsoft.co.il/blogs/bnaya/deploymentcatalog_2D5B1AB5.jpg" width="131" height="156" /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;this is the 12th 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; Deployment Catalog&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the code sample for this post can be found &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/MEF/MEF%20for%20Beginners/Part%2012?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;&amp;#160;&lt;/h5&gt;  &lt;h5&gt;What is MEF Deployment Catalogs?&lt;/h5&gt;  &lt;p&gt;the &lt;strong&gt;deployment catalog&lt;/strong&gt; is actually a redesign of the older&lt;strong&gt; package catalog&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;it enable to &lt;strong&gt;load parts&lt;/strong&gt; from &lt;strong&gt;xap&lt;/strong&gt; packages a-synchronically.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Code sample&lt;/h5&gt;  &lt;p&gt;the following code sample depend on 2 assembly that should be added to the project:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;System.ComponentModel.Composition &lt;/li&gt;    &lt;li&gt;System.ComponentModel.Composition.Initialization &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;at the startup (&lt;strong&gt;app.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:1445eb1a-5ba2-480c-82bd-bd8ae0324ac5" 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;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;InitializeContainer();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&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&gt;}&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&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;/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;AggregateCatalog&lt;/span&gt;();&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; catalog = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TypeCatalog&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;PlugIns&lt;/span&gt;));&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;catalogs.Catalogs.Add(catalog);&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:#008000;"&gt;// Create deployment catalog&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; deployCatalog = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DeploymentCatalog&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;PlugIns.xap&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;deployCatalog.DownloadCompleted += OnDownloadCompletedHandler;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;deployCatalog.DownloadProgressChanged += OnDownloadProgressChangedHandler;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;deployCatalog.DownloadAsync();&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;catalogs.Catalogs.Add(deployCatalog);&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:#008000;"&gt;// initialize the main application composition host (container)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#2b91af;"&gt;CompositionHost&lt;/span&gt;.Initialize(catalogs);&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 3&lt;/strong&gt;, &lt;strong&gt;initialize&lt;/strong&gt; &lt;strong&gt;MEF&lt;/strong&gt; before the creation of any windows that depend on MEF.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 9&lt;/strong&gt;, define &lt;strong&gt;aggregate catalog&lt;/strong&gt; (this is basically a catalog collection). &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;lines 11-12&lt;/strong&gt;, create &lt;strong&gt;type catalog&lt;/strong&gt; for plug-ins within the &lt;strong&gt;main&lt;/strong&gt; &lt;strong&gt;xap&lt;/strong&gt; (plug-in within the main xap&lt;/p&gt;  &lt;p&gt;can be assess directly) and add the catalog to the &lt;strong&gt;aggregate catalog&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 15&lt;/strong&gt;, create &lt;strong&gt;deployment catalog&lt;/strong&gt; (it get the xap relative path as parameter).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;lines 16-17&lt;/strong&gt;, register for &lt;strong&gt;xap&lt;/strong&gt; &lt;strong&gt;download process&lt;/strong&gt; events (&lt;strong&gt;optional&lt;/strong&gt;).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 18&lt;/strong&gt;, start &lt;strong&gt;downloading&lt;/strong&gt; the xap.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 20&lt;/strong&gt;, add the &lt;strong&gt;deployment catalog&lt;/strong&gt; to the &lt;strong&gt;aggregate catalog&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 23&lt;/strong&gt;, &lt;strong&gt;initialize&lt;/strong&gt; the &lt;strong&gt;composition host&lt;/strong&gt; with the &lt;strong&gt;aggregate catalog&lt;/strong&gt; (so &lt;/p&gt;  &lt;p&gt;latter using &lt;strong&gt;CompositionInitializer.SatisfyImports&lt;/strong&gt; will operate against the &lt;strong&gt;aggregate catalog&lt;/strong&gt;).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;at the &lt;strong&gt;MainPage.xaml&lt;/strong&gt; the code 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:ac24aa17-da47-4416-b1c8-eca20f21e845" 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;MainPage&lt;/span&gt;:&lt;span style="color:#2b91af;"&gt;UserControl&lt;/span&gt;,&lt;span style="color:#2b91af;"&gt;INotifyPropertyChanged&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; MainPage()&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;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.DataContext = &lt;span style="color:#0000ff;"&gt;this&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:#2b91af;"&gt;CompositionInitializer&lt;/span&gt;.SatisfyImports(&lt;span style="color:#0000ff;"&gt;this&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;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:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt; _plugIns;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;[&lt;span style="color:#2b91af;"&gt;ImportMany&lt;/span&gt;(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;public&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; PlugIns&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;get&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;/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;return&lt;/span&gt; _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;&lt;span style="color:#0000ff;"&gt;set&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;/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;_plugIns = &lt;span style="color:#0000ff;"&gt;value&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:#0000ff;"&gt;if&lt;/span&gt;(PropertyChanged != &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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;PropertyChanged(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;,&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;PropertyChangedEventArgs&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;PlugIns&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;/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;event&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;PropertyChangedEventHandler&lt;/span&gt; PropertyChanged;&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;strong&gt;line 7&lt;/strong&gt;, asking &lt;strong&gt;MEF&lt;/strong&gt; to &lt;strong&gt;satisfy&lt;/strong&gt; any &lt;strong&gt;import&lt;/strong&gt; of the current instance (in our case the PlugIns property).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;lines 11&lt;/strong&gt;, decorate the &lt;strong&gt;PlugIns&lt;/strong&gt; property for being assigned by the &lt;strong&gt;MEF&lt;/strong&gt; composition.&lt;/p&gt;  &lt;p&gt;notice that the decoration define &lt;strong&gt;AllowRecomposition = true, &lt;/strong&gt;this is very important&lt;/p&gt;  &lt;p&gt;because the &lt;strong&gt;deployment catalog&lt;/strong&gt; is &lt;strong&gt;a-synchronic,&lt;/strong&gt; therefore we do not control the exact time of the assignment.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Summary&lt;/h5&gt;  &lt;p&gt;&lt;strong&gt;deployment catalog&lt;/strong&gt; is the current way for &lt;strong&gt;delay composition&lt;/strong&gt; from &lt;strong&gt;xap&lt;/strong&gt; packages.&lt;/p&gt;  &lt;p&gt;it is a-synchronic and it will notify the catalog upon the download completion.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;the code sample for this post can be found &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/MEF/MEF%20for%20Beginners/Part%2012?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;Learn more&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a title="http://codebetter.com/blogs/glenn.block/archive/2010/03/07/building-hello-mef-part-iv-deploymentcatalog.aspx" href="http://codebetter.com/blogs/glenn.block/archive/2010/03/07/building-hello-mef-part-iv-deploymentcatalog.aspx"&gt;http://codebetter.com/blogs/glenn.block/archive/2010/03/07/building-hello-mef-part-iv-deploymentcatalog.aspx&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a title="http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2010/02/24/mef-silverlight-and-the-deploymentcatalog.aspx" href="http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2010/02/24/mef-silverlight-and-the-deploymentcatalog.aspx"&gt;http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2010/02/24/mef-silverlight-and-the-deploymentcatalog.aspx&lt;/a&gt; &lt;/li&gt; &lt;/ul&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%2f04%2f01%2fmef-for-beginner-deployment-catalog-part-12.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%2f04%2f01%2fmef-for-beginner-deployment-catalog-part-12.aspx" /&gt;&lt;/a&gt; &lt;a href="http://dotnetshoutout.com/MEF-for-Beginner-Deployment-Catalog-part-12-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%2F04%2F01%2Fmef-for-beginner-deployment-catalog-part-12.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=572185" 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/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></item><item><title>MEF Preview 9 released</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/02/26/mef-preview-9-released.aspx</link><pubDate>Fri, 26 Feb 2010 14:51:14 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:528987</guid><dc:creator>bnaya</dc:creator><slash:comments>0</slash:comments><description>&lt;h2&gt;MEF Preview 9 was released&lt;/h2&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://mef.codeplex.com/" target="_blank"&gt;&lt;strong&gt;MEF&lt;/strong&gt;&lt;/a&gt;&amp;#160;&lt;strong&gt;preview 9 &lt;/strong&gt;changes will be reflected the in the release of&lt;strong&gt; .NET 4.0&lt;/strong&gt; and &lt;strong&gt;Silverlight 4.0&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;except from bug fixing, there was some changes to the &lt;strong&gt;API&lt;/strong&gt;,&lt;/p&gt;  &lt;p&gt;most of the changes is related to&amp;#160; &lt;strong&gt;System.ComponentModel.Composition.Initilization.dll&lt;/strong&gt;, &lt;/p&gt;  &lt;p&gt;which is not yet available only for none Silverlight application :-(&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;here is a short list of API changes:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;p&gt;&lt;strong&gt;PackageCatalog&lt;/strong&gt; were brought back, and changed it name to &lt;strong&gt;DeploymentCatalog&lt;/strong&gt;. &lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;&lt;strong&gt;PartCreator&lt;/strong&gt; was renamed to &lt;strong&gt;ExportFactory&lt;/strong&gt;.&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;&lt;strong&gt;PartInitializer&lt;/strong&gt; was renamed to &lt;strong&gt;CompositionInitializer&lt;/strong&gt;&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;&lt;strong&gt;CompositionHost.InitializeContainer&lt;/strong&gt; was renamed to &lt;strong&gt;CompositionHost.Initialize&lt;/strong&gt;&lt;/p&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;i do hope that the &lt;strong&gt;System.ComponentModel.Composition.Initilization.dll&lt;/strong&gt; will finally find it place &lt;/p&gt;  &lt;p&gt;into the CLR 4.0 release.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;you can &lt;a href="http://mef.codeplex.com/" target="_blank"&gt;download&lt;/a&gt; it from the &lt;a href="http://mef.codeplex.com/" target="_blank"&gt;MEF codeplex&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the information was taken from &lt;a href="http://weblogs.asp.net/whaggard/default.aspx"&gt;Wes&amp;#39; Puzzling Blog&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;UPDATES:&lt;/h5&gt;  &lt;p&gt;From: &lt;a href="http://www.codeplex.com/site/users/view/gblock" target="_blank"&gt;Glenn block&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Unfortunately we will not be shipping CompositionInitializer / Host as part of .NET 4.0. .NET 4.0 and SL are on different ship cycles and the desktop locked long before we had the functionality in SL. We will do an OOB release on codeplex for desktop. I currently have an early version on my &lt;a href="http://cid-f8b2fd72406fb218.skydrive.live.com/self.aspx/blog/Composition.Initialization.Desktop.zip" target="_blank"&gt;SkyDrive&lt;/a&gt;, but we will get bits updated for codeplex. The plan is to role CI into the desktop in the future.&lt;/p&gt;  &lt;p&gt;&amp;#160;&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:7f2eeeff-b7d8-4c2a-91cc-c0522077bd47" 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/Composition" rel="tag"&gt;Composition&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/InportMany" rel="tag"&gt;InportMany&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/Extension" rel="tag"&gt;Extension&lt;/a&gt;&lt;/div&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=528987" 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/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/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/Import/default.aspx">Import</category></item><item><title>Catalogs (code cartoon)</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/02/15/catalogs-code-cartoon.aspx</link><pubDate>Tue, 16 Feb 2010 03:39:52 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:519353</guid><dc:creator>bnaya</dc:creator><slash:comments>0</slash:comments><description>&lt;h2&gt;Catalogs (code cartoon)&lt;/h2&gt;  &lt;p&gt;&lt;strong&gt;catalog&lt;/strong&gt; are &lt;strong&gt;search boundary&lt;/strong&gt; for the &lt;strong&gt;composition container&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/image_4751444A.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, Catalog, export, import,extensibility, ioc" border="0" alt="MEF, Catalog, export, import,extensibility, ioc" src="http://blogs.microsoft.co.il/blogs/bnaya/image_thumb_7A6D3219.png" width="496" height="366" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/image_23187196.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, Catalog, export, import,extensibility, ioc, composition" border="0" alt="MEF, Catalog, export, import,extensibility, ioc, composition" src="http://blogs.microsoft.co.il/blogs/bnaya/image_thumb_4674CA61.png" width="497" height="381" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;you can read more about &lt;a href="http://mef.codeplex.com/" target="_blank"&gt;MEF&lt;/a&gt; on MEF for beginner series, the &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;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:9b3578eb-679c-4b5e-a3b5-3441a8e01606" class="wlWriterSmartContent"&gt;תגים של Technorati:‏ &lt;a href="http://technorati.com/tags/Extensibility" rel="tag"&gt;Extensibility&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/catalogs" rel="tag"&gt;catalogs&lt;/a&gt;&lt;/div&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=519353" 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/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/expert/default.aspx">expert</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/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/Export/default.aspx">Export</category></item><item><title>MEF for Beginner (Catalogs) - part 10</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/02/13/mef-for-beginner-catalogs-part-10.aspx</link><pubDate>Sat, 13 Feb 2010 21:10:42 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:517731</guid><dc:creator>bnaya</dc:creator><slash:comments>1</slash:comments><description>&lt;h2&gt;MEF for Beginner (Catalogs) - part 10&lt;/h2&gt;  &lt;p&gt;this is the 10th 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;Catalogs&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/catalogSearch_64A5A158.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="MEF, export, import, importmany, extention, ioc, catalogs, composition" border="0" alt="MEF, export, import, importmany, extention, ioc, catalogs, composition" src="http://blogs.microsoft.co.il/blogs/bnaya/catalogSearch_thumb_61ECBFDA.jpg" width="240" height="180" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h5&gt;What is MEF Catalogs?&lt;/h5&gt;  &lt;p&gt;&lt;strong&gt;MEF container&lt;/strong&gt; is using &lt;strong&gt;catalogs&lt;/strong&gt; as its search area definition.&lt;/p&gt;  &lt;p&gt;the &lt;strong&gt;catalog&lt;/strong&gt; have instructions about where can &lt;strong&gt;MEF&lt;/strong&gt; look for&lt;/p&gt;  &lt;p&gt;the compose-able &lt;strong&gt;parts (&lt;/strong&gt;&lt;font color="#404040"&gt;&lt;strong&gt;import&lt;/strong&gt; and &lt;strong&gt;export &lt;/strong&gt;definitions&lt;/font&gt;). &lt;/p&gt;  &lt;p&gt;in short &lt;strong&gt;catalogs&lt;/strong&gt; are actually a &lt;strong&gt;discovery instruction&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Out of the box catalogs&lt;/h5&gt;  &lt;p&gt;&lt;strong&gt;MEF&lt;/strong&gt; is shipping with the following out of the box &lt;strong&gt;catalogs&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:df77e717-a196-4456-8343-b90e4dbf0cec" 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;var&lt;/span&gt; typeCat = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TypeCatalog&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;IFoo&lt;/span&gt;));&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; asmCat = &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;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; dirCat = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DirectoryCatalog&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;US&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;&amp;quot;*.dll&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; aggCat = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;AggregateCatalog&lt;/span&gt;(typeCat, asmCat, dirCat);&lt;/li&gt; &lt;li&gt;&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;(aggCat);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;container.Compose(...);&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;TypeCatalog&lt;/strong&gt; (&lt;strong&gt;line 1&lt;/strong&gt;) define that specific &lt;strong&gt;types &lt;/strong&gt;should includes in the discovery process. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;DirectoryCatalog &lt;/strong&gt;(&lt;strong&gt;line 2&lt;/strong&gt;) instruct the discovery process to search for compose-able pars       &lt;br /&gt;within specific &lt;strong&gt;assembly&lt;/strong&gt;. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;DirectoryCatalog&lt;/strong&gt; (&lt;strong&gt;line 3&lt;/strong&gt;) is the most common used catalog, which instruct &lt;strong&gt;MEF&lt;/strong&gt; to       &lt;br /&gt;search for compose-able parts within &lt;strong&gt;assemblies under specific directory&lt;/strong&gt; using search pattern (&amp;quot;*.dll&amp;quot;). &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;AggregateCatalog&lt;/strong&gt; (&lt;strong&gt;line 4&lt;/strong&gt;) is aggregation of different &lt;strong&gt;catalogs&lt;/strong&gt; instances.       &lt;br /&gt;this &lt;strong&gt;catalog&lt;/strong&gt; enable to add and remove &lt;strong&gt;catalogs&lt;/strong&gt; at runtime. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;&lt;font color="#000080"&gt;&lt;strong&gt;UPDATE&lt;/strong&gt;&lt;/font&gt;&lt;/h5&gt;  &lt;p&gt;&lt;font color="#000080"&gt;&lt;strong&gt;Silverlight&lt;/strong&gt; (CTP 9) introduce new catalog named &lt;strong&gt;DeploymentCatalog&lt;/strong&gt; which should replace the PackageCatalog.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000080"&gt;my next post will discuss more on this topic (soon).&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;strike&gt;&lt;font color="#800000"&gt;&lt;strong&gt;Silverlight&lt;/strong&gt; is adding the &lt;strong&gt;PackageCatalog&lt;/strong&gt; which is searching within assemblies which include&lt;/font&gt;&lt;/strike&gt;&lt;/p&gt;  &lt;p&gt;&lt;strike&gt;&lt;font color="#800000"&gt;in the &lt;strong&gt;package&lt;/strong&gt;. &lt;/font&gt;&lt;/strike&gt;&lt;/p&gt;  &lt;p&gt;&lt;strike&gt;&lt;font color="#800000"&gt;the following snippet demonstrate the &lt;strong&gt;Silverlight&lt;/strong&gt; &lt;strong&gt;PackageCatalog&lt;/strong&gt;:&lt;/font&gt;&lt;/strike&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:f1bc5114-013f-47d8-80ec-0018f42ace60" 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;var&lt;/span&gt; catalogs = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; PackageCatalog();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;catalogs.AddPackage(Package.Current);&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; container = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; CompositionContainer(catalogs);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;container.Compose(...);&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;strike&gt;&lt;font color="#800000"&gt;as you can see the &lt;strong&gt;PackageCatalog&lt;/strong&gt; can include multiple packages.&lt;/font&gt;&lt;/strike&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Summary&lt;/h5&gt;  &lt;p&gt;The &lt;strong&gt;catalogs&lt;/strong&gt; use to define the &lt;strong&gt;search boundary&lt;/strong&gt; of the &lt;strong&gt;composition container &lt;/strong&gt;discovery process.&lt;/p&gt;  &lt;p&gt;different &lt;strong&gt;catalogs&lt;/strong&gt; can be use for different boundary ranges. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Samples&lt;/h5&gt;  &lt;p&gt;each of the previous parts of this series contains samples which is using &lt;strong&gt;catalogs&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;you can explore the previous parts from the &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/01/09/mef-for-beginner-toc.aspx" target="_blank"&gt;&lt;strong&gt;TOC&lt;/strong&gt;&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:a216ad7d-4500-4348-9a05-56f569d72153" 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/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/importmany" rel="tag"&gt;importmany&lt;/a&gt;,&lt;a href="http://technorati.com/tags/extention" rel="tag"&gt;extention&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/catalogs" rel="tag"&gt;catalogs&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%2f02%2f13%2fmef-for-beginner-catalogs-part-10.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%2f13%2fmef-for-beginner-catalogs-part-10.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=517731" 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/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>does MEF apply the SOA paradigm?</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/02/09/does-mef-apply-the-soa-paradigm.aspx</link><pubDate>Tue, 09 Feb 2010 14:02:21 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:515555</guid><dc:creator>bnaya</dc:creator><slash:comments>4</slash:comments><description>&lt;h3&gt;does &lt;strong&gt;MEF&lt;/strong&gt; apply the &lt;strong&gt;SOA&lt;/strong&gt; paradigm?&lt;/h3&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;in this post I&amp;#39;m going to argue that the &lt;strong&gt;Manage Extensibility Framework&lt;/strong&gt; (&lt;a href="http://mef.codeplex.com/" target="_blank"&gt;&lt;strong&gt;MEF&lt;/strong&gt;&lt;/a&gt;),&lt;/p&gt;  &lt;p&gt;is actually applying to the &lt;a href="http://www.bpminstitute.org/articles/article/article/the-four-tenets-of-service-orientation.html" target="_blank"&gt;&lt;strong&gt;4 tenet&lt;/strong&gt;&lt;/a&gt; of &lt;strong&gt;Service Orientation Architecture&lt;/strong&gt; (&lt;a href="http://en.wikipedia.org/wiki/Service-oriented_architecture" target="_blank"&gt;&lt;strong&gt;SOA&lt;/strong&gt;&lt;/a&gt;),&lt;/p&gt;  &lt;p&gt;therefore &lt;strong&gt;MEF&lt;/strong&gt; is actually,&lt;strong&gt; in-process&lt;/strong&gt; implementation of the &lt;strong&gt;SOA&lt;/strong&gt; paradigm.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Background&lt;/h5&gt;  &lt;p&gt;when we speaking about &lt;strong&gt;SOA&lt;/strong&gt; we used to think about technologies like &lt;strong&gt;web services&lt;/strong&gt; and &lt;strong&gt;WCF&lt;/strong&gt;,&lt;/p&gt;  &lt;p&gt;which is cross process technologies. &lt;/p&gt;  &lt;p&gt;but does SOA define that services should always be consumed from the clouds?&lt;/p&gt;  &lt;p&gt;local services like loggers, rule engine, cache and more are everyday practice for in-process services.&lt;/p&gt;  &lt;h5&gt;&amp;#160;&lt;/h5&gt;  &lt;h5&gt;What make your architecture, service oriented?&lt;/h5&gt;  &lt;p&gt;different architect having different opinions of how to construct &lt;strong&gt;SOA&lt;/strong&gt; architecture,&lt;/p&gt;  &lt;p&gt;but most of them agree that &lt;strong&gt;SOA&lt;/strong&gt; design should apply to the &lt;strong&gt;&lt;a href="http://www.bpminstitute.org/articles/article/article/the-four-tenets-of-service-orientation.html" target="_blank"&gt;4 tenets of SOA&lt;/a&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160; &lt;/p&gt;  &lt;h5&gt;The 4 tenets of SOA&lt;/h5&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/1264400738_password_1546BD62.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="MEF, Catalog, Extensibility, Import,Export" border="0" alt="MEF, Catalog, Extensibility, Import,Export" src="http://blogs.microsoft.co.il/blogs/bnaya/1264400738_password_thumb_02CE46E0.jpg" width="59" height="59" /&gt;&lt;/a&gt; Service should have &lt;strong&gt;Explicit Boundaries&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/1264406391_Gear_59E331D6.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="1264406391_Gear" border="0" alt="1264406391_Gear" src="http://blogs.microsoft.co.il/blogs/bnaya/1264406391_Gear_thumb_6A2E83C2.jpg" width="59" height="59" /&gt;&lt;/a&gt;&amp;#160; Service should be &lt;strong&gt;Autonomous&lt;/strong&gt;. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/1264403639__bedingungen_7AC67EB0.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="1264403639__bedingungen" border="0" alt="1264403639__bedingungen" src="http://blogs.microsoft.co.il/blogs/bnaya/1264403639__bedingungen_thumb_58FAA61F.jpg" width="61" height="61" /&gt;&lt;/a&gt; Service API should rely on &lt;strong&gt;Contract&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/1264404491_diagram_v226_6588533B.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="1264404491_diagram_v2-26" border="0" alt="1264404491_diagram_v2-26" src="http://blogs.microsoft.co.il/blogs/bnaya/1264404491_diagram_v226_thumb_0B11D09D.jpg" width="58" height="58" /&gt;&lt;/a&gt; Service behavior and compatibility should rely on &lt;strong&gt;Policy&lt;/strong&gt;. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;How &lt;strong&gt;MEF&lt;/strong&gt; apply to the 4 tenets?&lt;/h5&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/1264400738_password_1546BD62.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="MEF, Catalog, Extensibility, Import,Export" border="0" alt="MEF, Catalog, Extensibility, Import,Export" src="http://blogs.microsoft.co.il/blogs/bnaya/1264400738_password_thumb_02CE46E0.jpg" width="59" height="59" /&gt;&lt;/a&gt; &lt;strong&gt;MEF&lt;/strong&gt; &lt;strong&gt;boundaries&lt;/strong&gt; define explicitly by the &lt;strong&gt;Export&lt;/strong&gt; definition.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/1264406391_Gear_59E331D6.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="1264406391_Gear" border="0" alt="1264406391_Gear" src="http://blogs.microsoft.co.il/blogs/bnaya/1264406391_Gear_thumb_6A2E83C2.jpg" width="59" height="59" /&gt;&lt;/a&gt;&amp;#160; separating &lt;strong&gt;exports&lt;/strong&gt; into separate dlls will create &lt;strong&gt;autonomous&lt;/strong&gt; unit which has no need &lt;/p&gt;  &lt;p&gt;for any reference but the reference for the services contract.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/1264403639__bedingungen_7AC67EB0.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="1264403639__bedingungen" border="0" alt="1264403639__bedingungen" src="http://blogs.microsoft.co.il/blogs/bnaya/1264403639__bedingungen_thumb_58FAA61F.jpg" width="61" height="61" /&gt;&lt;/a&gt;&amp;#160;&lt;strong&gt;Imports&lt;/strong&gt; does not aware of the actual implementation, &lt;strong&gt;imports&lt;/strong&gt; are solely relay on the &lt;strong&gt;contract&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;(&lt;font color="#404040"&gt;&lt;strong&gt;composition&lt;/strong&gt; will find &lt;strong&gt;export&lt;/strong&gt; that mach the &lt;strong&gt;import&lt;/strong&gt; contract&lt;/font&gt;).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/1264404491_diagram_v226_6588533B.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="1264404491_diagram_v2-26" border="0" alt="1264404491_diagram_v2-26" src="http://blogs.microsoft.co.il/blogs/bnaya/1264404491_diagram_v226_thumb_0B11D09D.jpg" width="58" height="58" /&gt;&lt;/a&gt;&amp;#160;&lt;strong&gt;MEF&lt;/strong&gt; has different &lt;strong&gt;policies&lt;/strong&gt; mechanism like &lt;strong&gt;metadata&lt;/strong&gt;, &lt;strong&gt;creation&lt;/strong&gt; policy, &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;instantiation&lt;/strong&gt; policy, &lt;strong&gt;recomposition&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Summary&lt;/h5&gt;  &lt;p&gt;despite &lt;strong&gt;MEF&lt;/strong&gt; being an in-process technology it does apply to the 4 tenet of SOA,&lt;/p&gt;  &lt;p&gt;therefore it can consider as such.&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;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:d74fd9aa-ba9a-42e9-98da-e786f7c3beb6" 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/SOA" rel="tag"&gt;SOA&lt;/a&gt;,&lt;a href="http://technorati.com/tags/CLR+4" rel="tag"&gt;CLR 4&lt;/a&gt;&lt;/div&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=515555" 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/Extensibility/default.aspx">Extensibility</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><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Metadata/default.aspx">Metadata</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 (Recomposition policy) - part 7</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/01/15/mef-for-beginner-recomposition-policy-part-7.aspx</link><pubDate>Sat, 16 Jan 2010 04:05:07 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:498833</guid><dc:creator>bnaya</dc:creator><slash:comments>0</slash:comments><description>&lt;h3&gt;MEF for Beginner (Recomposition policy) - part 7&lt;/h3&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/iStock_recomposition100_7A8962DD.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 composition" border="0" alt="MEF Extensibility composition" align="left" src="http://blogs.microsoft.co.il/blogs/bnaya/iStock_recomposition100_thumb_69E14222.jpg" width="124" height="100" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;this is the 7th 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;br /&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;the current post will focus on the &lt;strong&gt;recomposition&lt;/strong&gt; policy.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;What is the recomposition policy?&lt;/h5&gt;  &lt;p&gt;by default the &lt;strong&gt;composition&lt;/strong&gt; should assign the &lt;strong&gt;Import&lt;/strong&gt; only once &lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;(trying to recompose on already composed import will result with exception)&lt;/font&gt;.&lt;/p&gt;  &lt;p&gt;using the &lt;strong&gt;recomposition policy&lt;/strong&gt; we can define that our &lt;strong&gt;Import&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;is &lt;strong&gt;allowing reassignment&lt;/strong&gt; whenever the container is having changes.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;What is it good for?&lt;/h5&gt;  &lt;p&gt;the recomposition can be handy for dynamic data discovery that can &lt;/p&gt;  &lt;p&gt;changed during the application lifecycle&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;(you can put file watcher upon your DirectoryCatalog folder and refresh the catalog&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;when the change event occurs, this way you can add new plug-in at runtime)&lt;/font&gt;. &lt;/p&gt;  &lt;p&gt;you can also use it to reduce the pressure on your application startup &lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;(by starting with few most common catalog at startup and latter adding the rest)&lt;/font&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;How to define recompose-able Import / ImportMany?&lt;/h5&gt;  &lt;p&gt;the following snippet demonstrate the decoration that needed in&lt;/p&gt;  &lt;p&gt;order to define &lt;strong&gt;recompose-able&lt;/strong&gt; &lt;strong&gt;Import&lt;/strong&gt; /&lt;strong&gt; ImportMany&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:96bcdbbf-6755-4544-84bf-eda41ae9031e" 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;(AllowRecomposition = &lt;span style="color:#0000ff;"&gt;true&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;string&lt;/span&gt;[] Strings { &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;[&lt;span style="color:#2b91af;"&gt;Import&lt;/span&gt;(AllowRecomposition=&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;string&lt;/span&gt; Str { &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;as you can see, all it take is to set the &lt;strong&gt;AllowRecomposition&lt;/strong&gt; to true.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Code Sample&lt;/h5&gt;  &lt;p&gt;the following &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/MEF/MEF%20for%20Beginners/Part%207" target="_blank"&gt;code sample&lt;/a&gt; can be download from &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/MEF/MEF%20for%20Beginners/Part%207" target="_blank"&gt;here&lt;/a&gt;,&lt;/p&gt;  &lt;p&gt;it is demonstrating recomposition scenario.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h6&gt;Exported types:&lt;/h6&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:441066c7-62b4-4848-ab9e-57e94a0f2e91" 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;internal&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ExpMtd1&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;/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; GetString1 { &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;GetString 1&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; GetString2 { &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;GetString 2&amp;quot;&lt;/span&gt;; } }&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;internal&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ExpMtd2&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:#2b91af;"&gt;Export&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;string&lt;/span&gt; GetString3 { &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;GetString 3&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:#2b91af;"&gt;Export&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;string&lt;/span&gt; GetString4 { &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;GetString 4&amp;quot;&lt;/span&gt;; } }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;internal&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ExpMtdRuntime&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; ExpMtdRuntime(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; s) { GetString = s;&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:#2b91af;"&gt;Export&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;string&lt;/span&gt; GetString { &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 code having 3 classes, &lt;/p&gt;  &lt;p&gt;each of the 2 first classes ExpMtd1 and ExpMtd2 is simply exporting 2 string.&lt;/p&gt;  &lt;p&gt;class ExpMtdRuntime is exporting single string that initialized at the construction time.&lt;/p&gt;  &lt;p&gt;looking at the constructor it has no [ImportingConstructor] decoration which mean that &lt;/p&gt;  &lt;p&gt;it won&amp;#39;t be construct by &lt;strong&gt;MEF&lt;/strong&gt;&lt;font color="#808080"&gt; (we will manually instantiate it at runtime and then we will&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;introduce the instance to &lt;strong&gt;MEF&lt;/strong&gt;)&lt;/font&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h6&gt;Import&lt;/h6&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:ea86918d-e25f-44c6-8485-375c2bb6b9e2" 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;(AllowRecomposition = &lt;span style="color:#0000ff;"&gt;true&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;string&lt;/span&gt;[] Strings { &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;the &lt;strong&gt;import&lt;/strong&gt; is decorated with the &lt;strong&gt;AllowRecomposition&lt;/strong&gt; attribute, which define&lt;/p&gt;  &lt;p&gt;that &lt;strong&gt;MEF&lt;/strong&gt; can assign this property upon multiple &lt;strong&gt;composition&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h6&gt;Continues composition&lt;/h6&gt;  &lt;p&gt;the following code will demonstrate multiple compositions,&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;you can think on scenario like startup plug-ins loading, then latter adding less frequency used plug-ins,&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;or on demand plug-ins, that maybe adding new plug-ins that was initialize from data source&lt;/font&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:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:aef6f465-0824-40e5-ad18-74fa1b11b021" 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;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ImpCls&lt;/span&gt; s_imp = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ImpCls&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:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;[] s_beforeState;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&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&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; c = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TypeCatalog&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;ExpMtd1&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; catalog = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;AggregateCatalog&lt;/span&gt;(c);&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;(catalog);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;container.ComposeParts(s_imp);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;Write(s_imp.Strings); &lt;span style="color:#008000;"&gt;// writing the state before recomposition &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;container.ExportsChanging += (s, e) =&amp;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;s_beforeState = s_imp.Strings; &lt;span style="color:#008000;"&gt;// snapshot of the value before the recomposition assignment&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;container.ExportsChanged += (s, e) =&amp;gt;&amp;#160;&amp;#160;{&lt;span style="color:#008000;"&gt;// getting the changes gap&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:#0000ff;"&gt;var&lt;/span&gt; gap = s_imp.Strings.Except(s_beforeState); &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;s_beforeState = &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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;Write(gap);&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;span style="color:#008000;"&gt;// adding new catalog (will result in recomposition)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;catalog.Catalogs.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TypeCatalog&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;ExpMtd2&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;for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; i = &lt;span style="color:#a52a2a;"&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style="color:#a52a2a;"&gt;10&lt;/span&gt;; i++)&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;// adding export instance (will result in 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;container.ComposeParts(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ExpMtdRuntime&lt;/span&gt; (&lt;span style="color:#a31515;"&gt;&amp;quot;Runtime &amp;quot;&lt;/span&gt; + i.ToString())); &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;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Write(&lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt; strings)&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;foreach&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; item &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; strings) { &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(item); }&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;strong&gt;line 1&lt;/strong&gt;: &lt;strong&gt;s_imp &lt;/strong&gt;is the instance of the class that having the imports.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 2&lt;/strong&gt;: this is &lt;strong&gt;temporary variable&lt;/strong&gt; that we use for storing the state of the collection before the recomposition so&lt;/p&gt;  &lt;p&gt;we can get the gap of the changes after the recomposition complete.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;lines 6-9&lt;/strong&gt;: &lt;strong&gt;standard MEF catalog initialization&lt;/strong&gt;, at this stage we only adding the import instance (&lt;strong&gt;line 9&lt;/strong&gt;) &lt;/p&gt;  &lt;p&gt;and the ExpMtd1 type (&lt;strong&gt;line 6&lt;/strong&gt;), the catalog does not yet includes the ExpMtd2 and ExpMtdRuntime.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;lines 12-18&lt;/strong&gt;: listening to the &lt;strong&gt;changing&lt;/strong&gt; and &lt;strong&gt;changed events&lt;/strong&gt;, so we will able to write the gap of the&lt;/p&gt;  &lt;p&gt;newly discovered parts to the console, whenever the container will recompose.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 21&lt;/strong&gt;: adding the &lt;strong&gt;ExpMtd2&lt;/strong&gt; (by adding new TypeCatalog), it will cause recomposition.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;line 22-25&lt;/strong&gt;: continuously adding &lt;strong&gt;ExpMtdRuntime&lt;/strong&gt; instances, it will cause recomposition for each iteration.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Summary &lt;/h5&gt;  &lt;p&gt;The recomposition can be very useful in real-life scenarios and it is quite simple to implement.&lt;/p&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%2f15%2fmef-for-beginner-recomposition-policy-part-7.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2010%2f01%2f15%2fmef-for-beginner-recomposition-policy-part-7.aspx" border="0" alt="kick it on DotNetKicks.com" /&gt;&lt;/a&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:0cc9d5eb-1784-469e-a60a-f2ddca2b92a7" class="wlWriterSmartContent"&gt;תגים של Technorati:‏ &lt;a href="http://technorati.com/tags/Extensibility" rel="tag"&gt;Extensibility&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/SeLA" rel="tag"&gt;SeLA&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/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;a href="http://technorati.com/tags/.net" rel="tag"&gt;.net&lt;/a&gt;&lt;/div&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=498833" 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/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/IoC/default.aspx">IoC</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Composition/default.aspx">Composition</category></item><item><title>Secured directory catalog</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/01/07/secured-directory-catalog.aspx</link><pubDate>Fri, 08 Jan 2010 00:10:45 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:489259</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/SecuredCatalogs48_72DF62D6.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;margin-left:0px;border-top:0px;margin-right:0px;border-right:0px;" title="MEF, Bnaya, CLR 4 Extensibility" border="0" alt="MEF, Bnaya, CLR 4 Extensibility" align="left" src="http://blogs.microsoft.co.il/blogs/bnaya/SecuredCatalogs48_thumb_60867647.jpg" width="48" height="43" /&gt;&lt;/a&gt;Secured directory catalog&lt;/h3&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;I was discussing the question of how to secure your&lt;strong&gt; &lt;/strong&gt;&lt;a href="http://mef.codeplex.com/" target="_blank"&gt;&lt;strong&gt;MEF&lt;/strong&gt;&lt;/a&gt; application on &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/01/01/securing-the-mef-directory-catalog.aspx" target="_blank"&gt;this&lt;/a&gt; post&amp;#160; &lt;/p&gt;  &lt;p&gt;where I was publishing replica of the &lt;strong&gt;MEF&lt;/strong&gt; bits hopping that the &lt;strong&gt;Secured Directory Catalog&lt;/strong&gt; will &lt;/p&gt;  &lt;p&gt;find its way into the &lt;strong&gt;MEF&lt;/strong&gt; core.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;but as sad as it is :(, it won&amp;#39;t make into the core.&lt;/p&gt;  &lt;p&gt;you can read more about the &lt;strong&gt;MEF&lt;/strong&gt; team consideration &lt;a href="http://mef.codeplex.com/Thread/View.aspx?ThreadId=79489" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;anyway &lt;a href="http://codebetter.com/blogs/glenn.block/Default.aspx" target="_blank"&gt;Glenn Block&lt;/a&gt; has suggest a solution for haw to build the secured catalog &lt;/p&gt;  &lt;p&gt;without rewriting half of the &lt;strong&gt;MEF&lt;/strong&gt; core, so as you might guessed, &lt;/p&gt;  &lt;p&gt;I had created new directory catalog that let you control the assembly loading of your plug-ins.&lt;/p&gt;  &lt;p&gt;the implementation of the &lt;strong&gt;&lt;a href="http://mefsecuredcatalogs.codeplex.com/license" target="_blank"&gt;Secured Directory Catalog&lt;/a&gt;&lt;/strong&gt; can be found &lt;strong&gt;&lt;a href="http://mefsecuredcatalogs.codeplex.com/license" target="_blank"&gt;here&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;it is given without any warranty, but with full source code.&lt;/p&gt;  &lt;p&gt;actually it is real small implementation which you should find easy to review.&lt;/p&gt;  &lt;p&gt;so enjoy the secured way of the plug-ins injection.&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=489259" 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/Extensibility/default.aspx">Extensibility</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/IoC/default.aspx">IoC</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Composition/default.aspx">Composition</category></item><item><title>MEF for Beginner – Part 5 (Import)</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/01/02/mef-for-beginner-part-5-import.aspx</link><pubDate>Sun, 03 Jan 2010 03:30:57 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:483409</guid><dc:creator>bnaya</dc:creator><slash:comments>0</slash:comments><description>&lt;h2&gt;MEF for Beginner – Part 5 (Import)&lt;/h2&gt;  &lt;p&gt;this is the 5th post on &lt;a href="http://mef.codeplex.com/" target="_blank"&gt;&lt;strong&gt;MEF&lt;/strong&gt;&lt;/a&gt; for beginner series, you can see the previous post &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2009/12/05/mef-for-beginner-part-2-vs-2010.aspx" target="_blank"&gt;here&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" target="_blank"&gt;here&lt;/a&gt; and &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2009/12/19/mef-for-beginner-part-3-hello-silverlight.aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;this post will focus on the &lt;strong&gt;Import&lt;/strong&gt; aspect.&lt;/p&gt;  &lt;p&gt;we will soon learn about the different signature that can be apply with the &lt;strong&gt;Import&lt;/strong&gt; decoration, &lt;/p&gt;  &lt;p&gt;but before starting with that, we should introduce the &lt;strong&gt;Lazy&amp;lt;T&amp;gt;&lt;/strong&gt; class&lt;/p&gt;  &lt;p&gt;which is a first citizen at the &lt;strong&gt;MEF&lt;/strong&gt; world, and part of the &lt;strong&gt;CLR 4&lt;/strong&gt; types.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Lazy&amp;lt;T&amp;gt; definition&lt;/h5&gt;  &lt;p&gt;&lt;strong&gt;Lazy&amp;lt;T&amp;gt;&lt;/strong&gt; is used in order of delaying the actual instantiation until it actually needed.&lt;/p&gt;  &lt;p&gt;in fact using &lt;strong&gt;Lazy&amp;lt;T&amp;gt;&lt;/strong&gt; the actual instantiation will occur the first time the &lt;strong&gt;Value&lt;/strong&gt; property is accessed or &lt;strong&gt;ToString&lt;/strong&gt; method is called.&lt;/p&gt;  &lt;p&gt;you can use the &lt;strong&gt;Lazy&amp;lt;T&amp;gt;&lt;/strong&gt; when ever you want to delay the actual instantiation of the &lt;/p&gt;  &lt;p&gt;object that were discovered by the &lt;strong&gt;MEF&lt;/strong&gt; composition.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;The Import / ImportMany decorations&lt;/h5&gt;  &lt;p&gt;&lt;strong&gt;MEF&lt;/strong&gt; is trying to discover parts that apply to &lt;strong&gt;Import definition&lt;/strong&gt; constraint.&lt;/p&gt;  &lt;p&gt;we can think at the &lt;strong&gt;Import definition&lt;/strong&gt; as a &lt;strong&gt;where&lt;/strong&gt; clause of the Linq query &lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;font color="#808080"&gt;(the &lt;strong&gt;from&lt;/strong&gt; clause will be define by the &lt;strong&gt;Catalog&lt;/strong&gt; / &lt;strong&gt;Export provider&lt;/strong&gt; which will discuss latter on this series)&lt;/font&gt;.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;out of the box &lt;strong&gt;MEF&lt;/strong&gt; offer an attribute model for the &lt;strong&gt;Import definition&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Decoration options&lt;/h5&gt;  &lt;p&gt;out of the box &lt;strong&gt;MEF&lt;/strong&gt; is offering 2 type of &lt;strong&gt;Import decorations&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;1. &lt;strong&gt;[Import]&lt;/strong&gt; for single discoverable part.&lt;/p&gt;  &lt;p&gt;2. &lt;strong&gt;[ImportMany]&lt;/strong&gt; for discovering multiple parts.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;&lt;em&gt;Note: you should use [ImportMany] if there is a possibility that MEF will discover multiple Exported parts&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;&lt;em&gt;even if you need only one of those parts (you can latter filter one using Linq query).&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;&lt;em&gt;if you ask for single part and &lt;strong&gt;MEF&lt;/strong&gt; discovering multiple it will throw an exception or return null &lt;/em&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;&lt;em&gt;(depending on the &lt;strong&gt;MEF&lt;/strong&gt; policy which will discuss in the next post on this series).&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Import single instance&lt;/h5&gt;  &lt;p&gt;as I said in the previous paragraph, you should not use the&lt;strong&gt; [Import]&lt;/strong&gt; attribute unless &lt;/p&gt;  &lt;p&gt;you really expecting single discovery &lt;font color="#808080"&gt;(like the case of discovering UI shell)&lt;/font&gt;.&lt;/p&gt;  &lt;p&gt;you apply the &lt;strong&gt;[Import]&lt;/strong&gt; decoration to &lt;strong&gt;properties&lt;/strong&gt; that having a getter and a setter &lt;font color="#808080"&gt;(the setter can be private)&lt;/font&gt;,&lt;/p&gt;  &lt;p&gt;actually you can decorate a private property too (not in Silverlight).&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;&lt;em&gt;Note: you can also decorate fields but it considered as bad practice.&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;and you can use the &lt;strong&gt;Lazy&amp;lt;T&amp;gt;&lt;/strong&gt; if you want delay instantiation.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Import&lt;/strong&gt; decoration may look like the following 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:ed3a86b2-e357-4bf4-9a01-0e47e8594f84" 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;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;[&lt;span style="color:#2b91af;"&gt;Import&lt;/span&gt;]&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ISay&lt;/span&gt; Hellow { &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;nbsp;&lt;/li&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;Lazy&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;ISay&lt;/span&gt;&amp;gt; HellowLazy { &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;in the sample above the &lt;strong&gt;Import contract&lt;/strong&gt; is concluded from the type of the property,&lt;/p&gt;  &lt;p&gt;while in the next sample it is explicitly define.&lt;/p&gt;  &lt;p&gt;note that the&lt;strong&gt; Lazy&amp;lt;T&amp;gt;&lt;/strong&gt; is not part of the &lt;strong&gt;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:effb088c-7567-4544-a6ad-6f7d11a2bf85" 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;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;[&lt;span style="color:#2b91af;"&gt;Import&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;ISay&lt;/span&gt;))]&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ISay&lt;/span&gt; Hellow { &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;nbsp;&lt;/li&gt; &lt;li&gt;[&lt;span style="color:#2b91af;"&gt;Import&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;ISay&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;ISay&lt;/span&gt;&amp;gt; HellowLazy { &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;using explicit contract is useful while we want &lt;strong&gt;MEF&lt;/strong&gt; to search for &lt;strong&gt;contract&lt;/strong&gt; of specific derived &lt;/p&gt;  &lt;p&gt;type and not for the type of the property itself.&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;in case that the Imported property can have null value you should add the &lt;strong&gt;AllowDefault&lt;/strong&gt;=true &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;to the &lt;strong&gt;Import&lt;/strong&gt; decoration ( it will look like the following&lt;strong&gt; [Import (AllowDefault=true)]&lt;/strong&gt; )&lt;/font&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Import multiple values&lt;/h5&gt;  &lt;p&gt;&lt;strong&gt;Importing&lt;/strong&gt; multiple values is done by using the&lt;strong&gt; [ImportMany]&lt;/strong&gt; attribute.&lt;/p&gt;  &lt;p&gt;we can assign this attribute to properties that having &lt;strong&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/strong&gt;, &lt;strong&gt;Array&lt;/strong&gt; ([]) and &lt;/p&gt;  &lt;p&gt;any type that derived from &lt;strong&gt;ICollection&amp;lt;T&amp;gt;&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;the types within the above sets can be &lt;strong&gt;Lazy&amp;lt;T&amp;gt;&lt;/strong&gt; for having delay instantiation.&lt;/p&gt;  &lt;p&gt;the following code snippet will demonstrate the use of &lt;strong&gt;[ImportMany]&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:b476dac3-9b24-4fe0-8246-3a8d2eb17e62" 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;ISay&lt;/span&gt;[] AsArray { &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;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;[&lt;span style="color:#2b91af;"&gt;ImportMany&lt;/span&gt;]&lt;/li&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;ISay&lt;/span&gt;&amp;gt; AsEnumerable { &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;nbsp;&lt;/li&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;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;ISay&lt;/span&gt;&amp;gt; AsCollection { &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;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;[&lt;span style="color:#2b91af;"&gt;ImportMany&lt;/span&gt;]&lt;/li&gt; &lt;li&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;ISay&lt;/span&gt;&amp;gt;[] AsLazyArray { &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;nbsp;&lt;/li&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;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Lazy&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;ISay&lt;/span&gt;&amp;gt;&amp;gt; AsLazyEnumerable { &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;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;[&lt;span style="color:#2b91af;"&gt;ImportMany&lt;/span&gt;]&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Lazy&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;ISay&lt;/span&gt;&amp;gt;&amp;gt; AsLazyCollection { &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;Construction time import&lt;/h5&gt;  &lt;p&gt;the last capability I&amp;#39;m going to discuss in this post, &lt;/p&gt;  &lt;p&gt;is one that I advice against using whenever you can, because it can lead to &lt;/p&gt;  &lt;p&gt;cross composition reference. just for knowing what to avoid from &lt;/p&gt;  &lt;p&gt;I will now introduce you to the &lt;strong&gt;[ImportingConstructor]&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;the &lt;strong&gt;[ImportingConstructor]&lt;/strong&gt; can be decorate constructor that should be use by&lt;/p&gt;  &lt;p&gt;the &lt;strong&gt;MEF&lt;/strong&gt; composition, so any parameter of this constructor is &lt;/p&gt;  &lt;p&gt;treated as &lt;strong&gt;import&lt;/strong&gt; which should be &lt;strong&gt;satisfied&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;the constructor may 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:9dc73c44-d99d-4993-b589-4c2fc0457450" 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;ImportingConstructor&lt;/span&gt;]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Rumors(&lt;span style="color:#2b91af;"&gt;ISay&lt;/span&gt; hello)&lt;/li&gt; &lt;li&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;&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;in this post we learn which signature can be apply to the import definitions&lt;/p&gt;  &lt;p&gt;and we present the &lt;strong&gt;Lazy&amp;lt;T&amp;gt;&lt;/strong&gt; type and its role under the &lt;strong&gt;MEF&lt;/strong&gt; world.&lt;/p&gt;  &lt;p&gt;on the next post at this series we will survey different&lt;strong&gt; MEF policies&lt;/strong&gt; that&lt;/p&gt;  &lt;p&gt;can affects the behavior of the MEF composition process.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;code snippet (console application) can be download from &lt;a href="http://cid-9bf7c1a515d76a9a.skydrive.live.com/browse.aspx/Code%20Samples/MEF/MEF%20for%20Beginners/Part%205?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:ded43486-06c5-4672-884d-dc91a7b74f2a" 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/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/ioc" rel="tag"&gt;ioc&lt;/a&gt;,&lt;a href="http://technorati.com/tags/composition" rel="tag"&gt;composition&lt;/a&gt;&lt;/div&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=483409" 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/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/.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></item><item><title>Code cartoons - MEF</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2009/12/29/code-cartoons-mef.aspx</link><pubDate>Wed, 30 Dec 2009 02:24:47 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:478587</guid><dc:creator>bnaya</dc:creator><slash:comments>0</slash:comments><description>&lt;h2&gt;Code cartoons – &lt;a href="http://mef.codeplex.com/" target="_blank"&gt;MEF&lt;/a&gt;&amp;#160;&lt;/h2&gt;  &lt;h5&gt;&amp;#160;&lt;/h5&gt;  &lt;h5&gt;The super hero agency&lt;/h5&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/image_543A6CC7.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="MEF Extensibility SELA Bnaya Eshet" border="0" alt="MEF Extensibility SELA Bnaya Eshet" src="http://blogs.microsoft.co.il/blogs/bnaya/image_thumb_2D4C0AED.png" width="565" height="376" /&gt;&lt;/a&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=478587" 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/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/.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></item><item><title>Why and When slides from my MEF lecture</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2009/12/29/why-and-when-slides-from-my-mef-lecture.aspx</link><pubDate>Wed, 30 Dec 2009 01:39:12 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:478567</guid><dc:creator>bnaya</dc:creator><slash:comments>0</slash:comments><description>&lt;h2&gt;&lt;strong&gt;Why&lt;/strong&gt; and &lt;strong&gt;When&lt;/strong&gt; slides from my &lt;strong&gt;MEF&lt;/strong&gt; lecture&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/iStock_000001378511XSmall_2835E124.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, bnaya eshet" border="0" alt="MEF, Extensibility, bnaya eshet" align="left" src="http://blogs.microsoft.co.il/blogs/bnaya/iStock_000001378511XSmall_thumb_2B57A33F.jpg" width="168" height="129" /&gt;&lt;/a&gt;&lt;/h2&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;some time we are so enthusiastic about the technology, &lt;/p&gt;  &lt;p&gt;that we forgot to explain the &lt;strong&gt;Why &lt;/strong&gt;and &lt;strong&gt;When&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;so I thought it could be nice to share those aspects with you.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;when we asking &lt;strong&gt;Why&lt;/strong&gt; to use the &lt;strong&gt;MEF&lt;/strong&gt; technology we can think on the following reasons:&lt;/p&gt;  &lt;p&gt;• &lt;strong&gt;Simple&lt;/strong&gt; to &lt;strong&gt;understand&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;• &lt;strong&gt;Simple&lt;/strong&gt; to &lt;strong&gt;implement&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;• The &lt;strong&gt;CLR 4 Extensibility standard&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;• &lt;strong&gt;Contract&lt;/strong&gt; based model (type safe)&lt;/p&gt;  &lt;p&gt;• Easy &lt;strong&gt;deployment&lt;/strong&gt; (support copy / paste deployment)&lt;/p&gt;  &lt;p&gt;• Zero &lt;strong&gt;configuration&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;• Ease of &lt;strong&gt;Maintenance&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;• &lt;strong&gt;Silverlight&lt;/strong&gt; support&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;rules of thumb for &lt;strong&gt;When&lt;/strong&gt; should we consider using &lt;strong&gt;MEF&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;when ever we are using or considering one of the following, &lt;/p&gt;  &lt;p&gt;we may use &lt;a href="http://mef.codeplex.com/" target="_blank"&gt;MEF&lt;/a&gt; instead:&lt;/p&gt;  &lt;p&gt;• &lt;strong&gt;Reflection&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;• &lt;strong&gt;Factory&lt;/strong&gt; pattern &lt;/p&gt;  &lt;p&gt;• &lt;strong&gt;Command&lt;/strong&gt; pattern &lt;/p&gt;  &lt;p&gt;• Any other &lt;strong&gt;creational pattern&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;• &lt;strong&gt;IoC&lt;/strong&gt; (Inversion of control)&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=478567" 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/Extensibility/default.aspx">Extensibility</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/IoC/default.aspx">IoC</category><category domain="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Composition/default.aspx">Composition</category></item><item><title>MEF for Beginner – Part 4 (a-sync Silverlight loading)</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2009/12/26/mef-for-beginner-part-4-a-sync-silverlight-loading.aspx</link><pubDate>Sun, 27 Dec 2009 03:13:28 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:476335</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/iStock_000005308317XForIcon_47360B94.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="iStock_000005308317XForIcon" border="0" alt="iStock_000005308317XForIcon" src="http://blogs.microsoft.co.il/blogs/bnaya/iStock_000005308317XForIcon_thumb_0259C193.jpg" width="60" height="60" /&gt;&lt;/a&gt;&amp;#160; &lt;/h3&gt;  &lt;h1&gt;MEF for Beginner – Part 4 (a-sync Silverlight loading)&lt;/h1&gt;  &lt;p&gt;in this post we will continue from the point that we left our Silverlight application at &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2009/12/19/mef-for-beginner-part-3-hello-silverlight.aspx" target="_blank"&gt;part 3&lt;/a&gt; of this series.&lt;/p&gt;  &lt;p&gt;the post will focus on how to consume &lt;strong&gt;external plug-ins&lt;/strong&gt; using &lt;strong&gt;a-sync loading&lt;/strong&gt; into &lt;strong&gt;Silverlight&lt;/strong&gt; application using &lt;a href="http://mef.codeplex.com/"&gt;&lt;strong&gt;MEF&lt;/strong&gt;&lt;/a&gt;.&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; and &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2009/12/19/mef-for-beginner-part-3-hello-silverlight.aspx" target="_blank"&gt;part 3&lt;/a&gt; of this series.&lt;/p&gt;  &lt;p&gt;&amp;#160;&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;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%204/A-sync%20Sliverlight%20plug-ins%20loading.zip"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;if you want to start from our previous post code, you can download it 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: Download the Silverlight 4 Beta Toolkit&lt;/h5&gt;  &lt;p&gt;downloading &lt;strong&gt;a-sync&lt;/strong&gt;&amp;#160;&lt;strong&gt;Silverlight&lt;/strong&gt; Packages (&lt;strong&gt;XAP&lt;/strong&gt;) does not include in in the box at this point (i hope it will on the release time),&lt;/p&gt;  &lt;p&gt;so you have to download the &lt;strong&gt;Silverlight 4 Beta Toolkit&lt;/strong&gt;, which you can download &lt;a href="http://www.codeplex.com/Silverlight/Release/ProjectReleases.aspx"&gt;&lt;strong&gt;here&lt;/strong&gt;&lt;/a&gt;. You’ll need latter on this post.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Step 2: Create XAP (Silverlight App) for the new plug-in&lt;/h5&gt;  &lt;p&gt;the &lt;strong&gt;a-sync discovery&lt;/strong&gt; technique&amp;#160; that we are going to use in this post, will search for plug-ins in &lt;strong&gt;XAP&lt;/strong&gt; files&lt;/p&gt;  &lt;p&gt;that was deployed at the same virtual folder as our shell application deployed.&lt;/p&gt;  &lt;p&gt;therefore we have to create &lt;strong&gt;Silverlight&lt;/strong&gt; &lt;strong&gt;application&lt;/strong&gt; rather then &lt;strong&gt;Silverlight class library&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;create Silverlight application.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/image_2F9529BB.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 silverlight .net 4 clr 4" border="0" alt="mef silverlight .net 4 clr 4" src="http://blogs.microsoft.co.il/blogs/bnaya/image_thumb_76AAAA20.png" width="671" height="379" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;before approving the new application you have to uncheck the &amp;quot;make it the start page&amp;quot; check box&lt;/p&gt;  &lt;p&gt;so it will keep the current &lt;strong&gt;Silverlight&lt;/strong&gt; application as the startup application.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/image_36646AD9.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 silverlight" border="0" alt="mef silverlight" src="http://blogs.microsoft.co.il/blogs/bnaya/image_thumb_300D6E7E.png" width="522" height="632" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h6&gt;Step 2.1: delete the App.xaml&lt;/h6&gt;  &lt;p&gt;delete the app.xaml from the plug-in application, we don&amp;#39;t need it there.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Step 3: 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&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="mef silverlight" border="0" alt="mef silverlight" src="http://blogs.microsoft.co.il/blogs/bnaya/image_thumb3_62ECD918.png" width="482" height="390" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Step 4: Change the main page xaml (plug-in application)&lt;/h5&gt;  &lt;p&gt;at the plug-in application that we created in the previous step, change the MainPage.xaml to:&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:d0697fd9-1b33-48b6-a8d4-dd6cbdf55369" 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&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;LayoutRoot&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Background&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;White&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;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&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; Text&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;External plug&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;Button&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;Grid&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;we are using the main page as our plug-in.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Step 5: Expose the plug-in&lt;/h5&gt;  &lt;p&gt;go the the code behind of the plug-in MainPage.xaml and decorate the class with the following &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:2b5a6165-b5d8-4867-9af1-6694855f55e6" 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;MainPage&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;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; MainPage()&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;InitializeComponent();&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;DataContext = &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;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;add using to System.ComponentModel.Composition&lt;/p&gt;  &lt;p&gt;and set the &lt;strong&gt;DataContext&lt;/strong&gt; to this.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Step 5.1: Add Imports&lt;/h5&gt;  &lt;p&gt;adding &lt;strong&gt;imports&lt;/strong&gt; for the exposed shell TextBlock and Border.&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:2aa4a9e0-1f33-413e-8ebe-271b79505072" 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;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;[&lt;span style="color:#2b91af;"&gt;Import&lt;/span&gt;]&lt;/li&gt; &lt;li&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;h5&gt;Step 6: implement the ICommand interface&lt;/h5&gt;  &lt;p&gt;add the &lt;strong&gt;ICommand&lt;/strong&gt; to the inheritance of the class and implement the interface.&lt;/p&gt;  &lt;p&gt;the Execute method should look like the following 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:135bf02e-5ada-4563-938e-ca61fa8742aa" 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;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;External plug&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;32.0&lt;/span&gt;;&lt;/li&gt; &lt;li&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;.Yellow);&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; grdCol = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;GradientStopCollection&lt;/span&gt;();&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;grdCol.Add (&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;GradientStop&lt;/span&gt; { Color=&lt;span style="color:#2b91af;"&gt;Colors&lt;/span&gt;.Green, Offset=&lt;span style="color:#a52a2a;"&gt;0}&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;grdCol.Add (&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;GradientStop&lt;/span&gt; { Color=&lt;span style="color:#2b91af;"&gt;Colors&lt;/span&gt;.Purple, Offset=&lt;span style="color:#a52a2a;"&gt;0.25}&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;grdCol.Add (&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;GradientStop&lt;/span&gt; { Color=&lt;span style="color:#2b91af;"&gt;Colors&lt;/span&gt;.Orange, Offset=&lt;span style="color:#a52a2a;"&gt;0.5}&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;grdCol.Add (&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;GradientStop&lt;/span&gt; { Color=&lt;span style="color:#2b91af;"&gt;Colors&lt;/span&gt;.Blue, Offset=&lt;span style="color:#a52a2a;"&gt;0.75}&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; brush = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;LinearGradientBrush&lt;/span&gt; (grdCol,&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;ShellText.Foreground = brush;&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: A-Sync composition&lt;/h5&gt;  &lt;p&gt;add reference to the &lt;strong&gt;System.ComponentModel.Composition.Packaging.Toolkit.dll&lt;/strong&gt; to the shell project&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;you should find it at:&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;C:\Program Files (x86)\Microsoft SDKs\Silverlight\v4.0\Toolkit\Nov09\Bin\System.ComponentModel.Composition.Packaging.Toolkit.dll&amp;#160;&amp;#160; for 64 bit&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;C:\Program Files\Microsoft SDKs\Silverlight\v4.0\Toolkit\Nov09\Bin\System.ComponentModel.Composition.Packaging.Toolkit.dll&amp;#160;&amp;#160; for 32 bit&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Step 7.1: Allow Recomposition&lt;/h5&gt;  &lt;p&gt;the &lt;strong&gt;a-sync composition&lt;/strong&gt; will result in re-adding plug-ins to the existing plug-ins collection,&lt;/p&gt;  &lt;p&gt;this behavior required to modify the &lt;strong&gt;Import&lt;/strong&gt; policy to allow &lt;strong&gt;recomposition&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;at the shell project, &lt;strong&gt;MainPage.xaml&lt;/strong&gt; code behind, modify the import declaration to:&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:806c3be7-17ce-4e91-be75-e691947c049b" 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; (AllowRecomposition=&lt;span style="color:#0000ff;"&gt;true&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;ObservableCollection&lt;/span&gt;&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 7.2: Minor changes to the InitializeContainer method&lt;/h5&gt;  &lt;p&gt;because we will need the PackageCatalog latter for adding the new &lt;/p&gt;  &lt;p&gt;discovered packages we have to take it out to the class level scope.&lt;/p&gt;  &lt;p&gt;at the &lt;strong&gt;app.xaml&lt;/strong&gt; code behind , change the InitializeContainer&amp;#160; method 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:5ffa5da8-f4de-4e47-b17e-3be635c42284" 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;PackageCatalog&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;&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&gt;{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;_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&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 style="background:#f3f3f3;"&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&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 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;(_catalogs);&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;container.Compose(batch);&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;Step 7.3: Loading external plug-ins&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:34d28979-1ddd-4830-8f44-bcb630b6675c" 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;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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; uri = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Uri&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;MyPlugIn.xap&amp;quot;&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;UriKind&lt;/span&gt;.Relative);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#2b91af;"&gt;Package&lt;/span&gt;.DownloadPackageAsync(uri,&lt;/li&gt; &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;(args, p) =&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;{&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;Thread&lt;/span&gt;.Sleep(&lt;span style="color:#a52a2a;"&gt;3000&lt;/span&gt;);&lt;span style="color:#008000;"&gt;// just waiting in order to emphasize the a-sync effect&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;_catalogs.AddPackage(p);&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;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;lines 5-11 are responsible for the&lt;strong&gt; a-sync package loading&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5&gt;Summary&lt;/h5&gt;  &lt;p&gt;the a-sync pattern is really powerful, and we can benefit from &lt;strong&gt;better startup time&lt;/strong&gt; of the&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Silverlight&lt;/strong&gt; application by pushing heavy loading into plug-able components (which will be loaded a-sync).&lt;/p&gt;  &lt;p&gt;another benefit is the capability of on demand plug-ins loading.&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%204/A-sync%20Sliverlight%20plug-ins%20loading.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://codebetter.com/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 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;Point of Interest&lt;/h5&gt;  &lt;p&gt;if you living in Israel you can hear me speaking about &lt;strong&gt;MEF&lt;/strong&gt; at the&lt;strong&gt; &lt;/strong&gt;&lt;a href="http://www.sela.co.il/s/sdp/default.html"&gt;&lt;strong&gt;SDP&lt;/strong&gt;&lt;/a&gt; at Monday 28.12.2009 (mark your calendar)&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;a href="http://www.sela.co.il/s/sdp/default.html"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Sela Developer Practice (SDP)" border="0" alt="Sela Developer Practice (SDP)" src="http://blogs.microsoft.co.il/blogs/bnaya/SelaDeveloperPracticeSDP_4DEB30D8.png" width="717" height="156" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="wlWriterHeaderFooter" style="text-align:right;margin:0px;padding:4px 0px 4px 0px;"&gt;&lt;a href="http://digg.com/submit?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2009%2f12%2f26%2fmef-for-beginner-part-4-a-sync-silverlight-loading.aspx&amp;amp;title=MEF+for+Beginner+%e2%80%93+Part+4+(a-sync+Silverlight+loading)"&gt;&lt;img src="http://digg.com/img/badges/100x20-digg-button.png" width="100" height="20" alt="Digg This" title="Digg This" border="0" style="border:0;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=476335" 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/CompactFramework/default.aspx">CompactFramework</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/.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></item><item><title>Pocket MEF is now supporting Windows CE</title><link>http://blogs.microsoft.co.il/blogs/bnaya/archive/2009/12/26/pocket-mef-is-now-supporting-windows-ce.aspx</link><pubDate>Sat, 26 Dec 2009 14:51:38 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:476178</guid><dc:creator>bnaya</dc:creator><slash:comments>0</slash:comments><description>&lt;h3&gt;&lt;strong&gt;Pocket MEF&lt;/strong&gt; is now supporting &lt;strong&gt;Windows CE&lt;/strong&gt;&lt;/h3&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;One of our customer (at &lt;strong&gt;&lt;a href="http://www.sela.co.il/" target="_blank"&gt;SELA Group&lt;/a&gt;&lt;/strong&gt;) was asking for &lt;a href="http://mef.codeplex.com/" target="_blank"&gt;&lt;strong&gt;MEF&lt;/strong&gt;&lt;/a&gt; solution that targeting the &lt;strong&gt;Windows CE&lt;/strong&gt; platform.&lt;/p&gt;  &lt;p&gt;so after short discussion with &lt;a href="http://blogs.microsoft.co.il/blogs/noams/" target="_blank"&gt;Noam Sheffer&lt;/a&gt;&lt;strong&gt;&amp;#160;&lt;/strong&gt;we decide that it will be nice to add this capability into &lt;strong&gt;Packet MEF&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;in matter of fact i was able to add this new capability almost without having to change the Pocket MEF code at all.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;in case that you are working on &lt;strong&gt;Windows CE&lt;/strong&gt; solution and want to have &lt;strong&gt;MEF&lt;/strong&gt; capabilities, &lt;/p&gt;  &lt;p&gt;you can &lt;strong&gt;download&lt;/strong&gt; it from the&lt;strong&gt;&amp;#160;&lt;/strong&gt;&lt;a href="http://pocketmef.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=37780"&gt;&lt;strong&gt;Pocket MEF&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; &lt;/strong&gt;space at &lt;a href="http://pocketmef.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=37780"&gt;&lt;strong&gt;codeplex&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;&lt;div class="wlWriterHeaderFooter" style="text-align:right;margin:0px;padding:4px 0px 4px 0px;"&gt;&lt;a href="http://digg.com/submit?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2fbnaya%2farchive%2f2009%2f12%2f26%2fpocket-mef-is-now-supporting-windows-ce.aspx&amp;amp;title=Pocket+MEF+is+now+supporting+Windows+CE"&gt;&lt;img src="http://digg.com/img/badges/100x20-digg-button.png" width="100" height="20" alt="Digg This" title="Digg This" border="0" style="border:0;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=476178" 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/CompactFramework/default.aspx">CompactFramework</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/SELA/default.aspx">SELA</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></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></channel></rss>