2010-03-17 6 views
3

Я работаю над приложением в Silverlight 4 RC, и я беру оппонент, чтобы изучить MEF для управления элементами управления плагинами. У меня это работает в довольно простой усадьбе, но это не совсем аккуратно, и я знаю, что есть лучший способ импортировать несколько xap.MEF + SL4 вопрос

По существу, в 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()); 
    } 
} 

Это работает, но это, кажется, нечисто, что он работает в п раз (п быть числом XAP-х годов для загрузки). У меня называть sp.Children.Clear(), как если бы я не при загрузке, мой стек панели 2 плагина заполняется следующим образом:

TestPlugIn TestPlugIn TestPlugIn B

Мне явно что-то не хватает. Может ли кто-нибудь указать, что я должен делать? Спасибо!

ответ

1

Я думаю, что большинство из того, что вы делаете, в порядке. Хотя ObservableCollections поддерживают уведомления о добавлении и удалении отдельных элементов, MEF не использует это. В вашем случае он просто очистит коллекцию, а затем добавит все плагины. Поскольку вы используете OnImportsSatisfied для уведомления об изменении, вам даже не нужен ObservableCollection. Вы можете просто использовать IEnumerable для вашего импорта.

Чтобы добавить гибкость при загрузке различных xaps, я бы выставил сервис в вашем контейнере, который можно импортировать, и который предоставляет функциональные возможности для загрузки xap с учетом URL-адреса. Тогда любой компонент в вашем контейнере может инициировать загрузку, а URL-адрес для загрузки может поступать из любого источника, который вы считаете подходящим.

+0

Спасибо, это в значительной степени то, с чем я пошел, и, похоже, все в порядке для моих нужд –

Смежные вопросы