在最开始先我得说说我看这部分的情况,最开始被各种ModelMetadata和各种ModelMetadataProvider给搞晕了,就几页书花了我好大的精力去看,直到后来看了一幅类图,细细看各个类之间的关系,重新阅读这部分的内容,我才算有所了解,有所收获,这个估计是以后看书的方法,看代码的方法,先了解结构,才不会被庞大的类库所混乱。那么我也首先把类图列出来,这幅图依据我个人喜好位置上作了调整,与书上的不同。

整张图左边是ModelMetadata部分的,右边才是元数据的提供者Provider,虽然在章节前面介绍了很多元数据的属性,但是MVC里面用到的元数据并非是ModelMetadata,而是类的子类,那再下面将逐个类作介绍,介绍也是分两部分,一部分是左边Model元数据部分,另一部是右边的元数据Model提供者。

Model元数据部分

  • DataAnnotationsModelMetadata:由于MVC采用了基于注解特性声明式定义,所以定义了这个类。在这个类的构造函数中使用到DisplayColumnAttribute,主要跟Display有关,使用了这个Attrubute的类,其Label的值是该类对应属性的值,如书上的Address的显示以Address的DisplayText属性的值。
  • CachedModelMetadata<TPrototypeCache>:使用原型模式构建,或由子类CachedDataAnnotationsModelMetadata的Provider来提供,用于计算所有Model元数据的属性,它的示例在书上也有提示。
  • CachedDataAnnotationsModelMetadata:MVC中默认的元数据类型,继承CachedModelMetadata<CachedDataAnnotationsMetadataAttribute>,用于缓存Model元数据信息类型,该Attribute包含所有Model元数据注解特性。

Model元数据提供者部分

  • ModelMetadataProvider:所有Provider的抽象基类,定义了若干元数据的获得元数据的Get方法。
  • AssociatedMetadataProvider:重写ModelMetadataProvider基类的三个方法,实际内部均调用这个类声明的抽象方法CreateMetaData,这个类供两种Provider继承,其一是DataAnnotationsModelMetadataProvider,其二是CachedAssociatedMetadataProvider<TModelMetadata>。
  • DataAnnotationsModelMetadataProvider:继承了AssociatedMetadataProvider,定义了这个类的构造函数,所以这是个可以实际使用的Provder,它重写了ociatedMetadataProvider中定义的CreateMetaData抽象方法。达到了提供对应的元数据目的。
  • CachedAssociatedMetadataProvider<TModelMetadata>:继承了AssociatedMetadataProvider抽象类,TModelMetadata是集成了ModelMetadata,同样重写父类的CreateMetadata,返回对应Model元数据对象的抽象方法。其中有缓存功能,有缓存则用单例模式生成Model元数据,无缓存的则重新生成一个。
  • CachedDataAnnotationsModelMetadataProvider:继承了CachedAssociatedMetadataProvider<TModelMetadata>,实现了上面所有抽象方法。
  • ModelMetadataProviders:通过Current获取当前使用的Provider,是ModelMetadataProvider类型,默认是CachedDataAnnotationsModelMetadataProvider类型。

  书看到这一章节才知道框架里使用的默认Model元数据类型并不是基类ModelMetadata,而是它的子类,但是在基类中定义了很多Model元数据定制相关的属性,这我回想其在MVC模式中控制器控制的只是模型,整个模式中并没有提及专门存储数据用的实体类型,所有数据和业务逻辑处理都归结在Model中去,Model就囊括了属于这个模型的属性(Field或者Prototype)和行为(Method)。使用Model元数据这几个类的结构形式正好解决了这个问题,数据部分就定义为基类,行为部分就放在子类中。减少了数据和行为放在一起的混乱感,同时在数据引用方便又比较方便。

