0

摘自 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 实例注入到你的 VM 中?

var svm = new SomeViewModel(?);

我尝试使用 Caliburn.Micro.IoC.Get 方法,但没有奏效......

4

2 回答 2

7

不,您不会var svm = new SomeViewModel(?)也不会使用 IoC.Get,因为服务位置正在成为一种反模式。
文章作者建议的模式是最佳实践,即您应该通过构造函数注入将依赖项注入需要它们的对象。
我不知道如何用其他方式表达,但是让您的应用程序可组合并为您创建一个表示层的架构。
我会查看Screens, Conductors and Composition文章,因为它有一些与我所说的内容相关的好主意,并且伴随它的应用程序很棒。
我还将阅读有关依赖注入的信息。

于 2013-06-28T21:27:41.117 回答
1

我写了你引用的文章。嗅探器是正确的(请留下绿色勾号)。Caliburn.Micro 在一个叫做组合的概念上投入巨资。这意味着整个对象图是在运行时隐式构造的,或者如果你愿意的话。

这个想法是你的“shell” ViewModel 是由引导程序创建的,shell 反过来创建其他 ViewModel,依此类推。这允许使用构造函数注入并提供最佳的可组合性。

但是,有时这不是所需的功能,为此我们确实通过 IoC 类提供了服务定位器;正如 Sniffer 所说,服务位置的大多数用例都被认为是反模式,因此应该严格审查它的使用情况,否则它将在路上咬你一口。

我正在对 IoC 和我们内置的依赖容器 SimpleContainer 的两篇新文章进行最后润色,一旦这些文章完成,我将添加相关链接到 EventAggregator 文档,该文档应该提供更多关于注入站点和最佳实践的上下文。

于 2013-07-03T10:26:37.093 回答