麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

POCO Controller 你這么厲害,ASP.NET vNext 知道嗎?

2019-11-17 01:35:20
字體:
供稿:網(wǎng)友

POCO Controller 你這么厲害,asp.net vNext 知道嗎?

寫在前面

閱讀目錄:

  • POCO 是什么?

    1. 為什么會有 POJO?

    2. POJO 的意義

    3. POJO 與 PO、VO 的區(qū)別

    4. POJO 的擴展

    5. POCO VS DTO

  • Controller 是什么?

  • 關(guān)于 POCO Controller

  • POCO Controller 應(yīng)用

    1. 識別 POCO Controller

    2. 簡單 POCO Controller

    3. IActionResultHelper

    4. IModelMetadataPRovider、ViewDataDictionary

    5. IActionDiscoveryConventions、IControllerDescriptorFactory

  • 后記

  POCO Controller 你這么厲害,ASP.NET vNext 知道嗎?是的,ASP.NET vNext 曉得,因為這就是它的特性之一,嘿嘿。

  在上一篇《分享我對 ASP.NET vNext 的一些感受,也許多年回過頭看 So Easy!》博文中,簡單介紹了 ASP.NET vNext 的一些特性,文中的最后也做了一個簡單的示例,在示例中 HelloWorldController 控制器像以往我們創(chuàng)建 ASP.NET MVC 控制器一樣,需要繼承 Controller 基類,就像人群中某一種特定的人(公務(wù)員),Controller 用來標(biāo)示這一種人是公務(wù)員一樣。后來 dudu 在評論中指出:

  ASP.NET vNext 具有POCO Controllers 特性,控制器并不需要繼承Controller,當(dāng)時試了下確實可以,后來梁兄又指出:

  本人回復(fù):“還沒接觸過 POCO Controller,不做過多評論,后面深入了解下,不過多謝兄臺的指教。:)”,確實對 POCO Controller 并不是很了解,但是讓我對 POCO Controller 充滿了好奇,后來看了下相關(guān)知識,發(fā)現(xiàn)確實像梁兄所說,簡單的輸出是可以,如果輸出 View,需要自行實現(xiàn)一個 ViewDataDictionary 對象,如果真要做到 POCO 形式結(jié)合 View 的話,可能付出的努力要遠大于使用現(xiàn)成的 Controller 繼承?關(guān)于這一點,是有些疑問,但我覺得凡事必有存在的價值,只是了解多少而已,POCO Controller 也確實在探索性質(zhì)階段,關(guān)于 POCO Controller 以及相關(guān)知識,本篇內(nèi)容希望起到拋磚引玉的作用。

  以下內(nèi)容,只是一些個人看法,僅供參考學(xué)習(xí),也歡迎討論指教。

POCO 是什么?

POCO(Plain Old C#/CLR Object),意為:純老式的 C#/CLR 對象,也可以稱為簡單的 C#/CLR 對象,POCO 的概念來自于 POJO(Plain Old java Object),POJO 的內(nèi)在含義是指那些沒有從任何類繼承、也沒有實現(xiàn)任何接口,更沒有被其它框架侵入的 C# 對象。

1、為什么會有 POJO?   

  主要是 Java 的開發(fā)者被 EJB 的繁雜搞怕了,大家經(jīng)過反思,又回歸“純潔老式”的 JavaBean,即有無參構(gòu)造函數(shù),每個字段都有 getter 和 setter 的 java 類。

2、POJO 的意義

  POJO 讓開發(fā)者可專注于業(yè)務(wù)邏輯和脫離框架的單元測試。除此之外, 由于 POJO 并不須要繼承框架的類或?qū)崿F(xiàn)其接口,開發(fā)者能夠極其靈活地搭建繼承結(jié)構(gòu)和建造應(yīng)用。

  POJO 的意義就在于它的簡單而靈活性,因為它的簡單和靈活,使得 POJO 能夠任意擴展,從而勝任多個場合,也就讓一個模型貫穿多個層成為現(xiàn)實。先寫一個核心 POJO,然后實現(xiàn)業(yè)務(wù)邏輯接口和持久化接口,就成了 Domain Model; UI 需要使用時,就實現(xiàn)數(shù)據(jù)綁定接口,變成 VO(View Object)。

3、POJO 與 PO、VO 的區(qū)別

  • POJO 是指簡單 java 對象(Plain Old Java Objects、pure old java object 或者 plain ordinary java object)。
  • PO 是指持久對象(persistant object持久對象)。
  • VO 是指值對象或者 View 對象(Value Object、View Object)。注意,本文的 VO 特指 View Object。

  持久對象實際上必須對應(yīng)數(shù)據(jù)庫中的 entity,所以和 POJO 有所區(qū)別。比如說 POJO 是由 new 創(chuàng)建,由 GC 回收。但是持久對象是 insert 數(shù)據(jù)庫創(chuàng)建,由數(shù)據(jù)庫 delete 刪除的。基本上持久對象生命周期和數(shù)據(jù)庫密切相關(guān)。另外持久對象往往只能存在一個數(shù)據(jù)庫 Connection 之中,Connnection 關(guān)閉以后,持久對象就不存在了,而 POJO 只要不被 GC 回收,總是存在的。

  由于存在諸多差別,因此持久對象 PO(Persistent Object)在代碼上肯定和 POJO 不同,起碼 PO 相對于 POJO 會增加一些用來管理數(shù)據(jù)庫 entity 狀態(tài)的屬性和方法。而 ORM 追求的目標(biāo)就是要 PO 在使用上盡量和 POJO 一致,對于程序員來說,他們可以把 PO 當(dāng)做 POJO 來用,而感覺不到 PO 的存在。

