在WPF CAL MVVM中初始化模型和视图的正确方法是什么

ano*_*non 5 wpf prism unity-container mvvm viewmodel

我有两种方法来初始化WPF CAL MVVM中的Views和ViewModel.

1 - 似乎更受欢迎.需要您解析ViewModel以自动解析View.ViewModel包含有关View的信息.

    public interface IView
    {
        void SetModel(IViewModel model);
    }

    public interface IViewModel
    {
        IView View { get; }
    }

    public class View
    {
        public void SetModel(IViewModel model)
        {
            this.DataContext = model;
        }
    }

    public class ViewModel
    {
        private IView view;

        public ViewModel(IView view)
        {
            this.view = view;
        }

        public IView View { return this.view; }
    }
Run Code Online (Sandbox Code Playgroud)

2 - 看起来更清洁,并从ViewModel中删除View.需要您解析视图以自动解析ViewModel.将对象注入视图(不确定这是否合适).

    public interface IView
    {
    }

    public interface IViewModel
    {
    }

    public class View
    {
        private IViewModel model;

        public View(IUnityContainer unityContainer)
        {
            this.model = unityContainer.Resolve<IViewModel>();
            this.DataContext = this.model;
        }
    }

    public class ViewModel
    {
    }
Run Code Online (Sandbox Code Playgroud)

初始化视图和模型的可接受方法是什么,以及每种方法的优缺点是什么.你应该在视图中注入物体吗?

And*_*mes 3

它们都是有效的,但#1 往往更容易测试(它至少使您的测试更简洁)。#2 的优点是它往往更明确,并使维护更清晰,特别是当你有大量人员流动时,诸如此类的事情。不需要太多解释(尽管这不是采用它的理由,但这只是一个不言而喻的道理)。

区别在于#1 称为依赖注入#2 称为服务位置。它们经常被混淆,因为它们通常都使用某种 IoC 容器(尽管情况不一定如此)。

这最终是一个偏好问题,但正如我所说,我认为您会发现 #1 更容易测试......您不必在测试/模拟中涉及 IUnityContainer 接口。