在最开始先我得说说我看这部分的情况,最开始被各种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. 优雅的使用Python之软件管理

    上篇<优雅的使用python之环境管理>http://dwz.cn/wTsOr,如何管理python环境,有了一个干净的python环境之后,就不可避免的安装python软件包(pytho ...

  2. springmvc下js控制表单提交(表单提交前检验,提交后获取json返回值)

    这个问题我搞了四天,终于搞懂.因为对js很不熟悉.郁闷的是后台代码出错总可以设置断点调试,前端js代码出错只能通过浏览器提供一些运行数据来分析,很不习惯. 首先说下逻辑:这是一个注册功能,我希望,注册 ...

  3. MySQL 5.7新特性之Generated Column(函数索引)

    MySQL 5.7引入了Generated Column,这篇文章简单地介绍了Generated Column的使用方法和注意事项,为读者了解MySQL 5.7提供一个快速的.完整的教程.这篇文章围绕 ...

  4. Java final修饰符

    final的定义: 在英文层面上,final的意思是"最后的","最终的"意思,在Java中也同样表示出此种含义. final的运用对象: final适用于修饰 ...

  5. 我所了解的chrome

    Chrome的隐身模式 先来说说隐身模式的启用方法吧 1.键盘快捷:Ctrl + Shift + N. 2.在Windows7下的任务栏处,右击“Chrome”图标,会出一个下拉菜单,点击“新建隐身窗 ...

  6. salesforce 零基础学习(十六)Validation Rules & Date/time

    上一篇介绍的内容为Formula,其中的Date/time部分未指出,此篇主要介绍Date/time部分以及Validation rules. 本篇参考PDF: Date/time:https://r ...

  7. 无服务端纯前台导出数据到Excel-JSExcelXML.js 使用指南

    JSExcelXML 使用指南 先来个效果预览 a.前端显示 b.导出excel效果 表头部分 表尾部分 1.功能描述 JsExcelXml 采用js生成excel中可显示的xml格式文本,将输出文本 ...

  8. Jenkins的系统设置

    1.登录Jenkins进入以下界面: 2.点击 系统管理 3.点击 系统设置 (下图的系统设置是已经设置好的) 4.这里设置主要设置 Jenkins URL (这里我是测试的所以使用默认的)与 邮件的 ...

  9. ASP.NET MVC 拦截器IResultFilter

    在ASP.NET MVC中,有一个Result拦截器,实现ResultFilter需要继承一个类(System.Web.Mvc.FilterAttribute)和实现一个类(System.Web.Mv ...

  10. 了解canvas

    目录 [1]HTML属性[2]CSS样式 [3]API 坐标 填充和描边 阴影 绘制矩形 绘制路径 绘制文本 绘制图像 使用图像 变换 合成 [4]DEMO 前面的话 canvas元素是HTML5最受 ...