从EventAggregator上的Caliburn Micro文档中提取:
// Creating the EventAggregator as a singleton.
public class Bootstrapper : BootstrapperBase {
private readonly SimpleContainer _container =
new SimpleContainer();
// ... Other Bootstrapper Config
protected override void Configure(){
_container.Singleton<IEventAggregator, EventAggregator>();
}
// ... Other Bootstrapper Config
}
// Acquiring the EventAggregator in a viewModel.
public class FooViewModel {
private readonly IEventAggregator _eventAggregator;
public FooViewModel(IEventAggregator eventAggregator) {
_eventAggregator = eventAggregator;
}
}
所以问题是你如何获得Bootstrapper创建的EA实例注入你的虚拟机?
var svm = new SomeViewModel(?);
我尝试使用Caliburn.Micro.IoC.Get方法,但这不起作用......
答案 0 :(得分:7)
不,您没有var svm = new SomeViewModel(?)
并且不使用IoC.Get,因为服务地点正在变成反模式。
文章作者建议的模式是最佳实践,即您应该通过构造函数注入将依赖项注入需要它们的对象。
我不知道如何以任何其他方式说出来,但让你的应用程序可以组合并为你的表示层创建一个架构
我会查看Screens, Conductors and Composition文章,因为它有一些与我说的相关的好主意,并且附带的应用程序很棒。
我还会读到依赖注入。
答案 1 :(得分:1)
我写了你引用的文章。嗅探器是正确的(请留下绿色的蜱虫)。 Caliburn.Micro大力投资于一个名为组合的概念。这意味着整个对象图是在运行时隐式构造的,或者如果你愿意的话,可以构成。
这个想法是你的“shell”ViewModel是由引导程序创建的,shell依次创建其他ViewModel,依此类推。这允许使用构造函数注入并提供最佳的可组合性。
但是,有时这不是所需的功能,为此我们通过IoC类提供服务定位器;正如Sniffer所说,大多数服务地点的用例被认为是反模式,因此它的使用应该受到严格的审查,否则它会让你在路上咬你的屁股。
我正在对IoC和我们内置的依赖容器SimpleContainer的两篇新文章进行最后的修改,一旦这些文章出现,我将添加相关的链接到EventAggregator文档,这应该提供更多关于注入网站和最佳实践的上下文