2013-06-28 64 views
0

从卡利微文档中提取的EventAggregator:进样EventAggregator到视图模型与卡利微

// 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; 
    } 
} 

所以,你如何EA的情况下通过引导程序创建注入到你的虚拟机的问题?

var svm = new SomeViewModel(?);

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

回答

6

不,你不var svm = new SomeViewModel(?)因为服务不使用IoC.Get位置正在成为反模式。
本文作者建议的模式是最佳实践,即您应该通过构造函数注入将您的依赖注入到需要它们的对象中。
我不知道该如何用其他方式说出来,而是让你的应用程序可组合并为你的表示层创建一个架构。
我会检查Screens, Conductors and Composition文章,因为它有一些伟大的想法与我所说的相关,并伴随它的应用程序是一个伟大的想法。
我也会阅读关于依赖注入。

+1

这只是一个例子,一旦你添加IEventAggregator eventAggregator到ViewModel的构造函数,并且你不再有默认的构造函数,你必须通过一个EA的实例,当你实例化你的VM时......我的问题是如何让实例通过它进入虚拟机的构造... –

+2

@DeanKuga这是我的观点,你不会手动创建视图模型,你让CaliburnMicro从引导程序为你创建整个对象图,并且如果你有一个ViewModel你通过接收eventAggregator构造函数,通过只读实例变量保存对它的引用,并在ViewModel中使用此实例,如果该ViewModel需要手动创建其他构造函数中带有IEventAggregator的ViewModel。 –

1

我写了你参考的文章。嗅探器是正确的(请留下绿色的勾号)。 Caliburn.Micro大量投资于一个名为构图的概念。这意味着整个对象图在运行时隐式构造,或者如果您愿意,可以构成。

这个想法是,你的“外壳”ViewModel是由引导程序创建的,外壳依次创建其他ViewModel等等。这允许使用构造函数注入并提供最佳的可组合性。

但是,有时候这不是所需的功能,因为我们通过IoC类提供服务定位器;正如Sniffer所说,大多数用于服务位置的使用案例都被认为是反模式,因此它的使用应该严格审查,否则它会咬你的屁股。

我正在完成对IoC和我们内置的依赖容器SimpleContainer的两篇新文章的收尾工作,一旦这些文章完成了,我会将相关链接添加到EventAggregator文档中,该文档应提供更多有关注入网站和最佳环境的链接实践。

+0

你有这些链接吗?对将“UserControls”添加到需要依赖注入的View的“正确”方式非常感兴趣。 Caliburn.Micro新手。 – faldeland

+0

两者现在分别位于EventAggregator和SimpleContainer下http://caliburnmicro.codeplex.com/documentation – McDonnellDean