MEF + SL4问题

3
我正在开发一个Silverlight 4 RC应用程序,并且我正在学习使用MEF处理插件控件。我已经以相当基本的方式使它工作,但是它并不完美,我知道有更好的方法来导入多个xap文件。
基本上,在我的主机应用程序的App.xaml中,我有以下内容告诉MEF加载我的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; }

再次强调,这个方法可以使用,但我相信我没有正确地使用ImportMany....

最后,MainPage.xaml.cs文件实现了IPartImportsSatisfiedNotification,并且我有以下代码来处理插件加载完成的情况:

public void OnImportsSatisfied()
{
    sp.Children.Clear();

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

这个方法能够运行,但是它似乎有点不好看,因为它要运行n次(n是要加载的xap数量)。如果我不调用sp.Children.Clear(),当加载2个插件时,我的堆栈面板会被填充如下:

TestPlugIn A TestPlugIn A TestPlugIn B

显然我漏掉了什么。有人能指出我应该做什么吗? 谢谢!

1个回答

1

我认为你现在做的大部分都很好。虽然ObservableCollections支持添加和删除单个元素的通知,但MEF没有利用这一点。在你的情况下,它只会清除集合,然后添加所有插件。由于你正在使用OnImportsSatisfied进行更改通知,因此甚至不需要一个ObservableCollection。你可以仅使用IEnumerable来进行导入。

为了增加下载不同xap的灵活性,我建议在你的容器中公开一个服务,该服务可以被导入,并提供给定URL下载xap的功能。然后你容器中的任何组件都可以触发下载,下载的URL可以来自你认为适当的任何来源。


谢谢,这基本上就是我所选择的,看起来对我的需求来说还不错。 - CatBusStop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接