【移動(dòng)應(yīng)用開發(fā)技術(shù)】基于Lamda表達(dá)式的強(qiáng)類型Routing如何實(shí)現(xiàn)_第1頁(yè)
【移動(dòng)應(yīng)用開發(fā)技術(shù)】基于Lamda表達(dá)式的強(qiáng)類型Routing如何實(shí)現(xiàn)_第2頁(yè)
【移動(dòng)應(yīng)用開發(fā)技術(shù)】基于Lamda表達(dá)式的強(qiáng)類型Routing如何實(shí)現(xiàn)_第3頁(yè)
【移動(dòng)應(yīng)用開發(fā)技術(shù)】基于Lamda表達(dá)式的強(qiáng)類型Routing如何實(shí)現(xiàn)_第4頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余1頁(yè)可下載查看

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論