2

我有这个代码:

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

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

4

1 回答 1

1

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

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

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

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

最后, resolve MainWindow,它执行所有的实例化工作:

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

window.Show();

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

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

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

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

于 2011-01-02T03:44:25.400 回答