<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.microsoft.co.il/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Bnaya Eshet</title><subtitle type="html" /><id>http://blogs.microsoft.co.il/blogs/bnaya/atom.aspx</id><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/bnaya/" /><link rel="self" type="application/atom+xml" href="http://blogs.microsoft.co.il/blogs/bnaya/atom.aspx" /><generator uri="http://communityserver.org" version="3.1.20917.1142">Community Server</generator><updated>2013-01-14T01:19:42Z</updated><entry><title>The 3rd day of the SDP</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2013/05/08/the-3rd-day-of-the-sdp.aspx" /><id>http://blogs.microsoft.co.il/blogs/bnaya/archive/2013/05/08/the-3rd-day-of-the-sdp.aspx</id><published>2013-05-08T04:17:58Z</published><updated>2013-05-08T04:17:58Z</updated><content type="html">&lt;p&gt;The 3rd day of the SDP was over and I want to thanks all the attendants.   &lt;br /&gt;my yesterday session was about&lt;strong&gt; C# 5 async and await&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;today I will have a full day tutorial on &lt;strong&gt;Rx&lt;/strong&gt; and &lt;strong&gt;TPL Dataflow&lt;/strong&gt;.    &lt;br /&gt;you can download the &lt;strong&gt;demo code&lt;/strong&gt; and also the presentation for second and third days from &lt;a href="http://sdrv.ms/1283vDW"&gt;here&lt;/a&gt; (the link is also having the demo code for today&amp;#39;s sessions).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/IMG_2242_7E6AE9DF.jpg"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="sdp, clr, cryptography , rx, tpl, dataflow, async, await" border="0" alt="sdp, clr, cryptography , rx, tpl, dataflow, async, await" src="http://blogs.microsoft.co.il/blogs/bnaya/IMG_2242_thumb_17DEFEE8.jpg" width="416" height="352" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;anyway, I also want to &lt;strong&gt;recommend&lt;/strong&gt; 2of yesterday session.&lt;/p&gt;  &lt;p&gt;if you were attend at the conference you should have an access to the sessions video page.   &lt;br /&gt;first I want to recommend &lt;a href="http://blogs.microsoft.co.il/blogs/ofirmakmal/"&gt;Ofir Makmal&lt;/a&gt;&amp;#39;s session about &lt;strong&gt;.NET 4.5 CLR improvements&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;Ofir was talking about subjects like:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Multi-core JIT&lt;/li&gt;    &lt;li&gt;Managed Profile Guided Optimization&lt;/li&gt;    &lt;li&gt;Auto-Ngen&lt;/li&gt;    &lt;li&gt;Background Server GC&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;my favorite subject was&lt;strong&gt; Multi-core JIT&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;the following is a snippet for Multi-core JITing.&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:18ac9de8-9d7b-409c-9b7c-001a4cfec089" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;static&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; Main(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;[] args)&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ProfileOptimization&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.SetProfileRoot(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;@&amp;quot;C:&amp;#92;MyApplicationFolder&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ProfileOptimization&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.StartProfile(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;startup.profile&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;my second recommendation is &lt;a href="http://blogs.microsoft.co.il/blogs/applisec/"&gt;Manu Cohen-Yashar&lt;/a&gt;&amp;#39;s session about &lt;strong&gt;.NET cryptography&lt;/strong&gt;.    &lt;br /&gt;Manu&amp;#39;s talk is great for anyone who want to use the .NET cryptography library.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=2007610" width="1" height="1"&gt;</content><author><name>bnaya</name><uri>http://blogs.microsoft.co.il/members/bnaya.aspx</uri></author><category term="SELA" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx" /><category term="Rx" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Rx/default.aspx" /><category term="Parallel" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Parallel/default.aspx" /><category term="TPL" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/TPL/default.aspx" /><category term="Dataflow" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Dataflow/default.aspx" /><category term="TDF" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/TDF/default.aspx" /><category term="async" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/async/default.aspx" /><category term="await" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/await/default.aspx" /><category term="Reactive Extension" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Reactive+Extension/default.aspx" /><category term="SDP" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SDP/default.aspx" /><category term="TPL Dataflow" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/TPL+Dataflow/default.aspx" /><category term="TAP" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/TAP/default.aspx" /><category term="cryptography" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/cryptography/default.aspx" /><category term="clr" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/clr/default.aspx" /></entry><entry><title>Async / Await for .NET 4, Silverlight and Windows Phone</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2013/05/07/async-await-for-net-4-silverlight-and-windows-phone.aspx" /><id>http://blogs.microsoft.co.il/blogs/bnaya/archive/2013/05/07/async-await-for-net-4-silverlight-and-windows-phone.aspx</id><published>2013-05-07T09:25:00Z</published><updated>2013-05-07T09:25:00Z</updated><content type="html">&lt;h2&gt;Async / Await for .NET 4, Silverlight and Windows Phone&lt;/h2&gt;  &lt;p&gt;if you have to target .NET 4, Silverlight and Windows Phone and    &lt;br /&gt;still want to use the &lt;strong&gt;async / await&lt;/strong&gt; pattern. &lt;/p&gt;  &lt;p&gt;the BCL team provide you with a new NuGet package named &lt;strong&gt;Microsoft.Bcl.Async&lt;/strong&gt;. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/IMG_0368_37D8F7B8.jpg"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="Parallel.Async, await, Task, TPL, BCL" border="0" alt="Parallel.Async, await, Task, TPL, BCL" src="http://blogs.microsoft.co.il/blogs/bnaya/IMG_0368_thumb_3995D55A.jpg" width="463" height="336" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;this package was announced as &lt;strong&gt;stable&lt;/strong&gt; a few week ago.     &lt;br /&gt;so you can check it out if you&amp;#39;re having VS 2012 but should target one of the above platforms.&lt;/p&gt;  &lt;p&gt;be aware that this package won&amp;#39;t work with 2010.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=2004418" width="1" height="1"&gt;</content><author><name>bnaya</name><uri>http://blogs.microsoft.co.il/members/bnaya.aspx</uri></author><category term="SELA" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx" /><category term="Parallel" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Parallel/default.aspx" /><category term="Task" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Task/default.aspx" /><category term="Thread" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Thread/default.aspx" /><category term="TPL" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/TPL/default.aspx" /><category term="await" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/await/default.aspx" /><category term="TAP" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/TAP/default.aspx" /><category term="BCL" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/BCL/default.aspx" /><category term="Parallel.Async" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Parallel.Async/default.aspx" /></entry><entry><title>EF should adopt the WAQS framework</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2013/05/07/ef-should-adopt-the-waqs-framework.aspx" /><id>http://blogs.microsoft.co.il/blogs/bnaya/archive/2013/05/07/ef-should-adopt-the-waqs-framework.aspx</id><published>2013-05-07T09:08:33Z</published><updated>2013-05-07T09:08:33Z</updated><content type="html">&lt;h2&gt;EF should adopt the &lt;strong&gt;WAQS&lt;/strong&gt; framework&lt;/h2&gt;  &lt;p&gt;I was speaking with &lt;a href="http://msmvps.com/blogs/matthieu/default.aspx"&gt;Matthieu MEZIL&lt;/a&gt; about his &lt;a href="http://www.dailymotion.com/video/xuc1jb_waqs-application-scaffolding_tech"&gt;WAQS&lt;/a&gt;&lt;strong&gt;&lt;/strong&gt; framework,     &lt;br /&gt;it is a layer of abstraction over the &lt;strong&gt;Entity Framework&lt;/strong&gt; which I think you should check out.     &lt;br /&gt;&lt;strong&gt;Matthieu&lt;/strong&gt; is working on it on his free time (currently as an open source) and it is amazing to see what he was able to achieve.     &lt;br /&gt;this framework is already been in used by some of &lt;strong&gt;real word company&lt;/strong&gt; and it is improving over time (today Matthieu is working on a new version of it).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/IMG_6590_7676_317C194F.jpg"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="WAQS, EF, Database, ORM" border="0" alt="WAQS, EF, Database, ORM" src="http://blogs.microsoft.co.il/blogs/bnaya/IMG_6590_7676_thumb_1B81BF8B.jpg" width="533" height="429" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;as I see it, Microsoft EF team should adopt this framework as part of the EF open source project. &lt;strong&gt;I hope that the EF team will put the effort to merge it into their source code&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;WAQS is addressing many of the painful scenarios under EF, with a great design and&amp;#160; productivity. &lt;/p&gt;  &lt;p&gt;as I understand &lt;strong&gt;Matthieu is willing to let the EF team to take ownership&lt;/strong&gt; over his labor and I believe that it is an opportunity that will be pity to waste (everything within this framework came out of Matthieu&amp;#39;s field experience in order to ease his customer pain).&lt;/p&gt;  &lt;p&gt;this post is a call to action, if you like this framework or the ideas it represent &lt;strong&gt;&lt;font size="2"&gt;vote&lt;/font&gt; for it at&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/3929780-waqs" href="http://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/3929780-waqs"&gt;http://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/3929780-waqs&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=2004352" width="1" height="1"&gt;</content><author><name>bnaya</name><uri>http://blogs.microsoft.co.il/members/bnaya.aspx</uri></author><category term="SELA" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx" /><category term="Entity Framework" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Entity+Framework/default.aspx" /><category term="EF" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/EF/default.aspx" /><category term="ORM" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/ORM/default.aspx" /><category term="SDP" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SDP/default.aspx" /><category term="Database" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Database/default.aspx" /><category term="WAQS" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/WAQS/default.aspx" /></entry><entry><title>SDP (day 2)</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2013/05/06/sdp-day-2.aspx" /><id>http://blogs.microsoft.co.il/blogs/bnaya/archive/2013/05/06/sdp-day-2.aspx</id><published>2013-05-06T15:53:11Z</published><updated>2013-05-06T15:53:11Z</updated><content type="html">&lt;p&gt;the second day of the SDP was over and I want to thanks all the attendants of my sessions.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/IMG_2617_339184A1.jpg"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="SDP " border="0" alt="SDP " src="http://blogs.microsoft.co.il/blogs/bnaya/IMG_2617_thumb_4CB8F0A7.jpg" width="500" height="360" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;at day 1 I was giving a full day on &lt;strong&gt;TPL&lt;/strong&gt;, I was covering lot of API, tools and techniques.&lt;/p&gt;  &lt;p&gt;the demo codes for this session can be found at &lt;a href="http://sdrv.ms/1283vDW"&gt;http://sdrv.ms/1283vDW&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;the second day session was about &lt;strong&gt;.net 4.5 / VS 2012 new features&lt;/strong&gt;, tolling and overloads for parallel programming.&lt;/p&gt;  &lt;p&gt;the code sample for this session can be found at &lt;a title="http://sdrv.ms/18NeNje" href="http://sdrv.ms/18NeNje"&gt;http://sdrv.ms/18NeNje&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;tomorrow&lt;/strong&gt; I will talk about the new &lt;strong&gt;C# 5 parallel syntax (async / await)&lt;/strong&gt; and    &lt;br /&gt;on &lt;strong&gt;Wednesday&lt;/strong&gt; I will provide a full day on &lt;strong&gt;Rx (reactive Extension)&lt;/strong&gt; and &lt;strong&gt;TDF (TPL Dataflow).&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;I general we are having a successful conference with a local and foreign speakers. &lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=2000497" width="1" height="1"&gt;</content><author><name>bnaya</name><uri>http://blogs.microsoft.co.il/members/bnaya.aspx</uri></author><category term="SELA" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx" /><category term="Parallel" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Parallel/default.aspx" /><category term="SDP" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SDP/default.aspx" /></entry><entry><title>EF 6: Async</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2013/03/19/ef-6-async.aspx" /><id>http://blogs.microsoft.co.il/blogs/bnaya/archive/2013/03/19/ef-6-async.aspx</id><published>2013-03-19T15:02:51Z</published><updated>2013-03-19T15:02:51Z</updated><content type="html">&lt;h2&gt;EF 6: Async&lt;/h2&gt;  &lt;p&gt;this post is the first in a series about what&amp;#39;s new in &lt;strong&gt;EF 6&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;great improvements are about to come with &lt;strong&gt;Entity Framework 6&lt;/strong&gt;.     &lt;br /&gt;it is a major release and the first one since EF become an open source.     &lt;br /&gt;each post in the series will be dedicate to a single feature.&lt;/p&gt;  &lt;p&gt;this post will focus on a new&lt;strong&gt; EF a-sync&lt;/strong&gt; features.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/IMG_1416_38605C8C.jpg"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="EF, Parallel, async, await, task, api, entity" border="0" alt="EF, Parallel, async, await, task, api, entity" src="http://blogs.microsoft.co.il/blogs/bnaya/IMG_1416_thumb_7DE49B10.jpg" width="508" height="351" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;the first question that should be asked is, why do we need &lt;strong&gt;parallel data access&lt;/strong&gt;?     &lt;br /&gt;moreover why do we need a &lt;strong&gt;dedicate parallel data access API&lt;/strong&gt;, rather then using the TPL Task.Run(…) in order to introduce parallelism?&lt;/p&gt;  &lt;p&gt;the answer is related both to &lt;strong&gt;thread safety &lt;/strong&gt;and &lt;strong&gt;ThreadPool&lt;/strong&gt; &lt;strong&gt;optimization&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;a &lt;strong&gt;dedicate data access API&lt;/strong&gt; for &lt;strong&gt;parallel&lt;/strong&gt; programming, ensured a &lt;strong&gt;thread safe access&lt;/strong&gt;, which may not be a trivial task.&lt;/p&gt;  &lt;p&gt;furthermore, when the database is executing a query the .NET thread is idle (waiting for the execution result).    &lt;br /&gt;if this idle thread has taken from &lt;strong&gt;ThreadPool&lt;/strong&gt; (either directly or through high level API like TPL Task.Run(…)) it could lead to a ThreadPool &lt;strong&gt;starvation&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;assuming that you have a 2 second query, Task.Run(…) will hold the ThreadPool&amp;#39;s thread for 2 second even though it idle while the database is executing the query.&lt;/p&gt;  &lt;p&gt;what you really want is an &lt;strong&gt;API that operate over IOCP&lt;/strong&gt; (IO completion port). &lt;strong&gt;IOCP&lt;/strong&gt; &lt;strong&gt;API&lt;/strong&gt; will release the ThreadPool&amp;#39;s thread back to the pool and &lt;strong&gt;re-claim&lt;/strong&gt; &lt;strong&gt;a thread&lt;/strong&gt; at the completion time.&lt;/p&gt;  &lt;p&gt;at the API level you can find &lt;strong&gt;a-sync operations everywhere&lt;/strong&gt;.     &lt;br /&gt;I will present some of the main API.&lt;/p&gt;  &lt;p&gt;the following snippets, will use the following &lt;strong&gt;entities&lt;/strong&gt; (code first):&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:fbe34654-313a-4d52-8dce-d057a79ee95b" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Author&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; Author()&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;Blogs = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;List&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Blog&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;gt;();&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; Id { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; Name { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;IList&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Blog&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;gt; Blogs { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Blog&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; Id { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; Title { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; Content { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; AuthorId { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;and the following &lt;strong&gt;context&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:28fbb720-798b-4adc-b525-a499891febb1" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Context&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; : &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;DbContext&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;DbSet&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Author&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;gt; Authors { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;DbSet&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Blog&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;gt; Blogs { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;h5&gt;a-sync save&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:83e348f2-9cd6-4ca0-9de9-860ef135b5f8" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;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="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; context = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Context&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;())&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;context.Authors.Add(author);&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; affected = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;await&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; context.SaveChangesAsync();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;notice the &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2011/12/29/the-concept-of-async-await.aspx"&gt;await&lt;/a&gt; at line 4.&lt;/p&gt;  &lt;h5&gt;a-sync read&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:1f2f32d3-f7d9-42c6-99d2-f65460397626" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;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="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; context = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Context&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;())&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Author&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;[] authors = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;await&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; context.Authors&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;.Include(a =&amp;gt; a.Blogs)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;.ToArrayAsync();&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; authors;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;strong&gt;line 5&lt;/strong&gt;, is where the magic happens.&lt;/p&gt;  &lt;h5&gt;execute command&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:115f7c17-c8a6-4787-9ef2-d31583d09f3f" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; context = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Context&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;())&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; affected = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;await&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;context.Database.ExecuteSqlCommandAsync(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;DELETE FROM BLOGS&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;h5&gt;summary&lt;/h5&gt;  &lt;p&gt;&lt;strong&gt;EF 6&lt;/strong&gt; is having a great parallel API, which respect &lt;strong&gt;IOCP&lt;/strong&gt; and compatible with the new &lt;strong&gt;async / await&lt;/strong&gt; syntax. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.seladeveloperpractice.com/"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="EF, Parallel, async, await, task, api, entity, sdp" border="0" alt="EF, Parallel, async, await, task, api, entity,sdp" src="http://blogs.microsoft.co.il/blogs/bnaya/sdp-2013_7B87C6BA.png" width="316" height="125" /&gt;&lt;/a&gt;     &lt;br /&gt;&lt;/p&gt; &lt;a href="http://dotnetshoutout.com/EF-6-Async-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%2F2013%2F03%2F19%2Fef-6-async.aspx" /&gt;&lt;/a&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1811777" width="1" height="1"&gt;</content><author><name>bnaya</name><uri>http://blogs.microsoft.co.il/members/bnaya.aspx</uri></author><category term="DEV" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx" /><category term="SELA" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx" /><category term="Parallel" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Parallel/default.aspx" /><category term="Entity Framework" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Entity+Framework/default.aspx" /><category term="EF" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/EF/default.aspx" /><category term="Task" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Task/default.aspx" /><category term="Thread" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Thread/default.aspx" /><category term="async" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/async/default.aspx" /><category term="await" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/await/default.aspx" /><category term="TAP" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/TAP/default.aspx" /><category term="api" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/api/default.aspx" /><category term="entity" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/entity/default.aspx" /></entry><entry><title>Parallel and The C# Memory Model</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2013/03/06/parallel-and-the-c-memory-model.aspx" /><id>http://blogs.microsoft.co.il/blogs/bnaya/archive/2013/03/06/parallel-and-the-c-memory-model.aspx</id><published>2013-03-06T06:46:13Z</published><updated>2013-03-06T06:46:13Z</updated><content type="html">&lt;h2&gt;Parallel and The C# Memory Model&lt;/h2&gt;  &lt;p&gt;&lt;strong&gt;Parallel&lt;/strong&gt; programming &lt;strong&gt;can be tricky&lt;/strong&gt;, both compiler and CPU&amp;#39;s optimization can lead into a twilight zone&amp;#39;s debugging.&lt;/p&gt;  &lt;p&gt;lets take the following code snippet snippet:&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:ad6499c3-499f-4e52-9308-8dc1c0e3c6d4" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;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="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Program&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;static&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; Main(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;[] args)&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Console&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.WriteLine(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;Start&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; u = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Util&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;u.Exec();&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Console&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.ReadKey();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Util&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;bool&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; _stop = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; Exec()&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Task&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; t = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Task&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.Run(() =&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;bool&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; b = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;while&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (_stop)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                    &lt;span style="background:#ffffff;color:#000000;"&gt;b = !b;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Console&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.WriteLine(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;Complete {0}&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;, b);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;});&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Thread&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.Sleep(30);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;_stop = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;false&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;can you predict the outcome?    &lt;br /&gt;will it ever reach the completion at line 24?&lt;/p&gt;  &lt;p&gt;you can download the snippet from &lt;a href="http://sdrv.ms/Y9Tu5t"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;now &lt;a href="http://sdrv.ms/Y9Tu5t"&gt;download&lt;/a&gt; the snippet and try to execute it in the following order:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Compiled in &lt;strong&gt;Debug&lt;/strong&gt; mode and &lt;strong&gt;double click&lt;/strong&gt; on the &lt;strong&gt;exe&lt;/strong&gt; file (without an attached debugger). &lt;/li&gt;    &lt;li&gt;Compiled in &lt;strong&gt;Release &lt;/strong&gt;mode and &lt;strong&gt;double click&lt;/strong&gt; on the &lt;strong&gt;exe&lt;/strong&gt; file (without an attached debugger). &lt;/li&gt;    &lt;li&gt;Compiled in &lt;strong&gt;Release &lt;/strong&gt;mode and run it &lt;strong&gt;F5&lt;/strong&gt; (with an attached debugger). &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/IMG_0713_62B4BA7F.jpg"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="Parallel, Task, Memory model, MemoryBarrier, rase, optimization, reordering" border="0" alt="Parallel, Task, Memory model, MemoryBarrier, rase, optimization, reordering" src="http://blogs.microsoft.co.il/blogs/bnaya/IMG_0713_thumb_4D0A5C15.jpg" width="500" height="411" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;so why does is execute &lt;strong&gt;predictably&lt;/strong&gt; in &lt;strong&gt;Debug mode&lt;/strong&gt;, while behaving quit &lt;strong&gt;strange&lt;/strong&gt; in &lt;strong&gt;Release mode&lt;/strong&gt;?     &lt;br /&gt;even stranger why does it execute &lt;strong&gt;predictably&lt;/strong&gt; in &lt;strong&gt;Release mode&lt;/strong&gt; when a &lt;strong&gt;debugger attached&lt;/strong&gt;?&lt;/p&gt;  &lt;p&gt;what happening is a matter of a &lt;strong&gt;single thread optimization&lt;/strong&gt; that can occurs at the &lt;strong&gt;compiler (JIT)&lt;/strong&gt; or &lt;strong&gt;CPU&lt;/strong&gt; level which is taking &lt;strong&gt;assumption which is not acceptable for parallel execution&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;it can be &lt;strong&gt;fixed&lt;/strong&gt; up using different API like &lt;strong&gt;Thread.MemoryBarrier&lt;/strong&gt; and other.&lt;/p&gt;  &lt;p&gt;instead of explaining this out, I will offer you a reading of &lt;a href="http://msdn.microsoft.com/en-us/magazine/jj863136.aspx"&gt;part 1&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/magazine/jj883956.aspx"&gt;part 2&lt;/a&gt; of a&lt;strong&gt; great article&lt;/strong&gt; on those matters. &lt;/p&gt;  &lt;h5&gt;Summary&lt;/h5&gt;  &lt;p&gt;the &lt;strong&gt;optimization&lt;/strong&gt; world is still &lt;strong&gt;rely on a single thread assumption&lt;/strong&gt; (with some special instruction for parallel execution).     &lt;br /&gt;while the computing world becoming more parallel each day, this single thread assumption priority may have to be change in the future.&lt;/p&gt;  &lt;p&gt;in order to avoid pitfalls, you should be aware o it and use a &lt;strong&gt;parallel dedicated APIs&lt;/strong&gt;.&lt;/p&gt;  &lt;br /&gt;&lt;a href="http://dotnetshoutout.com/Parallel-and-The-C-Memory-Model-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%2F2013%2F03%2F06%2Fparallel-and-the-c-memory-model.aspx" /&gt;&lt;/a&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1781981" width="1" height="1"&gt;</content><author><name>bnaya</name><uri>http://blogs.microsoft.co.il/members/bnaya.aspx</uri></author><category term="DEV" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx" /><category term="SELA" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx" /><category term="Parallel" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Parallel/default.aspx" /><category term="Task" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Task/default.aspx" /><category term="Thread" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Thread/default.aspx" /><category term="TPL" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/TPL/default.aspx" /><category term="TPL Dataflow" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/TPL+Dataflow/default.aspx" /><category term="continuation" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/continuation/default.aspx" /><category term="Concurrency" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Concurrency/default.aspx" /><category term="rase" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/rase/default.aspx" /><category term="optimization" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/optimization/default.aspx" /><category term="MemoryBarrier" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/MemoryBarrier/default.aspx" /><category term="reordering" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/reordering/default.aspx" /><category term="Memory model" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Memory+model/default.aspx" /></entry><entry><title>Immutable Collections</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2013/02/17/immutable-collections.aspx" /><id>http://blogs.microsoft.co.il/blogs/bnaya/archive/2013/02/17/immutable-collections.aspx</id><published>2013-02-17T19:45:12Z</published><updated>2013-02-17T19:45:12Z</updated><content type="html">&lt;h2&gt;Immutable Collections &lt;/h2&gt;  &lt;p&gt;&lt;strong&gt;Immutability&lt;/strong&gt; is a pattern which is suit well &lt;strong&gt;parallel programming&lt;/strong&gt;,     &lt;br /&gt;but you have to be aware of a potential &lt;strong&gt;memory pressure risk&lt;/strong&gt; when it&amp;#39;s not implemented right or used wisely.&lt;/p&gt;  &lt;p&gt;this post will cover a new &lt;strong&gt;BCL library&lt;/strong&gt; (still in its preview stage) which is targeting&lt;strong&gt; immutable collections&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/IMG_0382_692BD55A.jpg"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="Immutable, Parallel, Task, BCL, collection, Thread-safe" border="0" alt="Immutable, Parallel, Task, BCL, collection, Thread-safe" src="http://blogs.microsoft.co.il/blogs/bnaya/IMG_0382_thumb_6CE97A2A.jpg" width="423" height="308" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;.NET&lt;/strong&gt; is already having &lt;strong&gt;Concurrent implementation&lt;/strong&gt; for Queue, Stack, Bug and Dictionary, which is &lt;strong&gt;thread-safe&lt;/strong&gt;, but other type of collection like List is missing.     &lt;br /&gt;another type of collection are &lt;strong&gt;read only collection&lt;/strong&gt;, but those type of collection are &lt;strong&gt;not truly thread-safe&lt;/strong&gt; because it is just a wrapper upon other collection which can be mutate by it&amp;#39;s owner.     &lt;br /&gt;so &lt;strong&gt;iterating on a read only collection doesn&amp;#39;t guarantee thread-safety&lt;/strong&gt; because the collection can be mutate during the iteration by it&amp;#39;s original owner.     &lt;br /&gt;currently we do have one option to create an &lt;strong&gt;immutable collection&lt;/strong&gt; by using the &lt;strong&gt;ToArray()&lt;/strong&gt; extension method, but as I mentioned before it &lt;strong&gt;can lead to a memory pressure&lt;/strong&gt; while using a large collection.&lt;/p&gt;  &lt;p&gt;the &lt;strong&gt;BCL team&lt;/strong&gt; was targeting this issue and are working on a new kind of collections which are immutable.     &lt;br /&gt;those collection is having a cool concept which guarantee that an immutable sequence will not changed, but it can be part of another immutable sequence. this mean that you can take an immutable collection and add an item. this will keep the immutable part as is and you will get a new collection that include your addition and the original collection, but if someone is using the original collection he won&amp;#39;t be affected by your mutation.     &lt;br /&gt;as you can see the &lt;strong&gt;BCL immutable collection&lt;/strong&gt; &lt;strong&gt;can be&lt;/strong&gt; &lt;strong&gt;mutate&lt;/strong&gt; but the mutation will return a new collection and leave the original collection untouched.&lt;/p&gt;  &lt;h5&gt;Start using the immutable collection&lt;/h5&gt;  &lt;p&gt;you can start using it though &lt;a href="https://nuget.org/packages/Microsoft.Bcl.Immutable"&gt;NuGet&lt;/a&gt;.     &lt;br /&gt;on the current preview version it includes:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;ImmutableStack&amp;lt;T&amp;gt; &lt;/li&gt;    &lt;li&gt;ImmutableQueue&amp;lt;T&amp;gt; &lt;/li&gt;    &lt;li&gt;ImmutableList&amp;lt;T&amp;gt; &lt;/li&gt;    &lt;li&gt;ImmutableHashSet&amp;lt;T&amp;gt; &lt;/li&gt;    &lt;li&gt;ImmutableSortedSet&amp;lt;T&amp;gt; &lt;/li&gt;    &lt;li&gt;ImmutableDictionary&amp;lt;K, V&amp;gt; &lt;/li&gt;    &lt;li&gt;ImmutableSortedDictionary&amp;lt;K, V&amp;gt; &lt;/li&gt; &lt;/ul&gt;  &lt;h5&gt;Fluent API&lt;/h5&gt;  &lt;p&gt;I will speak about 3 APIs:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Add &lt;/li&gt;    &lt;li&gt;AddRange &lt;/li&gt;    &lt;li&gt;Builder &lt;/li&gt; &lt;/ul&gt;  &lt;h6&gt;Add&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:6e44ba97-9c59-49e9-8793-4d1ed33706a6" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;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="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Test&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; List_AddItem_Test()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; col = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ImmutableList&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;gt;.Empty;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; col1 = col.Add(1);&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; col2 = col1.Add(2);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Assert&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.AreEqual(0, col.Count);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Assert&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.AreEqual(1, col1.Count);&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Assert&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.AreEqual(2, col2.Count);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;whenever you want an &lt;strong&gt;empty instance&lt;/strong&gt; of immutable collection you should use the &lt;strong&gt;static Empty property&lt;/strong&gt; (there is no public constructor available).&lt;/p&gt;  &lt;p&gt;you should always remember that Adding an item will &lt;strong&gt;not affect the original collection&lt;/strong&gt; therefore you must &lt;strong&gt;handle the return value&lt;/strong&gt; (is is the same concept as string.Replace).&lt;/p&gt;  &lt;p&gt;finally you can notice at lines 8-10 that the above code was actually construct 3 different immutable collections.&lt;/p&gt;  &lt;h6&gt;AddRange&lt;/h6&gt;  &lt;p&gt;both from &lt;strong&gt;performance&lt;/strong&gt; and &lt;strong&gt;usability&lt;/strong&gt; it is better using the &lt;strong&gt;AddRange&lt;/strong&gt; API when you intend to add multiple items.&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:4a59b070-234d-40da-af88-f5149f6ae735" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;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="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Test&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; List_AddRange_Test()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; col = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ImmutableList&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;gt;.Empty;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; col1 = col.AddRange(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Enumerable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.Range(0, 1000));&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Assert&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.AreEqual(0, col.Count);&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Assert&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.AreEqual(1000, col1.Count);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;h6&gt;Builder&lt;/h6&gt;  &lt;p&gt;if you want to &lt;strong&gt;efficiently&lt;/strong&gt; &lt;strong&gt;add multiple items&lt;/strong&gt; and AddRange doesn&amp;#39;t do the job for you, you can use a &lt;strong&gt;Builder&lt;/strong&gt; (the concept is quit similar to StringBuilder).     &lt;br /&gt;you should remember that &lt;strong&gt;unlike the immutable collection a builder is not a thread-safe&lt;/strong&gt; structure, therefore you shouldn&amp;#39;t share its state between threads.     &lt;br /&gt;when you complete the mutation, you can &lt;strong&gt;extract an immutable collection from the builder&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:74e71650-2eaf-46b2-b766-eed18f1569aa" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;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="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Test&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; List_Builder_Test()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; col = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Enumerable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.Range(0, 1000).ToImmutableList();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; builder = col.ToBuilder();&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;for&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; i = 0; i &amp;lt; 100; i++)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;builder.Remove(i * 10);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; col1 = builder.ToImmutable();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Assert&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.AreEqual(1000, col.Count);&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Assert&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.AreEqual(900, col1.Count);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;strong&gt;line 5&lt;/strong&gt;: getting a builder from immutable collection.     &lt;br /&gt;&lt;strong&gt;line 10&lt;/strong&gt;: getting an immutable back from the builder (after the mutation).&lt;/p&gt;  &lt;h5&gt;Migration&lt;/h5&gt;  &lt;p&gt;if you are using a read only collection though the IReadOnlyCollection, IReadOnlyList or IReadOnlyDictionary, migration will be easy because the immutable collections are implementing those interfaces.&lt;/p&gt;  &lt;h5&gt;Optimization&lt;/h5&gt;  &lt;p&gt;we already spoke about the memory pressure optimization, but what is the characterize of those collection in compare with the well known BCL mutable collection?    &lt;br /&gt;as the BCL team argue that &lt;strong&gt;immutable collections have been heavily tuned for maximum performance and minimum GC pressure&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;the following table was published by the &lt;strong&gt;BCL team&lt;/strong&gt;.     &lt;br /&gt;it &lt;strong&gt;compare the performance behavior of the BCL immutable and immutable&lt;/strong&gt; &lt;strong&gt;collection&lt;/strong&gt; (and remember that this is only a preview version which mean that further optimization can be applied).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/immutable-table_3C72F5B4.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="Immutable, Parallel, Task, BCL, collection, Thread-safe" border="0" alt="Immutable, Parallel, Task, BCL, collection, Thread-safe" src="http://blogs.microsoft.co.il/blogs/bnaya/immutable-table_thumb_33A2ED68.png" width="492" height="179" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;you can read more on this at &lt;a href="http://blogs.msdn.com/b/bclteam/archive/2012/12/18/preview-of-immutable-collections-released-on-nuget.aspx"&gt;this&lt;/a&gt; post.&lt;/p&gt;  &lt;h5&gt;summary&lt;/h5&gt;  &lt;p&gt;&lt;strong&gt;Immutability&lt;/strong&gt; is a great pattern for &lt;strong&gt;parallelism&lt;/strong&gt;.     &lt;br /&gt;the BCL team are giving us a robust and &lt;strong&gt;well design immutable collection&lt;/strong&gt;.     &lt;br /&gt;the potential memory pressure has reduced by the internal data-structure design.     &lt;br /&gt;so it is definitely something to wait for its release.&lt;/p&gt;  &lt;p&gt;you can read more about it at &lt;a href="http://blogs.msdn.com/b/bclteam/archive/2012/12/18/preview-of-immutable-collections-released-on-nuget.aspx"&gt;here&lt;/a&gt;.     &lt;br /&gt;and if you want more background and comparison to the read only collection, you can check out &lt;a href="http://blogs.msdn.com/b/andrewarnottms/archive/2011/08/22/read-only-frozen-and-immutable-types-and-collections.aspx"&gt;this&lt;/a&gt; post.&lt;/p&gt;  &lt;br /&gt;&lt;a href="http://dotnetshoutout.com/Immutable-Collections-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%2F2013%2F02%2F17%2Fimmutable-collections.aspx" /&gt;&lt;/a&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1751972" width="1" height="1"&gt;</content><author><name>bnaya</name><uri>http://blogs.microsoft.co.il/members/bnaya.aspx</uri></author><category term="DEV" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx" /><category term="Extensibility" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Extensibility/default.aspx" /><category term="SELA" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx" /><category term="extension" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/extension/default.aspx" /><category term="Composition" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Composition/default.aspx" /><category term="ImportMany" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/ImportMany/default.aspx" /><category term="Export" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Export/default.aspx" /><category term="Import" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Import/default.aspx" /><category term="Parallel" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Parallel/default.aspx" /><category term="Task" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Task/default.aspx" /><category term="CompositionContainer" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/CompositionContainer/default.aspx" /><category term="collection" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/collection/default.aspx" /><category term="BCL" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/BCL/default.aspx" /><category term="Immutable" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Immutable/default.aspx" /><category term="Thread-safe" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Thread-safe/default.aspx" /></entry><entry><title>MEF 2.0 - mini series: part 8 (Composition options and exception handling)</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2013/02/16/mef-2-0-mini-series-part-8-composition-options-and-exception-handling.aspx" /><id>http://blogs.microsoft.co.il/blogs/bnaya/archive/2013/02/16/mef-2-0-mini-series-part-8-composition-options-and-exception-handling.aspx</id><published>2013-02-16T14:05:57Z</published><updated>2013-02-16T14:05:57Z</updated><content type="html">&lt;h2&gt;MEF 2.0 - mini series: part 8 (Composition options and exception handling)&lt;/h2&gt;  &lt;p&gt;this is the last post in the &lt;strong&gt;MEF 2.0&lt;/strong&gt; mini series.     &lt;br /&gt;you can see other posts of this series in &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2013/01/06/mef-2-0-toc.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;this post will wrap-up the series with a quick survey to to the to some changes made for the &lt;strong&gt;underline composition&lt;/strong&gt; process.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/IMG_0389_08C6B15D.jpg"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="MEF, SELA, Export, Import, CompositionContainer, RegistrationBuilder, Catalog" border="0" alt="MEF, SELA, Export, Import, CompositionContainer, RegistrationBuilder, Catalog" src="http://blogs.microsoft.co.il/blogs/bnaya/IMG_0389_thumb_6D41AF59.jpg" width="449" height="232" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h5&gt;Exception &lt;/h5&gt;  &lt;p&gt;one of the most painful experience of MEF 1 was its &lt;strong&gt;misleading exception&amp;#39;s description&lt;/strong&gt;. some time it was really hard to figure out the exception roots.&amp;#160; you can read more about MEF 1 issues in &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2011/03/18/sdp-mef-real-life-patterns.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;MEF 2&lt;/strong&gt; was doing a much better job, but still some composition failure are misleading.     &lt;br /&gt;my recommendation is to use the &lt;strong&gt;IPartImportsSatisfiedNotification&lt;/strong&gt; which can give you an interception point where you can figure out what went wrong, before MEF is throwing a composition exception.&lt;/p&gt;  &lt;p&gt;the pattern that I&amp;#39;m using is to allow default on any imports and validate it on the OnImportsSatisfied method, see the next snippet:&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:07fccf84-12ee-405b-9fdf-329cf30fbcdb" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Foo&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; : &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;IPartImportsSatisfiedNotification&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Import&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(AllowDefault=&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)]&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;IIdentity&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; Identity { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ImportMany&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;IReflect&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;[] Reflects { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; OnImportsSatisfied()&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (Identity == &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Trace&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.WriteLine(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;Composition failure (Identity)&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;throw&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ArgumentNullException&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;Identity&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (Reflects == &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; || Reflects.Length == 0)&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Trace&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.WriteLine(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;Composition failure (Reflects)&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;throw&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ArgumentNullException&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;Reflects&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;h5&gt;Composition options&lt;/h5&gt;  &lt;p&gt;&lt;strong&gt;MEF 2&lt;/strong&gt; is exposing some &lt;strong&gt;composition tuning options&lt;/strong&gt; that wasn&amp;#39;t available on MEF 1.     &lt;br /&gt;there was some &lt;strong&gt;hidden composition assumptions&lt;/strong&gt; which you couldn&amp;#39;t modified.     &lt;br /&gt;I will focus on the &lt;strong&gt;DisableSilentRejection&lt;/strong&gt; options.     &lt;br /&gt;silent rejection was added into MEF composition in order to support &lt;strong&gt;robust composition&lt;/strong&gt; of &lt;strong&gt;ill functioning plug-ins&lt;/strong&gt;. the requirement for this feature came from the Visual Studio team which is using MEF for their plug-in model.     &lt;br /&gt;anyway you might want to alter this behavior. MEF 2 doe&amp;#39;s let you the option to disable it.     &lt;br /&gt;the original behavior will &lt;strong&gt;exclude&lt;/strong&gt; the ill functioning plug-in from the composition (for import many) without throwing an exception.     &lt;br /&gt;this led to scenarios when you had a real hard time to figure out why some of the plug-in wasn&amp;#39;t loading and still everything seem to be working.&lt;/p&gt;  &lt;p&gt;the following snippet is demonstrating this scenario:&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:61b43611-220e-4b89-9463-0416020f0b00" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;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="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Program&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;static&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; Main(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;[] args)&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; p = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Program&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;();&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; cat = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;AssemblyCatalog&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Assembly&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.GetExecutingAssembly());&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; container = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;CompositionContainer&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(cat, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;CompositionOptions&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.DisableSilentRejection);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;try&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;container.ComposeParts(p);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Console&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.WriteLine(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;{0} Plug-ins loaded&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;, p.Plugins.Length);&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;catch&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;CompositionException&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Console&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.WriteLine(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;Composition error&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ImportMany&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Iplugin&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;[] Plugins { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;InheritedExport&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;interface&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Iplugin&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; { }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;BadPlugin&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; : &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Iplugin&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Import&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;IIdentity&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;))]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;IIdentity&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; MissingDependency { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;FinePlugin&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; : &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Iplugin&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; { }&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;strong&gt;line 8&lt;/strong&gt;: &lt;strong&gt;disabling the silent rejection&lt;/strong&gt; behavior.     &lt;br /&gt;&lt;strong&gt;line 28 - 32&lt;/strong&gt;: a class that is having a &lt;strong&gt;missing dependencies&lt;/strong&gt;, therefore cannot be construct. on silent rejection mode (which is the default) it will be simply &lt;strong&gt;removed from the composition&lt;/strong&gt; and the Plugins property at line 22 will get a single plug-in rather then 2.&lt;/p&gt;  &lt;h5&gt;Summary&lt;/h5&gt;  &lt;p&gt;MEF 2 is having improvements both in the engine and the API level.    &lt;br /&gt;you do have more control over the composition and better descriptive exception.&lt;/p&gt;  &lt;br /&gt;&lt;a href="http://dotnetshoutout.com/MEF-20-mini-series-part-8-Composition-options-and-exception-handling-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%2F2013%2F02%2F16%2Fmef-2-0-mini-series-part-8-composition-options-and-exception-handling.aspx" /&gt;&lt;/a&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1750200" width="1" height="1"&gt;</content><author><name>bnaya</name><uri>http://blogs.microsoft.co.il/members/bnaya.aspx</uri></author><category term="DEV" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx" /><category term="MEF" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/MEF/default.aspx" /><category term="SELA" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx" /><category term="Composition" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Composition/default.aspx" /><category term="ImportMany" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/ImportMany/default.aspx" /><category term="Export" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Export/default.aspx" /><category term="Import" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Import/default.aspx" /><category term="CompositionContainer" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/CompositionContainer/default.aspx" /><category term="RegistrationBuilder" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/RegistrationBuilder/default.aspx" /><category term="Catalog" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Catalog/default.aspx" /></entry><entry><title>The problem of animals and foods</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2013/02/08/the-problem-of-animals-and-foods.aspx" /><id>http://blogs.microsoft.co.il/blogs/bnaya/archive/2013/02/08/the-problem-of-animals-and-foods.aspx</id><published>2013-02-08T16:51:51Z</published><updated>2013-02-08T16:51:51Z</updated><content type="html">&lt;h2&gt;The problem of animals and foods&lt;/h2&gt;  &lt;p&gt;this is a short post that is dealing with a classic riddle.&lt;/p&gt;  &lt;p&gt;I was thinking on this riddle when I was trying to figure out a &lt;a href="http://scala-ide.org/" target="_blank"&gt;Scala&lt;/a&gt; feature. we are having (at Sela Group) a small &lt;a href="http://scala-ide.org/" target="_blank"&gt;Scala&lt;/a&gt; study group led by &lt;a href="http://practicaldroid.blogspot.co.il/" target="_blank"&gt;Israel Tabadi&lt;/a&gt; and while we were going over &lt;a href="http://docs.scala-lang.org/tutorials/tour/abstract-types.html" target="_blank"&gt;Scala&amp;#39;s abstract type&lt;/a&gt; (which is by the way a cool implementation) I was thinking about the &lt;strong&gt;.NET equivalent&lt;/strong&gt; solution.&lt;/p&gt;  &lt;p&gt;I will use the problem of &amp;quot;&lt;strong&gt;animals and foods&lt;/strong&gt;&amp;quot; (taken from &lt;a href="http://stackoverflow.com/questions/1154571/scala-abstract-types-vs-generics" target="_blank"&gt;here&lt;/a&gt;) as an anchor&amp;#39;s point.&lt;/p&gt;  &lt;p&gt;The problem: assuming an &lt;strong&gt;Animal&lt;/strong&gt; with a method, &lt;strong&gt;Eat&lt;/strong&gt;, which eats some food. and the riddle is, how can you &lt;strong&gt;restrict a Cow&lt;/strong&gt; (which derived from an Animal), to eat nothing but &lt;strong&gt;Grass&lt;/strong&gt; (at compile time). A &lt;strong&gt;Cow&lt;/strong&gt; &lt;strong&gt;can&amp;#39;t eat an arbitrary food like Fish&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;the idea is to &lt;strong&gt;restrict&lt;/strong&gt; a Cow to a &lt;strong&gt;specialize type of food&lt;/strong&gt; which is Grass.&lt;/p&gt;  &lt;p&gt;the &lt;strong&gt;Scala version&lt;/strong&gt; is available &lt;a href="https://skydrive.live.com/redir?resid=9BF7C1A515D76A9A!6066&amp;amp;authkey=!AAmowWyCxq0uunY" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;now take your time and think of how can you solve it using &lt;strong&gt;.NET&lt;/strong&gt; and &lt;strong&gt;Generics&lt;/strong&gt;?&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/IMG_0345_6CB1FF0A.jpg"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="Scala, Generics, Abstract, Type, animals and foods, .NET" border="0" alt="Scala, Generics, Abstract, Type, animals and foods, .NET" src="http://blogs.microsoft.co.il/blogs/bnaya/IMG_0345_thumb_75DE147E.jpg" width="491" height="341" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;the solution is to &lt;strong&gt;assign the Cow&amp;#39;s type to Grass&lt;/strong&gt; (as simple as it is, sometimes it can slip away).&lt;/p&gt;  &lt;p&gt;the solution is present on the following snippet:&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:2b70993f-ab93-4725-a819-ca246be13df5" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;abstract&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Food&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; { }&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Grass&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; : &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Food&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; { }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Club&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; : &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Grass&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; { }&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;DogFood&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; : &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Food&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; { }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;abstract&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Animal&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;lt;T&amp;gt; &lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;where&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; T : &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Food&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; eat(T food)&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Console&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.WriteLine(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;{0} eat {1}&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.GetType().Name, food.GetType().Name);&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Cow&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;: &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Animal&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Grass&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;gt; &lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Dog&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; : &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Animal&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;DogFood&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;gt; &lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;the following snippet is the main method part:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:7bd78259-046b-45d8-b364-669b283406d9" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; dogFood = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;DogFood&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;();&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; grass = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Grass&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; club = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Club&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;();&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; dog = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Dog&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;();&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; cow = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Cow&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;dog.eat(dogFood);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;//dog.eat(grass) // not compiled&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;cow.eat(grass);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;cow.eat(club);    &lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;    &lt;p&gt;and the result is:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/AnimalEatFood_0C50B306.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="Scala, Generics, Abstract, Type, animals and foods, .NET" border="0" alt="Scala, Generics, Abstract, Type, animals and foods, .NET" src="http://blogs.microsoft.co.il/blogs/bnaya/AnimalEatFood_thumb_232F8482.png" width="350" height="165" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;br /&gt;&lt;a href="http://dotnetshoutout.com/The-problem-of-animals-and-foods-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%2F2013%2F02%2F08%2Fthe-problem-of-animals-and-foods.aspx" /&gt;&lt;/a&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1738713" width="1" height="1"&gt;</content><author><name>bnaya</name><uri>http://blogs.microsoft.co.il/members/bnaya.aspx</uri></author><category term="DEV" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx" /><category term="SELA" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx" /><category term=".net" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net/default.aspx" /><category term="Generics" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Generics/default.aspx" /><category term="Type" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Type/default.aspx" /><category term="animals and foods" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/animals+and+foods/default.aspx" /><category term="Abstract" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Abstract/default.aspx" /><category term="Scala" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Scala/default.aspx" /></entry><entry><title>MEF 2.0 - mini series: Part 7 (Catalog filter and Deep hierarchic scoping)</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2013/01/24/mef-2-0-mini-series-part-7-catalog-filter-and-deep-hierarchic-scoping.aspx" /><id>http://blogs.microsoft.co.il/blogs/bnaya/archive/2013/01/24/mef-2-0-mini-series-part-7-catalog-filter-and-deep-hierarchic-scoping.aspx</id><published>2013-01-24T16:31:18Z</published><updated>2013-01-24T16:31:18Z</updated><content type="html">&lt;h2&gt;MEF 2.0 - mini series: Part 7 (Catalog filter and Deep hierarchic scoping)&lt;/h2&gt;  &lt;p&gt;this is the 7th post in the &lt;strong&gt;MEF 2.0&lt;/strong&gt; mini series.     &lt;br /&gt;you can see the following &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2013/01/06/mef-2-0-toc.aspx"&gt;TOC&lt;/a&gt; for other posts in this series.&lt;/p&gt;  &lt;p&gt;in the &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2013/01/16/mef-2-0-mini-series-part-6-composition-scoping-and-lifetime-management.aspx" target="_blank"&gt;previous&lt;/a&gt; post I was talking about &lt;strong&gt;composition scoping &lt;/strong&gt;and &lt;strong&gt;lifetime management.&lt;/strong&gt;     &lt;br /&gt;on this one, I will extend the &lt;strong&gt;composition scoping&lt;/strong&gt; topic toward &lt;strong&gt;hierarchic&lt;/strong&gt; along with &lt;strong&gt;catalog filtering&lt;/strong&gt; capability.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/IMG_6354_3E65F039.jpg"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="MEF, extension, Composition, ImportMany, Export, Import, .NET 4.5, egistrationBuilder, Catalog" border="0" alt="MEF, extension, Composition, ImportMany, Export, Import, .NET 4.5, egistrationBuilder, Catalog" src="http://blogs.microsoft.co.il/blogs/bnaya/IMG_6354_thumb_05F7C961.jpg" width="373" height="368" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;hierarchic scoping&lt;/strong&gt; is not trivial, you must understand the hierarchic behavior and what it was design for.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;MEF hierarchic&lt;/strong&gt; was &lt;strong&gt;design&lt;/strong&gt; to enable &lt;strong&gt;parts &lt;/strong&gt;from &lt;strong&gt;higher scope &lt;/strong&gt;to access &lt;strong&gt;lower scope&amp;#39;s part&lt;/strong&gt; without re-instantiation, lower part do not target higher scope&amp;#39;s part directly.&lt;/p&gt;  &lt;p&gt;each hierarchic scope construct by importing a &lt;strong&gt;ExportFactory&amp;lt;T&amp;gt;&lt;/strong&gt; (which we saw in the previous post).&lt;/p&gt;  &lt;p&gt;I will try to make it as simple as I can.&lt;/p&gt;  &lt;p&gt;the following diagram demonstrate the idea of &lt;strong&gt;sub scope&lt;/strong&gt; that &lt;strong&gt;interact with its parent scope&amp;#39;s items&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/SubScope_113DDFA4.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="MEF, extension, Composition, ImportMany, Export, Import, .NET 4.5, egistrationBuilder, Catalog" border="0" alt="MEF, extension, Composition, ImportMany, Export, Import, .NET 4.5, egistrationBuilder, Catalog" src="http://blogs.microsoft.co.il/blogs/bnaya/SubScope_thumb_76251095.png" width="371" height="459" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;let try to have a similar code structures.&lt;/p&gt;  &lt;p&gt;I will use a plug-in base class to trace the instantiations:&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:25b11936-2884-4ae7-b73d-702f0d714feb" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;abstract&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;PluginBase&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;static&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; _globalId = 0;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;protected&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; _id;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; PluginBase()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;_id = _globalId++; &lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;// not thread-safe&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;derived class&amp;#39;s ids will be incremented per instantiation. &lt;/p&gt;  &lt;p&gt;the following snippet include the classes which will be used for our hierarchic demonstration:&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:b4a6d890-4976-4cfd-b8c1-4a8ed9535156" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;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="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Level1ScopeRoot&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; : &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;PluginBase&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Import&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Level1ItemA&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; ItemA { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Import&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Level1ItemB&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; ItemB { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Level1ItemShared&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; : &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;PluginBase&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; { }&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Level1ItemA&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; : &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;PluginBase&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Import&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Level1ItemShared&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; ItemZ { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Level1ItemB&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; : &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;PluginBase&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Import&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Level1ItemShared&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; SharedItem { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Import&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ExportFactory&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Level2SubScopeRoot&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;gt; SubScope { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Level2SubScopeRoot&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; : &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;PluginBase&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Import&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Level2SubItem1&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; SubItem1 { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Import&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Level2SubItem2&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; SubItem2 { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Level2SubItem1&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; : &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;PluginBase&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Import&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Level1ItemShared&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; ItemShared { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Import&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Level2SubItemShared&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; SubItemShared { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Level2SubItem2&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; : &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;PluginBase&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Import&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Level2SubItemShared&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; SubItem { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Level2SubItemShared&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; : &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;PluginBase&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; { }&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;all the classes prefixed with the scoping &amp;#39;&lt;strong&gt;Level&lt;/strong&gt;&amp;#39;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;referring a sub-scope&lt;/strong&gt; required using of &lt;strong&gt;ExportFactory&amp;lt;T&amp;gt; &lt;/strong&gt;(line 23).&lt;/p&gt;  &lt;p&gt;the following diagram is showing their hierarchic and dependencies graph:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/SubScope1_0D03E212.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="MEF, extension, Composition, ImportMany, Export, Import, .NET 4.5, egistrationBuilder, Catalog" border="0" alt="MEF, extension, Composition, ImportMany, Export, Import, .NET 4.5, egistrationBuilder, Catalog" src="http://blogs.microsoft.co.il/blogs/bnaya/SubScope1_thumb_23E2B38E.png" width="487" height="457" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;our final step is to define a &lt;strong&gt;catalog per scope&amp;#39;s hierarchic&lt;/strong&gt; and to &lt;strong&gt;set hierarchic structure&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:cb185349-f5b2-4c6e-a386-5622630e500b" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;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="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; picker = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;RegistrationBuilder&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;();&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;picker.ForTypesDerivedFrom&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;PluginBase&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;gt;()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000;"&gt;// add ScopeLevel metadata &lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;.AddMetadata(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;ScopeLevel&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;, t =&amp;gt; t.Name.StartsWith(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;Level1&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;) ? 1 : 2)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;.Export&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;PluginBase&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;gt;();&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; catalog = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;AssemblyCatalog&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Program&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).Assembly, picker);&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; catalogL0 = catalog.Filter(p =&amp;gt; p.ContainsPartMetadata(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;ScopeLevel&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;, 1));&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; catalogL1 = catalog.Filter(p =&amp;gt; p.ContainsPartMetadata(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;ScopeLevel&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;, 2));&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; scopeL1 = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;CompositionScopeDefinition&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(catalogL1, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; scopeL0 = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;CompositionScopeDefinition&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(catalogL0, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;[] { scopeL1 });&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; container = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;CompositionContainer&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(scopeL0);&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;at line 2-5, I &lt;strong&gt;export&lt;/strong&gt; &lt;strong&gt;everything inherits from &amp;#39;PluginBase&amp;#39;&lt;/strong&gt; and &lt;strong&gt;adding a &amp;#39;ScopeLevel&amp;#39; metadata&lt;/strong&gt; with the right scope leveling value.&lt;/p&gt;  &lt;p&gt;line 7, define a general &lt;strong&gt;assembly catalog&lt;/strong&gt; (which will be the base for the filtered catalogs).&lt;/p&gt;  &lt;p&gt;lines 9,10, are defining a &lt;strong&gt;filtered catalog&lt;/strong&gt; for each scoping level (filtering an existing assembly catalog).&lt;/p&gt;  &lt;p&gt;lines 12,13, &lt;strong&gt;defines&lt;/strong&gt; the &lt;strong&gt;hierarchic&lt;/strong&gt; between the scoped catalogs.&lt;/p&gt;  &lt;p&gt;line 15, create a &lt;strong&gt;container&lt;/strong&gt; with the top level scope.&lt;/p&gt;  &lt;p&gt;now we&amp;#39;re ready for a composition.&lt;/p&gt;  &lt;p&gt;&lt;a href="https://skydrive.live.com/?cid=9bf7c1a515d76a9a&amp;amp;id=9BF7C1A515D76A9A%216037" target="_blank"&gt;here&lt;/a&gt; you can download a &lt;a href="https://skydrive.live.com/?cid=9bf7c1a515d76a9a&amp;amp;id=9BF7C1A515D76A9A%216037" target="_blank"&gt;sample code&lt;/a&gt;.&lt;/p&gt;  &lt;h5&gt;Summary&lt;/h5&gt;  &lt;p&gt;I consider this feature as &lt;strong&gt;MEF 2&lt;/strong&gt;&amp;#39;s most complex one.&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Hierarchic&lt;/strong&gt; can become complex, so use it with caution.&lt;/p&gt;  &lt;br /&gt;&lt;a href="http://dotnetshoutout.com/MEF-20-mini-series-Part-7-Catalog-filter-and-Deep-hierarchic-scoping-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%2F2013%2F01%2F24%2Fmef-2-0-mini-series-part-7-catalog-filter-and-deep-hierarchic-scoping.aspx" /&gt;&lt;/a&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1696250" width="1" height="1"&gt;</content><author><name>bnaya</name><uri>http://blogs.microsoft.co.il/members/bnaya.aspx</uri></author><category term="DEV" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx" /><category term="MEF" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/MEF/default.aspx" /><category term="SELA" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx" /><category term="extension" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/extension/default.aspx" /><category term="Composition" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Composition/default.aspx" /><category term="ImportMany" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/ImportMany/default.aspx" /><category term="Export" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Export/default.aspx" /><category term="Import" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Import/default.aspx" /><category term="Metadata" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Metadata/default.aspx" /><category term=".NET 4.5" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.NET+4.5/default.aspx" /><category term="exception" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/exception/default.aspx" /><category term="Catalog" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Catalog/default.aspx" /><category term="egistrationBuilder" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/egistrationBuilder/default.aspx" /></entry><entry><title>This Week On Channel 9</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2013/01/16/channel-9-illumiroom.aspx" /><id>http://blogs.microsoft.co.il/blogs/bnaya/archive/2013/01/16/channel-9-illumiroom.aspx</id><published>2013-01-16T06:59:33Z</published><updated>2013-01-16T06:59:33Z</updated><content type="html">&lt;h2&gt;This Week On Channel 9&lt;/h2&gt;  &lt;p&gt;my blog was manage to get on Channel 9 week&amp;#39;s top developer &lt;a href="http://channel9.msdn.com/Shows/This+Week+On+Channel+9/TWC9-January-11-2013" target="_blank"&gt;news&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/IMG_0090_36C0F979.jpg"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="ch9, MEF, bnaya, news, ,net 4.5" border="0" alt="ch9, MEF, bnaya, news, ,net 4.5" src="http://blogs.microsoft.co.il/blogs/bnaya/IMG_0090_thumb_453BF59E.jpg" width="461" height="373" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1667333" width="1" height="1"&gt;</content><author><name>bnaya</name><uri>http://blogs.microsoft.co.il/members/bnaya.aspx</uri></author><category term="DEV" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx" /><category term="MEF" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/MEF/default.aspx" /><category term="SELA" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx" /><category term="Bnaya" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Bnaya/default.aspx" /><category term="net 4.5" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/net+4.5/default.aspx" /><category term="news" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/news/default.aspx" /><category term="ch9" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/ch9/default.aspx" /></entry><entry><title>MEF 2.0 - mini series: part 6 (Composition scoping and lifetime management)</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2013/01/16/mef-2-0-mini-series-part-6-composition-scoping-and-lifetime-management.aspx" /><id>http://blogs.microsoft.co.il/blogs/bnaya/archive/2013/01/16/mef-2-0-mini-series-part-6-composition-scoping-and-lifetime-management.aspx</id><published>2013-01-16T06:21:01Z</published><updated>2013-01-16T06:21:01Z</updated><content type="html">&lt;h3&gt;MEF 2.0 - mini series: part 6 &lt;/h3&gt;  &lt;h3&gt;(Composition scoping and lifetime management)&lt;/h3&gt;  &lt;p&gt;this is the 6th post in the &lt;strong&gt;MEF 2.0&lt;/strong&gt; mini series.     &lt;br /&gt;you can see the following &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2013/01/06/mef-2-0-toc.aspx"&gt;TOC&lt;/a&gt; for other posts in this series.&lt;/p&gt;  &lt;p&gt;in this post I will cover a new concept of &lt;strong&gt;scoping&lt;/strong&gt; and &lt;strong&gt;part lifetime management&lt;/strong&gt;, which is a great improvement over MEF 1.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/IMG_2080_614BDBED.jpg"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="DEV, MEF, SELA, Export, Import, CompositionContainer, RegistrationBuilder, Catalog" border="0" alt="DEV, MEF, SELA, Export, Import, CompositionContainer, RegistrationBuilder, Catalog" src="http://blogs.microsoft.co.il/blogs/bnaya/IMG_2080_thumb_3A9D4FA0.jpg" width="471" height="324" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;MEF 1&lt;/strong&gt; was coming with a fairly &lt;strong&gt;naïve lifetime management&lt;/strong&gt;.     &lt;br /&gt;part&amp;#39;s lifetime could be either shared or non-shared (&lt;font color="#666666"&gt;you could also apply &amp;#39;any&amp;#39; but eventually &amp;#39;any&amp;#39; will be created as shared or non-shared&lt;/font&gt;).     &lt;br /&gt;shared is a singleton instantiation, while non-shared will create a new instance each time.&lt;/p&gt;  &lt;p&gt;MEF 1&amp;#39;s instantiation model doesn&amp;#39;t support a complex scenario where some dependency&amp;#39;s lifetime should be dictate by the lifetime of other unites.    &lt;br /&gt;you can conceder a UI window that is having plug-ins that should be dispose while the UI window is closing. &lt;/p&gt;  &lt;p&gt;for example consider you have the following components (parts) dependency flow:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/Presentation1_4CBB76C0.jpg"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="DEV, MEF, SELA, Export, Import, CompositionContainer, RegistrationBuilder, Catalog" border="0" alt="DEV, MEF, SELA, Export, Import, CompositionContainer, RegistrationBuilder, Catalog" src="http://blogs.microsoft.co.il/blogs/bnaya/Presentation1_thumb_36A4E561.jpg" width="418" height="235" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;the application can have multiple processes.    &lt;br /&gt;each process is having some plugins, but each view should have different instantiation of the plugins.     &lt;br /&gt;until now you can argue that a non-shared instantiation will do the job.     &lt;br /&gt;the next dependency level (DAL) &lt;strong&gt;should be shared under the boundary of a process&lt;/strong&gt; but &lt;strong&gt;shouldn&amp;#39;t be shared across processes&lt;/strong&gt;.&amp;#160; &lt;br /&gt;this one can neither handle by the share nor by non-shared instantiation.     &lt;br /&gt;single instance of DAL should be created under each view scope.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;MEF 2&lt;/strong&gt; added a &lt;strong&gt;scoped lifetime management&lt;/strong&gt;.     &lt;br /&gt;I will use the&lt;strong&gt; attribute based model&lt;/strong&gt; for this sample, but it will work in the same way in the &lt;strong&gt;fluent model&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:bbded519-b190-4131-a26d-a23dc52527e3" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;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="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Export&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Application&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Import&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ExportFactory&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ProcessA&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;gt; ProcAFactory { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Import&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ExportFactory&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ProcessB&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;gt; ProcBFactory { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Export&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ProcessA&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Import&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;PluginA&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; PlugA { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Import&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;PluginB&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; PlugB { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Export&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ProcessB&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Import&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;PluginA&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; PlugA { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Import&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;PluginB&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; PlugB { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Export&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;PluginA&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Import&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;DAL&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; Dal { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Export&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;PluginB&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Import&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;DAL&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; Dal { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Export&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;DAL&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;at line 4-7 you can see a &lt;strong&gt;new type of importing target&lt;/strong&gt; called &lt;strong&gt;ExportFactory&amp;lt;T&amp;gt;&lt;/strong&gt; this type will initialize the scope.     &lt;br /&gt;It is having a &lt;strong&gt;CreateExport&lt;/strong&gt; method that return a &lt;strong&gt;ExportLifetimeContext&amp;lt;T&amp;gt;&lt;/strong&gt; can control the part life time.&lt;/p&gt;  &lt;p&gt;the full implementation of the Application class is:&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:28b41930-c6ff-4a1b-ad02-fbbd478b7d27" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;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="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Export&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;  &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Application&lt;/span&gt;&lt;/li&gt; &lt;li&gt;  &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;      &lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Import&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;      &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ExportFactory&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ProcessA&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;gt; ProcAFactory { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;      &lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Import&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;      &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ExportFactory&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ProcessB&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;gt; ProcBFactory { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;      &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; WriteLayoutA()&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;      &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;          &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ExportLifetimeContext&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ProcessA&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;gt; lifeOfA = ProcAFactory.CreateExport())&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;          &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;              &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ProcessA&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; a = lifeOfA.Value;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;              &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Console&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.WriteLine(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;Proc A&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;              &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Console&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.WriteLine(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;&amp;#92;tPlug A: {0}&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;, a.PlugA.GetHashCode());&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;              &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Console&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.WriteLine(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;&amp;#92;t&amp;#92;tDal: {0}&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;, a.PlugA.Dal.GetHashCode());&lt;/span&gt;&lt;/li&gt; &lt;li&gt;              &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Console&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.WriteLine(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;&amp;#92;tPlug B: {0}&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;, a.PlugB.GetHashCode());&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;              &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Console&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.WriteLine(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;&amp;#92;t&amp;#92;tDal: {0}&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;, a.PlugB.Dal.GetHashCode());&lt;/span&gt;&lt;/li&gt; &lt;li&gt;          &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;      &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;      &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; WriteLayoutB()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;      &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;          &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;using&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ExportLifetimeContext&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ProcessB&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;gt; lifeOfB = ProcBFactory.CreateExport())&lt;/span&gt;&lt;/li&gt; &lt;li&gt;          &lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;                &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ProcessB&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;b = lifeOfB.Value;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;              &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Console&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.WriteLine(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;Proc B&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;              &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Console&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.WriteLine(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;&amp;#92;tPlug A: {0}&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;, b.PlugA.GetHashCode());&lt;/span&gt;&lt;/li&gt; &lt;li&gt;              &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Console&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.WriteLine(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;&amp;#92;t&amp;#92;tDal: {0}&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;, b.PlugA.Dal.GetHashCode());&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;              &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Console&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.WriteLine(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;&amp;#92;tPlug B: {0}&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;, b.PlugB.GetHashCode());&lt;/span&gt;&lt;/li&gt; &lt;li&gt;              &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Console&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.WriteLine(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;&amp;#92;t&amp;#92;tDal: {0}&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;, b.PlugB.Dal.GetHashCode());&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;          &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;      &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;  &lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;you can see the usage of &lt;strong&gt;ExportFactory&amp;lt;T&amp;gt;&lt;/strong&gt; at lines 11 and 24.&lt;/p&gt;  &lt;p&gt;having a &lt;strong&gt;lifetime handled part&lt;/strong&gt; is the &lt;strong&gt;first step for the scoping&lt;/strong&gt;.     &lt;br /&gt;now we can define which part will be managed by the scope.     &lt;br /&gt;for each scope we except to find a single instantiation of each scoped part.     &lt;br /&gt;as you can see in the diagram below, the Plugins and the DAL should be instantiate once for each scope.     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/Presentation1_4D1783E8.jpg"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="Presentation1" border="0" alt="Presentation1" src="http://blogs.microsoft.co.il/blogs/bnaya/Presentation1_thumb_376D257E.jpg" width="429" height="241" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;in order to define what&amp;#39;s goes within the scope we should use the &lt;strong&gt;CompositionScopeDefinition&lt;/strong&gt; as shown in the following code snippet:&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:c29f7814-3e2a-4939-9ad9-13a2a6f52938" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;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="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;static&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; Main(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;[] args)&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; scopeDependentCatalog = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;TypeCatalog&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ProcessA&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;),&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ProcessB&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;), &lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;PluginA&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;),&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;PluginB&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;),&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;DAL&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;));&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; scopeDefDependent = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;CompositionScopeDefinition&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(scopeDependentCatalog, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; appCatalog = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;TypeCatalog&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Application&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;));&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; scopeDefRoot = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;CompositionScopeDefinition&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(appCatalog, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;[] { scopeDefDependent });&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; container = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;CompositionContainer&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(scopeDefRoot);&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; app = container.GetExportedValue&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Application&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;gt;();&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;app.WriteLayoutA();&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Console&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.WriteLine(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515;"&gt;&amp;quot;------------------------------------&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;app.WriteLayoutB();&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;    &lt;p&gt;you can see the &lt;strong&gt;scope dependent definition&lt;/strong&gt; at line 9     &lt;br /&gt;and the &lt;strong&gt;hierarchic&lt;/strong&gt; between the scope and the application at line 12.&lt;/p&gt;  &lt;p&gt;as you may notice it is possible to have deeper hierarchic, but this will be shown in future posts.&lt;/p&gt;  &lt;p&gt;the output is:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/scopeoutput_652AC876.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="scopeoutput" border="0" alt="scopeoutput" src="http://blogs.microsoft.co.il/blogs/bnaya/scopeoutput_thumb_2ACF5295.png" width="337" height="235" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;remember that we was printing the &lt;strong&gt;part&amp;#39;s hash code&lt;/strong&gt;.     &lt;br /&gt;you can easily see that each process is having different plugin and DAL&amp;#39;s instantiations, but even those the DAL was consumed by both plugins it has a single instantiation per scope.&lt;/p&gt;  &lt;h5&gt;Summary&lt;/h5&gt;  &lt;p&gt;scoping is a very powerful instantiation model which can solve some of the real-life scenario which wasn&amp;#39;t fall into the shared or non-shared models.&lt;/p&gt;  &lt;p&gt;in future post I will present a deeper hierarchic and the catalog filtering capability.&lt;/p&gt;  &lt;br /&gt;&lt;a href="http://dotnetshoutout.com/MEF-20-mini-series-part-6-Composition-scoping-and-lifetime-management-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%2F2013%2F01%2F16%2Fmef-2-0-mini-series-part-6-composition-scoping-and-lifetime-management.aspx" /&gt;&lt;/a&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1667233" width="1" height="1"&gt;</content><author><name>bnaya</name><uri>http://blogs.microsoft.co.il/members/bnaya.aspx</uri></author><category term="DEV" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx" /><category term="MEF" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/MEF/default.aspx" /><category term="SELA" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx" /><category term="extension" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/extension/default.aspx" /><category term="Composition" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Composition/default.aspx" /><category term="ImportMany" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/ImportMany/default.aspx" /><category term="Export" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Export/default.aspx" /><category term="Import" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Import/default.aspx" /><category term=".NET 4.5" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.NET+4.5/default.aspx" /><category term="CompositionContainer" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/CompositionContainer/default.aspx" /><category term="RegistrationBuilder" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/RegistrationBuilder/default.aspx" /><category term="Catalog" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Catalog/default.aspx" /></entry><entry><title>MEF 2.0 - mini series: part 5 (Fluent export properties)</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2013/01/15/mef-2-0-mini-series-part-5-fluent-export-properties.aspx" /><id>http://blogs.microsoft.co.il/blogs/bnaya/archive/2013/01/15/mef-2-0-mini-series-part-5-fluent-export-properties.aspx</id><published>2013-01-15T06:04:54Z</published><updated>2013-01-15T06:04:54Z</updated><content type="html">&lt;h2&gt;MEF 2.0 - mini series: part 5 (Fluent export properties)&lt;/h2&gt;  &lt;p&gt;this is the 5th post in the &lt;strong&gt;MEF 2.0&lt;/strong&gt; mini series.     &lt;br /&gt;you can see the following &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2013/01/06/mef-2-0-toc.aspx"&gt;TOC&lt;/a&gt; for other posts in this series.&lt;/p&gt;  &lt;p&gt;in this post I will cover the &lt;strong&gt;fluent property&amp;#39;s export&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/IMG_8047_6004ACAC.jpg"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="MEF, Import, Export, CompositionContainer, RegistrationBuilder, Catalog" border="0" alt="MEF, Import, Export, CompositionContainer, RegistrationBuilder, Catalog" src="http://blogs.microsoft.co.il/blogs/bnaya/IMG_8047_thumb_441377B4.jpg" width="533" height="420" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Exporting properties&lt;/strong&gt; is a less known feature of &lt;strong&gt;MEF&lt;/strong&gt;.     &lt;br /&gt;MEF 1 was supporting this feature by using the attribute model.     &lt;br /&gt;you could decorate a property with a &lt;strong&gt;[Export]&lt;/strong&gt; attribute and then it become available for imports.&lt;/p&gt;  &lt;p&gt;the following code demonstrate property exporting in &lt;strong&gt;MEF 1&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;the Foo class is importing multiple SymmetricAlgorithm:&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:b0602047-a06b-4f28-b86b-e676c745744e" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Export&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Foo&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ImportMany&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;SymmetricAlgorithm&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;[] CryptoProviders { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;and the CryptoComposer class is exporting a few symmetric algorithms:&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:31387df1-d35c-4c93-a7ee-5e2c44cf671b" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Export&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;CryptoComposer&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Export&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;SymmetricAlgorithm&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; Aes { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;AesManaged&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(); } }&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Export&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;SymmetricAlgorithm&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; TripleDES { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;TripleDESCryptoServiceProvider&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(); } }&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Export&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;SymmetricAlgorithm&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; RC2 { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;RC2CryptoServiceProvider&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(); } }&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;with the following composition the Foo instance will have the CryptoComposer&amp;#39;s symmetric algorithms:&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:3d1ef620-a957-4e7e-86d9-27990ba28cb0" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; catalog = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;AssemblyCatalog&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Program&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).Assembly);&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; container = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;CompositionContainer&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(catalog);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; foo = container.GetExportedValue&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Foo&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;gt;();&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;h5&gt;so, how do we do it with the fluent export API?&lt;/h5&gt;  &lt;p&gt;to keep it simple I will leave the Foo class with the attribute model (we learned how to use &lt;strong&gt;fluent import&lt;/strong&gt; in the previous &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2013/01/12/mef-2-0-mini-series-part-4-fluent-import.aspx" target="_blank"&gt;post&lt;/a&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:e2fcb7bc-b2db-49d9-ab32-ddbedd73912a" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Export&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Foo&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;ImportMany&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;SymmetricAlgorithm&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;[] CryptoProviders { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;CryptoComposer&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;SymmetricAlgorithm&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; Aes { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;AesManaged&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(); } }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;SymmetricAlgorithm&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; TripleDES { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;TripleDESCryptoServiceProvider&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(); } }&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;SymmetricAlgorithm&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; RC2 { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;RC2CryptoServiceProvider&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(); } }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;in order to export the CryptoComposer&amp;#39;s properties you should use 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:3e993dad-1510-4ea9-a111-a7325b56d7ca" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; picker = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;RegistrationBuilder&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;();&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;picker.ForType&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;CryptoComposer&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;gt;()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;.ExportProperties(p =&amp;gt; p.PropertyType == &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;SymmetricAlgorithm&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;));&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; catalog = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;AssemblyCatalog&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Program&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;).Assembly, picker);&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; container = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;CompositionContainer&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(catalog);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; foo = container.GetExportedValue&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Foo&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&amp;gt;();&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;h5&gt;summary&lt;/h5&gt;  &lt;p&gt;exporting properties using the &lt;strong&gt;fluent API&lt;/strong&gt; is fairly straightforward.&lt;/p&gt;  &lt;br /&gt;&lt;a href="http://dotnetshoutout.com/MEF-20-mini-series-part-5-Fluent-export-properties-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%2F2013%2F01%2F15%2Fmef-2-0-mini-series-part-5-fluent-export-properties.aspx" /&gt;&lt;/a&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1663793" width="1" height="1"&gt;</content><author><name>bnaya</name><uri>http://blogs.microsoft.co.il/members/bnaya.aspx</uri></author><category term="DEV" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx" /><category term="MEF" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/MEF/default.aspx" /><category term="SELA" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx" /><category term="extension" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/extension/default.aspx" /><category term="Composition" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Composition/default.aspx" /><category term="ImportMany" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/ImportMany/default.aspx" /><category term="Export" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Export/default.aspx" /><category term="Import" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Import/default.aspx" /><category term="CompositionContainer" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/CompositionContainer/default.aspx" /><category term="RegistrationBuilder" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/RegistrationBuilder/default.aspx" /><category term="Catalog" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Catalog/default.aspx" /></entry><entry><title>Open House at Microsoft</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2013/01/14/open-house-at-microsoft.aspx" /><id>http://blogs.microsoft.co.il/blogs/bnaya/archive/2013/01/14/open-house-at-microsoft.aspx</id><published>2013-01-14T07:48:22Z</published><updated>2013-01-14T07:48:22Z</updated><content type="html">&lt;h2&gt;Open House at Microsoft&lt;/h2&gt;  &lt;p&gt;yesterday I was lecturing at Microsoft about VS 2012, .NET 4.5, async/await, Rx and TPL Dataflow.&lt;/p&gt;  &lt;p&gt;there was 90 people attended and I hope that everybody has learn something new.&lt;/p&gt;  &lt;p&gt;the code sample for this lecture available &lt;a href="https://skydrive.live.com/?cid=9bf7c1a515d76a9a&amp;amp;id=9BF7C1A515D76A9A%216027" target="_blank"&gt;here&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/Ashdot-field-5_584BDCDB.jpg"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="Parallel,tdf, dataflow, rx, reactive, task, .net 4., vs 2012" border="0" alt="Parallel,tdf, dataflow, rx, reactive, task, .net 4., vs 2012" src="http://blogs.microsoft.co.il/blogs/bnaya/Ashdot-field-5_thumb_21EA8EFF.jpg" width="468" height="364" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1660692" width="1" height="1"&gt;</content><author><name>bnaya</name><uri>http://blogs.microsoft.co.il/members/bnaya.aspx</uri></author><category term="DEV" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx" /><category term="SELA" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx" /><category term="Rx" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Rx/default.aspx" /><category term="Parallel" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Parallel/default.aspx" /><category term="Task" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Task/default.aspx" /><category term="TPL" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/TPL/default.aspx" /><category term="Dataflow" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Dataflow/default.aspx" /><category term="TDF" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/TDF/default.aspx" /><category term="Reactive" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Reactive/default.aspx" /><category term="async" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/async/default.aspx" /><category term="await" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/await/default.aspx" /><category term="Reactive Extension" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Reactive+Extension/default.aspx" /><category term="TPL Dataflow" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/TPL+Dataflow/default.aspx" /><category term="vs 2012" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/vs+2012/default.aspx" /><category term=".net 4." scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net+4_2E00_/default.aspx" /></entry><entry><title>Async and AggregateException</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/bnaya/archive/2013/01/14/async-and-aggregateexception.aspx" /><id>http://blogs.microsoft.co.il/blogs/bnaya/archive/2013/01/14/async-and-aggregateexception.aspx</id><published>2013-01-14T06:19:42Z</published><updated>2013-01-14T06:19:42Z</updated><content type="html">&lt;h2&gt;Async and AggregateException&lt;/h2&gt;  &lt;p&gt;this post is a complementary to &lt;a href="http://blogs.microsoft.co.il/blogs/stiller/archive/2012/12/31/accessing-the-aggregateexception-with-await.aspx" target="_blank"&gt;Eran Stiller&amp;#39;s post&lt;/a&gt;.     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;I was reading &lt;strong&gt;Eran Stiller&amp;#39;s &lt;/strong&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/stiller/archive/2012/12/31/accessing-the-aggregateexception-with-await.aspx" target="_blank"&gt;post&lt;/a&gt; about &lt;strong&gt;exception handling&lt;/strong&gt; using &lt;strong&gt;async&lt;/strong&gt; methods and I want to add a few side notes.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/IMG_0115_62725ED9.jpg"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="async, await, parallel, task, tpl, tap,.net4.5,c#5, exception" border="0" alt="async, await, parallel, task, tpl, tap,.net4.5,c#5, exception" src="http://blogs.microsoft.co.il/blogs/bnaya/IMG_0115_thumb_49D29BBC.jpg" width="497" height="381" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;1) the exception handling behavior decisions is well documented in &lt;a href="http://blogs.msdn.com/b/pfxteam/archive/2011/09/28/10217876.aspx" target="_blank"&gt;this&lt;/a&gt; post (by the TPL team), it decided after they had consider different options.&lt;/p&gt;  &lt;p&gt;2) I was suggesting that compiler will check whether the a catch of AggregateException is implemented and if so to avoid the unwrapping behavior.    &lt;br /&gt;in this case the it can be assumed that programmer do expect multiple exceptions.     &lt;br /&gt;unfortunately, for the current version, I was&amp;#160; speaking with them after the release of .NET 4.5.     &lt;br /&gt;I hope that we will see this mitigation in future release.&lt;/p&gt;  &lt;p&gt;3) for the current version you can use the following &lt;strong&gt;work around&lt;/strong&gt; if you do want to &lt;strong&gt;catch aggregate exception&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:083b3af6-dfc0-4562-8707-5e5b53189e7c" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;await&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;Task&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;.WhenAll(t1, t2)&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;.ContinueWith(t =&amp;gt; { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; (t.Exception != &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;) &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;throw&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; t.Exception; });&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;by&lt;strong&gt; re-throwing&lt;/strong&gt; the exception the unwrapped exception will be &lt;strong&gt;AggregateException&lt;/strong&gt;.     &lt;br /&gt;it may be wise to wrap this pattern in an &lt;strong&gt;extension method&lt;/strong&gt; because it can be a very repetitive one.&lt;/p&gt;  &lt;h5&gt;Proper Disclosure&lt;/h5&gt;  &lt;p&gt;Eran is one of my colleague and definitely one of the more talent Architect I was happened to work with. &lt;/p&gt;  &lt;br /&gt;&lt;a href="http://dotnetshoutout.com/Async-and-AggregateException-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%2F2013%2F01%2F14%2Fasync-and-aggregateexception.aspx" /&gt;&lt;/a&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1660489" width="1" height="1"&gt;</content><author><name>bnaya</name><uri>http://blogs.microsoft.co.il/members/bnaya.aspx</uri></author><category term="DEV" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/DEV/default.aspx" /><category term="SELA" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/SELA/default.aspx" /><category term="Parallel" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Parallel/default.aspx" /><category term="Task" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/Task/default.aspx" /><category term="TPL" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/TPL/default.aspx" /><category term="async" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/async/default.aspx" /><category term="await" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/await/default.aspx" /><category term="TAP" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/TAP/default.aspx" /><category term="C#5" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/C_2300_5/default.aspx" /><category term="exception" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/exception/default.aspx" /><category term="exception handling" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/exception+handling/default.aspx" /><category term=".net4.5" scheme="http://blogs.microsoft.co.il/blogs/bnaya/archive/tags/.net4.5/default.aspx" /></entry></feed>