c# - 使用 Caliburn Micro & Ninject 设置依赖注入(inject)

标签 c# wpf dependency-injection ninject caliburn.micro

我正在尝试使用 Caliburn Micro 和 Ninject 框架在新的 WPF 项目中设置依赖项注入(inject)。 不幸的是我没有成功:( 互联网上有一些实现通用 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 很陌生。 你能告诉我我必须更改什么,以便在应用程序启动时加载具有相应 ViewModel (AppViewModel) 的 View (AppView) 吗?

您是否知道有关使用和设置 Ninject 与 Caliburn Micro 的最新教程?

最佳答案

您还需要覆盖 OnStartup 以显示您的 Root View / View 模型:

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

这个额外的调用取代了之前的通用 Bootstrap ,并允许您在运行时为您的应用程序选择 Root View 。

您还需要覆盖 GetInstance 以使 Caliburn Hook 到 Ninject:

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

只要 Caliburn.Micro 需要构造某些东西,它就会调用它,因此它是您将 Ninject(其他 IoC 容器可用!)注入(inject)流程的一站式商店。

至于最新的教程;自从 Caliburn.Micro 进入第 2 版以来,周围就没有那么多了,但是他们的 official documentation通常非常有用。

编辑: 你还需要做一件事!确保您的 Bootstrap 构造函数调用 Initialize:

public CbmBootstrapper ()
{           
    Initialize();
}

这将使 Caliburn.Micro 开始行动......

关于c# - 使用 Caliburn Micro & Ninject 设置依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29075597/

相关文章:

c# - 手动实例化和调用 TagHelpers

c# - 调用 C++/CLI 包装器时出现外部异常 E0434352

c# - C# 自动关闭消息框

wpf - 使用 Visual Studio 2012 在 wpf 工具包中找不到 AutoCompleteBox

c# - 如何使用 Ninject 将拦截器添加到特定方法

c# - .NET Core IServiceScopeFactory.CreateScope() 与 IServiceProvider.CreateScope() 扩展

c# - 为什么在声明 ActionResult 时使用 `virtual`

c# - 如何暂停/挂起一个线程然后继续它?

c# - C# 读取两个 Json 文件并合并它们

c# - 如何在 WPF 中序列化控件 + 代码?