溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

.NET/ASP.NETMVC Model元數(shù)據(jù)、HtmlHelper、自定義模板、模板的裝飾者模式(一)

發(fā)布時(shí)間:2020-07-31 16:36:07 來源:網(wǎng)絡(luò) 閱讀:1772 作者:王清培 欄目:編程語言

閱讀目錄:

  • 1.開篇介紹

  • 2.Model與View的使用關(guān)系(數(shù)據(jù)上下文DataContext與View呈現(xiàn))

  • 3.Metadata元數(shù)據(jù)驅(qū)動(dòng)設(shè)計(jì)(如何使用中間層元數(shù)據(jù)來驅(qū)動(dòng)最終的行為)

  • 4.ASP.NETMVC ModelMetadata(ModelMetadata元數(shù)據(jù)如何支撐Model與View之間的組合關(guān)系)

1】開篇介紹

這篇文章讓我們一起來學(xué)習(xí)一下有關(guān)Asp.netMvc中的Mode元數(shù)據(jù)的相關(guān)設(shè)計(jì)和圍繞元數(shù)據(jù)的一些其他對象模型,他們是如何通過彼此協(xié)調(diào)來支撐起一個(gè)靈活的界面編程接口;

其實(shí)提到元數(shù)據(jù)(Metadata)大家在研究某個(gè)應(yīng)用框架的時(shí)候都曾經(jīng)或多或少的見到過,可能并沒有引起你的注意;其實(shí)在很多應(yīng)用框架中我們都能看見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ī)則;

通過對這些模式深入理解,基本上可以提煉出兩條設(shè)計(jì)上的黃金規(guī)則:1.將變化點(diǎn)從編譯時(shí)遷移到運(yùn)行時(shí);2.將變化點(diǎn)從硬編碼遷移到配置化;

這里只是一個(gè)簡單的介紹,由于每一個(gè)主題細(xì)化下來都會很大,都會包含該方向中的很多領(lǐng)域概念、術(shù)語和重要的設(shè)計(jì)思想,所以這里只是一個(gè)簡單的介紹,本篇文章會重點(diǎn)介紹一下“元數(shù)據(jù)驅(qū)動(dòng)設(shè)計(jì)”編程思想和它到底好在哪里,然后在ASP.NETMVC中它起到怎樣的作用,它又是如何架起通往Model與View的高速橋梁的,讓Model與View可以到做1對N的搭配關(guān)系,在大型站點(diǎn)中ViewModel一般只有固定的幾種,但是View可能會有成千種,如何做到這種高度適配,這就是自定義模板的功能,當(dāng)然一切都建立在ModelMetadata基礎(chǔ)上;

2】Model與View的使用關(guān)系(數(shù)據(jù)上下文DataContext與View呈現(xiàn))

在MVC的定義中,Model準(zhǔn)確點(diǎn)講是ViewModel而非DomainModel,ViewModel簡稱顯示Model,主要是將要顯示的數(shù)據(jù)融合在一個(gè)DataContext中,它來源于企業(yè)應(yīng)用架構(gòu)中的Query端的數(shù)據(jù)源;一般情況下這樣的一個(gè)ViewModel不會經(jīng)常變化,都是根據(jù)眾多的業(yè)務(wù)場景抽象出來的一個(gè)比較Common的數(shù)據(jù)上下文;

在網(wǎng)站型的系統(tǒng)中,尤其電子商務(wù)平臺,界面的變化很常見,幾乎每天都有可能改變界面上的某個(gè)顯示方式,同樣一組數(shù)據(jù)可能在UI上的展現(xiàn)方式各不相同;這里就會形成一個(gè)Model與多個(gè)View的組合關(guān)系,同樣一個(gè)Promotion(促銷)數(shù)據(jù)上下文,需要在很多注銷類別不同的UI上展現(xiàn),而不同的UI組成都是由不同的View的負(fù)責(zé)生成;

圖1:

.NET/ASP.NETMVC Model元數(shù)據(jù)、HtmlHelper、自定義模板、模板的裝飾者模式(一)

可以總結(jié)出一個(gè)數(shù)據(jù)上下文實(shí)體在大部分的情況下都可能會被很多View使用,所以ASP.NETMVC 需要具備很強(qiáng)的自定義性,一個(gè)Model可以隨意呈現(xiàn)出多中Ui而不會因此將ViewModel搞的一團(tuán)亂;

注意:一個(gè)ViewModel數(shù)據(jù)實(shí)體可能很大,如果為了應(yīng)付不同的顯示場景最好將ViewModel進(jìn)行切割,拉出繼承體系,而不是將所有的ViewModel耦合在一個(gè)超大的ViewModel中,這樣會讓每一次的查詢都會涉及到一些你本次不相關(guān)的屬性;

3.Metadata元數(shù)據(jù)驅(qū)動(dòng)設(shè)計(jì)(如何使用中間層元數(shù)據(jù)來驅(qū)動(dòng)最終的行為)

