<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="http://www.codeplex.com/rss.xsl"?><rss version="2.0"><channel><title>MEF Wiki &amp; Documentation Rss Feed</title><link>http://www.codeplex.com/MEF/Wiki/View.aspx?title=Home</link><description>MEF Wiki Rss Description</description><item><title>New Comment on "Exports and Metadata"</title><link>http://mef.codeplex.com/wikipage?title=Exports and Metadata&amp;ANCHOR#C14134</link><description>Why can&amp;#39;t I have IEnumerable&amp;#60;IMessageSender, IMessageSenderCapabilities&amp;#62; &amp;#63;</description><author>kfitzie</author><pubDate>Wed, 04 Nov 2009 18:45:09 GMT</pubDate><guid isPermaLink="false">New Comment on "Exports and Metadata" 20091104064509P</guid></item><item><title>New Comment on "Architecture"</title><link>http://mef.codeplex.com/wikipage?title=Architecture&amp;ANCHOR#C14063</link><description>a total nitpick, but in the white paper you define a class square, but the number of sides property returns 5, i assume you mean 4 &amp;#58;&amp;#41;</description><author>aL3891</author><pubDate>Wed, 28 Oct 2009 10:28:53 GMT</pubDate><guid isPermaLink="false">New Comment on "Architecture" 20091028102853A</guid></item><item><title>Updated Wiki: Exports and Metadata</title><link>http://mef.codeplex.com/wikipage?title=Exports and Metadata&amp;version=12</link><description>&lt;div class="wikidoc"&gt;&lt;h1&gt;Exports and Metadata&lt;/h1&gt;&lt;a href="http://mef.codeplex.com/wikipage?title=Declaring%20Exports&amp;referringTitle=Exports%20and%20Metadata"&gt;Declaring Exports&lt;/a&gt; explained the basics of parts exporting services and values. In some cases it’s necessary to associate information with exports for a variety of reasons. Commonly it’s used to explain about the capabilities of an specific implementation of a common contract. This is useful to allow imports to either constraint the export that can satisfy it, or to import all available implementations at the time and check their capabilities in runtime before using the export.&lt;br /&gt;
&lt;h2&gt;Attaching Metadata to an Export&lt;/h2&gt;Consider the IMessageSender service introduced earlier. Suppose we have a few implementations, and they have differences that may be relevant to the consumer of the implementations. For our example the transport of the message and whether is secure are important information for a consumer (importer).&lt;br /&gt;
&lt;h3&gt;Using ExportMetadataAttribute&lt;/h3&gt;All we have to do to attach this information is to use the &lt;b&gt;&lt;span class="codeInline"&gt;[System.ComponentModel.Composition.ExportMetadataAttribute]&lt;/span&gt;&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;interface&lt;/span&gt; IMessageSender
{
    &lt;span style="color:Blue;"&gt;void&lt;/span&gt; Send(&lt;span style="color:Blue;"&gt;string&lt;/span&gt; message);
}

[Export(&lt;span style="color:Blue;"&gt;typeof&lt;/span&gt;(IMessageSender))]
[ExportMetadata(&lt;span style="color:#A31515;"&gt;&amp;quot;transport&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;smtp&amp;quot;&lt;/span&gt;)]
&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;class&lt;/span&gt; EmailSender : IMessageSender
{
    &lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;void&lt;/span&gt; Send(&lt;span style="color:Blue;"&gt;string&lt;/span&gt; message)
    {
        Console.WriteLine(message);
    }
}

[Export(&lt;span style="color:Blue;"&gt;typeof&lt;/span&gt;(IMessageSender))]
[ExportMetadata(&lt;span style="color:#A31515;"&gt;&amp;quot;transport&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;smtp&amp;quot;&lt;/span&gt;)]
[ExportMetadata(&lt;span style="color:#A31515;"&gt;&amp;quot;secure&amp;quot;&lt;/span&gt;, &lt;span style="color:Blue;"&gt;null&lt;/span&gt;)]
&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;class&lt;/span&gt; SecureEmailSender : IMessageSender
{
    &lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;void&lt;/span&gt; Send(&lt;span style="color:Blue;"&gt;string&lt;/span&gt; message)
    {
        Console.WriteLine(message);
    }
}

[Export(&lt;span style="color:Blue;"&gt;typeof&lt;/span&gt;(IMessageSender))]
[ExportMetadata(&lt;span style="color:#A31515;"&gt;&amp;quot;transport&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;phone_network&amp;quot;&lt;/span&gt;)]
&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;class&lt;/span&gt; SMSSender : IMessageSender
{
    &lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;void&lt;/span&gt; Send(&lt;span style="color:Blue;"&gt;string&lt;/span&gt; message)
    {
        Console.WriteLine(message);
    }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Using a Custom Export Attribute&lt;/h3&gt;In order to do it more strongly typed than using the ExportMetadataAttribute, you need to create your own attribute and decorate it with &lt;b&gt;&lt;span class="codeInline"&gt;[System.ComponentModel.Composition.MetadataAttribute]&lt;/span&gt;&lt;/b&gt;. In this example we also derive from ExportAttribute, thus creating a custom Export attribute that also specifies metadata. &lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple=&lt;span style="color:Blue;"&gt;false&lt;/span&gt;)]
&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;class&lt;/span&gt; MessageSenderAttribute : ExportAttribute
{
    &lt;span style="color:Blue;"&gt;public&lt;/span&gt; MessageSenderAttribute() : &lt;span style="color:Blue;"&gt;base&lt;/span&gt;(&lt;span style="color:Blue;"&gt;typeof&lt;/span&gt;(IMessageSender)) { }
    &lt;span style="color:Blue;"&gt;public&lt;/span&gt; MessageTransport Transport { &lt;span style="color:Blue;"&gt;get&lt;/span&gt;; &lt;span style="color:Blue;"&gt;set&lt;/span&gt;; }
    &lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;bool&lt;/span&gt; IsSecure { &lt;span style="color:Blue;"&gt;get&lt;/span&gt;; &lt;span style="color:Blue;"&gt;set&lt;/span&gt;; }
}

&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;enum&lt;/span&gt; MessageTransport
{
    Undefined,
    Smtp,
    PhoneNetwork,
    Other
}
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Above, the MetadataAttribute is applied to our custom export attribute. The next step is to apply the attribute to our IMessageSender implementations:&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
[MessageSender(Transport=MessageTransport.Smtp)]
&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;class&lt;/span&gt; EmailSender : IMessageSender
{
    &lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;void&lt;/span&gt; Send(&lt;span style="color:Blue;"&gt;string&lt;/span&gt; message)
    {
        Console.WriteLine(message);
    }
}

[MessageSender(Transport=MessageTransport.Smtp, IsSecure=&lt;span style="color:Blue;"&gt;true&lt;/span&gt;)]
&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;class&lt;/span&gt; SecureEmailSender : IMessageSender
{
    &lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;void&lt;/span&gt; Send(&lt;span style="color:Blue;"&gt;string&lt;/span&gt; message)
    {
        Console.WriteLine(message);
    }
}

