使用Caliburn Micro和Ninject设置依赖注入

6
我正在尝试使用Caliburn Micro和Ninject框架在新的WPF项目中设置依赖注入。不幸的是,我没有成功:(互联网上有一些示例实现了一个通用的Bootstrap,但对于我来说,通用的Bootstrap类不可用,并且由于所有这些示例至少有3年历史,我猜它们已经过时了...
我尝试的方法如下:
public class CbmBootstrapper : BootstrapperBase
{
    private IKernel kernel;

    protected override void Configure()
    {
        this.kernel = new StandardKernel();

        this.kernel.Bind<IAppViewModel>().To<AppViewModel>();
    }
}

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

我对WPF和Ninject非常陌生。你能告诉我需要更改什么,才能使应用程序在启动时加载视图(AppView)及其相应的视图模型(AppViewModel)吗?

你知道有没有关于如何使用并设置Ninject与Caliburn Micro的最新教程吗?

1个回答

4

您需要重写 OnStartup 方法,以显示您的根视图/视图模型:

protected override void OnStartup(object sender, System.Windows.StartupEventArgs e)
{
    DisplayRootViewFor<IAppViewModel>();
}

这个额外的调用替代了先前的通用引导程序,并允许您在运行时选择应用程序的根视图。

您还需要重写GetInstance以使Caliburn钩入Ninject:

protected override object GetInstance(Type serviceType, string key)
{
    return container.Get(serviceType);
}

每当 Caliburn.Micro 需要构造某些东西时,它会调用此函数,因此您可以将 Ninject(也可以使用其他 IoC 容器!)注入到该过程中,这是您的一站式服务。
至于最新的教程,由于 Caliburn.Micro 到了第2个版本,所以没有那么多,但是他们的官方文档通常非常有用。
编辑:还有一件事情需要做!确保您的引导程序构造函数调用Initialize
public CbmBootstrapper ()
{           
    Initialize();
}

这将启动 Caliburn.Micro ...


嗨Simon,感谢你的回答!这似乎很有道理:D 我在CbmBootstrapper中添加了OnStartup和GetInstance的覆盖,但不幸的是,我的视图仍然没有启动...我还需要在App.xaml.cs中添加一些内容,以便它识别我的引导程序并使用它吗?我的CbmBootstrapper的OnStartup断点没有被触发...提前致谢。 - xeraphim
嗨@xeraphim,看到我的编辑了吗?调用Initialize是让Caliburn.Micro开始运行的关键,这是我忘记的基本信息... - Simon Cowen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接