Я работаю над приложением в 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 (), как если бы я этого не делал, при загрузке двух плагинов панель стека заполняется следующим образом:
TestPlugIn A
TestPlugIn A
TestPlugIn B
Я явно что-то здесь упускаю. Кто-нибудь может указать, что я должен делать?
Спасибо!