Silverlight 4.0 MEF+;SL4问题

Silverlight 4.0 MEF+;SL4问题,silverlight-4.0,mef,Silverlight 4.0,Mef,我正在Silverlight 4 RC中开发一个应用程序,并借此机会学习处理插件控件的MEF。我已经让它在一个相当基本的庄园工作,但它并不完全整洁,我知道有一个更好的方法导入多个xap 本质上,在我的主机应用程序App.xaml中,我有以下命令告诉我加载我的xap: AggregateCatalog catalog = new AggregateCatalog(); DeploymentCatalog c1 = new DeploymentCatalog(new Uri("TestPlugIn

我正在Silverlight 4 RC中开发一个应用程序,并借此机会学习处理插件控件的MEF。我已经让它在一个相当基本的庄园工作,但它并不完全整洁,我知道有一个更好的方法导入多个xap

本质上,在我的主机应用程序App.xaml中,我有以下命令告诉我加载我的xap:

AggregateCatalog catalog = new AggregateCatalog();

DeploymentCatalog c1 = new DeploymentCatalog(new Uri("TestPlugInA.xap", UriKind.Relative));
DeploymentCatalog c2 = new DeploymentCatalog(new Uri("TestPlugInB.xap", UriKind.Relative));

catalog.Catalogs.Add(c1);
catalog.Catalogs.Add(c2);

CompositionHost.Initialize(catalog);

c1.DownloadAsync();
c2.DownloadAsync();
我确信我在这里没有完全使用AggregateCatalog,我需要能够加载目录中可能存在的任何xap,而不仅仅是硬编码Uri

此外,在主机中的MainPage.xaml.cs中,我有以下集合,MEF将插件放入其中:

[ImportMany(AllowRecomposition = true)]
public ObservableCollection<IPlugInApp> PlugIns { get; set; }
这是可行的,但它运行n次(n是要加载的xap的数量)看起来很肮脏。我必须调用sp.Children.Clear(),就像我不调用一样。加载2个插件时,我的堆栈面板填充如下:

测试插件A 测试插件A 测试插件B

我显然遗漏了一些东西。有人能指出我应该做什么吗?
谢谢

我认为你现在做的大部分事情都很好。尽管ObservableCollections确实支持添加和删除单个元素的通知,但MEF并没有利用这一点。在您的情况下,它只需清除集合,然后添加所有插件。因为您使用的是OnImportsAssetized作为变更通知,所以您甚至不需要ObservableCollection。您可以使用IEnumerable进行导入


为了增加下载不同xap的灵活性,我将在您的容器中公开一个可以导入的服务,该服务提供在给定url的情况下下载xap的功能。然后,您容器中的任何组件都可以触发下载,并且要下载的url可以来自您认为合适的任何来源。

谢谢,这正是我所做的,似乎适合我的需要
public void OnImportsSatisfied()
{
    sp.Children.Clear();

    foreach (IPlugInApp plugIn in PlugIns)
    {
        if (plugIn != null)
            sp.Children.Add(plugIn.GetUserControl());
    }
}