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
相关产品推荐
相关产品推荐

