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

7

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

我有一个主壳(conductor)如下:

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

现在我想将一个服务注入到DashboardViewModel中,但由于ActivateItem方法要求我传递一个实例(而不是例如类型),所以我被迫自己提供服务。并且,由于ShellViewModel没有意识到底层的IoC容器,我必须将服务注入到shell中... 对我来说,这似乎是Caliburn试图强制执行应用程序中所有视图模型和依赖项的完整图形。 我知道我可以使用反转控制容器的静态访问器,但我真的不喜欢这种方法,因为我想为我的应用程序(引导程序)拥有单个组合根,而不必让其他部分知道依赖注入等内容。

你找到了使用接口来利用依赖注入使用ActivateItem的方法吗? 目前唯一的方法是通过传递一个viewmodel实例并通过IoC获取服务。 - Sascha
1个回答

2
有几种方法可以实现,完全取决于您选择的容器。
在参数构造函数中使用MEF [ImportMany],该参数将执行实际导入引用Hello Screens示例。
您可以使用内置的IoC静态类IoC.Get<IDashBoard>()IoC.GetAll<IDashBoard>(),这假定您已经将类型注册到您使用的容器中。请注意,这可能会被过度使用并导致反模式行为。我在我的一个应用程序中执行了此操作,该应用程序执行仪表板,我的Container实例中标记为IDashBoard的任何内容都将与实际实现类一起被拉入集合IoC.GetAll<IDashboard>()或基于IoC.Get<IDashBoard>()的集合中的第一项。
您还可以使您的仪表板继承Conductor<IDashBoard>.Collection.AllActive,从而允许您访问Items属性(作为Collection的一部分),并使用您的DashBoardViewMode的CTOR填充它,使用IoC.GetAll<IDashboard>()在那个地方获取您需要的所有项目。从那里,我在OnActivate中查询Items集合属性,并将其他视图模型与所需属性匹配,并相应地放置命名的ContentControl在DashBoardView上。
这确实从您选择的容器中提取,记住您可能只想通过其预期的设计使用容器的方法来获取必要的项目。
我实际上已经放弃了MEF,因为CM中使用的版本不适用于开放泛型,并且调试缺少Export()属性开始让我感到疲倦。

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