2011-02-11 67 views
1

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

这意味着windowmanager必须注入Y的viewmodel,所以我可以用它来调用windowManager.ShowDialog()来查看Z. 所以我是认为我应该将一个构造函数添加到接受IWindowManager参数的Y的viewmodel中。

公共YViewModel(IWindowManager窗口管理器){...}

能自动Caliburn.Micro注入viewmanager的实例为YViewModel?没有windowmanager我会写

ActivateItem(new YViewModel());

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

+0

目前我解决它通过从构造参数除去IWindowManager和通过将码在构造: _windowManager = IoC.Get (); – rekna 2011-02-19 08:56:38

回答

3

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

虽然您的解决方案只能在简单情况下执行,但从您的类中调用服务定位器也被认为是不好的做法。

周围有很多好的IoC容器。我建议看看Unity或Autofac。因为你会在互联网上找到适合的Caliburn.Micro bootstrappers。

在Autofac例如你有一个像线:

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

您的自定义Autofac引导程序里面。每当YViewModel通过IoC容器实例化时,MyWindowManager的同一个实例就会被注入。

0

如果你从来没有使用自定义的窗口管理器实现IWindowManager,我想如果你直接使用new关键字实例化的窗口管理器,它的确定。

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

具有自定义IOC/DI使用,你必须创建自己的引导程序类,以下为指导MEF引导程序,做必要的登记为IWindowManager,IEventAgreggator等

目前我确定与默认caliburn micro的MEF bootstrapper版本,但是如果我使用IoC/DI容器,那么肯定会使用SimpleInjector。