元數(shù)據(jù)驅(qū)動(dòng)設(shè)計(jì)模式是眾多經(jīng)典框架設(shè)計(jì)模式之一,它與契約式設(shè)計(jì)有點(diǎn)一脈相承的感覺;其實(shí)框架設(shè)計(jì)的本質(zhì)是如何靈活的運(yùn)用一些框架設(shè)計(jì)模式,不同的語言、平臺對模式的運(yùn)用各不相同,但是模式的中心思想一直不會變,不管你如何設(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ù)雜度也相對較低所以比較容易上手;其實(shí)在很多現(xiàn)有的.NET框架中,如:WCF、ASP.NET、Remoting、Winform中都會看見Metadata的影子,但是不一定非得要在命名的時(shí)候加上Metadata,有很多的時(shí)候也會使用Description來代替;

元數(shù)據(jù)通常作為支持?jǐn)?shù)據(jù),它是描述數(shù)據(jù)的數(shù)據(jù),是真正被解析處理的數(shù)據(jù);既然是描述數(shù)據(jù)的數(shù)據(jù),那么就存在它在那個(gè)方向上的描述,描述的角度是什么,描述的層面又是是什么;

我們就拿ModelMetadata來講,在ASP.NETMVC中,Model的使用方向基本上被限定在三個(gè)操作集合中,第一:請求的數(shù)據(jù)綁定,第二:數(shù)據(jù)綁定時(shí)的驗(yàn)證,第三:Model的最終呈現(xiàn);那么ModelMetadata要包含這三個(gè)操作集合所需要的全部數(shù)據(jù),當(dāng)然也可以通過切割成三組元數(shù)據(jù)對象模型,通過繼承體系包含起來;那么ModelMetadata需要描述三個(gè)方向上的所需要的數(shù)據(jù)集合,Model本身就是一中數(shù)據(jù),而通過使用ModelMetadata來抽象的描述第二個(gè)層面上的數(shù)據(jù),從三個(gè)操作集合角度中包含使用的數(shù)據(jù),也就是說三個(gè)角度,兩個(gè)層面;如果你的框架需要具備多個(gè)層面,那就需要進(jìn)一步細(xì)化抽象;

圖2:

.NET/ASP.NETMVC Model元數(shù)據(jù)、HtmlHelper、自定義模板、模板的裝飾者模式(一)

標(biāo)準(zhǔn)數(shù)據(jù)經(jīng)過一個(gè)中間的環(huán)節(jié)轉(zhuǎn)換成元數(shù)據(jù),然后交給最終的處理程序去使用;可以很清晰的了解到元數(shù)據(jù)起到的一個(gè)核心作用,它可以很好的將處理程序與標(biāo)準(zhǔn)數(shù)據(jù)之間解耦,讓中間的元數(shù)據(jù)提供更大的靈活性,通過這個(gè)中間層元數(shù)據(jù),我們可以很輕松的做到對元數(shù)據(jù)進(jìn)行配置;

我們假設(shè)沒有中間層元數(shù)據(jù),操作程序不管如何設(shè)計(jì)都會和標(biāo)準(zhǔn)數(shù)據(jù)實(shí)體有耦合,而且要保證標(biāo)準(zhǔn)數(shù)據(jù)的純潔度,不可能總是對它使用繼承、特性等重度污染性的侵入,保證完全的POCO(Plain Old Csharp Objects)對象很難,如果沒有IDE的編譯時(shí)支持,很難提取出可以在運(yùn)行時(shí)使用的數(shù)據(jù);這個(gè)時(shí)候我們?nèi)绻枰薷臉?biāo)準(zhǔn)元數(shù)據(jù)的類型或者修改操作程序的邏輯都會或多或少的對兩者有影響;

如果使用元數(shù)據(jù)我們完全可以將表數(shù)據(jù)對元數(shù)據(jù)的定義部分遷移到配置文件中去,然后再在元數(shù)據(jù)提供程序中擴(kuò)展讀取元數(shù)據(jù)的源頭,可以做到將標(biāo)準(zhǔn)數(shù)據(jù)放在任何地方甚至遙遠(yuǎn)的云平臺上,對于操作程序來說,我們可以將獲取元數(shù)據(jù)的接口提取成Service方式,從任何一個(gè)地方讀取元數(shù)據(jù);

這些種種方案你可能決定永遠(yuǎn)都不會用到,但是誰又能把某個(gè)框架的所有功能都用一邊呢,系統(tǒng)需求各異,都有可能需要這些擴(kuò)展點(diǎn);

4.ASP.NETMVC ModelMetadata(ModelMetadata元數(shù)據(jù)如何支撐Model與View之間的組合關(guān)系)

未完待續(xù),敬請關(guān)注......


作者:王清培

出處:http://wangqingpei557.blog.51cto.com/

本文版權(quán)歸作者和51CTO共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI