微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

为简单起见,我将保留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;
    }
}

为什么以上不是国家模型,例如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的数据.

此外,如果您坚持使用Web上的内容,即包含可观察的CountryModel集合的CountryModel和Countryviewmodel,那么您将如何处理包含每个城市列表的国家/地区?我将城市模型作为POCO,然后对于城市列表,我将创建一个具有可观察的CityModel集合的Cityviewmodel.

但那又怎样?我应该将Cityviewmodel作为CountryModel的一部分吗?这似乎不对!也许是这样,有人可以澄清一下.这是我更加困惑的地方,因为我创建了一个具有属性Name,Location和List< CityModel>类型属性的CountryModel,但是我如何在MVVM中正确表示这一点?

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

解决方法

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

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

由于您通常希望在应用程序中为每个视图创建一个视图模型,因此您很多时会得到一组与您的域模型对象的CRUD操作相匹配的视图模型.例如,假设您有一个帐户域模型,那么您可能拥有CreateAccountviewmodel,displayAccountviewmodel,DeleteAccountviewmodel和UpdateAccountviewmodel.

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


原文地址:http://msdn.microsoft.com/en-us/magazine/cc163791.aspx 原文发布日期: 9/19/2005 原文已经被 Microsoft 删除了,收集过程中发现很多文章图都不全,那是因为原文的图都不全,所以特收集完整全文。 目录 前言 CLR启动程序
前言 随着近些年微服务的流行,有越来越多的开发者和团队所采纳和使用,它的确提供了很多的优势也解决了很多的问题,但是我们也知道也并不是银弹,提供优势的同时它也给我们的开发人员和团队也带来了很多的挑战。 为了迎接或者采用这些新技术,开发团队需要更加注重一些流程或工具的使用,这样才能更好的适应这些新技术所
最近因为比较忙,好久没有写博客了,这篇主要给大家分享一下PLINQ中的分区。上一篇介绍了并行编程,这边详细介绍一下并行编程中的分区和自定义分区。 先做个假设,假设我们有一个200Mb的文本文件需要读取,怎么样才能做到最优的速度呢?对,很显然就是拆分,把文本文件拆分成很多个小文件,充分利用我们计算机中
在多核CPU在今天和不久的将来,计算机将拥有更多的内核,Microsoft为了利用这个硬件特性,于是在Visual Studio 2010 和 .NET Framework 4的发布及以上版本中,添加了并行编程这个新特性,我想它以后势必会改变我们的开发方式。 在以前或者说现在,我们在并行开发的时候可
c语言输入成绩怎么判断等级
字符型数据在内存中的存储形式是什么
c语言怎么求字符串的长度并输出
c语言函数的三种调用方式是什么
c语言中保留两位小数怎么表示
double的输入格式符是什么