Caliburn.Micro和MEF在wpf上

时间:2012-09-20 12:26:57

标签: wpf mef caliburn.micro

我正在学习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 个答案:

答案 0 :(得分:17)

在WPF中,您需要使用显式CompositionContainer构造函数。在我的WPF和Silverlight共享引导程序中,我使用了以下#if - #else指令:

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

修改

引导程序将标识实现IShell接口的组件(假设您的引导程序正在扩展Bootstrapper<IShell>基类),因此您需要实现一个用{{1}的MEF导出修饰的类}。

通常这将是您的IShell,声明如下:

ShellViewModel

您可以阅读有关引导程序设置和自定义here的更多信息。