MEF + SL4 вопрос - PullRequest
       8

MEF + SL4 вопрос

3 голосов
/ 17 марта 2010

Я работаю над приложением в 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

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

1 Ответ

1 голос
/ 17 марта 2010

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

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

...