中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

ASP.NETWebAPIModel-ActionBinding-創(chuàng)新互聯(lián)

ASP.NET Web API Model-ActionBinding

前言

前面的幾個(gè)篇幅把Model部分的知識(shí)點(diǎn)劃分成一個(gè)個(gè)的模塊來講解,而在控制器執(zhí)行過程中分為好多個(gè)過程,對(duì)于控制器執(zhí)行過程(一)主要講解了過濾器以及在后面的過濾器篇幅中也有講到,而在過濾器之中還有一些執(zhí)行過程,也就是在授權(quán)過濾器執(zhí)行完畢后,行為過濾器執(zhí)行之前,我們要做的就是Model綁定,面前也都說了之前對(duì)Model的知識(shí)點(diǎn)模塊都講解的差不多了,今天這個(gè)篇幅我們就來看一下這些零散知識(shí)點(diǎn)的源頭,也就是Model綁定的入口點(diǎn)。

成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供孟津企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、成都h5網(wǎng)站建設(shè)、小程序制作等業(yè)務(wù)。10年已為孟津眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進(jìn)行中。

Model-ActionBinding

HttpActionBinding的由來

我們通過前面幾篇的了解都知道在ASP.NET Web API框架中進(jìn)入整個(gè)Model綁定的入口點(diǎn)就是在HttpActionBinding類型中,對(duì)于這個(gè)類型前面的篇幅也介紹過,它里面封裝了ParameterBinding數(shù)組,這些ParameterBinding就是控制器方法中每個(gè)參數(shù)執(zhí)行Model綁定的對(duì)象了,既然我們知道HttpActionBinding類型中有著許多ParameterBinding類型的對(duì)象實(shí)例,那么我們就要看看HttpActionBinding類型是怎么生成的。

示例代碼1-1

this.SetSingle<IActionValueBinder>(new DefaultActionValueBinder());

首先我們看到示例代碼1-1中可以看到在HttpConfiguration類型的服務(wù)容器中,默認(rèn)注冊(cè)為IActionValueBinder類型服務(wù)的是DefaultActionValueBinder類型。

示例代碼1-2

namespace System.Web.Http.ModelBinding
{
    public class DefaultActionValueBinder : IActionValueBinder
    {
        public DefaultActionValueBinder();

        public virtual HttpActionBinding GetBinding(HttpActionDescriptor actionDescriptor);
        protected virtual HttpParameterBinding GetParameterBinding(HttpParameterDescriptor parameter);
    }
}

代碼1-2中所示的是DefaultActionValueBinder類型的定義,其中的這兩個(gè)方法很重要,第一個(gè)GetBinding()方法是用以框架內(nèi)部來進(jìn)行調(diào)用,根據(jù)HttpActionDescriptor控制器方法描述類型對(duì)象獲取到我們所需的HttpActionBinding,而其內(nèi)部實(shí)現(xiàn)則是調(diào)用下面的GetParameterBinding()方法,利用HttpActionDescriptor對(duì)象獲取到HttpParameterDescriptor集合后,然后遍歷的去調(diào)用GetParameterBinding()方法,從而能夠獲取到HttpParameterBinding對(duì)象實(shí)例,最后生成HttpActionBinding對(duì)象實(shí)例,從設(shè)計(jì)角度來看這個(gè)DefaultActionValueBinder類型中的兩個(gè)方法GetBinding()和GetParameterBinding()方法都是采用了templatemethod模式,這種模式在框架設(shè)計(jì)中很常見。

HttpParameterBinding的由來

下面我們就要來說說GetParameterBinding()方法的細(xì)節(jié)實(shí)現(xiàn)了因?yàn)殛P(guān)乎著使用哪種方式來進(jìn)行綁定。也就是根據(jù)HttpParameterDescriptor類型實(shí)例怎么去創(chuàng)建HttpParameterBinding的。

示例代碼1-3

    protected virtual HttpParameterBinding GetParameterBinding(HttpParameterDescriptor parameter)
    {
        ParameterBindingAttribute parameterBinderAttribute = parameter.ParameterBinderAttribute;
        if (parameterBinderAttribute == null)
        {
            ParameterBindingRulesCollection parameterBindingRules = parameter.Configuration.ParameterBindingRules;
            if (parameterBindingRules != null)
            {
                HttpParameterBinding binding = parameterBindingRules.LookupBinding(parameter);
                if (binding != null)
                {
                    return binding;
                }
            }
            Type parameterType = parameter.ParameterType;
            if (TypeHelper.IsSimpleUnderlyingType(parameterType) || TypeHelper.HasStringConverter(parameterType))
            {
                return parameter.BindWithAttribute(new FromUriAttribute());
            }
            parameterBinderAttribute = new FromBodyAttribute();
        }
        return parameterBinderAttribute.GetBinding(parameter);
     }

代碼1-3就是具體的實(shí)現(xiàn)了,那我們就就來看一下其中的過程以及會(huì)涉及到的類型。

首先會(huì)根據(jù)參數(shù)HttpParameterDescriptor類型實(shí)例獲取到在這個(gè)控制器方法參數(shù)上使用了ParameterBindingAttribute標(biāo)識(shí),并且獲取ParameterBindingAttribute類型實(shí)例。我們暫且就來看一下ParameterBindingAttribute類型定義。

示例代碼1-4

    [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Class, Inherited = true, AllowMultiple = false)]
    public abstract class ParameterBindingAttribute : Attribute
    {
        // Methods
        protected ParameterBindingAttribute();
        public abstract HttpParameterBinding GetBinding(HttpParameterDescriptor parameter);
    }

