我有这段代码:
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
var mainVM = new MainViewModel
(
new Service1(),
...
new Service10(),
);
var window = new MainWindow();
window.DataContext = mainVM;
window.Show();
}
}
我将所有Services实例传递给MainViewModel。在MainViewModel中,我通过构造函数参数传递将这些服务传播到其他ViewModel。
我应该在App类中使用任何DI框架吗?
如果是,那么解决服务的好处是什么,而不仅仅是手动创建实例......?
答案 0 :(得分:1)
您可以在容器中注册所有这些类型,并让OnStartup
方法进行一次Resolve
调用。
首先,让MainWindow
在其构造函数中接受其视图模型:
public MainWindow(MainViewModel viewModel)
{
DataContext = viewModel;
}
然后,在服务旁边的容器中注册MainWindow
和MainViewModel
。如果MainViewModel
需要其他视图模型,请将它们放在其构造函数中并注册它们。
最后,解析执行所有实例化工作的MainWindow
:
var window = container.Resolve<MainWindow>();
window.Show();
这里的关键点是视图模型与您在容器中注册的任何其他类没有区别。
这种方法的优点(来自评论):
1)容器为你做了所有的构造函数调用 - 你只需要描述图形的每一部分,它就会经历组装它的乏味。
2)MainViewModel
不必知道如何构建其子视图模型,这使得它可以专注于其核心职责,而不必知道其子女的每一个依赖。