将服务传递给MainViewModel - 我应该使用依赖注入容器吗?

时间:2011-01-02 00:13:46

标签: mvvm dependency-injection service viewmodel inject

我有这段代码:

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框架吗?

如果是,那么解决服务的好处是什么,而不仅仅是手动创建实例......?

1 个答案:

答案 0 :(得分:1)

您可以在容器中注册所有这些类型,并让OnStartup方法进行一次Resolve调用。

首先,让MainWindow在其构造函数中接受其视图模型:

public MainWindow(MainViewModel viewModel)
{
    DataContext = viewModel;
}

然后,在服务旁边的容器中注册MainWindowMainViewModel。如果MainViewModel需要其他视图模型,请将它们放在其构造函数中并注册它们。

最后,解析执行所有实例化工作的MainWindow

var window = container.Resolve<MainWindow>();

window.Show();

这里的关键点是视图模型与您在容器中注册的任何其他类没有区别。

这种方法的优点(来自评论):

1)容器为你做了所有的构造函数调用 - 你只需要描述图形的每一部分,它就会经历组装它的乏味。

2)MainViewModel不必知道如何构建其子视图模型,这使得它可以专注于其核心职责,而不必知道其子女的每一个依赖。