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 неверна. Не могли бы вы помочь мне исправить это?
Ответы
Ответ 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
{
...
}
Вы можете прочитать гораздо больше о настройке и настройке начальной загрузки здесь.