閱讀目錄:
創(chuàng)新互聯(lián)公司是工信部頒發(fā)資質(zhì)IDC服務(wù)器商,為用戶提供優(yōu)質(zhì)的達(dá)州電信機(jī)房服務(wù)
1.開(kāi)篇介紹
2.Model與View的使用關(guān)系(數(shù)據(jù)上下文DataContext與View呈現(xiàn))
3.Metadata元數(shù)據(jù)驅(qū)動(dòng)設(shè)計(jì)(如何使用中間層元數(shù)據(jù)來(lái)驅(qū)動(dòng)最終的行為)
4.ASP.NETMVC ModelMetadata(ModelMetadata元數(shù)據(jù)如何支撐Model與View之間的組合關(guān)系)
這篇文章讓我們一起來(lái)學(xué)習(xí)一下有關(guān)Asp.netMvc中的Mode元數(shù)據(jù)的相關(guān)設(shè)計(jì)和圍繞元數(shù)據(jù)的一些其他對(duì)象模型,他們是如何通過(guò)彼此協(xié)調(diào)來(lái)支撐起一個(gè)靈活的界面編程接口;
其實(shí)提到元數(shù)據(jù)(Metadata)大家在研究某個(gè)應(yīng)用框架的時(shí)候都曾經(jīng)或多或少的見(jiàn)到過(guò),可能并沒(méi)有引起你的注意;其實(shí)在很多應(yīng)用框架中我們都能看見(jiàn)Matedata的影子,它是一個(gè)很不錯(cuò)的框架設(shè)計(jì)模式,俗稱:“元數(shù)據(jù)驅(qū)動(dòng)設(shè)計(jì)”,它跟目前很多設(shè)計(jì)思想很接近,如:元編程、契約式設(shè)計(jì),這些模式目的都是為了能很好的控制耦合,產(chǎn)生極大的擴(kuò)展靈活性;元編程讓我們能基于最終的用戶選擇動(dòng)態(tài)的產(chǎn)生運(yùn)行軟件的代碼,而契約式設(shè)計(jì)能讓我們將控制權(quán)設(shè)立在很遠(yuǎn)的地方,從而很大粒度的控制擴(kuò)展性,根據(jù)契約設(shè)立規(guī)則,控制端再在運(yùn)行時(shí)動(dòng)態(tài)的生成出最終需要的規(guī)則;
通過(guò)對(duì)這些模式深入理解,基本上可以提煉出兩條設(shè)計(jì)上的黃金規(guī)則:1.將變化點(diǎn)從編譯時(shí)遷移到運(yùn)行時(shí);2.將變化點(diǎn)從硬編碼遷移到配置化;
這里只是一個(gè)簡(jiǎn)單的介紹,由于每一個(gè)主題細(xì)化下來(lái)都會(huì)很大,都會(huì)包含該方向中的很多領(lǐng)域概念、術(shù)語(yǔ)和重要的設(shè)計(jì)思想,所以這里只是一個(gè)簡(jiǎn)單的介紹,本篇文章會(huì)重點(diǎn)介紹一下“元數(shù)據(jù)驅(qū)動(dòng)設(shè)計(jì)”編程思想和它到底好在哪里,然后在ASP.NETMVC中它起到怎樣的作用,它又是如何架起通往Model與View的高速橋梁的,讓Model與View可以到做1對(duì)N的搭配關(guān)系,在大型站點(diǎn)中ViewModel一般只有固定的幾種,但是View可能會(huì)有成千種,如何做到這種高度適配,這就是自定義模板的功能,當(dāng)然一切都建立在ModelMetadata基礎(chǔ)上;
在MVC的定義中,Model準(zhǔn)確點(diǎn)講是ViewModel而非DomainModel,ViewModel簡(jiǎn)稱顯示Model,主要是將要顯示的數(shù)據(jù)融合在一個(gè)DataContext中,它來(lái)源于企業(yè)應(yīng)用架構(gòu)中的Query端的數(shù)據(jù)源;一般情況下這樣的一個(gè)ViewModel不會(huì)經(jīng)常變化,都是根據(jù)眾多的業(yè)務(wù)場(chǎng)景抽象出來(lái)的一個(gè)比較Common的數(shù)據(jù)上下文;
在網(wǎng)站型的系統(tǒng)中,尤其電子商務(wù)平臺(tái),界面的變化很常見(jiàn),幾乎每天都有可能改變界面上的某個(gè)顯示方式,同樣一組數(shù)據(jù)可能在UI上的展現(xiàn)方式各不相同;這里就會(huì)形成一個(gè)Model與多個(gè)View的組合關(guān)系,同樣一個(gè)Promotion(促銷)數(shù)據(jù)上下文,需要在很多注銷類別不同的UI上展現(xiàn),而不同的UI組成都是由不同的View的負(fù)責(zé)生成;
圖1:
可以總結(jié)出一個(gè)數(shù)據(jù)上下文實(shí)體在大部分的情況下都可能會(huì)被很多View使用,所以ASP.NETMVC 需要具備很強(qiáng)的自定義性,一個(gè)Model可以隨意呈現(xiàn)出多中Ui而不會(huì)因此將ViewModel搞的一團(tuán)亂;
注意:一個(gè)ViewModel數(shù)據(jù)實(shí)體可能很大,如果為了應(yīng)付不同的顯示場(chǎng)景最好將ViewModel進(jìn)行切割,拉出繼承體系,而不是將所有的ViewModel耦合在一個(gè)超大的ViewModel中,這樣會(huì)讓每一次的查詢都會(huì)涉及到一些你本次不相關(guān)的屬性;
元數(shù)據(jù)驅(qū)動(dòng)設(shè)計(jì)模式是眾多經(jīng)典框架設(shè)計(jì)模式之一,它與契約式設(shè)計(jì)有點(diǎn)一脈相承的感覺(jué);其實(shí)框架設(shè)計(jì)的本質(zhì)是如何靈活的運(yùn)用一些框架設(shè)計(jì)模式,不同的語(yǔ)言、平臺(tái)對(duì)模式的運(yùn)用各不相同,但是模式的中心思想一直不會(huì)變,不管你如何設(shè)計(jì)都必須呈現(xiàn)出框架模式的本質(zhì)才行;
在眾多的框架設(shè)計(jì)模式中 如:契約式設(shè)計(jì)、元編程、元數(shù)據(jù)驅(qū)動(dòng)設(shè)計(jì)、管道模型、遠(yuǎn)程代理模式、提供程序模型;元數(shù)據(jù)驅(qū)動(dòng)設(shè)計(jì)模式是使用頻率比較高的,因?yàn)槠鋸?fù)雜度也相對(duì)較低所以比較容易上手;其實(shí)在很多現(xiàn)有的.NET框架中,如:WCF、ASP.NET、Remoting、Winform中都會(huì)看見(jiàn)Metadata的影子,但是不一定非得要在命名的時(shí)候加上Metadata,有很多的時(shí)候也會(huì)使用Description來(lái)代替;
元數(shù)據(jù)通常作為支持?jǐn)?shù)據(jù),它是描述數(shù)據(jù)的數(shù)據(jù),是真正被解析處理的數(shù)據(jù);既然是描述數(shù)據(jù)的數(shù)據(jù),那么就存在它在那個(gè)方向上的描述,描述的角度是什么,描述的層面又是是什么;
我們就拿ModelMetadata來(lái)講,在ASP.NETMVC中,Model的使用方向基本上被限定在三個(gè)操作集合中,第一:請(qǐng)求的數(shù)據(jù)綁定,第二:數(shù)據(jù)綁定時(shí)的驗(yàn)證,第三:Model的最終呈現(xiàn);那么ModelMetadata要包含這三個(gè)操作集合所需要的全部數(shù)據(jù),當(dāng)然也可以通過(guò)切割成三組元數(shù)據(jù)對(duì)象模型,通過(guò)繼承體系包含起來(lái);那么ModelMetadata需要描述三個(gè)方向上的所需要的數(shù)據(jù)集合,Model本身就是一中數(shù)據(jù),而通過(guò)使用ModelMetadata來(lái)抽象的描述第二個(gè)層面上的數(shù)據(jù),從三個(gè)操作集合角度中包含使用的數(shù)據(jù),也就是說(shuō)三個(gè)角度,兩個(gè)層面;如果你的框架需要具備多個(gè)層面,那就需要進(jìn)一步細(xì)化抽象;
圖2:
標(biāo)準(zhǔn)數(shù)據(jù)經(jīng)過(guò)一個(gè)中間的環(huán)節(jié)轉(zhuǎn)換成元數(shù)據(jù),然后交給最終的處理程序去使用;可以很清晰的了解到元數(shù)據(jù)起到的一個(gè)核心作用,它可以很好的將處理程序與標(biāo)準(zhǔn)數(shù)據(jù)之間解耦,讓中間的元數(shù)據(jù)提供更大的靈活性,通過(guò)這個(gè)中間層元數(shù)據(jù),我們可以很輕松的做到對(duì)元數(shù)據(jù)進(jìn)行配置;
我們假設(shè)沒(méi)有中間層元數(shù)據(jù),操作程序不管如何設(shè)計(jì)都會(huì)和標(biāo)準(zhǔn)數(shù)據(jù)實(shí)體有耦合,而且要保證標(biāo)準(zhǔn)數(shù)據(jù)的純潔度,不可能總是對(duì)它使用繼承、特性等重度污染性的侵入,保證完全的POCO(Plain Old Csharp Objects)對(duì)象很難,如果沒(méi)有IDE的編譯時(shí)支持,很難提取出可以在運(yùn)行時(shí)使用的數(shù)據(jù);這個(gè)時(shí)候我們?nèi)绻枰薷臉?biāo)準(zhǔn)元數(shù)據(jù)的類型或者修改操作程序的邏輯都會(huì)或多或少的對(duì)兩者有影響;
如果使用元數(shù)據(jù)我們完全可以將表數(shù)據(jù)對(duì)元數(shù)據(jù)的定義部分遷移到配置文件中去,然后再在元數(shù)據(jù)提供程序中擴(kuò)展讀取元數(shù)據(jù)的源頭,可以做到將標(biāo)準(zhǔn)數(shù)據(jù)放在任何地方甚至遙遠(yuǎn)的云平臺(tái)上,對(duì)于操作程序來(lái)說(shuō),我們可以將獲取元數(shù)據(jù)的接口提取成Service方式,從任何一個(gè)地方讀取元數(shù)據(jù);
這些種種方案你可能決定永遠(yuǎn)都不會(huì)用到,但是誰(shuí)又能把某個(gè)框架的所有功能都用一邊呢,系統(tǒng)需求各異,都有可能需要這些擴(kuò)展點(diǎn);
未完待續(xù),敬請(qǐng)關(guān)注......
作者:王清培
出處:http://wangqingpei557.blog.51cto.com/
本文版權(quán)歸作者和51CTO共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。
網(wǎng)站標(biāo)題:.NET/ASP.NETMVCModel元數(shù)據(jù)、HtmlHelper、自定義模板、模板的裝飾者模式(一)
地址分享:http://jinyejixie.com/article0/ijggio.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、品牌網(wǎng)站設(shè)計(jì)、用戶體驗(yàn)、網(wǎng)站收錄、網(wǎng)站營(yíng)銷、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)