從代碼1-4可以看出,這個(gè)ParameterBindingAttribute類型適用于類型以及參數(shù),也就是說我們選擇綁定的方式可以在Model類型定義的時(shí)候標(biāo)識(shí)這個(gè)特性,也可以在定義控制器方法的時(shí)候適當(dāng)?shù)慕o參數(shù)這個(gè)特性標(biāo)識(shí)。

然而在這個(gè)類型中為什么會(huì)有GetBinding()方法呢?因?yàn)檫@個(gè)類型是抽象類型,也就是采用了上面所說過的template method模式,而在子類實(shí)現(xiàn)中,根據(jù)自身適應(yīng)的情況生成響應(yīng)的HttpParameterBinding類型。看下如下的圖表示相關(guān)的對(duì)象模型。

圖1

ASP.NET Web API Model-ActionBinding

上面圖1中涉及到的每個(gè)類型大家可以去看前面的篇幅,篇幅中有遺漏的就麻煩大家自己多動(dòng)一下手去看看吧。

HttpParameterBinding的選擇機(jī)制

接著代碼1-3的思緒,在我們獲取到了ParameterBindingAttribute之后,并不知道這個(gè)控制器方法中的參數(shù)是否標(biāo)識(shí)有ParameterBindingAttribute,或者是參數(shù)類型上是否有標(biāo)識(shí)。這個(gè)時(shí)候假使是有的話,可以看到代碼1-3中的最后一句代碼,直接使用獲取到的ParameterBindingAttribute類型進(jìn)行調(diào)用GetBinding()方法,也就是在上一小節(jié)中圖1所示的那樣。

然而還有一種情況,就是我們?cè)诙x控制器方法的時(shí)候參數(shù)沒有明確的標(biāo)識(shí)我們要使用某種綁定機(jī)制,或者是在定義Model的時(shí)候沒有明確的表示,這個(gè)時(shí)候框架則會(huì)從定義好的規(guī)則集合中根據(jù)當(dāng)前控制其方法參數(shù)的描述類型來獲取對(duì)應(yīng)的ParameterBinding類型實(shí)例。如下的示例代碼定義了規(guī)則集合的定義。

示例代碼1-5

    internal static ParameterBindingRulesCollection GetDefaultParameterBinders()
    {
        ParameterBindingRulesCollection ruless = new ParameterBindingRulesCollection();
        ruless.Add(typeof(CancellationToken), parameter => new CancellationTokenParameterBinding(parameter));
        ruless.Add(typeof(HttpRequestMessage), parameter => new HttpRequestParameterBinding(parameter));
        ruless.Add(delegate (HttpParameterDescriptor parameter) {
            if (!typeof(HttpContent).IsAssignableFrom(parameter.ParameterType))
            {
                return null;
            }
            return parameter.BindAsError(Error.Format(SRResources.ParameterBindingIllegalType, new object[] { parameter.ParameterType.Name, parameter.ParameterName }));
        });
        return ruless;
     }

代碼1-5中所表示的就是規(guī)則定義,意思就是在我們使用HttpParameterDescriptor類型實(shí)例來從集合中想獲取ParameterBinding的時(shí)候,ParameterBindingRulesCollection類型會(huì)把我們的HttpParameterDescriptor類型實(shí)例中的ParameterType取出來和之前定義的每一項(xiàng)規(guī)則的類型進(jìn)行比對(duì),類型吻合了就會(huì)隨之調(diào)用對(duì)應(yīng)的委托類型進(jìn)行ParameterBinding生成。從代碼1-5中我們可以看到的是規(guī)則中只有CancellationToken類型和HttpRequestMessage類型,假使這個(gè)時(shí)候我們的控制其方法參數(shù)類型是自定義的復(fù)雜類型,這里也都沒有定義,這個(gè)時(shí)候框架會(huì)取出HttpParameterDescriptor類型中的ParameterType進(jìn)行判斷,假使是可以轉(zhuǎn)換成string類型的簡單類型參數(shù),則會(huì)生成一個(gè)FromUriAttribute類型作為標(biāo)識(shí),F(xiàn)romUriAttribute類型繼承自ModelBinderAttribute類型。

假使這里的判斷沒有通過則說明是復(fù)雜類型,最后我們?cè)倏创a1-3中的定義最后生成的是FromBodyAttribute標(biāo)識(shí)類型,這個(gè)時(shí)候請(qǐng)參照?qǐng)D1。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)站名稱:ASP.NETWebAPIModel-ActionBinding-創(chuàng)新互聯(lián)
文章網(wǎng)址:http://m.rwnh.cn/article16/cciigg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、服務(wù)器托管、建站公司、企業(yè)網(wǎng)站制作搜索引擎優(yōu)化、小程序開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作
屯门区| 建湖县| 华安县| 南安市| 五指山市| 大余县| 神木县| 维西| 红河县| 宁化县| 吴江市| 武冈市| 黄浦区| 吕梁市| 广汉市| 眉山市| 康马县| 清涧县| 定州市| 晴隆县| 泰宁县| 长垣县| 偃师市| 固阳县| 合作市| 永善县| 元朗区| 葫芦岛市| 邢台县| 松原市| 英德市| 岫岩| 英超| 利津县| 华池县| 庆阳市| 小金县| 西乡县| 牡丹江市| 准格尔旗| 西乌|