【问题标题】:How to inject dependencies into view models in Caliburn.Micro?如何将依赖项注入 Caliburn.Micro 中的视图模型?
【发布时间】:2015-07-16 16:29:52
【问题描述】:

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

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

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

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

我知道我可以为我的控制容器反转使用静态访问器,但我真的不喜欢这种方法,因为我希望在没有其他部分了解依赖注入等。

【问题讨论】:

  • 您是否找到了一种方法来使用 ActivateItem 使用接口来利用依赖注入?目前唯一的方法是传递一个viewmodel实例并通过IoC获取服务?

标签: c# wpf mvvm dependency-injection caliburn.micro


【解决方案1】:

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

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

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

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

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

我实际上已经离开了 MEF,因为 CM 中使用的版本不适用于 Open Generics,而且调试缺少的 Export() 属性开始让我筋疲力尽。

【讨论】:

    猜你喜欢
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 2014-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多