使用Caliburn Micro将EventAggregator注入ViewModel

时间:2013-06-28 19:29:38

标签: c# mvvm caliburn.micro

从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方法,但这不起作用......

2 个答案:

答案 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文档,这应该提供更多关于注入网站和最佳实践的上下文