我有这个代码:
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();
}
}
我将所有服务实例传递给 MainViewModel。在 MainViewModel 中,我通过构造函数参数传递将这些服务传播到其他 ViewModel。
我应该为 App 类中的服务使用任何 DI 框架吗?
如果是的话,解决服务而不是仅仅手动创建实例有什么好处......?
最佳答案
您可以在容器中注册所有这些类型,并拥有 OnStartup
方法制作单个Resolve
称呼。
首先,有MainWindow
在其构造函数中接受其 View 模型:
public MainWindow(MainViewModel viewModel)
{
DataContext = viewModel;
}
然后,注册
MainWindow
和 MainViewModel
在服务旁边的容器中。如果 MainViewModel
需要其他 View 模型,将它们放入其构造函数并注册它们。最后解决
MainWindow
,它执行所有的实例化工作:var window = container.Resolve<MainWindow>();
window.Show();
这里的关键点是 View 模型与您在容器中注册的任何其他类没有什么不同。
这种方法的优点(来自评论):
1) 容器为您调用所有的构造函数——您只需要描述图形的每一部分,并且它会经历组装它的单调乏味。
2)
MainViewModel
不必知道如何构建其 subview 模型,这使它可以专注于其核心职责,而不必了解其 subview 的每一个依赖关系。
关于mvvm - 将服务传递给 MainViewModel - 我应该使用依赖注入(inject)容器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4576470/