Model元数据提供机制小结

  在最开始先我得说说我看这部分的情况,最开始被各种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元数据这几个类的结构形式正好解决了这个问题,数据部分就定义为基类,行为部分就放在子类中。减少了数据和行为放在一起的混乱感,同时在数据引用方便又比较方便。

时间: 2024-10-11 23:11:15

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

Model元数据解析

Model 元数据是针对数据类型的一种描述信息,主要用于控制数据类型本身及其成员属性在界面上的呈现方式,同时也为Model 绑定和验证提供必不可少的元数据信息.一个复杂数据类型通过属性的方式定义了一系列的数据成员,而Model 元数据不仅仅是数据类型本身的描述,对数据成员的描述也包含其中,所以Model 元数据具有一个层次化结构. AdditionalMetadataAttribute定义的值放在元数据的AdditionalValues中.实现接口IMetadat aAware ModelMet

ASP.NET MVC Model元数据(四)

ASP.NET MVC Model元数据(四) 前言 前面的篇幅讲解了Model元数据生成的过程,并没有对Model元数据生成过程的内部和Model元数据结构的详细解释.看完本篇后将会对Model元数据有更清楚的了解,当然了也不会是特别全面的,因为后面还有篇幅.希望能给大家带来好的效果. Model元数据 什么是Model元数据? 生成Model元数据的过程[一] 生成Model元数据的过程[二] ModelMetaData的定义.详解 Model元数据应用(常用特性应用)-1 Model元数据

ASP.NET MVC Model元数据(五)

ASP.NET MVC Model元数据(五) 前言 在上一篇中我们描述了应用于Model上面的各种用于显示控制的特性类,在本篇中将详细的介绍这些特性类的应用,虽然它们跟Model元数据的直接关系并不大,但是我们可以用它们在编码阶段控制运行时的显示. Model元数据 什么是Model元数据? 生成Model元数据的过程[一] 生成Model元数据的过程[二] ModelMetaData的定义.详解 Model元数据应用(常用特性应用)-1 Model元数据应用(自定义视图模板)-2 Model

asp.net Model元数据学习三

5.Model元数据的提供机制 表示Model元数据的ModelMetadata对象最终是通过一个名为ModelMetadataProvider对象提供的,Model元数据的提供机制是以ModelMetadataProvider为核心的.我们首先来看ModelMetadata的构造函数: public ModelMetadata(ModelMetadataProvider provider, Type containerType, Func<object> modelAccessor,Type

ASP.NET MVC Model元数据(三)

ASP.NET MVC Model元数据(三) 前言 在上篇中我们大概的讲解了Model元数据的生成过程,并没有对Model元数据本身和详细的生成过程有所描述,本篇将会对详细的生成过程进行讲解,并且会对Model元数据本身的结构稍作讲解,读完本篇过后你将会对Model元数据的结构有个很清晰的印象. Model元数据 什么是Model元数据? 生成Model元数据的过程[一] 生成Model元数据的过程[二] ModelMetaData的定义.详解 Model元数据应用(常用特性应用)-1 Mod

【笔记】ASP.NET MVC Model元数据

问题1:什么叫Model元数据? Model元数据,是针对数据类型的一种描述信息.由于复杂类型(或者说类型嵌套的存在,比如CustomerModel中有一个属性为复杂类型Address)的存在,因此Model 元数据为树形结构: 1 //namespace:System.Web.Mvc 2 public class ModelMetadata 3 { 4 //其它成员 5 6 //当前模型类型 7 //倘若用数据库中树形结构解释,这个属性相当于Id 8 public Type ModelType

ASP.NET MVC Model元数据(二)

ASP.NET MVC Model元数据(二) 前言 在上篇中,给大家留个对Model元数据的印象,并没有对Model元数据有过多的讲解,而在本篇中也不会对Model元数据的本身来解释,而是针对于它的生成过程,让大家能够清楚的了解到系统框架是在什么时候生成Model元数据的,对于Model元数据生成篇幅初定为两篇,本篇为它的整体的生成过程,下篇则为详细的生成过程并且会对它本身做一个粗略的介绍,希望大家看完能够有所收获 Model元数据 什么是Model元数据? 生成Model元数据的过程[一]

MVC之Model元数据

Contronoller激活之后,ASP.NET MVC会根据当前请求上下文得到目标Action的名称,然后解析出对应的方法并执行之. 在整个Action方法的执行过程中,Model元数据的解析是一个非常重要的环节.ASP.NET MVC中的Model实际上View Model,表示最终绑定到View上的数据,而Model元数据描述了Model的数据结构,以及Model的每个数据成员的一些特性. 正是有了Model元数据的存在,才使模板化HTML的呈现机制成为可能.此外,Model元数据支撑了A

asp.net Model元数据学习二

3.IMetadataAware接口 用于设置Model元数据自定义属性的AdditionalMetadataAttribute特性实现了一个非常重要的IMetadataAware接口,实现这个接口的特性可以对最终生成的Model元数据进行自由定制.这个接口只有唯一的方法,作为参数的ModelMetadata对象表示可以被自由定制的Model元数据.当表示Model元数据的ModelMetadata对象被创建出来后,前篇帖子里记的一系列注解特性会被提取出来对其进行初始化. public inte