下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
【移動(dòng)應(yīng)用開發(fā)技術(shù)】基于Lamda表達(dá)式的強(qiáng)類型Routing如何實(shí)現(xiàn)
本篇內(nèi)容介紹了“基于Lamda表達(dá)式的強(qiáng)類型Routing如何實(shí)現(xiàn)”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓在下帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!這種方式的基本使用示例如下:services.Configure(opt
=>
{
opt.EnableTypedRouting();
opt.GetRoute("homepage",
c
=>
c.Action(x
=>
x.Index()));
opt.GetRoute("aboutpage/{name}",
c
=>
c.Action(x
=>
x.About(Param.Any)));
opt.PostRoute("sendcontact",
c
=>
c.Action(x
=>
x.Contact()));
});從示例中可以看出,我們可以通過(guò)GetRoute或PostRoute等擴(kuò)展方法來(lái)定義route,而且后面使用Lambda表達(dá)式來(lái)定Controller的類型和Action的方法。注意,在這里獲取Action的方法名,是通過(guò)委托執(zhí)行該Action方法來(lái)實(shí)現(xiàn)的(實(shí)際上并沒(méi)有執(zhí)行,而是基于此獲取該Action的MethodInfo)。實(shí)現(xiàn)原理在Stratup.cs的ConfigureServices方法中配置services的時(shí)候,我們可以對(duì)MVC站點(diǎn)使用的核心配置文件MvcOptions進(jìn)行配置,其中該類有一個(gè)ApplicationModelConventions屬性(List)可以保存一個(gè)IApplicationModelConvention接口的集合,改接口可以對(duì)MVC程序的程序模型進(jìn)行管線處理,該接口的定義如下:public
interface
IApplicationModelConvention
{
void
Apply(ApplicationModel
application);
}public
interface
IApplicationModelConvention
{
void
Apply(ApplicationModel
application);
}接口中的Apply方法所接收的參數(shù)類型是ApplicationModel,而ApplicationModel有兩個(gè)極其重要的內(nèi)容可以供我們操作,一個(gè)是Controller模型集合,一個(gè)是各種Filter的集合,該類的定義如下:public
class
ApplicationModel
{
public
ApplicationModel();
public
IList
Controllers
{
get;
}
public
IList
Filters
{
get;
}
}這里最重要的就是ControllerModel類,該類的實(shí)例上保存了各種各樣重要而又可以操作的信息,比如該類和相關(guān)Action上的路由定義數(shù)據(jù),API描述信息,路由約束等等,這些信息都可以進(jìn)行操作。新的IApplicationModelConvention注冊(cè)方式如下:services.Configure(opt
=>
{
opts.ApplicationModelConventions.Add(new
MyApplicationModelConvention());
});所以我們可以利用這個(gè)方法,在合適的時(shí)機(jī)對(duì)整個(gè)MVC的程序模型做響應(yīng)的調(diào)整和修改,本章節(jié)中的強(qiáng)類型路由就是利用這個(gè)特性來(lái)實(shí)現(xiàn)的。實(shí)現(xiàn)步驟首先定義一個(gè)強(qiáng)類型的路由模型TypedRouteModel類,該類要繼承于AttributeRouteModel,AttributeRouteModel類是基于Attribute路由的基本模型,TypedRouteModel類的代碼如下:public
class
TypedRouteModel
:
AttributeRouteModel
{
public
TypedRouteModel(string
template)
{
Template
=
template;
HttpMethods
=
new
string[0];
}
public
TypeInfo
ControllerType
{
get;
private
set;
}
public
MethodInfo
ActionMember
{
get;
private
set;
}
public
IEnumerable
HttpMethods
{
get;
private
set;
}
public
TypedRouteModel
Controller()
{
ControllerType
=
typeof(TController).GetTypeInfo();
return
this;
}
public
TypedRouteModel
Action該類主要的功能是:定義支持傳入Controller類型,支持鏈?zhǔn)秸{(diào)用。然后再定義一個(gè)繼承IApplicationModelConvention接口的TypedRoutingApplicationModelConvention類。代碼如下:public
class
TypedRoutingApplicationModelConvention
:
IApplicationModelConvention
{
internal
static
readonly
Dictionarypublic
class
TypedRoutingApplicationModelConvention
:
IApplicationModelConvention
{
internal
static
readonly
Dictionary在該類中,保存了一個(gè)靜態(tài)變量Routes,用于保存所有以Lamda表達(dá)式方式聲明的路由,然后在現(xiàn)有的Controllers集合中進(jìn)行查找及修改,然后替換AttributeRouteModel屬性,并設(shè)置響應(yīng)的Http
Method(如果不設(shè)置,則默認(rèn)所有的方式都允許)。在這里,我們只是簡(jiǎn)單替換action.AttributeRouteModel,所以會(huì)導(dǎo)致一些缺陷(比如一個(gè)Action只能支持一個(gè)路由路徑,以***一個(gè)為準(zhǔn)),各位同學(xué)可以根據(jù)自己的能力進(jìn)行優(yōu)化。優(yōu)化的時(shí)候,要注意Controller上的Route集合保存在controller.Attributes屬性上,Action上的Route集合保存在action.Attributes屬性上,可以對(duì)其進(jìn)行優(yōu)化。然后,在MvcOptions上,我們?cè)贋門ypeRouteModel添加一些擴(kuò)展方法以方便使用,代碼如下:public
static
class
MvcOptionsExtensions
{
public
static
TypedRouteModel
GetRoute(this
MvcOptions
opts,
string
template,
Action
configSetup)
{
return
AddRoute(template,
configSetup).ForHttpMethods("GET");
}
public
static
TypedRouteModel
PostRoute(this
MvcOptions
opts,
string
template,
Action
configSetup)
{
return
AddRoute(template,
configSetup).ForHttpMethods("POST");
}
public
static
TypedRouteModel
PutRoute(this
MvcOptions
opts,
string
template,
Action
configSetup)
{
return
AddRoute(template,
configSetup).ForHttpMethods("PUT");
}
public
static
TypedRouteModel
DeleteRoute(this
MvcOptions
opts,
string
template,
Action
configSetup)
{
return
AddRoute(template,
configSetup).ForHttpMethods("DELETE");
}
public
static
TypedRouteModel
TypedRoute(this
MvcOptions
opts,
string
template,
Action
configSetup)
{
return
AddRoute(template,
configSetup);
}
private
static
TypedRouteModel
AddRoute(string
template,
Action
configSetup)
{
var
route
=
new
TypedRouteModel(template);
configSetup(route);
if
(TypedRoutingApplicationModelConvention.Routes.ContainsKey(route.ControllerType))
{
var
controllerActions
=
TypedRoutingApplicationModelConvention.Routes[route.ControllerType];
controllerActions.Add(route);
}
else
{
var
controllerActions
=
new
List
{
route
};
TypedRoutingApplicationModelConvention.Routes.Add(route.ControllerType,
controllerActions);
}
return
route;
}
public
static
void
EnableTypedRouting(this
MvcOptions
opts)
{
opts.ApplicationModelConventions.Add(new
TypedRoutingApplicationModelConvention());
}
}在上述代碼中,我們添加了一個(gè)EnableTypedRouting擴(kuò)展方法,以便向MvcOptions.ApplicationModelConventions屬性上添加新的TypedRoutingApplicationModelConvention類型示例。其它的擴(kuò)展方法則都是用于聲明相關(guān)的route,大家注意,在最開頭的示例中,我們看到獲取action信息的方法是通過(guò)委托調(diào)用該action方法(但沒(méi)有真正調(diào)用),但是有的方法有參數(shù),那怎么辦呢?為此,我們定于一個(gè)忽略參數(shù)的Param類,代碼如下:public
static
class
Param
{
public
static
TValue
Any
{
get
{
return
default(TValue);
}
}
}public
static
class
Param
{
public
static
TValue
Any
{
get
{
return
default(TValue);
}
}
}這樣,我們?yōu)楹袇?shù)的About方法定于路由的時(shí)候,就可以這樣來(lái)定義了,代碼如下:opt.GetRoute("aboutpage/{name}",
c
=>
c.Action(x
=>
x.About(Param.Any)));另外,由于TypeRouteModel里很多方法都是可以鏈?zhǔn)秸{(diào)用,所以我們也可以通過(guò)這種方式為route指定一個(gè)名稱,示例代碼如下:opt.GetRoute("homepage",
c
=>
c.Action(x
=>
x.Index())).WithName("foo");至此,整個(gè)強(qiáng)類型路由的功能就實(shí)現(xiàn)完畢了,大家在使用的時(shí)候,就多了一種選擇了。弊端(或Bug)我們看到,在上面實(shí)現(xiàn)IApplicationModelConvention接口的時(shí)候,我們只是簡(jiǎn)單的對(duì)action.AttributeRouteModel進(jìn)行替換,也就是說(shuō),如果你在Action上已經(jīng)了Route特性的話,他會(huì)把你的信息給你覆蓋掉,從而導(dǎo)致你的route失效。比如,如果你定義了一個(gè)這樣的自定義路由:public
class
ProductsController
:
Controller
{
[Route("index")]
public
IActionResult
Index()
{
return
Content("Index");
}
}public
class
ProductsController
:
Controller
{
[Route("index")]
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 臨床中期引產(chǎn)護(hù)理查房
- 病毒防疫防控服務(wù)合同
- 第一醫(yī)院醫(yī)療廢物管理制度
- 新解讀《GB 51205-2016精對(duì)苯二甲酸工廠設(shè)計(jì)規(guī)范 》
- 兩宋的政治和軍事 課件 2024-2025學(xué)年高一歷史統(tǒng)編版(2019)必修中外歷史綱要上
- 4.7 相似三角形的性質(zhì) 北師大版數(shù)學(xué)九年級(jí)上冊(cè)堂堂練(含答案)
- 人教版八年級(jí)上冊(cè)英語(yǔ)Unit 3 語(yǔ)法 比較級(jí)專項(xiàng)訓(xùn)練
- 電商行業(yè)的消費(fèi)者購(gòu)買決策影響因素經(jīng)驗(yàn)分享
- 江蘇省蘇北地區(qū)2023-2024學(xué)年中考數(shù)學(xué)全真模擬試卷含解析
- 江蘇省連云港市海州區(qū)新海實(shí)驗(yàn)中學(xué)2024屆中考二模數(shù)學(xué)試題含解析
- 2022年ISO13485醫(yī)療器械管理體系全套程序文件(內(nèi)含表格)
- YY 9706.261-2023醫(yī)用電氣設(shè)備第2-61部分:脈搏血氧設(shè)備的基本安全和基本性能專用要求
- 民族學(xué)概論課件
- 2023年城管協(xié)管員筆試考題試題含答案
- 氮?dú)獍踩珮?biāo)簽
- 民俗學(xué)概論授課ppt
- 無(wú)配重懸挑裝置吊籃施工方案
- 法考-07民訴-案例指導(dǎo)用書【】
- 高一【音樂(lè)鑒賞】鑒賞模塊(第三課時(shí))-課件
- 《香菇栽培》課件-
- 錸的性質(zhì)及分析方法綜述
評(píng)論
0/150
提交評(píng)論