[MessageSender(Transport=MessageTransport.PhoneNetwork)]
&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;class&lt;/span&gt; SMSSender : IMessageSender
{
    &lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;void&lt;/span&gt; Send(&lt;span style="color:Blue;"&gt;string&lt;/span&gt; message)
    {
        Console.WriteLine(message);
    }
}
&lt;/pre&gt;&lt;/div&gt;That’s all that is required on the export side. Under the hood, MEF is still populating a dictionary, but this fact becomes invisible to you.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note:&lt;/b&gt; You can also create metadata attributes that are not themselves exports, by creating an attribute which is decorated with MetadataAttributeAttribute. In these cases the metadata will be added to Exports on the same member where the custom metadata attribute was applied.&lt;br /&gt;
&lt;h2&gt;Importing Metadata&lt;/h2&gt;Importers can access the metadata attached to the exports.
&lt;h3&gt;Using Strongly-typed Metadata&lt;/h3&gt;To access metadata in a strongly-typed fashion created a metadata view by definining an interface with matching read only properties (names and types). For our sample it would be an interface like the following:&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;interface&lt;/span&gt; IMessageSenderCapabilities
{
    MessageTransport Transport { &lt;span style="color:Blue;"&gt;get&lt;/span&gt;; }
    &lt;span style="color:Blue;"&gt;bool&lt;/span&gt; IsSecure { &lt;span style="color:Blue;"&gt;get&lt;/span&gt;; }
}
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Then you can start importing using the type &lt;b&gt;&lt;span class="codeInline"&gt;System.Lazy&amp;lt;T, TMetadata&amp;gt;&lt;/span&gt;&lt;/b&gt; where T is the contract type and TMetadata is the interface you’ve created. &lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
[Export]
&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;class&lt;/span&gt; HttpServerHealthMonitor
{
    [ImportMany]
    &lt;span style="color:Blue;"&gt;public&lt;/span&gt; Lazy&amp;lt;IMessageSender, IMessageSenderCapabilities&amp;gt;[] Senders { &lt;span style="color:Blue;"&gt;get&lt;/span&gt;; &lt;span style="color:Blue;"&gt;set&lt;/span&gt;; }

    &lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;void&lt;/span&gt; SendNotification()
    {
        &lt;span style="color:Blue;"&gt;foreach&lt;/span&gt;(&lt;span style="color:Blue;"&gt;var&lt;/span&gt; sender &lt;span style="color:Blue;"&gt;in&lt;/span&gt; Senders)
        {
            &lt;span style="color:Blue;"&gt;if&lt;/span&gt; (sender.Metadata.Transport == MessageTransport.Smtp &amp;amp;&amp;amp; 
                sender.Metadata.IsSecure)
            {
                &lt;span style="color:Blue;"&gt;var&lt;/span&gt; messageSender = sender.Value;
                messageSender.Send(&lt;span style="color:#A31515;"&gt;&amp;quot;Server is fine&amp;quot;&lt;/span&gt;);
                
                &lt;span style="color:Blue;"&gt;break&lt;/span&gt;;
            }
        }
    }
}
&lt;/pre&gt;&lt;/div&gt;&lt;h3&gt;Using Weakly-typed metadata&lt;/h3&gt;To access metadata in a weakly-typed fashion, you import uisng the type &lt;b&gt;&lt;span class="codeInline"&gt;System.Lazy&amp;lt;T, TMetadata&amp;gt;&lt;/span&gt;&lt;/b&gt; passing IDictionary&amp;lt;string,object&amp;gt; for the metadata. You can then access the metadata through the Metadata property which will be a dictionary.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note:&lt;/b&gt; In general we recommend the strongly-typed method for accessing metadata, however there are systems that need to access the metadata in a dynamic fashion, which this allows.&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
[Export]
&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;class&lt;/span&gt; HttpServerHealthMonitor
{
    [ImportMany]
    &lt;span style="color:Blue;"&gt;public&lt;/span&gt; Lazy&amp;lt;IMessageSender, IDictionary&amp;lt;&lt;span style="color:Blue;"&gt;string&lt;/span&gt;,&lt;span style="color:Blue;"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;[] Senders { &lt;span style="color:Blue;"&gt;get&lt;/span&gt;; &lt;span style="color:Blue;"&gt;set&lt;/span&gt;; }

    &lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;void&lt;/span&gt; SendNotification()
    {
        &lt;span style="color:Blue;"&gt;foreach&lt;/span&gt;(&lt;span style="color:Blue;"&gt;var&lt;/span&gt; sender &lt;span style="color:Blue;"&gt;in&lt;/span&gt; Senders)
        {
            &lt;span style="color:Blue;"&gt;if&lt;/span&gt; (sender.Metadata.ContainsKey(&lt;span style="color:#A31515;"&gt;&amp;quot;Transport&amp;quot;&lt;/span&gt;) &amp;amp;&amp;amp; sender.Metadata[&lt;span style="color:#A31515;"&gt;&amp;quot;Transport&amp;quot;&lt;/span&gt;] == MessageTransport.Smtp &amp;amp;&amp;amp; 
                sender.Metadata.ContainsKey(&lt;span style="color:#A31515;"&gt;&amp;quot;Issecure&amp;quot;&lt;/span&gt;) &amp;amp;&amp;amp; Metadata[&lt;span style="color:#A31515;"&gt;&amp;quot;IsSecure&amp;quot;&lt;/span&gt;] == &lt;span style="color:Blue;"&gt;true&lt;/span&gt;)
            {
                &lt;span style="color:Blue;"&gt;var&lt;/span&gt; messageSender = sender.Value;
                messageSender.Send(&lt;span style="color:#A31515;"&gt;&amp;quot;Server is fine&amp;quot;&lt;/span&gt;);
                
                &lt;span style="color:Blue;"&gt;break&lt;/span&gt;;
            }
        }
    }
}
&lt;/pre&gt;&lt;/div&gt;&lt;h3&gt;Metadata filtering and DefaultValueAttribute&lt;/h3&gt;When you specifiy a metadata view, an implicit filtering will occur to match &lt;b&gt;only&lt;/b&gt; those exports which contain the metadata properties defined in the view. You can specify on the metadata view that a property is not required, by using the &lt;span class="codeInline"&gt;System.ComponentModel.DefaultValueAttribute&lt;/span&gt;. Below you can see where we have specified a default value of false on IsSecure. This means if a part exports IMessageSender, but does not supply IsSecure metadata, then it will still be matched.&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;interface&lt;/span&gt; IMessageSenderCapabilities
{
    MessageTransport Transport { &lt;span style="color:Blue;"&gt;get&lt;/span&gt;; }
    [DefaultValue(&lt;span style="color:Blue;"&gt;false&lt;/span&gt;)];
    &lt;span style="color:Blue;"&gt;bool&lt;/span&gt; IsSecure { &lt;span style="color:Blue;"&gt;get&lt;/span&gt;; }
}
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>weshaggard</author><pubDate>Tue, 27 Oct 2009 23:03:49 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Exports and Metadata 20091027110349P</guid></item><item><title>Updated Wiki: Exports and Metadata</title><link>http://mef.codeplex.com/wikipage?title=Exports and Metadata&amp;version=11</link><description>&lt;div class="wikidoc"&gt;&lt;h1&gt;Exports and Metadata&lt;/h1&gt;&lt;a href="http://mef.codeplex.com/wikipage?title=Declaring%20Exports&amp;referringTitle=Exports%20and%20Metadata"&gt;Declaring Exports&lt;/a&gt; explained the basics of parts exporting services and values. In some cases it’s necessary to associate information with exports for a variety of reasons. Commonly it’s used to explain about the capabilities of an specific implementation of a common contract. This is useful to allow imports to either constraint the export that can satisfy it, or to import all available implementations at the time and check their capabilities in runtime before using the export.&lt;br /&gt;
&lt;h2&gt;Attaching Metadata to an Export&lt;/h2&gt;Consider the IMessageSender service introduced earlier. Suppose we have a few implementations, and they have differences that may be relevant to the consumer of the implementations. For our example the transport of the message and whether is secure are important information for a consumer (importer).&lt;br /&gt;
&lt;h3&gt;Using ExportMetadataAttribute&lt;/h3&gt;All we have to do to attach this information is to use the &lt;b&gt;&lt;span class="codeInline"&gt;[System.ComponentModel.Composition.ExportMetadataAttribute]&lt;/span&gt;&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;interface&lt;/span&gt; IMessageSender
{
    &lt;span style="color:Blue;"&gt;void&lt;/span&gt; Send(&lt;span style="color:Blue;"&gt;string&lt;/span&gt; message);
}

[Export(&lt;span style="color:Blue;"&gt;typeof&lt;/span&gt;(IMessageSender))]
[ExportMetadata(&lt;span style="color:#A31515;"&gt;&amp;quot;transport&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;smtp&amp;quot;&lt;/span&gt;)]
&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;class&lt;/span&gt; EmailSender : IMessageSender
{
    &lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;void&lt;/span&gt; Send(&lt;span style="color:Blue;"&gt;string&lt;/span&gt; message)
    {
        Console.WriteLine(message);
    }
}

[Export(&lt;span style="color:Blue;"&gt;typeof&lt;/span&gt;(IMessageSender))]
[ExportMetadata(&lt;span style="color:#A31515;"&gt;&amp;quot;transport&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;smtp&amp;quot;&lt;/span&gt;)]
[ExportMetadata(&lt;span style="color:#A31515;"&gt;&amp;quot;secure&amp;quot;&lt;/span&gt;, &lt;span style="color:Blue;"&gt;null&lt;/span&gt;)]
&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;class&lt;/span&gt; SecureEmailSender : IMessageSender
{
    &lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;void&lt;/span&gt; Send(&lt;span style="color:Blue;"&gt;string&lt;/span&gt; message)
    {
        Console.WriteLine(message);
    }
}

[Export(&lt;span style="color:Blue;"&gt;typeof&lt;/span&gt;(IMessageSender))]
[ExportMetadata(&lt;span style="color:#A31515;"&gt;&amp;quot;transport&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;phone_network&amp;quot;&lt;/span&gt;)]
&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;class&lt;/span&gt; SMSSender : IMessageSender
{
    &lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;void&lt;/span&gt; Send(&lt;span style="color:Blue;"&gt;string&lt;/span&gt; message)
    {
        Console.WriteLine(message);
    }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Using a Custom Export Attribute&lt;/h3&gt;In order to do it more strongly typed than using the ExportMetadataAttribute, you need to create your own attribute and decorate it with &lt;b&gt;&lt;span class="codeInline"&gt;[System.ComponentModel.Composition.MetadataAttribute]&lt;/span&gt;&lt;/b&gt;. In this example we also derive from ExportAttribute, thus creating a custom Export attribute that also specifies metadata. &lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple=&lt;span style="color:Blue;"&gt;false&lt;/span&gt;)]
&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;class&lt;/span&gt; MessageSenderAttribute : ExportAttribute
{
    &lt;span style="color:Blue;"&gt;public&lt;/span&gt; MessageSenderAttribute() : &lt;span style="color:Blue;"&gt;base&lt;/span&gt;(&lt;span style="color:Blue;"&gt;typeof&lt;/span&gt;(IMessageSender)) { }
    &lt;span style="color:Blue;"&gt;public&lt;/span&gt; MessageTransport Transport { &lt;span style="color:Blue;"&gt;get&lt;/span&gt;; &lt;span style="color:Blue;"&gt;set&lt;/span&gt;; }
    &lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;bool&lt;/span&gt; IsSecure { &lt;span style="color:Blue;"&gt;get&lt;/span&gt;; &lt;span style="color:Blue;"&gt;set&lt;/span&gt;; }
}

&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;enum&lt;/span&gt; MessageTransport
{
    Undefined,
    Smtp,
    PhoneNetwork,
    Other
}
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Above, the MetadataAttribute is applied to our custom export attribute. The next step is to apply the attribute to our IMessageSender implementations:&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
[MessageSender(Transport=MessageTransport.Smtp)]
&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;class&lt;/span&gt; EmailSender : IMessageSender
{
    &lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;void&lt;/span&gt; Send(&lt;span style="color:Blue;"&gt;string&lt;/span&gt; message)
    {
        Console.WriteLine(message);
    }
}

[MessageSender(Transport=MessageTransport.Smtp, IsSecure=&lt;span style="color:Blue;"&gt;true&lt;/span&gt;)]
&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;class&lt;/span&gt; SecureEmailSender : IMessageSender
{
    &lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;void&lt;/span&gt; Send(&lt;span style="color:Blue;"&gt;string&lt;/span&gt; message)
    {
        Console.WriteLine(message);
    }
}

