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

标签 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();

        }
    }

我将所有服务实例传递给 MainViewModel。在 MainViewModel 中,我通过构造函数参数传递将这些服务传播到其他 ViewModel。

我应该为 App 类中的服务使用任何 DI 框架吗?

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

最佳答案

您可以在容器中注册所有这些类型,并拥有 OnStartup方法制作单个Resolve称呼。

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

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

然后,注册MainWindowMainViewModel在服务旁边的容器中。如果 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/

相关文章:

c# - 如何在 WPF 中使用一次性 View 模型?

mvvm - 用于在 android 平台和 ViewModel 之间共享事件的 Xamarin 架构

c# - 如何在 Prism 框架中的模块之间正确发送事件消息?

wpf - 绑定(bind)到 View 模型中的变量

c++依赖注入(inject)+ Demeter法则+记录器/断言

android - 如何将自定义调用对象从服务传递到 Activity ?

android - 警报管理器或服务

javascript - 为什么我能够在不注入(inject)模块的情况下访问 Angular 服务?

java - 是否可以将使用 @Component 定义的 bean 作为 BeanFactoryPostProcessor 的参数注入(inject)?

android - 当应用关闭时,就像在VLC Player中一样,在后台(在通知栏中)播放视频声音(在通知栏中)