Model元数据提供机制小结的更多相关文章

  1. .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)

    阅读目录: 1.需求背景介绍(Model元数据设置项应该与View绑定而非ViewModel) 1.1.确定问题域范围(可以使用DSL管理问题域前提是锁定领域模型) 2.迁移ViewModel设置到外 ...

  2. ASP.NET MVC5学习笔记之Action参数模型绑定之模型元数据和元数据提供

    一. 元数据描述类型ModelMetadata 模型元数据是对Model的描述信息,在ASP.NET MVC框架中有非常重要的作用,在模型绑定,模型验证,模型呈现等许多地方都有它的身影.描述Model ...

  3. Model元数据解析

    Model 元数据是针对数据类型的一种描述信息,主要用于控制数据类型本身及其成员属性在界面上的呈现方式,同时也为Model 绑定和验证提供必不可少的元数据信息.一个复杂数据类型通过属性的方式定义了一系 ...

  4. ASP.NET MVC Model元数据(五)

    ASP.NET MVC Model元数据(五) 前言 在上一篇中我们描述了应用于Model上面的各种用于显示控制的特性类,在本篇中将详细的介绍这些特性类的应用,虽然它们跟Model元数据的直接关系并不 ...

  5. ASP.NET MVC Model元数据(四)

    ASP.NET MVC Model元数据(四) 前言 前面的篇幅讲解了Model元数据生成的过程,并没有对Model元数据生成过程的内部和Model元数据结构的详细解释.看完本篇后将会对Model元数 ...

  6. 迁移Model元数据设置项

    .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序) 阅读目录: 1.需求背景介绍(Model元数据设置项应该与View绑定而非ViewModel) 1 ...

  7. Artech的MVC4框架学习——第四章Model元数据的解析

    总结: 第一Model元数据是针对 数据类型的一种表述信息. 第二Model元数据作用:控制数据类型本身及其成员,通过相应的特性,在view中 为绑定的数据(Model)实现模版化的html呈现. 第 ...

  8. MVC中Model元数据及绑定机制

    ASP.NET MVC的Model为View Model,表示最终呈现在View上的数据,而Model元数据的一个重要的作用在于控制对象在View上的呈现方式.说得更加具体点,就是基于某种数据类型的M ...

  9. ASP.NET MVC Model元数据(三)

    ASP.NET MVC Model元数据(三) 前言 在上篇中我们大概的讲解了Model元数据的生成过程,并没有对Model元数据本身和详细的生成过程有所描述,本篇将会对详细的生成过程进行讲解,并且会 ...

随机推荐

  1. html5 Application Cache——加快简历二次访问速度

    上篇博客(在github上写个人简历——最简单却又不容易的内容罗列)介绍了我在github上放的一个个人在线简历,有朋友看了后告诉我一个很大缺陷,使用github挺慢的,每次看的时候都很慢,第一反应这 ...

  2. Senparc.Weixin.MP SDK 微信公众平台开发教程(四):Hello World

    =============  以下写于2013-07-20 ============= 这一篇文章其实可以写在很前面,不过我还是希望开发者们尽多地了解清楚原理之后再下手. 通过上一篇Senparc.W ...

  3. Qt 设置应用程序图标

    Qt4设置应用程序图标 将一个ico图标放在资源文件夹下; 然后建立txt,输入 IDI_ICON1 DISCARABLE "myico.ico"; 保存文件,将其后缀改为.rc; ...

  4. 给UINavigationBar自定义颜色

    self.navigationController.navigationBar.barTintColor = RGB(55, 46, 41);    

  5. redis启动流程介绍

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/114.html?1455860562 1. 准备运行环境 * 设置oom ...

  6. Asp.net WebApi 项目示例(增删改查)

    1.WebApi是什么 ASP.NET Web API 是一种框架,用于轻松构建可以由多种客户端(包括浏览器和移动设备)访问的 HTTP 服务.ASP.NET Web API 是一种用于在 .NET ...

  7. JS 操作 DOM

    定义:文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口.它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式 节点:(例如:< ...

  8. Eclipse 启动时提示“发现了以元素'd:skin'开头的无效内容,此处不应含有子元素“

    今天打开 Eclipse 时遇到了这个提示,如图所示: 关闭后发现控制台也有提示: [2016-04-19 11:11:20 - Android SDK] Error when loading the ...

  9. 24.编写一个Car类,具有String类型的属性品牌,具有功能drive; 定义其子类Aodi和Benchi,具有属性:价格、型号;具有功能:变速; 定义主类E,在其main方法中分别创建Aodi和Benchi的对象并测试对象的特 性。

    package zhongqiuzuoye; public class Car { String brand; public void drive() {} } package zhongqiuzuo ...

  10. js算法之最常用的排序

    引入 大学学习计算机语言的那几年,从c语言,到c++,再到数据结构JAVA..让我印象最深刻的还是最开始老师讲冒泡算法的时候,直到现在大四快毕业了我才渐渐通窍了.刚学前端的时候以为前端就是做出好看很炫 ...