[MessageSender(Transport=MessageTransport.PhoneNetwork)]
&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;class&lt;/span&gt; SMSSender : IMessageSender
{
    &lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;void&lt;/span&gt; Send(&lt;span style="color:Blue;"&gt;string&lt;/span&gt; message)
    {
        Console.WriteLine(message);
    }
}
&lt;/pre&gt;&lt;/div&gt;That’s all that is required on the export side. Under the hood, MEF is still populating a dictionary, but this fact becomes invisible to you.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note:&lt;/b&gt; You can also create metadata attributes that are not themselves exports, by creating an attribute which is decorated with MetadataAttributeAttribute. In these cases the metadata will be added to Exports on the same member where the custom metadata attribute was applied.&lt;br /&gt;
&lt;h2&gt;Importing Metadata&lt;/h2&gt;Importers can access the metadata attached to the exports.
&lt;h3&gt;Using Strongly-typed Metadata&lt;/h3&gt;To access metadata in a strongly-typed fashion created a metadata view by definining an interface with matching read only properties (names and types). For our sample it would be an interface like the following:&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;interface&lt;/span&gt; IMessageSenderCapabilities
{
    MessageTransport Transport { &lt;span style="color:Blue;"&gt;get&lt;/span&gt;; }
    &lt;span style="color:Blue;"&gt;bool&lt;/span&gt; IsSecure { &lt;span style="color:Blue;"&gt;get&lt;/span&gt;; }
}
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Then you can start importing using the type &lt;b&gt;{[{System.Lazy&amp;lt;T, TMetadata&amp;gt;}}]&lt;/b&gt; where T is the contract type and TMetadata is the interface you’ve created. &lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
[Export]
&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;class&lt;/span&gt; HttpServerHealthMonitor
{
    [ImportMany]
    &lt;span style="color:Blue;"&gt;public&lt;/span&gt; Lazy&amp;lt;IMessageSender, IMessageSenderCapabilities&amp;gt;[] Senders { &lt;span style="color:Blue;"&gt;get&lt;/span&gt;; &lt;span style="color:Blue;"&gt;set&lt;/span&gt;; }

    &lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;void&lt;/span&gt; SendNotification()
    {
        &lt;span style="color:Blue;"&gt;foreach&lt;/span&gt;(&lt;span style="color:Blue;"&gt;var&lt;/span&gt; sender &lt;span style="color:Blue;"&gt;in&lt;/span&gt; Senders)
        {
            &lt;span style="color:Blue;"&gt;if&lt;/span&gt; (sender.Metadata.Transport == MessageTransport.Smtp &amp;amp;&amp;amp; 
                sender.Metadata.IsSecure)
            {
                &lt;span style="color:Blue;"&gt;var&lt;/span&gt; messageSender = sender.Value;
                messageSender.Send(&lt;span style="color:#A31515;"&gt;&amp;quot;Server is fine&amp;quot;&lt;/span&gt;);
                
                &lt;span style="color:Blue;"&gt;break&lt;/span&gt;;
            }
        }
    }
}
&lt;/pre&gt;&lt;/div&gt;&lt;h3&gt;Using Weakly-typed metadata&lt;/h3&gt;To access metadata in a weakly-typed fashion, you import uisng the type &lt;b&gt;&lt;a href="http://mef.codeplex.com/wikipage?title=%7b%7bSystem.Lazy%3cT%2c%20TMetadata%3e%7d%7d&amp;referringTitle=Exports%20and%20Metadata"&gt;&amp;#123;&amp;#123;System.Lazy&amp;#60;T, TMetadata&amp;#62;&amp;#125;&amp;#125;&lt;/a&gt;&lt;/b&gt; passing IDictionary&amp;lt;string,object&amp;gt; for the metadata. You can then access the metadata through the Metadata property which will be a dictionary.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note:&lt;/b&gt; In general we recommend the strongly-typed method for accessing metadata, however there are systems that need to access the metadata in a dynamic fashion, which this allows.&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
[Export]
&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;class&lt;/span&gt; HttpServerHealthMonitor
{
    [ImportMany]
    &lt;span style="color:Blue;"&gt;public&lt;/span&gt; Lazy&amp;lt;IMessageSender, IDictionary&amp;lt;&lt;span style="color:Blue;"&gt;string&lt;/span&gt;,&lt;span style="color:Blue;"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;[] Senders { &lt;span style="color:Blue;"&gt;get&lt;/span&gt;; &lt;span style="color:Blue;"&gt;set&lt;/span&gt;; }

    &lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;void&lt;/span&gt; SendNotification()
    {
        &lt;span style="color:Blue;"&gt;foreach&lt;/span&gt;(&lt;span style="color:Blue;"&gt;var&lt;/span&gt; sender &lt;span style="color:Blue;"&gt;in&lt;/span&gt; Senders)
        {
            &lt;span style="color:Blue;"&gt;if&lt;/span&gt; (sender.Metadata.ContainsKey(&lt;span style="color:#A31515;"&gt;&amp;quot;Transport&amp;quot;&lt;/span&gt;) &amp;amp;&amp;amp; sender.Metadata[&lt;span style="color:#A31515;"&gt;&amp;quot;Transport&amp;quot;&lt;/span&gt;] == MessageTransport.Smtp &amp;amp;&amp;amp; 
                sender.Metadata.ContainsKey(&lt;span style="color:#A31515;"&gt;&amp;quot;Issecure&amp;quot;&lt;/span&gt;) &amp;amp;&amp;amp; Metadata[&lt;span style="color:#A31515;"&gt;&amp;quot;IsSecure&amp;quot;&lt;/span&gt;] == &lt;span style="color:Blue;"&gt;true&lt;/span&gt;)
            {
                &lt;span style="color:Blue;"&gt;var&lt;/span&gt; messageSender = sender.Value;
                messageSender.Send(&lt;span style="color:#A31515;"&gt;&amp;quot;Server is fine&amp;quot;&lt;/span&gt;);
                
                &lt;span style="color:Blue;"&gt;break&lt;/span&gt;;
            }
        }
    }
}
&lt;/pre&gt;&lt;/div&gt;&lt;h3&gt;Metadata filtering and DefaultValueAttribute&lt;/h3&gt;When you specifiy a metadata view, an implicit filtering will occur to match &lt;b&gt;only&lt;/b&gt; those exports which contain the metadata properties defined in the view. You can specify on the metadata view that a property is not required, by using the &lt;span class="codeInline"&gt;System.ComponentModel.DefaultValueAttribute&lt;/span&gt;. Below you can see where we have specified a default value of false on IsSecure. This means if a part exports IMessageSender, but does not supply IsSecure metadata, then it will still be matched.&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;interface&lt;/span&gt; IMessageSenderCapabilities
{
    MessageTransport Transport { &lt;span style="color:Blue;"&gt;get&lt;/span&gt;; }
    [DefaultValue(&lt;span style="color:Blue;"&gt;false&lt;/span&gt;)];
    &lt;span style="color:Blue;"&gt;bool&lt;/span&gt; IsSecure { &lt;span style="color:Blue;"&gt;get&lt;/span&gt;; }
}
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>weshaggard</author><pubDate>Tue, 27 Oct 2009 23:01:18 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Exports and Metadata 20091027110118P</guid></item><item><title>Updated Wiki: Composition Batch</title><link>http://mef.codeplex.com/wikipage?title=Composition Batch&amp;version=4</link><description>&lt;div class="wikidoc"&gt;&lt;h1&gt;Composition Batch&lt;/h1&gt;
A MEF container instance is not immutable. Changes can happen if the catalog supports changes (like watching a directory for changes) or if your code add or remove parts in runtime. Previously you had to make the changes and invoke the Compose method on the CompositionContainer. In the Preview 4 release we have introduced support for a composition batch. &lt;br /&gt;&lt;br /&gt;The batch contains a list of parts to be added and/or removed. After performing the changes, the container automatically triggers a composition which updates recomposable imports affected by the changes.&lt;br /&gt;As a scenario, consider a settings window and a user selecting and deselecting options. Those would map to parts present or not on the container. To apply the batch, you would call the Compose method, as follows:&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;var&lt;/span&gt; batch = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; CompositionBatch();
batch.AddPart(partInstance1);
batch.AddPart(partInstance2);
batch.RemovePart(part3);

container.Compose(batch);
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;For types that actually use the attributed programming model there are some extension methods on AttributedModelServices for CompositionContainer that allow you to do hide the CompositionBatch in some common cases where it isn't needed.&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
container.ComposeParts(partInstance1, partInstance2,... ); &lt;span style="color:Green;"&gt;// creates a CompositionBatch and calls AddPart on all the passed parts followed by Compose&lt;/span&gt;
container.ComposeExportedValue&amp;lt;IFoo&amp;gt;(instanceOfIFoo); &lt;span style="color:Green;"&gt;// creates a CompositionBatch and calls AddExportedValue&amp;lt;T&amp;gt; followed by Compose.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>weshaggard</author><pubDate>Tue, 27 Oct 2009 22:58:30 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Composition Batch 20091027105830P</guid></item><item><title>Updated Wiki: Parts</title><link>http://mef.codeplex.com/wikipage?title=Parts&amp;version=31</link><description>&lt;div class="wikidoc"&gt;&lt;h1&gt;Defining Composable Parts and Contracts&lt;/h1&gt;&lt;a name="Parts"&gt;&lt;/a&gt;
&lt;h2&gt;Composable Parts&lt;/h2&gt;A Composable Part is a composable unit within MEF. Composable Parts export services that other Composable Parts need, and import services from other Composable Parts. In the MEF programming model, Composable Parts are attributed with the &lt;b&gt;&lt;span class="codeInline"&gt;System.ComponentModel.Composition.Import&lt;/span&gt;&lt;/b&gt; and &lt;b&gt;&lt;span class="codeInline"&gt;[System.ComponentModel.Composition.Export]&lt;/span&gt;&lt;/b&gt; attribute in order to declare their exports and imports. A Composable Part should contain at least one export. Composable Parts are either added to the container explicity or created through the use of catalogs. The default catalogs that MEF ship with identify Composable Parts through the presence of an export attribute.&lt;br /&gt;&lt;a name="Contracts"&gt;&lt;/a&gt;
&lt;h2&gt;Contracts&lt;/h2&gt;Composable Parts do not directly depend on one another, instead they depend on a contract, which is a string identifier. Every export has a contract, and every import declares the contract it needs. The container uses the contract information to match up imports to exports. If no contract is specified, MEF will implicitly use the fully qualified name of the type as the contract. If a type is passed, it will also use the fully qualified name. &lt;br /&gt;&lt;br /&gt;&lt;i&gt;Note: By default a type should be passed for a contract, and not a string. Although contracts can be an arbitrary string this can lead to ambiguity. For example &amp;quot;Sender&amp;quot; might overlap with another implementation of &amp;quot;Sender&amp;quot; in a different library. For this reason if you do need to specify a string constract, it is recommend that contract names should be qualified with a namespace that includes the Company Name for example &amp;quot;Contoso.Exports.Sender&amp;quot;.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;In the code snippet below, all export contracts are equivalent.&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;namespace&lt;/span&gt; MEFSample 
{
  [Export]
  &lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;class&lt;/span&gt; Exporter {...}

  [Export(&lt;span style="color:Blue;"&gt;typeof&lt;/span&gt;(Exporter))]
  &lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;class&lt;/span&gt; Exporter1 {...}

  [Export(&lt;span style="color:#A31515;"&gt;&amp;quot;MEFSample.Exporter&amp;quot;&lt;/span&gt;)]
  &lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;class&lt;/span&gt; Exporter2 {...}
}
&lt;/pre&gt;&lt;/div&gt;&lt;b&gt;Interface / Abstract contracts&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;A common pattern is for a Composable Part to export an interface or an abstract type contract rather than a concrete type. This allows the importer to be completely decoupled from the specific implementation of the export it is importing resulting in a separation of concerns. For example below you can see there are two sender implementations that both export &lt;b&gt;&lt;span class="codeInline"&gt;IMessageSender&lt;/span&gt;&lt;/b&gt;. The &lt;b&gt;&lt;span class="codeInline"&gt;Notifier&lt;/span&gt;&lt;/b&gt; class imports a collection of &lt;b&gt;&lt;span class="codeInline"&gt;IMessageSender&lt;/span&gt;&lt;/b&gt; which it invokes in its &lt;b&gt;&lt;span class="codeInline"&gt;Send()&lt;/span&gt;&lt;/b&gt; method. New message senders can now easily be added to the system.&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
  [Export(&lt;span style="color:Blue;"&gt;typeof&lt;/span&gt;(IMessageSender))]
  &lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;class&lt;/span&gt; EmailSender : IMessageSender {
    ...
  }

  [Export(&lt;span style="color:Blue;"&gt;typeof&lt;/span&gt;(IMessageSender))]  
  &lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;class&lt;/span&gt; TCPSender : IMessageSender {
    ...
  }

  &lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;class&lt;/span&gt; Notifier {
    [ImportMany]
    &lt;span style="color:Blue;"&gt;public&lt;/span&gt; IEnumerable&amp;lt;IMessageSender&amp;gt; Senders {&lt;span style="color:Blue;"&gt;get&lt;/span&gt;; &lt;span style="color:Blue;"&gt;set&lt;/span&gt;;}
    &lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;void&lt;/span&gt; Notify(&lt;span style="color:Blue;"&gt;string&lt;/span&gt; message) {
      &lt;span style="color:Blue;"&gt;foreach&lt;/span&gt;(IMessageSender sender &lt;span style="color:Blue;"&gt;in&lt;/span&gt; Senders) 
        sender.Send(message);
    } 
  }
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;i&gt;Note: You must specify the specific interface type (&lt;b&gt;&lt;span class="codeInline"&gt;IMessageSender&lt;/span&gt;&lt;/b&gt;) being exported otherwise the type (&lt;b&gt;&lt;span class="codeInline"&gt;EmailSender&lt;/span&gt;&lt;/b&gt;) itself will be exported.&lt;/i&gt;&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>weshaggard</author><pubDate>Tue, 27 Oct 2009 22:50:59 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Parts 20091027105059P</guid></item><item><title>New Comment on "Filtering Catalogs"</title><link>http://mef.codeplex.com/wikipage?title=Filtering Catalogs&amp;ANCHOR#C14058</link><description>I&amp;#39;ve updated the FilteredCatalog to reflect the current &amp;#40;preview 8&amp;#41; code. Also we don&amp;#39;t need to unhook any events in the dispose because we aren&amp;#39;t explicitly hooking the change event any longer.</description><author>weshaggard</author><pubDate>Tue, 27 Oct 2009 22:08:23 GMT</pubDate><guid isPermaLink="false">New Comment on "Filtering Catalogs" 20091027100823P</guid></item><item><title>Updated Wiki: Filtering Catalogs</title><link>http://mef.codeplex.com/wikipage?title=Filtering Catalogs&amp;version=5</link><description>&lt;div class="wikidoc"&gt;&lt;h1&gt;Filtering Catalogs&lt;/h1&gt;
When using child containers it may be important to filter catalogs based on some specific criteria. For example, it is common to filter based on part's creation policy. The following code snippet demonstrates how to set up this particular approach:&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;var&lt;/span&gt; catalog = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; AssemblyCatalog(&lt;span style="color:Blue;"&gt;typeof&lt;/span&gt;(Program).Assembly);
&lt;span style="color:Blue;"&gt;var&lt;/span&gt; parent = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; CompositionContainer(catalog);

