Mvvm MEF中暴露第三方视觉控制的正确方法

Mvvm MEF中暴露第三方视觉控制的正确方法,mvvm,silverlight-4.0,mef,Mvvm,Silverlight 4.0,Mef,正确的方法是什么? 假设我们的项目中有一些第三方库,我们需要提供对一些密封控件的访问。 将使用MEF创建新的小部件并将其添加到应用程序中,它们应该能够从核心应用程序导入一些控件。 那么如何正确导出这些控件呢?如何将第三方控件包装在“导出”类中,然后通过包装器访问此控件?如果无法修改原始类(例如,ThirdPartyComponent),则可以通过另一个类上的属性进行导出(例如,ThirdPartyComponentExporter): 对于可视化控件,您可能必须使用CreationPolicy.

正确的方法是什么? 假设我们的项目中有一些第三方库,我们需要提供对一些密封控件的访问。 将使用MEF创建新的小部件并将其添加到应用程序中,它们应该能够从核心应用程序导入一些控件。
那么如何正确导出这些控件呢?

如何将第三方控件包装在“导出”类中,然后通过包装器访问此控件?

如果无法修改原始类(例如,
ThirdPartyComponent
),则可以通过另一个类上的属性进行导出(例如,
ThirdPartyComponentExporter
):


对于可视化控件,您可能必须使用
CreationPolicy.NonShared
,以防止MEF在不同位置重复使用同一实例。

这实际上是我目前正在做的事情。但我失去了可混合性,因为我无法再在Xaml中添加导出控件,因此这似乎不是正确的方法。我需要共享每个地方都有一个控件实例,所以现在即使在已经可以访问的地方(例如在主页中)我必须使用导入机制并将其添加到代码隐藏中的某个容器中。共享是默认的创建策略吗?我尝试了类似的方法,并在用户控件中添加了要导出的控件,并通过属性将其公开。然后我将该用户控件添加到主页面(因为我想在VisualDesigner中查看导出的控件,而这是我唯一能够做到的方法)。看起来好像创建了两个不同的可导出控件实例,一个是由MEF创建的,另一个是因为我在页面中添加了一个包含可导出控件的用户控件。@Incognito:默认情况下,MEF将尝试重用它自己创建的实例。但它不会重用您创建的实例,如您在此处所述。It不知道这些实例。您能否建议如何将导出的控件添加到xaml中的页面,而不是将其作为其他容器的子容器添加到代码隐藏中。我正在考虑在xaml中为该控件添加占位符。我在其他帖子中已经问过了
public class ThirdPartyComponentExporter
{
   [Export(typeof(ThirdPartyComponent))]
   public ThirdPartyComponent Foo
   {
      get
      {
         return new ThirdPartyComponent();
      }
   }
}