You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Caliburn.Micro WPF:如何创建带依赖的ViewModel并注入事件聚合器?

嘿,我来帮你搞定这个Caliburn.Micro里的依赖注入问题!你完全不需要手动创建IEventAggregator实例传入,只要利用框架的容器自动处理就行,步骤很清晰:

第一步:把AViewModel注册到容器里

你的Bootstrapper目前只给ShellViewModel、窗口管理器和事件聚合器做了注册,但容器还不知道AViewModel的存在,得先把它加进去。修改Configure方法:

protected override void Configure()
{
    _container.Singleton<IWindowManager, WindowManager>();
    _container.Singleton<IEventAggregator, EventAggregator>();
    _container.RegisterPerRequest(typeof(ShellViewModel), null, typeof(ShellViewModel));
    // 新增这行,让容器能解析AViewModel
    _container.RegisterPerRequest(typeof(AViewModel), null, typeof(AViewModel));
}

第二步:修正AViewModel的小语法错误

你写的AViewModel构造函数末尾多了个多余的点,先把这个小问题改了,不然编译会报错:

public class AViewModel : Screen
{
    private IEventAggregator _eventAggregator;

    public AViewModel(IEventAggregator eventAggregator)
    {
        _eventAggregator = eventAggregator; // 去掉这里的多余点
    }
}

第三步:让容器帮你创建AViewModel实例

别再手动new AViewModel了,Caliburn.Micro的服务定位器IoC会帮你从容器里拿实例,而且自动把IEventAggregator注入进去。修改ShellViewModel:

public class ShellViewModel : Conductor<Screen>
{
    public ShellViewModel()
    {
        // 从容器获取AViewModel,依赖自动注入
        var aViewModel = IoC.GetInstance(typeof(AViewModel), null) as Screen;
        ActivateItem(aViewModel);
    }
}

如果你更倾向于纯构造函数注入(这是更推荐的依赖注入方式,代码更清晰),还可以直接把AViewModel注入到ShellViewModel的构造函数里,连服务定位器都不用:

public class ShellViewModel : Conductor<Screen>
{
    // 容器自动解析AViewModel并传入
    public ShellViewModel(AViewModel aViewModel)
    {
        ActivateItem(aViewModel);
    }
}

原理说明

Caliburn.Micro的SimpleContainer会自动处理依赖链:当它要创建AViewModel时,发现构造函数需要IEventAggregator,就会从容器里找你已经注册好的单例EventAggregator实例,自动注入进去。整个过程完全不需要你手动传参,既省心又符合依赖注入的设计原则。

内容的提问来源于stack exchange,提问作者user5535613

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:38:12