&lt;span style="color:Blue;"&gt;var&lt;/span&gt; filteredCat = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; FilteredCatalog(catalog,
    def =&amp;gt; def.Metadata.ContainsKey(CompositionConstants.PartCreationPolicyMetadataName) &amp;amp;&amp;amp;
    ((CreationPolicy)def.Metadata[CompositionConstants.PartCreationPolicyMetadataName]) == CreationPolicy.NonShared);
&lt;span style="color:Blue;"&gt;var&lt;/span&gt; child = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; CompositionContainer(filteredCat, parent);

&lt;span style="color:Blue;"&gt;var&lt;/span&gt; root = child.GetExportedObject&amp;lt;Root&amp;gt;();
child.Dispose();
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;If CreationPolicy is not enough as a criteria to select parts you may want to use the &lt;b&gt;&lt;span class="codeInline"&gt;[System.ComponentModel.Composition.PartMetadataAttribute]&lt;/span&gt;&lt;/b&gt; instead. It allows you to attach metadata to the part so you can use it to construct a filtering expression. For example, the following is a class that with the attribute applied:&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
[PartMetadata(&lt;span style="color:#A31515;"&gt;&amp;quot;scope&amp;quot;&lt;/span&gt;, &lt;span style="color:#A31515;"&gt;&amp;quot;webrequest&amp;quot;&lt;/span&gt;), Export]
&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;class&lt;/span&gt; HomeController : Controller
{
} 
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;This allows you to create a child container with parts that should be scoped to a (logical) web request. Note that it is up to you to define a scope boundary, in other words, MEF doesn't know what a &amp;quot;webrequest&amp;quot; is, so you have to create some infrastructure code to create/dispose containers per web request.&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;var&lt;/span&gt; catalog = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; AssemblyCatalog(&lt;span style="color:Blue;"&gt;typeof&lt;/span&gt;(Program).Assembly);
&lt;span style="color:Blue;"&gt;var&lt;/span&gt; parent = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; CompositionContainer(catalog);

&lt;span style="color:Blue;"&gt;var&lt;/span&gt; filteredCat = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; FilteredCatalog(catalog,
    def =&amp;gt; def.Metadata.ContainsKey(&lt;span style="color:#A31515;"&gt;&amp;quot;scope&amp;quot;&lt;/span&gt;) &amp;amp;&amp;amp;
    def.Metadata[&lt;span style="color:#A31515;"&gt;&amp;quot;scope&amp;quot;&lt;/span&gt;].ToString() == &lt;span style="color:#A31515;"&gt;&amp;quot;webrequest&amp;quot;&lt;/span&gt;);
&lt;span style="color:Blue;"&gt;var&lt;/span&gt; perRequest = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; CompositionContainer(filteredCat, parent);

&lt;span style="color:Blue;"&gt;var&lt;/span&gt; controller = perRequest.GetExportedObject&amp;lt;HomeController&amp;gt;();
perRequest.Dispose();
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Note that we do not provide a FilteredCatalog class. A simple implementation that illustrates what would take to build one follows:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;using&lt;/span&gt; System;
&lt;span style="color:Blue;"&gt;using&lt;/span&gt; System.ComponentModel.Composition.Primitives;
&lt;span style="color:Blue;"&gt;using&lt;/span&gt; System.ComponentModel.Composition.Hosting;
&lt;span style="color:Blue;"&gt;using&lt;/span&gt; System.Linq;
&lt;span style="color:Blue;"&gt;using&lt;/span&gt; System.Linq.Expressions;

&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;class&lt;/span&gt; FilteredCatalog : ComposablePartCatalog, INotifyComposablePartCatalogChanged
{
    &lt;span style="color:Blue;"&gt;private&lt;/span&gt; &lt;span style="color:Blue;"&gt;readonly&lt;/span&gt; ComposablePartCatalog _inner;
    &lt;span style="color:Blue;"&gt;private&lt;/span&gt; &lt;span style="color:Blue;"&gt;readonly&lt;/span&gt; INotifyComposablePartCatalogChanged _innerNotifyChange;
    &lt;span style="color:Blue;"&gt;private&lt;/span&gt; &lt;span style="color:Blue;"&gt;readonly&lt;/span&gt; IQueryable&amp;lt;ComposablePartDefinition&amp;gt; _partsQuery;

    &lt;span style="color:Blue;"&gt;public&lt;/span&gt; FilteredCatalog(ComposablePartCatalog inner,
                           Expression&amp;lt;Func&amp;lt;ComposablePartDefinition, &lt;span style="color:Blue;"&gt;bool&lt;/span&gt;&amp;gt;&amp;gt; expression)
    {
        _inner = inner;
        _innerNotifyChange = inner &lt;span style="color:Blue;"&gt;as&lt;/span&gt; INotifyComposablePartCatalogChanged;
        _partsQuery = inner.Parts.Where(expression);
    }

    &lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;override&lt;/span&gt; IQueryable&amp;lt;ComposablePartDefinition&amp;gt; Parts
    {
        &lt;span style="color:Blue;"&gt;get&lt;/span&gt;
        {
            &lt;span style="color:Blue;"&gt;return&lt;/span&gt; _partsQuery;
        }
    }

    &lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;event&lt;/span&gt; EventHandler&amp;lt;ComposablePartCatalogChangeEventArgs&amp;gt; Changed
    {
        add
        {
            &lt;span style="color:Blue;"&gt;if&lt;/span&gt; (_innerNotifyChange != &lt;span style="color:Blue;"&gt;null&lt;/span&gt;)
                _innerNotifyChange.Changed += value;
        }
        remove
        {
            &lt;span style="color:Blue;"&gt;if&lt;/span&gt; (_innerNotifyChange != &lt;span style="color:Blue;"&gt;null&lt;/span&gt;)
                _innerNotifyChange.Changed -= value;
        }
    }

    &lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;event&lt;/span&gt; EventHandler&amp;lt;ComposablePartCatalogChangeEventArgs&amp;gt; Changing
    {
        add
        {
            &lt;span style="color:Blue;"&gt;if&lt;/span&gt; (_innerNotifyChange != &lt;span style="color:Blue;"&gt;null&lt;/span&gt;)
                _innerNotifyChange.Changing += value;
        }
        remove
        {
            &lt;span style="color:Blue;"&gt;if&lt;/span&gt; (_innerNotifyChange != &lt;span style="color:Blue;"&gt;null&lt;/span&gt;)
                _innerNotifyChange.Changing -= value;
        }
    }
}
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>weshaggard</author><pubDate>Tue, 27 Oct 2009 22:06:18 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Filtering Catalogs 20091027100618P</guid></item><item><title>Updated Wiki: Using Catalogs</title><link>http://mef.codeplex.com/wikipage?title=Using Catalogs&amp;version=13</link><description>&lt;div class="wikidoc"&gt;&lt;h2&gt;Catalogs&lt;/h2&gt;One of value propositions of MEF's attributed programming model is the ability to dynamically discover parts via catalogs. Catalogs allow applications to easily consume exports that have self-registered themselves via the Export attribute. Below is a list the catalogs MEF provides out of the box. &lt;br /&gt;
&lt;h3&gt;Assembly Catalog&lt;/h3&gt;To discover all the exports in a given assembly one would use the &lt;b&gt;&lt;span class="codeInline"&gt;[System.ComponentModel.Composition.Hosting.AssemblyCatalog]&lt;/span&gt;&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;var&lt;/span&gt; catalog = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly());
&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Directory Catalog&lt;/h3&gt;To discover all the exports in all the assemblies in a directory one would use the &lt;b&gt;&lt;span class="codeInline"&gt;[System.ComponentModel.Composition.Hosting.DirectoryCatalog]&lt;/span&gt;&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;var&lt;/span&gt; catalog = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; DirectoryCatalog(&lt;span style="color:#A31515;"&gt;&amp;quot;Extensions&amp;quot;&lt;/span&gt;);
&lt;/pre&gt;&lt;/div&gt;If a relative directory is used it is relative to the base directory of the current AppDomain.&lt;br /&gt;&lt;br /&gt;The DirectoryCatalog will do a one-time scan of the directory and will not automatically refresh when there are changes in the directory. However, you can implement your own scanning mechanism, and call &lt;span class="codeInline"&gt;Refresh()&lt;/span&gt; on the catalog to have it rescan. Once it rescans, recomposition will occur.&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;var&lt;/span&gt; catalog = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; DirectoryCatalog(&lt;span style="color:#A31515;"&gt;&amp;quot;Extensions&amp;quot;&lt;/span&gt;);
&lt;span style="color:Green;"&gt;//some scanning logic&lt;/span&gt;
catalog.Refresh();
&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Aggregate Catalog&lt;/h3&gt;When AssemblyCatalog and DirectoryCatalog are not enough individually and a combination of catalogs is needed then an application can use an &lt;b&gt;&lt;span class="codeInline"&gt;[System.ComponentModel.Composition.Hosting.AggregateCatalog]&lt;/span&gt;&lt;/b&gt;. An AggregateCatalog combines multiple catalogs into a single catalog. A common pattern is to add the current executing assembly, as well as a directory catalog of third-party extensions. You can pass in a collection of catalogs to the AggregateCatalog constructor or you can add directly to the Catalogs collection i.e. catalog.Catalogs.Add(...)&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;var&lt;/span&gt; catalog = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; AggregateCatalog(
  &lt;span style="color:Blue;"&gt;new&lt;/span&gt; AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly()), 
  &lt;span style="color:Blue;"&gt;new&lt;/span&gt; DirectoryCatalog(&lt;span style="color:#A31515;"&gt;&amp;quot;Extensions&amp;quot;&lt;/span&gt;));
