Подтвердить что ты не робот

Caliburn.Micro и MEF на wpf

Я просто изучаю WPF и Caliburn.Micro. Я следую приведенному здесь коду: http://caliburnmicro.codeplex.com/wikipage?title=Customizing%20The%20Bootstrapper&referringTitle=Documentation

По-видимому, этот код предназначен для Silverlight, но мой проект является WPF, и по этой причине я получаю ошибку, что CompositionHost не определен.

В документе указано, что мне нужно инициализировать контейнер непосредственно в wpf, но нет документа, чтобы показать, как это сделать. Как я могу инициализировать контейнер напрямую?

Изменить 1 Загрузочная лента выглядит так:

     container = CompositionHost.Initialize(
        new AggregateCatalog(
            AssemblySource.Instance.Select(x => new AssemblyCatalog(x)).OfType<ComposablePartCatalog>()
            )
        );

    var batch = new CompositionBatch();

    batch.AddExportedValue<IWindowManager>(new WindowManager());
    batch.AddExportedValue<IEventAggregator>(new EventAggregator());
    batch.AddExportedValue(container);

    container.Compose(batch);

и я преобразовал его в:

    var catalog =
            new AggregateCatalog(
                AssemblySource.Instance.Select(x => new AssemblyCatalog(x)).OfType<ComposablePartCatalog>());

        this.container = new CompositionContainer(catalog);
        var batch = new CompositionBatch();

        batch.AddExportedValue<IWindowManager>(new WindowManager());
        batch.AddExportedValue<IEventAggregator>(new EventAggregator());
        batch.AddExportedValue(this.container);

        this.container.Compose(batch);

Но когда я запускаю приложение, я получаю ошибку, что MEF не может найти реализацию для IShell

     Could not locate any instances of contract IShell.

Я верю, что моя инициализация MEF неверна. Не могли бы вы помочь мне исправить это?

4b9b3361

Ответ 1

В WPF вам нужно использовать явный конструктор CompositionContainer. В моем WPF и Silverlight общем загрузочном носителе я использовал следующую директиву #if - #else:

#if SILVERLIGHT
    container = CompositionHost.Initialize(catalog);
#else
    container = new CompositionContainer(catalog); ;
#endif

ИЗМЕНИТЬ

Бутстраппер идентифицирует компонент, реализующий интерфейс IShell (при условии, что ваш загрузчик расширяет базовый класс Bootstrapper<IShell>), поэтому вам нужно реализовать класс, украшенный экспортом MEF IShell.

Обычно это будет ваш ShellViewModel, и объявление будет выглядеть так:

[Export(typeof(IShell))]
public class ShellViewModel : PropertyChangedBase, IShell
{
   ...
}

Вы можете прочитать гораздо больше о настройке и настройке начальной загрузки здесь.