Caliburn.Micro的activateitem和Ioc注入IWindowManager

时间:2011-02-11 20:46:22

标签: caliburn.micro

我正在学习如何将Caliburn.Micro用作WPF应用程序的MVVM框架。在视图X中,我想使用ActivateItem显示另一个视图Y.在此视图Y中,当用户单击按钮时,我需要将另一个视图Z显示为对话框。所以我在视图Y中需要一个WindowManager实例。

这意味着windowmanager必须被注入到Y的viewmodel中,所以我可以用它来调用windowManager.howDialog()来查看Z. 所以我想我应该在Y的viewmodel中添加一个构造函数,它接受一个I​​WindowManager参数。

public YViewModel(IWindowManager windowManager){...}

Caliburn.Micro可以自动将viewmanager的实例注入YViewModel吗?如果没有窗口管理员,我会写

ActivateItem(new YViewModel());

但是当我需要windowmanager时这不起作用...当YViewModel需要windowmanager的一个实例时,我怎么想写ActivateItem?

2 个答案:

答案 0 :(得分:3)

Caliburn.Micro本身不是IoC容器。它的内置引导程序有一个简单的IoC实现(而不是服务定位器),它不能像你想要用IWindowManager构造函数参数那样进行依赖注入。

虽然你的解决方案有效但它只会在简单的情况下这样做,从你的类中调用服务定位器也被认为是不好的做法。

周围有很多好的IoC容器。我建议看一下Unity或Autofac。两者都可以在互联网上找到适合的Caliburn.Micro bootstrappers。

例如,在Autofac中你会有一行:

builder.Register<IWindowManager>(c => new MyWindowManager()).InstancePerLifetimeScope();

在自定义Autofac引导程序中。每当YViewModel通过IoC容器实例化时,都会注入相同的MyWindowManager实例。

答案 1 :(得分:0)

如果您从未使用自定义窗口管理器实现IWindowManager,我认为如果使用new关键字直接实例化WindowManager,则可以。

如果你正在使用NuGet包,你会看到默认的Caliburn的引导程序使用MEF作为ServiceLocator,在覆盖方法“Configure”上“注册”IWindowManager。

要与自定义IOC / DI一起使用,您必须创建自己的引导程序类,遵循mef引导程序的指导,为IWindowManager,IEventAgreggator等进行必要的注册。

目前我可以使用默认的MEF bootstrapper版本的caliburn micro,但是如果我使用IoC / DI容器,我当然会使用SimpleInjector。