.NET/ASP.NETMVC 深刻剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(一)

阅读目录:编程

  • 1.开篇介绍
  • 2.Model与View的使用关系(数据上下文DataContext与View呈现)
  • 3.Metadata元数据驱动设计(如何使用中间层元数据来驱动最终的行为)
  • 4.ASP.NETMVC ModelMetadata(ModelMetadata元数据如何支撑Model与View之间的组合关系)

1】开篇介绍

这篇文章让咱们一块儿来学习一下有关Asp.netMvc中的Mode元数据的相关设计和围绕元数据的一些其余对象模型,他们是如何经过彼此协调来支撑起一个灵活的界面编程接口;设计模式

其实提到元数据(Metadata)你们在研究某个应用框架的时候都曾经或多或少的见到过,可能并无引发你的注意;其实在不少应用框架中咱们都能看见Matedata的影子,它是一个很不错的框架设计模式,俗称:“元数据驱动设计”,它跟目前不少设计思想很接近,如:元编程契约式设计,这些模式目的都是为了能很好的控制耦合,产生极大的扩展灵活性;元编程让咱们能基于最终的用户选择动态的产生运行软件的代码,而契约式设计能让咱们将控制权设立在很远的地方,从而很大粒度的控制扩展性,根据契约设立规则,控制端再在运行时动态的生成出最终须要的规则;架构

经过对这些模式深刻理解,基本上能够提炼出两条设计上的黄金规则:1.将变化点从编译时迁移到运行时2.将变化点从硬编码迁移到配置化框架

这里只是一个简单的介绍,因为每个主题细化下来都会很大,都会包含该方向中的不少领域概念、术语和重要的设计思想,因此这里只是一个简单的介绍,本篇文章会重点介绍一下“元数据驱动设计”编程思想和它到底好在哪里,而后在ASP.NETMVC中它起到怎样的做用,它又是如何架起通往Model与View的高速桥梁的,让Model与View能够到作1对N的搭配关系,在大型站点中ViewModel通常只有固定的几种,可是View可能会有成千种,如何作到这种高度适配,这就是自定义模板的功能,固然一切都创建在ModelMetadata基础上;学习

2】Model与View的使用关系(数据上下文DataContext与View呈现)

在MVC的定义中,Model准确点讲是ViewModel而非DomainModel,ViewModel简称显示Model,主要是将要显示的数据融合在一个DataContext中,它来源于企业应用架构中的Query端的数据源;通常状况下这样的一个ViewModel不会常常变化,都是根据众多的业务场景抽象出来的一个比较Common的数据上下文;网站

在网站型的系统中,尤为电子商务平台,界面的变化很常见,几乎天天都有可能改变界面上的某个显示方式,一样一组数据可能在UI上的展示方式各不相同;这里就会造成一个Model与多个View的组合关系,一样一个Promotion(促销)数据上下文,须要在不少注销类别不一样的UI上展示,而不一样的UI组成都是由不一样的View的负责生成;编码

图1:spa

能够总结出一个数据上下文实体在大部分的状况下均可能会被不少View使用,因此ASP.NETMVC 须要具有很强的自定义性,一个Model能够随意呈现出多中Ui而不会所以将ViewModel搞的一团乱;.net

注意:一个ViewModel数据实体可能很大,若是为了应付不一样的显示场景最好将ViewModel进行切割,拉出继承体系,而不是将全部的ViewModel耦合在一个超大的ViewModel中,这样会让每一次的查询都会涉及到一些你本次不相关的属性;设计

3.Metadata元数据驱动设计(如何使用中间层元数据来驱动最终的行为)

元数据驱动设计模式是众多经典框架设计模式之一,它与契约式设计有点一脉相承的感受;其实框架设计的本质是如何灵活的运用一些框架设计模式,不一样的语言、平台对模式的运用各不相同,可是模式的中心思想一直不会变,无论你如何设计都必须呈现出框架模式的本质才行;

在众多的框架设计模式中 如:契约式设计、元编程、元数据驱动设计、管道模型、远程代理模式、提供程序模型;元数据驱动设计模式是使用频率比较高的,由于其复杂度也相对较低因此比较容易上手;其实在不少现有的.NET框架中,如:WCF、ASP.NET、Remoting、Winform中都会看见Metadata的影子,可是不必定非得要在命名的时候加上Metadata,有不少的时候也会使用Description来代替;

元数据一般做为支持数据,它是描述数据的数据,是真正被解析处理的数据;既然是描述数据的数据,那么就存在它在那个方向上的描述,描述的角度是什么,描述的层面又是是什么;

咱们就拿ModelMetadata来说,在ASP.NETMVC中,Model的使用方向基本上被限定在三个操做集合中,第一:请求的数据绑定,第二:数据绑定时的验证,第三:Model的最终呈现;那么ModelMetadata要包含这三个操做集合所须要的所有数据,固然也能够经过切割成三组元数据对象模型,经过继承体系包含起来;那么ModelMetadata须要描述三个方向上的所须要的数据集合,Model自己就是一中数据,而经过使用ModelMetadata来抽象的描述第二个层面上的数据,从三个操做集合角度中包含使用的数据,也就是说三个角度,两个层面;若是你的框架须要具有多个层面,那就须要进一步细化抽象;

图2:

标准数据通过一个中间的环节转换成元数据,而后交给最终的处理程序去使用;能够很清晰的了解到元数据起到的一个核心做用,它能够很好的将处理程序与标准数据之间解耦,让中间的元数据提供更大的灵活性,经过这个中间层元数据,咱们能够很轻松的作到对元数据进行配置;

咱们假设没有中间层元数据,操做程序无论如何设计都会和标准数据实体有耦合,并且要保证标准数据的纯洁度,不可能老是对它使用继承、特性等重度污染性的侵入,保证彻底的POCO(Plain Old Csharp Objects)对象很难,若是没有IDE的编译时支持,很难提取出能够在运行时使用的数据;这个时候咱们若是须要修改标准元数据的类型或者修改操做程序的逻辑都会或多或少的对二者有影响;

若是使用元数据咱们彻底能够将表数据对元数据的定义部分迁移到配置文件中去,而后再在元数据提供程序中扩展读取元数据的源头,能够作到将标准数据放在任何地方甚至遥远的云平台上,对于操做程序来讲,咱们能够将获取元数据的接口提取成Service方式,从任何一个地方读取元数据;

这些种种方案你可能决定永远都不会用到,可是谁又能把某个框架的全部功能都用一边呢,系统需求各异,都有可能须要这些扩展点;

4.ASP.NETMVC ModelMetadata(ModelMetadata元数据如何支撑Model与View之间的组合关系)

未完待续,敬请关注......

 

相关文章
相关标签/搜索