在最开始先我得说说我看这部分的情况,最开始被各种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. 犀利的background-clip:text,实现K歌字幕效果

    今天学到了一个新的CSS3属性,更准确的说是属性值,那就是background-clip:text.利用此属性值可以制作出很神奇的效果.可惜只有chrome支持,不过今天可以先来玩玩这个属性. 先来介 ...

  2. java实现输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

    package JingDian; import java.util.Scanner; public class charKind { public static void main(String[] ...

  3. java笔试题(金山网络)

    今天参加金山的校园招聘,java笔试,回来仔细研究实现一下: 题目1:工厂两条生产线,三个工人,生产线上可以最多存放m个产品,当生产线满时,机器停止生产,等产品线不满时才继续生产,每条产线上一次只能允 ...

  4. 赴美工作常识(Part 3 - 英语)

    在<Part 2 - 申请>的评论中有人问英语要达到何种水平,以及如何提高.其实英语也不是我的强项,只是刚刚好做到能够沟通而已.由于我在知乎上回到过一个类似问题,我就基于那个答案简单说一下 ...

  5. MFC CString::GetBuffer() 内存数据异常

    问题描述 在项目中的一个文件路径存储在CString的对象中,这个对象在函数间传递了几次,当传递出来的时候,因为要使用到字符指针,所以GetBuffer获取字符串的指针,但是通过调试,发现,CStri ...

  6. WAMPServer 默认安装启动后,图标显示橙黄色

    说明:我是在家的电脑上面学习的WAMPServer的,而家的电脑很干净.这次来学校以后,实验室的电脑被我经常的折磨,今天在安装以后,启动后,发现图标有红色到黄色,就停止了.其实,问题的根源很简单,某个 ...

  7. WebApi系列~通过HttpClient来调用Web Api接口~续~实体参数的传递

    回到目录 上一讲中介绍了使用HttpClient如何去调用一个标准的Web Api接口,并且我们知道了Post,Put方法只能有一个FromBody参数,再有多个参数时,上讲提到,需要将它封装成一个对 ...

  8. 移动端使用localResizeIMG4压缩图片

    移动h5开发避免不了上传图片,一般我们使用html自带的控件input或者使用微信上传API.但微信上传API不是任何地方都可以使用的,使用html自带的控件input上传又免不了图片体积太大,上传不 ...

  9. MySQL账户安全设置

    一般来说,安装完MySQL后,默认的用户是root,密码123456,外网不能访问. 有时候也希望在外网访问,则可以添加一个账户.建议不要用root. 如下表,存在安全问题: mysql> se ...

  10. [javaweb]Java过滤器与包装设计模式的实用案例.

    在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可以使用Decorator(装饰器)模式对request.response对象进行包装,再把包装对象传给目 ...