如何在Caliburn.Micro中将依赖项注入视图模型?

7 c# wpf dependency-injection mvvm caliburn.micro

我真的希望这不是一个愚蠢的问题,但我无法识别使用Caliburn.Micro将依赖关系注入视图模型的直接方法.

我有一个像这样的主壳(导体):

public class ShellViewModel : Conductor<IScreen>.Collection.OneActive, IShell
{
    public ShellViewModel(IEventAggregator eventAggregator) {
        ActivateItem(new DashboardViewModel());
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我想注入一个服务,DashboardViewModel但由于该ActivateItem方法要求我传递一个实例(而不是例如一个类型),我不得不自己提供服务.由于ShellViewModel不知道底层IoC容器,我必须将服务注入shell ...对我来说,看起来Caliburn正在尝试强制执行应用程序中所有视图模型和依赖项的完整图形.

我知道我可以使用静态访问器来控制容器的反转,但我真的不喜欢这种方法,因为我想为我的应用程序(引导程序)创建一个组合根,而不需要知道其他部分关于依赖注入等.

mve*_*mef 2

有几种方法可以完全取决于您选择的容器。

MEF [ImportMany] 在构造函数中使用的参数将执行实际导入引用 Hello Screens 示例

您可以使用 IoC 静态类中的烘焙IoC.Get<IDashBoard>()IoC.GetAll<IDashBoard>(),这假设您已将类型注册到您使用的容器中。请注意,它可能会被过度使用并导致反模式行为。我已经在一个执行仪表板的应用程序中完成了此操作,容器实例中标记有 IDashBoard 的任何内容,与实际实现类相关的内容都将被拉入集合IoC.GetAll<IDashboard>()或集合中基于IoC.Get<IDashBoard>().

您还可以使仪表板继承Conductor<IDashBoard>.Collection.AllActive,从而允许您访问 Items 属性(作为集合的一部分)并使用 DashBoardViewMode 的 CTOR 填充它,IoC.GetAll<IDashboard>()在该位置使用获取仪表板上所需的所有项目。从那里,我在 OnActivate 中查询 Items 集合属性,并将其他视图模型与我需要的属性相匹配,并相应地将命名的 ContentControls 放置在 DashBoardView 上。

这确实从您选择的容器中提取,请记住,您可能只想使用容器的方法通过其预期设计来获取必要的项目。

实际上,我放弃了 MEF,因为 CM 中使用的版本无法与 Open Generics 一起使用,并且调试缺少的 Export() 属性开始让我疲惫不堪。