我有一个 Caliburn.Micro 项目,我正在尝试从它的 SimpleContainer 移植到 Autofac

我正在使用 this code ,这是 this guide 中代码的更新版本。
使用 SimpleContainer 我只是做了(在 bootstrap 内)

protected override void OnStartup(object sender, System.Windows.StartupEventArgs e)
{
    this.DisplayRootViewFor<IScreen>(); // where ShellViewModel : Screen
}

现在这不再起作用了,那么我应该怎么做才能将 Autofac 与 Caliburn.Micro 集成?

最佳答案

您的解决方案有一些问题。

首先,没有什么会调用您的 AppBootstrapper 。这通常在 Caliburn.Micro 中通过将 bootstrap 类型添加为 App.xaml 中的资源来完成。有关 WPF 的说明,请参阅 here

即你的 App.xaml 应该是这样的:

<Application x:Class="AutofacTests.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:local="clr-namespace:AutofacTests">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary>
                    <local:AppBootstrapper x:Key="bootstrapper" />
                </ResourceDictionary>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

其次,由于您的 View 模型和 View 位于不同的程序集中,Caliburn.Micro 和 Autofac 都需要知道它们的位置(分别用于 View 位置和依赖项解析)。

您正在使用的 Autofac bootstrap 从 Caliburn.Micro 用于查看位置的 AssemblySource 实例解析依赖项。因此,您只需要填充这个程序集源集合。您可以通过覆盖 SelectAssemblies 中的 AppBootstrapper 来做到这一点:
protected override IEnumerable<Assembly> SelectAssemblies()
{
    return new[]
               {
                   GetType().Assembly,
                   typeof(ShellViewModel).Assembly,
                   typeof(ShellView).Assembly
               };
}

关于wpf - Caliburn.Micro + Autofac 引导,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20056673/

10-16 09:56