&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Type Catalog&lt;/h3&gt;To discover all the exports in a specific set of types one would use a &lt;b&gt;&lt;span class="codeInline"&gt;[System.ComponentModel.Composition.Hosting.TypeCatalog]&lt;/span&gt;&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;var&lt;/span&gt; catalog = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; TypeCatalog(&lt;span style="color:Blue;"&gt;typeof&lt;/span&gt;(type1), &lt;span style="color:Blue;"&gt;typeof&lt;/span&gt;(type2), ...);
&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Using catalog with a Container&lt;/h3&gt;To use a catalog with the container, simpy pass the catalog to the container's constructor.&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;var&lt;/span&gt; container = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; CompositionContainer(catalog);
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>weshaggard</author><pubDate>Tue, 27 Oct 2009 21:41:58 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Using Catalogs 20091027094158P</guid></item><item><title>Updated Wiki: Using Catalogs</title><link>http://mef.codeplex.com/wikipage?title=Using Catalogs&amp;version=12</link><description>&lt;div class="wikidoc"&gt;&lt;h2&gt;Catalogs&lt;/h2&gt;One of value propositions of MEF's attributed programming model is the ability to dynamically discover parts via catalogs. Catalogs allow applications to easily consume exports that have self-registered themselves via the Export attribute. Below is a list the catalogs MEF provides out of the box. &lt;br /&gt;
&lt;h3&gt;Assembly Catalog&lt;/h3&gt;To discover all the exports in a given assembly one would use the &lt;b&gt;&lt;span class="codeInline"&gt;[System.ComponentModel.Composition.Hosting.AssemblyCatalog]&lt;/span&gt;&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;var&lt;/span&gt; catalog = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly());
&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Directory Catalog&lt;/h3&gt;To discover all the exports in all the assemblies in a directory one would use the &lt;b&gt;&lt;span class="codeInline"&gt;[System.ComponentModel.Composition.Hosting.DirectoryCatalog]&lt;/span&gt;&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;var&lt;/span&gt; catalog = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; DirectoryCatalog(&lt;span style="color:#A31515;"&gt;&amp;quot;Extensions&amp;quot;&lt;/span&gt;);
&lt;/pre&gt;&lt;/div&gt;If a relative directory is used it is relative to the base directory of the current AppDomain.&lt;br /&gt;&lt;br /&gt;The DirectoryCatalog will do a one-time scan of the directory and will not automatically refresh when there are changes in the directory. However, you can implement your own scanning mechanism, and call &lt;span class="codeInline"&gt;Refresh()&lt;/span&gt; on the catalog to have it rescan. Once it rescans, recomposition will occur.&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;var&lt;/span&gt; catalog = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; DirectoryCatalog(&lt;span style="color:#A31515;"&gt;&amp;quot;Extensions&amp;quot;&lt;/span&gt;);
&lt;span style="color:Green;"&gt;//some scanning logic&lt;/span&gt;
catalog.Refresh();
&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Aggregate Catalog&lt;/h3&gt;When AssemblyCatalog and DirectoryCatalog are not enough individually and a combination of catalogs is needed then an application can use an &lt;b&gt;&lt;span class="codeInline"&gt;[System.ComponentModel.Composition.Hosting.AggregateCatalog]&lt;/span&gt;&lt;/b&gt;. An AggregateCatalog combines multiple catalogs into a single catalog. A common pattern is to add the current executing assembly, as well as a directory catalog of third-party extensions. You can pass in a collection of catalogs to the AggregateCatalog constructor or you can add directly to the Catalogs collection i.e. catalog.Catalogs.Add(...)&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;var&lt;/span&gt; catalog = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; AggregateCatalog 
  &lt;span style="color:Blue;"&gt;new&lt;/span&gt; AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly()), 
  &lt;span style="color:Blue;"&gt;new&lt;/span&gt; DirectoryCatalog(&lt;span style="color:#A31515;"&gt;&amp;quot;Extensions&amp;quot;&lt;/span&gt;));
&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Type Catalog&lt;/h3&gt;To discover all the exports in a specific set of types one would use a &lt;b&gt;&lt;span class="codeInline"&gt;[System.ComponentModel.Composition.Hosting.TypeCatalog]&lt;/span&gt;&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;var&lt;/span&gt; catalog = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; TypeCatalog(&lt;span style="color:Blue;"&gt;typeof&lt;/span&gt;(type1), &lt;span style="color:Blue;"&gt;typeof&lt;/span&gt;(type2), ...);
&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Using catalog with a Container&lt;/h3&gt;To use a catalog with the container, simpy pass the catalog to the container's constructor.&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;var&lt;/span&gt; container = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; CompositionContainer(catalog);
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>weshaggard</author><pubDate>Tue, 27 Oct 2009 21:41:38 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Using Catalogs 20091027094138P</guid></item><item><title>Updated Wiki: Using Catalogs</title><link>http://mef.codeplex.com/wikipage?title=Using Catalogs&amp;version=11</link><description>&lt;div class="wikidoc"&gt;&lt;h2&gt;Catalogs&lt;/h2&gt;One of value propositions of MEF's attributed programming model is the ability to dynamically discover parts via catalogs. Catalogs allow applications to easily consume exports that have self-registered themselves via the Export attribute. Below is a list the catalogs MEF provides out of the box. &lt;br /&gt;
&lt;h3&gt;Assembly Catalog&lt;/h3&gt;To discover all the exports in a given assembly one would use the &lt;b&gt;&lt;span class="codeInline"&gt;[System.ComponentModel.Composition.Hosting.AssemblyCatalog]&lt;/span&gt;&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;var&lt;/span&gt; catalog = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly());
&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Directory Catalog&lt;/h3&gt;To discover all the exports in all the assemblies in a directory one would use the &lt;b&gt;&lt;span class="codeInline"&gt;[System.ComponentModel.Composition.Hosting.DirectoryCatalog]&lt;/span&gt;&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;var&lt;/span&gt; catalog = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; DirectoryCatalog(&lt;span style="color:#A31515;"&gt;&amp;quot;Extensions&amp;quot;&lt;/span&gt;);
&lt;/pre&gt;&lt;/div&gt;If a relative directory is used it is relative to the base directory of the current AppDomain.&lt;br /&gt;&lt;br /&gt;The DirectoryCatalog will do a one-time scan of the directory and will not automatically refresh when there are changes in the directory. However, you can implement your own scanning mechanism, and call &lt;span class="codeInline"&gt;Refresh()&lt;/span&gt; on the catalog to have it rescan. Once it rescans, recomposition will occur.&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;var&lt;/span&gt; catalog = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; DirectoryCatalog(&lt;span style="color:#A31515;"&gt;&amp;quot;Extensions&amp;quot;&lt;/span&gt;);
&lt;span style="color:Green;"&gt;//some scanning logic&lt;/span&gt;
catalog.Refresh();
&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Aggregate Catalog&lt;/h3&gt;When AssemblyCatalog and DirectoryCatalog are not enough individually and a combination of catalogs is needed then an application can use an &lt;b&gt;&lt;span class="codeInline"&gt;[System.ComponentModel.Composition.Hosting.AggregateCatalog]&lt;/span&gt;&lt;/b&gt;. An AggregateCatalog combines multiple catalogs into a single catalog. A common pattern is to add the current executing assembly, as well as a directory catalog of third-party extensions. You can pass in a collection of catalogs to the AggregateCatalog constructor or you can add directly to the Catalogs collection i.e. catalog.Catalogs.Add(...)&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;var&lt;/span&gt; catalog = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; AggregateCatalog 
  &lt;span style="color:Blue;"&gt;new&lt;/span&gt; AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly()), 
  &lt;span style="color:Blue;"&gt;new&lt;/span&gt; DirectoryCatalog(&lt;span style="color:#A31515;"&gt;&amp;quot;Extensions&amp;quot;&lt;/span&gt;));