4、POJO 的擴展

  POJO 僅包含最簡單的字段屬性,沒有多余的東西,它本質(zhì)上就是一個普通的 JavaBean。但是在 POJO 的基礎(chǔ)上,能夠擴展出不同的對象。

  • 為 POJO 增加了持久化的方法(Insert、Update、Delete……)之后,POJO 就變成了 PO。
  • 為 POJO 增加了數(shù)據(jù)綁定功能之后,POJO 就變成了 View Object,即 UI Model。
  • 為 POJO 增加業(yè)務(wù)邏輯的方法(比如單據(jù)審核、轉(zhuǎn)帳……)之后,POJO 就變成了 Domain Model。
  • POJO 還可以當(dāng)作 DTO 使用。

注:以上內(nèi)容來自(http://kb.VEVb.com/page/89750/)

5、POCO VS DTO

  理解了上面關(guān)于 POCO 的概念理解,如果對 DDD(領(lǐng)域驅(qū)動設(shè)計)有所了解,就會發(fā)現(xiàn) POCO 和 DTO 某種意義上很相似,上面關(guān)于 POCO 的擴展也有指出:POCO 可以當(dāng)做 DTO 使用,但也只是某種意義上的,其實有很大的區(qū)別,可以參考:http://stackoverflow.com/questions/725348/poco-vs-dto,我理解的 POCO,就像原始人類一樣,它可以演化成現(xiàn)在的各個人種,比如白種人、黑種人和黃種人(PO、UI Model、Domain Model等等)。

  雖然 POCO 為原始人類,但是也包含(不必須)人類的狀態(tài)或行為,只是這種狀態(tài)或行為是最原始的,比如狩獵為生、吃生食物等等,DTO(Data Transfer Objec)是什么?關(guān)于 DTO 的概念可以參考:http://www.companysz.com/xishuai/p/3691787.html,DTO 是領(lǐng)域驅(qū)動設(shè)計中的概念,只是數(shù)據(jù)傳輸對象,不包含任何的行為和狀態(tài),我個人覺得和 POCO 不是一個概念里面的東西,無法進行比較。

  如果非要對 DTO 和 POCO 進行區(qū)別的話,上面把 POCO 看做為原始人類,那 DTO 可以看做是原始人類的標(biāo)本,他們倆只是長得比較像,僅此而已。

Controller 是什么?

  在 ASP.NET MVC 中 Controller(控制器)的職責(zé)是:獲取 Model 數(shù)據(jù)并將 Model 傳遞給 View 對象,通知 View 對象顯示,關(guān)于 Controller 概念的官方說明:

Controllers:Controllers are the components that handle user interaction, work with the model, and ultimately select a view to render that displays UI. In an MVC application, the view only displays information; the controller handles and responds to user input and interaction. For example, the controller handles query-string values, and passes these values to the model, which in turn queries the database by using the values.

  可以把 Controller 看做是一個產(chǎn)品加工廠,Model 為原材料,View 為銷售平臺,原材料在產(chǎn)品加工廠經(jīng)過一定的加工處理后,得到成型的產(chǎn)品,然后放在銷售平臺上進行展示銷售,從這個比喻中可以看出 Controller 的作用,就是協(xié)調(diào) Model 和 View,那 Routing(路由)是什么?可以看做是政府的宏觀調(diào)控,用來決定加工生產(chǎn)什么產(chǎn)品?由哪家加工廠生產(chǎn)?這些工作都是 Routing 進行宏觀調(diào)控的。

  為了進一步方便理解 Controller 在 ASP.NET MVC 所起到的作用,我們分析下 ASP.NET MVC 整個的處理流程,首先,用戶通過 Web 瀏覽器向服務(wù)器發(fā)送一條 Url 請求,這個請求被 ASP.NET MVC 的路由映射系統(tǒng)截獲。路由映射系統(tǒng)按照映射規(guī)則,解析出控制器名 ControllerName、ActionName和各個參數(shù) Parameters,然后,找尋 Controllers 目錄下的 ControllerNameController.cs 這個控制器類,默認情況下,系統(tǒng)總是找尋 Controllers 目錄下的“控制器名+ Controller ”這么一個類,然后,找尋這個類下與 ActionName 同名的方法,找到后,將 Parameters 作為參數(shù)傳給這個方法,而后 Action 方法開始執(zhí)行,完成后返回相應(yīng)視圖,默認情況下,會返回 Views 目錄下與 ControllerName 同名的目錄下的與 ActionName 同名的 View 文件,并且將 ViewData 傳遞到視圖。

  大致畫了下 ASP.NET MVC 的處理流程:

  上圖只是大致演示了下 ASP.NET MVC 的處理流程,更專業(yè)、詳細請參照《Pro ASP.NET MVC Framework》作者 Steven Sanderson 的一張完整請求處理流程圖(Request-Handling Pipeline Poster):

  當(dāng)我們使用 VS2012 創(chuàng)建 MVC3/MVC4 的時候,如果把控制器中繼承的 Controller 基類去掉,結(jié)果如下:

 1 namespace MvcApplication1.Controllers 2 { 3     public class HomeController 4     { 5         // 6         // GET: /Home/ 7         public string Index() 8         { 9             return "Hello World";10         }11     }12 }

  HomeController 的 IndexAction 方法中返回一段字符串,路由配置是完全正確的,運行結(jié)果會是怎樣?你可能會猜到了,對,就是這樣:

  結(jié)合上面關(guān)于 ASP.NET MVC 的處理流程,你會明白為什么會報“無法找到資源”的異常?而這些同樣的代碼或配置,在 ASP.NET vNext 中卻可以正常使用,這也就是POCO Controllers 特性的美妙之處。

  請接著往下看。

關(guān)于 POCO Controller

  理解了 POCO 和 Controller 概念,理解 POCO Controller 就不會那么困難了,網(wǎng)上關(guān)于 POCO Controller 特性的資料實在是少的可憐,MSDN 暫時未找到詳細的說明,如果想要深入的研究,看來只有過段時間把 ASP.NET vNext 搞熟之后了,因為 ASP.NET vNext 支持 POCO Controller 特性,這樣使得代碼更加簡潔,難道好處只是代碼簡潔嗎?其實不然,因為 ASP.NET vNext 開源和支持內(nèi)置依賴注入(DI),所以你可以研究它的源代碼,在 Controller 中編寫適合自己的控制器,這樣使得你的 vNext 應(yīng)用程序可擴展性或性能得到進一步的提升,如果可以的話,你甚至編寫屬于自己的一套 Controller,這一切都是從 POCO Controller 演化而來。

  其實如果往長遠一點來想,我個人覺得 POCO Controller 并不簡簡單單是 ASP.NET vNext 的一種特性,它也代表著 ASP.NET vNext 的一種方向,因為跨平臺、開源和依賴注入,使得一切都有可能,雖然 ASP.NET vNext 現(xiàn)在還未正式發(fā)布,POCO Controller 也僅僅是一個探路者,但是我覺得這個信號很重要,很重要,也希望大家可以接收得到。

POCO Controller 應(yīng)用

1,識別 POCO Controller

  言歸正題,因為POCO Controllers 不從 Microsoft.AspNet.Mvc.Controller 基類派生,ASP.NET vNext 如何識別 POCO Controller?關(guān)于這個問題在 stackoverflow 中提問:“How Are POCO Controllers Discovered As Controllers?”,回答如下:

There are some conventions that we use to identify a POCO controller:

  • The assembly must reference MVC(必須引用 MVC)
  • The POCO controller class must have the suffix Controller(POCO controller 必須以“Controller”后綴結(jié)尾)

  必須引用 MVC 就是在 project.json 中添加如下如下引用:

2,簡單 POCO Controller

  最簡單的 POCO Controller:

 1 // For more information on enabling MVC for empty projects, visit http://go.microsoft.com/f
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 成人免费一区二区三区视频网站 | 国产一国产一级毛片视频在线 | 欧美精品a∨在线观看不卡 午夜精品影院 | a视频在线看 | 伊人久操视频 | 国产午夜精品久久久久婷 | 国产精品成人免费一区久久羞羞 | 一级黄色免费 | 精品一区二区三区日本 | 精品免费久久 | 久久久成人999亚洲区美女 | 青青操精品 | 在线亚洲免费视频 | 黄色片网站在线看 | www.guochan | 91av爱爱| 激情小说区 | 国产免费永久在线观看 | 久久久久久久久日本理论电影 | 国产亚洲欧美日韩在线观看不卡 | 色淫网站免费视频 | 精品一区二区三区免费看 | 深夜小视频在线观看 | 国产精品视频亚洲 | 国产1区视频 | 国产一区视频在线免费观看 | 免费看搡女人无遮挡的视频 | 日本成人在线免费 | 国产亚洲欧美日韩在线观看不卡 | 欧美www| av国产片 | 国产成人av免费看 | 欧美人与牲禽动交精品一区 | 一级毛片真人免费播放视频 | 亚洲啊v在线观看 | 国产乱淫av一区二区三区 | 亚洲一区二区中文字幕在线观看 | 国产高潮好爽好大受不了了 | 综合网天天射 | 成人免费电影在线观看 | 精品亚洲一区二区三区 |