MVVM中Model和ViewModel的澄清和命名约定

时间:2013-09-07 04:43:30

标签: c# xaml mvvm

我对应该是什么样的模型或视图模型感到困惑,应该如何命名。

为简单起见,我将保留INotifyPropertyChange

以下课程显然是一个模型:

class CountryModel
{
    public string Name { get; set; }
    public string Location { get; set; }
}

您最常在网上看到的是视图模型定义如下:

class CountryViewModel
{
    public CountryViewModel
    {
        // initialize data (not ideal place, I know, but keeping it simple!)
    }

    public ObservableCollection<CountryModel> Countries
    {
        private get;
        set;
    }
}

为什么上面不是Countries的模型,例如CountriesModel?为什么它被视为视图模型?

技术上应该如此吗?我们应该为视图模型设置另一个类吗?

class CountryViewModel
{
    private ObservableCollection<CountryModel> _countries = new ....;

    public CountryViewModel
    {

    }

    public ObservableCollection<CountryModel> Countries
    {
        private get { return _countries ?? _countries = LoadCountries(); }
        set { _countries = value; }
    }

    private ObservableCollection<CountryModel> LoadCountries()
    {
        ObservableCollection<CountryModel> countries = new ...;
        foreach (CountryModel country in CountriesModel)
        {
           countries.add(country);
        }
        return countries;
    }
}

以上是否有意义?我只是不明白为什么它似乎是一个标准,为什么你会在CountriesViewModel给我CountriesModel时调用它CountryViewModel并且应该创建一个CountriesModel来访问来自{的数据{1}}。

此外,如果您坚持网络上的内容,即CountryModelCountryViewModel包含可观察的CountryModel集合,那么您将如何处理包含每个列表的CityModel城市?我会将CityViewModel作为POCO,然后对于城市列表,我会创建一个CityModel,其中包含CityViewModel的可观察集合。

但那又怎么样?我应该制作CountryModel的{​​{1}}部分吗?这似乎不对!也许是这样,有人可以澄清一下。这是我感到困惑的地方,因为我创建了一个CountryModel,其中包含属性NameLocation和类型为List<CityModel>的属性,但我该怎样才能正确表示在MVVM中?

如何正确定义?特别是您拥有对象列表的部分以及每个对象都包含另一个列表。哪个是模型,视图模型以及如何处理模型中的列表?

1 个答案:

答案 0 :(得分:16)

通常,人们为他们系统中的每个视图制作一个视图模型。视图模型的目的是方便视图的数据。视图模型通常是其域模型对应物的扁平化版本,但是当您拥有实际上只是数据传输对象(DTO)的平面域模型时,这看起来会让人感到困惑。不要害怕拥有与领域模型非常相似的视图模型;它们是用于在应用程序的不同区域/层中生活和工作的数据的不同抽象。

至于你的问题/例子,如果你的应用程序中有一个代表国家和城市的视图,那么就可以完全接受由{{1}组成的CountryViewModel与任何其他视图模型一起帮助构成该特定视图的数据。也可以在视图模型中使用继承,以便您可以拥有基本视图模型类,其中包含出错的任何错误信息,例如检索数据的问题,映射数据的问题或验证数据的问题。

由于您通常希望在应用程序中为每个视图创建一个视图模型,因此您很多时会得到一组与您的域模型对象的CRUD操作相匹配的视图模型。例如,假设您拥有CityViewModel域模型,则可能会有AccountCreateAccountViewModelDisplayAccountViewModelDeleteAccountViewModel

很多人都担心代码中的重复,并认为拥有一个在结构和数据类型上几乎完全相同的域模型和视图模型是错误的,但请记住它们的用途非常不同;存在域模型以便于您正在处理的问题空间的数据,而存在视图模型以便于在视图中向用户显示信息的数据。

在数据访问层中拥有一个与域模型不同的数据模型类,但镜像从数据库表中检索的数据结构也是闻所未闻。这就是你如何使用像UpdateAccountViewModel这样的微观ORM。您不是编写ADO.NET Dapper映射逻辑,而是创建一个数据模型类,该类与您用于从数据库中检索数据的查询中的列名相匹配,然后将该类用作“转储”的对象将数据转化为。从那里你可以有映射逻辑来构建一个域模型类,它可以传递回应用程序的各个层。