&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Type Catalog&lt;/h3&gt;To discover all the exports in a specific set of types one would use a &lt;b&gt;&lt;span class="codeInline"&gt;[System.ComponentModel.Composition.Hosting.TypeCatalog]&lt;/span&gt;&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;var&lt;/span&gt; catalog = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; TypeCatalog(&lt;span style="color:Blue;"&gt;typeof&lt;/span&gt;(type1), &lt;span style="color:Blue;"&gt;typeof&lt;/span&gt;(type2), ...);
&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Using catalog with a Container&lt;/h3&gt;To use a catalog with the container, simpy pass the catalog to the container's constructor.&lt;br /&gt;&lt;br /&gt;&lt;div style="color:Black;background-color:White;"&gt;&lt;pre&gt;
&lt;span style="color:Blue;"&gt;var&lt;/span&gt; container = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; CompositionContainer(catalog);
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>weshaggard</author><pubDate>Tue, 27 Oct 2009 21:41:01 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Using Catalogs 20091027094101P</guid></item><item><title>Updated Wiki: Guide</title><link>http://mef.codeplex.com/wikipage?title=Guide&amp;version=31</link><description>&lt;div class="wikidoc"&gt;&lt;h3&gt;MEF Programming Guide&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://mef.codeplex.com/wikipage?title=Hosting%20MEF%20and%20the%20Container&amp;referringTitle=Guide"&gt;Hosting MEF in an application&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;a href="http://mef.codeplex.com/wikipage?title=Parts&amp;referringTitle=Guide"&gt;Defining Parts and Contracts&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;a href="http://mef.codeplex.com/wikipage?title=Declaring%20Exports&amp;referringTitle=Guide"&gt;Declaring Exports&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;a href="http://mef.codeplex.com/wikipage?title=Declaring%20Imports&amp;referringTitle=Guide"&gt;Declaring Imports&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;a href="http://mef.codeplex.com/wikipage?title=Lazy%20Exports&amp;referringTitle=Guide"&gt;Lazy Imports&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;a href="http://mef.codeplex.com/wikipage?title=Exports%20and%20Metadata&amp;referringTitle=Guide"&gt;Exports and Metadata&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;a href="http://mef.codeplex.com/wikipage?title=Using%20Catalogs&amp;referringTitle=Guide"&gt;Using Catalogs&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;a href="http://mef.codeplex.com/wikipage?title=Filtering%20Catalogs&amp;referringTitle=Guide"&gt;Filtered Catalogs&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;a href="http://mef.codeplex.com/wikipage?title=Parts%20Lifetime&amp;referringTitle=Guide"&gt;Part Lifetime&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;a href="http://mef.codeplex.com/wikipage?title=Recomposition&amp;referringTitle=Guide"&gt;Recomposition&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;a href="http://mef.codeplex.com/wikipage?title=Querying%20the%20Composition%20Container&amp;referringTitle=Guide"&gt;Querying the Composition Container&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;a href="http://mef.codeplex.com/wikipage?title=Composition%20Batch&amp;referringTitle=Guide"&gt;Composition Batch&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;a href="http://mef.codeplex.com/wikipage?title=PartCreator&amp;referringTitle=Guide"&gt;Dynamic Instantiation and PartCreator&amp;#60;T&amp;#62;&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;a href="http://mef.codeplex.com/wikipage?title=Debugging%20and%20Diagnostics&amp;referringTitle=Guide"&gt;Debugging and Diagnostics&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;a href="http://mef.codeplex.com/wikipage?title=FAQ&amp;referringTitle=Guide"&gt;FAQ&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>gblock</author><pubDate>Tue, 27 Oct 2009 19:03:31 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Guide 20091027070331P</guid></item><item><title>Updated Wiki: Home</title><link>http://mef.codeplex.com/wikipage?version=57</link><description>&lt;div class="wikidoc"&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=MEF&amp;DownloadId=42492" alt="logo.gif" title="logo.gif" /&gt;
&lt;h1&gt;Welcome to the MEF community site&lt;/h1&gt;
Application requirements change frequently and software is constantly evolving. As a result, such applications often become monolithic making it difficult to add new functionality. The Managed Extensibility Framework (MEF) is a new library in .NET Framework 4.0 that addresses this problem by simplifying the design of extensible applications and components. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Disclaimer&lt;/b&gt;: MEF is in development. The source available on this site, does not reflect the final state of the product, it is a preview of what will be shipping in the framework in the future. We welcome any &lt;a href="http://www.codeplex.com/MEF/Thread/List.aspx" class="externalLink"&gt;feedback&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; you have on your experience.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=MEF&amp;DownloadId=42484" alt="blocks.png" title="blocks.png" /&gt;&lt;br /&gt;
&lt;h3&gt;Where to go next&lt;/h3&gt;
&lt;table&gt;&lt;tr&gt;&lt;td&gt; &lt;b&gt;&lt;a href="http://mef.codeplex.com/wikipage?title=Overview&amp;referringTitle=Home"&gt;Learn more about MEF&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt;&lt;a href="http://mef.codeplex.com/wikipage?title=Guide&amp;referringTitle=Home"&gt;Read the MEF Programming Guide&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt;&lt;a href="http://mef.codeplex.com/wikipage?title=Samples&amp;referringTitle=Home"&gt;Read our sample documentation&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt;&lt;a href="http://mef.codeplex.com/wikipage?title=Architecture&amp;referringTitle=Home"&gt;Architecture Overview&lt;/a&gt;&lt;/b&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt;&lt;a href="http://www.codeplex.com/MEF/Thread/List.aspx" class="externalLink"&gt;Visit the MEF Discussions&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt;&lt;a href="http://mef.codeplex.com/wikipage?title=Blogs&amp;referringTitle=Home"&gt;See our team Blogs&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt;&lt;a href="http://mef.codeplex.com/wikipage?title=Field_Blogs&amp;referringTitle=Home"&gt;See field and industry blogs on MEF&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.composition(VS.100).aspx" class="externalLink"&gt;Read reference documentation on MSDN&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;, &lt;b&gt;(&lt;a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.composition.hosting(VS.100).aspx" class="externalLink"&gt;more&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;)&lt;/b&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;h3&gt;News&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;MEF Preview 8 is live, download it &lt;a href="http://mef.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=34838"&gt;here&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;If you want to know about MEF's underlying composition model, check out the new &lt;a href="http://mef.codeplex.com/Project/Download/FileDownload.aspx?DownloadId=62133" class="externalLink"&gt;whitepaper&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; on hosting the .NET composition primivites&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MEF is now MS-PL, read about it &lt;a href="http://blogs.msdn.com/gblock/archive/2008/10/02/mef-going-ms-pl-the-little-engine-that-could.aspx" class="externalLink"&gt;here&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MEF Contrib has launched. &lt;a href="http://www.codeplex.com/MEFContrib" class="externalLink"&gt;http://www.codeplex.com/MEFContrib&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>gblock</author><pubDate>Tue, 27 Oct 2009 14:44:11 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20091027024411P</guid></item><item><title>New Comment on "Filtering Catalogs"</title><link>http://mef.codeplex.com/wikipage?title=Filtering Catalogs&amp;ANCHOR#C14052</link><description>The inner catalog may not need to be disposed, but the Change event needs to be unwired.</description><author>fa3den</author><pubDate>Tue, 27 Oct 2009 13:38:45 GMT</pubDate><guid isPermaLink="false">New Comment on "Filtering Catalogs" 20091027013845P</guid></item><item><title>New Comment on "Querying the Composition Container"</title><link>http://mef.codeplex.com/wikipage?title=Querying the Composition Container&amp;ANCHOR#C14041</link><description>can you make a query using meta data&amp;#63; i have a scenario where there are multiple repositories and i want to get the one with the metadata name x that ive defined in some settings i have.</description><author>aL3891</author><pubDate>Mon, 26 Oct 2009 14:29:40 GMT</pubDate><guid isPermaLink="false">New Comment on "Querying the Composition Container" 20091026022940P</guid></item><item><title>Updated Wiki: Home</title><link>http://mef.codeplex.com/wikipage?version=56</link><description>&lt;div class="wikidoc"&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=MEF&amp;DownloadId=42492" alt="logo.gif" title="logo.gif" /&gt;
&lt;h1&gt;Welcome to the MEF community site&lt;/h1&gt;
Application requirements change frequently and software is constantly evolving. As a result, such applications often become monolithic making it difficult to add new fuctionality. The Managed Extensibility Framework (MEF) is a new library in .NET Framework 4.0 that addresses this problem by simplifying the design of extensible applications and components. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Disclaimer&lt;/b&gt;: MEF is in development. The source available on this site, does not reflect the final state of the product, it is a preview of what will be shipping in the framework in the future. We welcome any &lt;a href="http://www.codeplex.com/MEF/Thread/List.aspx" class="externalLink"&gt;feedback&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; you have on your experience.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=MEF&amp;DownloadId=42484" alt="blocks.png" title="blocks.png" /&gt;&lt;br /&gt;
&lt;h3&gt;Where to go next&lt;/h3&gt;
&lt;table&gt;&lt;tr&gt;&lt;td&gt; &lt;b&gt;&lt;a href="http://mef.codeplex.com/wikipage?title=Overview&amp;referringTitle=Home"&gt;Learn more about MEF&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt;&lt;a href="http://mef.codeplex.com/wikipage?title=Guide&amp;referringTitle=Home"&gt;Read the MEF Programming Guide&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt;&lt;a href="http://mef.codeplex.com/wikipage?title=Samples&amp;referringTitle=Home"&gt;Read our sample documentation&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt;&lt;a href="http://mef.codeplex.com/wikipage?title=Architecture&amp;referringTitle=Home"&gt;Architecture Overview&lt;/a&gt;&lt;/b&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt;&lt;a href="http://www.codeplex.com/MEF/Thread/List.aspx" class="externalLink"&gt;Visit the MEF Discussions&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt;&lt;a href="http://mef.codeplex.com/wikipage?title=Blogs&amp;referringTitle=Home"&gt;See our team Blogs&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt;&lt;a href="http://mef.codeplex.com/wikipage?title=Field_Blogs&amp;referringTitle=Home"&gt;See field and industry blogs on MEF&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.composition(VS.100).aspx" class="externalLink"&gt;Read reference documentation on MSDN&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;, &lt;b&gt;(&lt;a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.composition.hosting(VS.100).aspx" class="externalLink"&gt;more&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;)&lt;/b&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;h3&gt;News&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;MEF Preview 8 is live, download it &lt;a href="http://mef.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=34838"&gt;here&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;If you want to know about MEF's underlying composition model, check out the new &lt;a href="http://mef.codeplex.com/Project/Download/FileDownload.aspx?DownloadId=62133" class="externalLink"&gt;whitepaper&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; on hosting the .NET composition primivites&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MEF is now MS-PL, read about it &lt;a href="http://blogs.msdn.com/gblock/archive/2008/10/02/mef-going-ms-pl-the-little-engine-that-could.aspx" class="externalLink"&gt;here&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MEF Contrib has launched. &lt;a href="http://www.codeplex.com/MEFContrib" class="externalLink"&gt;http://www.codeplex.com/MEFContrib&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>gblock</author><pubDate>Mon, 26 Oct 2009 03:33:54 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20091026033354A</guid></item><item><title>Updated Wiki: Home</title><link>http://mef.codeplex.com/wikipage?version=55</link><description>&lt;div class="wikidoc"&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=MEF&amp;DownloadId=42492" alt="logo.gif" title="logo.gif" /&gt;
&lt;h1&gt;Welcome to the MEF community site&lt;/h1&gt;
The Managed Extensibility Framework &amp;#40;MEF&amp;#41; is a new library in .NET that enables greater reuse of applications and components. Using MEF, .NET applications can make the shift from being statically compiled to dynamically composed. If you are building extensible applications, extensible frameworks and application extensions, then MEF is for you.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Disclaimer&lt;/b&gt;: MEF is in development. The source available on this site, does not reflect the final state of the product, it is a preview of what will be shipping in the framework in the future. We welcome any &lt;a href="http://www.codeplex.com/MEF/Thread/List.aspx" class="externalLink"&gt;feedback&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; you have on your experience.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=MEF&amp;DownloadId=42484" alt="blocks.png" title="blocks.png" /&gt;&lt;br /&gt;
&lt;h3&gt;Where to go next&lt;/h3&gt;
&lt;table&gt;&lt;tr&gt;&lt;td&gt; &lt;b&gt;&lt;a href="http://mef.codeplex.com/wikipage?title=Overview&amp;referringTitle=Home"&gt;Learn more about MEF&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt;&lt;a href="http://mef.codeplex.com/wikipage?title=Guide&amp;referringTitle=Home"&gt;Read the MEF Programming Guide&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt;&lt;a href="http://mef.codeplex.com/wikipage?title=Samples&amp;referringTitle=Home"&gt;Read our sample documentation&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt;&lt;a href="http://mef.codeplex.com/wikipage?title=Architecture&amp;referringTitle=Home"&gt;Architecture Overview&lt;/a&gt;&lt;/b&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt;&lt;a href="http://www.codeplex.com/MEF/Thread/List.aspx" class="externalLink"&gt;Visit the MEF Discussions&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt;&lt;a href="http://mef.codeplex.com/wikipage?title=Blogs&amp;referringTitle=Home"&gt;See our team Blogs&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt;&lt;a href="http://mef.codeplex.com/wikipage?title=Field_Blogs&amp;referringTitle=Home"&gt;See field and industry blogs on MEF&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.composition(VS.100).aspx" class="externalLink"&gt;Read reference documentation on MSDN&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;, &lt;b&gt;(&lt;a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.composition.hosting(VS.100).aspx" class="externalLink"&gt;more&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;)&lt;/b&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;h3&gt;News&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;MEF Preview 8 is live, download it &lt;a href="http://mef.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=34838"&gt;here&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;If you want to know about MEF's underlying composition model, check out the new &lt;a href="http://mef.codeplex.com/Project/Download/FileDownload.aspx?DownloadId=62133" class="externalLink"&gt;whitepaper&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; on hosting the .NET composition primivites&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MEF is now MS-PL, read about it &lt;a href="http://blogs.msdn.com/gblock/archive/2008/10/02/mef-going-ms-pl-the-little-engine-that-could.aspx" class="externalLink"&gt;here&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MEF Contrib has launched. &lt;a href="http://www.codeplex.com/MEFContrib" class="externalLink"&gt;http://www.codeplex.com/MEFContrib&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>haveriss</author><pubDate>Thu, 22 Oct 2009 21:17:14 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20091022091714P</guid></item><item><title>Updated Wiki: Blogs</title><link>http://mef.codeplex.com/wikipage?title=Blogs&amp;version=22</link><description>&lt;div class="wikidoc"&gt;&lt;h1&gt;MEF Team Blogs&lt;/h1&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;Team member&lt;/td&gt;&lt;td&gt;Blog&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Krzysztof Cwalina&lt;/td&gt;&lt;td&gt;&lt;a href="http://blogs.msdn.com/kcwalina/" class="externalLink"&gt;http://blogs.msdn.com/kcwalina/&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Mircea Troffin&lt;/td&gt;&lt;td&gt;&lt;a href="http://blogs.msdn.com/mirceat/" class="externalLink"&gt;http://blogs.msdn.com/mirceat/&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Wes Haggard&lt;/td&gt;&lt;td&gt;&lt;a href="http://weblogs.asp.net/whaggard/" class="externalLink"&gt;http://weblogs.asp.net/whaggard/&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;David Kean&lt;/td&gt;&lt;td&gt;&lt;a href="http://davesbox.com/" class="externalLink"&gt;http://davesbox.com/&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Daniel Plaisted&lt;/td&gt;&lt;td&gt;&lt;a href="http://blogs.msdn.com/dsplaisted/" class="externalLink"&gt;http://blogs.msdn.com/dsplaisted/&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Glenn Block&lt;/td&gt;&lt;td&gt;&lt;a href="http://blogs.msdn.com/gblock/" class="externalLink"&gt;http://blogs.msdn.com/gblock/&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Hamilton Verissimo&lt;/td&gt;&lt;td&gt;&lt;a href="http://blogs.msdn.com/hammett/" class="externalLink"&gt;http://blogs.msdn.com/hammett/&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; &lt;a href="http://hammett.castleproject.org/" class="externalLink"&gt;http://hammett.castleproject.org/&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Nicholas Blumhardt&lt;/td&gt;&lt;td&gt;&lt;a href="http://blogs.msdn.com/nblumhardt/" class="externalLink"&gt;http://blogs.msdn.com/nblumhardt/&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;h2&gt;Recent Feeds&lt;/h2&gt;&lt;div class="rss"&gt;&lt;div class="accentbar"&gt;&lt;span class="left"&gt;&amp;nbsp;&lt;/span&gt;Nicholas Blumhardt News Feed&lt;span class="right"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="entry"&gt;&lt;div class="title"&gt;&lt;a href="http://blogs.msdn.com/nblumhardt/archive/2009/09/29/homeward-bound.aspx"&gt;Homeward Bound&lt;/a&gt;&lt;/div&gt;&lt;div class="moreinfo"&gt;&lt;span class="date"&gt;Wednesday, September 30, 2009&lt;/span&gt; &amp;nbsp;|&amp;nbsp; &lt;span class="source"&gt;From &lt;a target="_blank" href="http://blogs.msdn.com/nblumhardt/rss.aspx"&gt;Nicholas Blumhardt&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="entry"&gt;&lt;div class="title"&gt;&lt;a href="http://blogs.msdn.com/nblumhardt/archive/2009/09/24/debug-composition-from-within-visual-studio.aspx"&gt;Debug Composition from within Visual Studio&lt;/a&gt;&lt;/div&gt;&lt;div class="moreinfo"&gt;&lt;span class="date"&gt;Thursday, September 24, 2009&lt;/span&gt; &amp;nbsp;|&amp;nbsp; &lt;span class="source"&gt;From &lt;a target="_blank" href="http://blogs.msdn.com/nblumhardt/rss.aspx"&gt;Nicholas Blumhardt&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="entry"&gt;&lt;div class="title"&gt;&lt;a href="http://blogs.msdn.com/nblumhardt/archive/2009/08/30/parameterised-triggers-and-re-entrant-states-in-stateless-v2.aspx"&gt;Parameterised Triggers and Re-Entrant States in Stateless v2&lt;/a&gt;&lt;/div&gt;&lt;div class="moreinfo"&gt;&lt;span class="date"&gt;Sunday, August 30, 2009&lt;/span&gt; &amp;nbsp;|&amp;nbsp; &lt;span class="source"&gt;From &lt;a target="_blank" href="http://blogs.msdn.com/nblumhardt/rss.aspx"&gt;Nicholas Blumhardt&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="accentbar"&gt;&lt;span class="left"&gt;&amp;nbsp;&lt;/span&gt;Nicholas Blumhardt News Feed&lt;span class="right"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="rss"&gt;&lt;div class="accentbar"&gt;&lt;span class="left"&gt;&amp;nbsp;&lt;/span&gt;Krzysztof Cwalina : MEF News Feed&lt;span class="right"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="entry"&gt;&lt;div class="title"&gt;&lt;a href="http://blogs.msdn.com/kcwalina/archive/2009/06/09/MEFPrimitives.aspx"&gt;MEF Primitives Explained&lt;/a&gt;&lt;/div&gt;&lt;div class="moreinfo"&gt;&lt;span class="date"&gt;Tuesday, June 09, 2009&lt;/span&gt; &amp;nbsp;|&amp;nbsp; &lt;span class="source"&gt;From &lt;a target="_blank" href="http://blogs.msdn.com/kcwalina/rss_tag_MEF.xml"&gt;Krzysztof Cwalina : MEF&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="entry"&gt;&lt;div class="title"&gt;&lt;a href="http://blogs.msdn.com/kcwalina/archive/2009/06/09/MEFPrimitives.aspx"&gt;MEF Primitives Explained&lt;/a&gt;&lt;/div&gt;&lt;div class="moreinfo"&gt;&lt;span class="date"&gt;Tuesday, June 09, 2009&lt;/span&gt; &amp;nbsp;|&amp;nbsp; &lt;span class="source"&gt;From &lt;a target="_blank" href="http://blogs.msdn.com/kcwalina/rss_tag_MEF.xml"&gt;Krzysztof Cwalina : MEF&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="entry"&gt;&lt;div class="title"&gt;&lt;a href="http://blogs.msdn.com/kcwalina/archive/2009/03/03/9457619.aspx"&gt;Custom Programming Models for MEF (Provider Model Contrib)&lt;/a&gt;&lt;/div&gt;&lt;div class="moreinfo"&gt;&lt;span class="date"&gt;Tuesday, March 03, 2009&lt;/span&gt; &amp;nbsp;|&amp;nbsp; &lt;span class="source"&gt;From &lt;a target="_blank" href="http://blogs.msdn.com/kcwalina/rss_tag_MEF.xml"&gt;Krzysztof Cwalina : MEF&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="accentbar"&gt;&lt;span class="left"&gt;&amp;nbsp;&lt;/span&gt;Krzysztof Cwalina : MEF News Feed&lt;span class="right"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="rss"&gt;&lt;div class="accentbar"&gt;&lt;span class="left"&gt;&amp;nbsp;&lt;/span&gt;Mircea Trofin's blog : MEF News Feed&lt;span class="right"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="entry"&gt;&lt;div class="title"&gt;&lt;a href="http://blogs.msdn.com/mirceat/archive/2008/06/05/the-managed-extensibility-framework-mef-ctp-is-out.aspx"&gt;The Managed Extensibility Framework (MEF) CTP is out!&lt;/a&gt;&lt;/div&gt;&lt;div class="moreinfo"&gt;&lt;span class="date"&gt;Thursday, June 05, 2008&lt;/span&gt; &amp;nbsp;|&amp;nbsp; &lt;span class="source"&gt;From &lt;a target="_blank" href="http://blogs.msdn.com/mirceat/rss_tag_MEF.xml"&gt;Mircea Trofin's blog : MEF&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="entry"&gt;&lt;div class="title"&gt;&lt;a href="http://blogs.msdn.com/mirceat/archive/2008/06/05/the-managed-extensibility-framework-mef-ctp-is-out.aspx"&gt;The Managed Extensibility Framework (MEF) CTP is out!&lt;/a&gt;&lt;/div&gt;&lt;div class="moreinfo"&gt;&lt;span class="date"&gt;Thursday, June 05, 2008&lt;/span&gt; &amp;nbsp;|&amp;nbsp; &lt;span class="source"&gt;From &lt;a target="_blank" href="http://blogs.msdn.com/mirceat/rss_tag_MEF.xml"&gt;Mircea Trofin's blog : MEF&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="accentbar"&gt;&lt;span class="left"&gt;&amp;nbsp;&lt;/span&gt;Mircea Trofin's blog : MEF News Feed&lt;span class="right"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="rss"&gt;&lt;div class="accentbar"&gt;&lt;span class="left"&gt;&amp;nbsp;&lt;/span&gt;Wes' Puzzling Blog : MEF News Feed&lt;span class="right"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="entry"&gt;&lt;div class="title"&gt;&lt;a href="http://weblogs.asp.net/whaggard/archive/2009/04/07/mef-preview-5-released.aspx"&gt;MEF preview 5 released&lt;/a&gt;&lt;/div&gt;&lt;div class="moreinfo"&gt;&lt;span class="date"&gt;Wednesday, April 08, 2009&lt;/span&gt; &amp;nbsp;|&amp;nbsp; &lt;span class="source"&gt;From &lt;a target="_blank" href="http://weblogs.asp.net/whaggard/rss.aspx?Tags=MEF&amp;AndTags=1"&gt;Wes' Puzzling Blog : MEF&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="entry"&gt;&lt;div class="title"&gt;&lt;a href="http://weblogs.asp.net/whaggard/archive/2008/11/10/should-mef-support-non-shared-components.aspx"&gt;Should MEF support non-shared components?&lt;/a&gt;&lt;/div&gt;&lt;div class="moreinfo"&gt;&lt;span class="date"&gt;Monday, November 10, 2008&lt;/span&gt; &amp;nbsp;|&amp;nbsp; &lt;span class="source"&gt;From &lt;a target="_blank" href="http://weblogs.asp.net/whaggard/rss.aspx?Tags=MEF&amp;AndTags=1"&gt;Wes' Puzzling Blog : MEF&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="entry"&gt;&lt;div class="title"&gt;&lt;a href="http://weblogs.asp.net/whaggard/archive/2008/09/09/mef-ctp2-released-with-source-code.aspx"&gt;MEF CTP2 released with source code.&lt;/a&gt;&lt;/div&gt;&lt;div class="moreinfo"&gt;&lt;span class="date"&gt;Wednesday, September 10, 2008&lt;/span&gt; &amp;nbsp;|&amp;nbsp; &lt;span class="source"&gt;From &lt;a target="_blank" href="http://weblogs.asp.net/whaggard/rss.aspx?Tags=MEF&amp;AndTags=1"&gt;Wes' Puzzling Blog : MEF&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="accentbar"&gt;&lt;span class="left"&gt;&amp;nbsp;&lt;/span&gt;Wes' Puzzling Blog : MEF News Feed&lt;span class="right"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="rss"&gt;&lt;div class="accentbar"&gt;&lt;span class="left"&gt;&amp;nbsp;&lt;/span&gt;Dave's Box : Managed Extensibility Framework News Feed&lt;span class="right"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="entry"&gt;&lt;div class="title"&gt;&lt;a href="http://davesbox.com/archive/2008/09/08/new-managed-extensibility-framework-mef-preview.aspx"&gt;New Managed Extensibility Framework (MEF) Preview&lt;/a&gt;&lt;/div&gt;&lt;div class="moreinfo"&gt;&lt;span class="date"&gt;Monday, September 08, 2008&lt;/span&gt; &amp;nbsp;|&amp;nbsp; &lt;span class="source"&gt;From &lt;a target="_blank" href="http://davesbox.com/rss.aspx?Tags=Managed+Extensibility+Framework&amp;AndTags=1"&gt;Dave's Box : Managed Extensibility Framework&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="entry"&gt;&lt;div class="title"&gt;&lt;a href="http://davesbox.com/archive/2008/06/21/binding-private-and-internal-members-using-the-compositioncontainer.aspx"&gt;Binding private and internal members using the CompositionContainer&lt;/a&gt;&lt;/div&gt;&lt;div class="moreinfo"&gt;&lt;span class="date"&gt;Saturday, June 21, 2008&lt;/span&gt; &amp;nbsp;|&amp;nbsp; &lt;span class="source"&gt;From &lt;a target="_blank" href="http://davesbox.com/rss.aspx?Tags=Managed+Extensibility+Framework&amp;AndTags=1"&gt;Dave's Box : Managed Extensibility Framework&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="entry"&gt;&lt;div class="title"&gt;&lt;a href="http://davesbox.com/archive/2008/06/20/dependency-injection-in-the-managed-extensibility-framework-named-contracts.aspx"&gt;Dependency Injection in the Managed Extensibility Framework – Named Contracts&lt;/a&gt;&lt;/div&gt;&lt;div class="moreinfo"&gt;&lt;span class="date"&gt;Friday, June 20, 2008&lt;/span&gt; &amp;nbsp;|&amp;nbsp; &lt;span class="source"&gt;From &lt;a target="_blank" href="http://davesbox.com/rss.aspx?Tags=Managed+Extensibility+Framework&amp;AndTags=1"&gt;Dave's Box : Managed Extensibility Framework&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="accentbar"&gt;&lt;span class="left"&gt;&amp;nbsp;&lt;/span&gt;Dave's Box : Managed Extensibility Framework News Feed&lt;span class="right"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="rss"&gt;&lt;div class="accentbar"&gt;&lt;span class="left"&gt;&amp;nbsp;&lt;/span&gt;My Technobabble : MEF News Feed&lt;span class="right"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="entry"&gt;&lt;div class="title"&gt;&lt;a href="http://blogs.msdn.com/gblock/archive/2009/08/20/open-generic-support-in-mef-contrib.aspx"&gt;Open-generic support in MEF Contrib&lt;/a&gt;&lt;/div&gt;&lt;div class="moreinfo"&gt;&lt;span class="date"&gt;Thursday, August 20, 2009&lt;/span&gt; &amp;nbsp;|&amp;nbsp; &lt;span class="source"&gt;From &lt;a target="_blank" href="http://blogs.msdn.com/gblock/rss_tag_MEF.xml"&gt;My Technobabble : MEF&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="entry"&gt;&lt;div class="title"&gt;&lt;a href="http://blogs.msdn.com/gblock/archive/2009/08/20/open-generic-support-in-mef-contrib.aspx"&gt;Open-generic support in MEF Contrib&lt;/a&gt;&lt;/div&gt;&lt;div class="moreinfo"&gt;&lt;span class="date"&gt;Thursday, August 20, 2009&lt;/span&gt; &amp;nbsp;|&amp;nbsp; &lt;span class="source"&gt;From &lt;a target="_blank" href="http://blogs.msdn.com/gblock/rss_tag_MEF.xml"&gt;My Technobabble : MEF&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="entry"&gt;&lt;div class="title"&gt;&lt;a href="http://blogs.msdn.com/gblock/archive/2009/08/16/should-i-use-mef-for-my-general-ioc-needs.aspx"&gt;Should I use MEF for my general IoC needs?&lt;/a&gt;&lt;/div&gt;&lt;div class="moreinfo"&gt;&lt;span class="date"&gt;Sunday, August 16, 2009&lt;/span&gt; &amp;nbsp;|&amp;nbsp; &lt;span class="source"&gt;From &lt;a target="_blank" href="http://blogs.msdn.com/gblock/rss_tag_MEF.xml"&gt;My Technobabble : MEF&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="accentbar"&gt;&lt;span class="left"&gt;&amp;nbsp;&lt;/span&gt;My Technobabble : MEF News Feed&lt;span class="right"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="rss"&gt;&lt;div class="accentbar"&gt;&lt;span class="left"&gt;&amp;nbsp;&lt;/span&gt;MEF and more News Feed&lt;span class="right"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="entry"&gt;&lt;div class="title"&gt;&lt;a href="http://blogs.msdn.com/hammett/archive/2009/07/15/mef-and-asp-net-mvc-sample-updated.aspx"&gt;MEF and ASP.NET MVC sample updated&lt;/a&gt;&lt;/div&gt;&lt;div class="moreinfo"&gt;&lt;span class="date"&gt;Wednesday, July 15, 2009&lt;/span&gt; &amp;nbsp;|&amp;nbsp; &lt;span class="source"&gt;From &lt;a target="_blank" href="http://blogs.msdn.com/hammett/rss.aspx"&gt;MEF and more&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="entry"&gt;&lt;div class="title"&gt;&lt;a href="http://blogs.msdn.com/hammett/archive/2009/07/15/mef-and-asp-net-mvc-sample-updated.aspx"&gt;MEF and ASP.NET MVC sample updated&lt;/a&gt;&lt;/div&gt;&lt;div class="moreinfo"&gt;&lt;span class="date"&gt;Wednesday, July 15, 2009&lt;/span&gt; &amp;nbsp;|&amp;nbsp; &lt;span class="source"&gt;From &lt;a target="_blank" href="http://blogs.msdn.com/hammett/rss.aspx"&gt;MEF and more&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="entry"&gt;&lt;div class="title"&gt;&lt;a href="http://blogs.msdn.com/hammett/archive/2009/04/23/mef-and-asp-net-mvc-sample.aspx"&gt;MEF and ASP.NET MVC sample&lt;/a&gt;&lt;/div&gt;&lt;div class="moreinfo"&gt;&lt;span class="date"&gt;Thursday, April 23, 2009&lt;/span&gt; &amp;nbsp;|&amp;nbsp; &lt;span class="source"&gt;From &lt;a target="_blank" href="http://blogs.msdn.com/hammett/rss.aspx"&gt;MEF and more&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="accentbar"&gt;&lt;span class="left"&gt;&amp;nbsp;&lt;/span&gt;MEF and more News Feed&lt;span class="right"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="rss"&gt;&lt;div class="accentbar"&gt;&lt;span class="left"&gt;&amp;nbsp;&lt;/span&gt;Daniel Plaisted's Blog News Feed&lt;span class="right"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="entry"&gt;&lt;div class="title"&gt;&lt;a href="http://blogs.msdn.com/dsplaisted/archive/2009/08/10/import-cardinality-and-picking-which-export-to-use.aspx"&gt;Import Cardinality, and Picking Which Export to Use&lt;/a&gt;&lt;/div&gt;&lt;div class="moreinfo"&gt;&lt;span class="date"&gt;Tuesday, August 11, 2009&lt;/span&gt; &amp;nbsp;|&amp;nbsp; &lt;span class="source"&gt;From &lt;a target="_blank" href="http://blogs.msdn.com/dsplaisted/rss.aspx"&gt;Daniel Plaisted's Blog&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="entry"&gt;&lt;div class="title"&gt;&lt;a href="http://blogs.msdn.com/dsplaisted/archive/2009/08/10/import-cardinality-and-picking-which-export-to-use.aspx"&gt;Import Cardinality, and Picking Which Export to Use&lt;/a&gt;&lt;/div&gt;&lt;div class="moreinfo"&gt;&lt;span class="date"&gt;Monday, August 10, 2009&lt;/span&gt; &amp;nbsp;|&amp;nbsp; &lt;span class="source"&gt;From &lt;a target="_blank" href="http://blogs.msdn.com/dsplaisted/rss.aspx"&gt;Daniel Plaisted's Blog&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="entry"&gt;&lt;div class="title"&gt;&lt;a href="http://blogs.msdn.com/dsplaisted/archive/2009/06/08/a-crash-course-on-the-mef-primitives.aspx"&gt;A Crash Course on the MEF Primitives&lt;/a&gt;&lt;/div&gt;&lt;div class="moreinfo"&gt;&lt;span class="date"&gt;Monday, June 08, 2009&lt;/span&gt; &amp;nbsp;|&amp;nbsp; &lt;span class="source"&gt;From &lt;a target="_blank" href="http://blogs.msdn.com/dsplaisted/rss.aspx"&gt;Daniel Plaisted's Blog&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="accentbar"&gt;&lt;span class="left"&gt;&amp;nbsp;&lt;/span&gt;Daniel Plaisted's Blog News Feed&lt;span class="right"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>haveriss</author><pubDate>Thu, 22 Oct 2009 20:51:48 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Blogs 20091022085148P</guid></item><item><title>New Comment on "Hosting MEF and the Container"</title><link>http://mef.codeplex.com/wikipage?title=Hosting MEF and the Container&amp;ANCHOR#C13998</link><description>Actually in my opinion the decoupling of core functionality and extra one &amp;#40;extension methods&amp;#41; is cool until both share the same namespace. It is not obvious why there are some methods missing in Catalog until you declare &amp;#34;System.Component.Model.Composition&amp;#34; namespace. This means that documentation and samples should always highlight that two namespaces have to be declared in order to reproduce samples. Thanks, Denis.</description><author>DenisVuyka</author><pubDate>Mon, 19 Oct 2009 19:30:36 GMT</pubDate><guid isPermaLink="false">New Comment on "Hosting MEF and the Container" 20091019073036P</guid></item><item><title>New Comment on "Composition Batch"</title><link>http://mef.codeplex.com/Wiki/View.aspx?title=Composition Batch&amp;ANCHOR#C13981</link><description>It would be nice to use FluentInterface to add and&amp;#47;or remove parts&amp;#58;&amp;#10;&amp;#10;var batch &amp;#61;CompositionBatch.AddPart&amp;#40;partInstance1&amp;#41;.&amp;#10;  AddPart&amp;#40;partInstance2&amp;#41;.&amp;#10;  RemovePart&amp;#40;part3&amp;#41;.GetBatchInstance&amp;#40;&amp;#41;&amp;#59;</description><author>chudq</author><pubDate>Thu, 15 Oct 2009 22:24:40 GMT</pubDate><guid isPermaLink="false">New Comment on "Composition Batch" 20091015102440P</guid></item></channel></rss>