当前位置 > 首页 > Asp.net

Asp.net web Api源码分析-ParameterBindingAttribute

2012-12-7 16:25:00来源:Asp.net

在前面数据绑定中我们曾提到一个FromUriAttribute类,它 集成于ModelBinderAttribute,而ModelBinderAttribute又继承 ParameterBindingAttribute,ParameterBindingAttribute类就一个空方法没什么实现,这里主要的实现在 ModelBinderAttribute类里面,其主要方法是GetBinding,

 public override HttpParameterBinding GetBinding(HttpParameterDescriptor parameter)
        {
            HttpConfiguration config = parameter.Configuration;
            IModelBinder binder = GetModelBinder(config, parameter.ParameterType);
            IEnumerable<ValueProviderFactory> valueProviderFactories = GetValueProviderFactories(config);


            return new ModelBinderParameterBinding(parameter, binder, valueProviderFactories);
        }

这里的GetModelBinder方法具体实现如下,

 public IModelBinder GetModelBinder(HttpConfiguration configuration, Type modelType)
        {
            if (BinderType == null)
            {
                ModelBinderProvider provider = GetModelBinderProvider(configuration);
                return provider.GetBinder(configuration, modelType);
            }


            // This may create a IModelBinder or a ModelBinderProvider
            object value = GetOrInstantiate(configuration, BinderType);

            Contract.Assert(value != null); // Activator would have thrown

            IModelBinder binder = value as IModelBinder;
            if (binder != null)
            {
                return binder;
            }
            else
            {
                ModelBinderProvider provider = value as ModelBinderProvider;
                if (provider != null)
                {
                    return provider.GetBinder(configuration, modelType);
                }

            }

            Type required = typeof(IModelBinder);
            throw Error.InvalidOperation(SRResources.ValueProviderFactory_Cannot_Create, required.Name, value.GetType().Name, required.Name);
        }

这里的检查BinderType 是否为null,这里首先调用GetModelBinderProvider来获取一个ModelBinderProvider实例,

 public ModelBinderProvider GetModelBinderProvider(HttpConfiguration configuration)
        {
            if (BinderType != null)
            {
                object value = GetOrInstantiate(configuration, BinderType);

                if (value != null)
                {
                    VerifyBinderType(value.GetType());
                    ModelBinderProvider result = (ModelBinderProvider)value;
                    return result;
                }
            }

            // Create default over config
            IEnumerable<ModelBinderProvider> providers = configuration.Services.GetModelBinderProviders();

            if (providers.Count() == 1)
            {
                return providers.First();
            }

            return new CompositeModelBinderProvider(providers);
        },

这你的GetOrInstantiate方法非常简单,根据BinderType直接创建一个实例,创建方法configuration.DependencyResolver.GetService,然后验证实例是否是ModelBinderProvider类型实例,如果不是抛出异常,如果是则直接转化为ModelBinderProvider


  • ADO.Net 浅析(一)

    2009-7-6 11:37:00

    ADO.Net是什么? ADO是.Net对DataBase操作的相关类的集合. ADO在处理数据时,可分为连接式与断开式 ADO涉及到的主要对象: 连接对

  • call vs callvirt; virtual, override, new

    2007-7-13 19:16:00

    摘要: 看到一些C#书籍,介绍virtual, override, new,我觉得还不够深入。今天有点时间来探讨一下内部的机制,如果有什么不准确的地方,请不吝赐教。我觉得C#编译器编译为IL语言时,

  • Eagerly Performing ASP.NET MVC 3 Unobtrusive Client Side Validation

    2011-4-30 19:01:00

    Introduction: Unobtrusive client side validationis one of the great featurethatI li

  • Take a look at LiveId + CardSpace

    2007-8-30 3:14:00

    I was in a user group meeting recently with Patrick Hynds speaking about Identity andpresenting d

  • 哦!这些怎可能是SharePoint网站!!

    2007-5-21 3:22:00

    记得给大家介绍过基于SharePoint制作的相当漂亮的“ 夏威夷人航空公司 ”网站,现在又有一个非常漂亮的基于SharePoint的站点“SENDTEC”在上个月发布了: http://ww

  • ReMIX 09 Is Coming To Lisbon, Portugal

    2009-9-10 6:07:00

    For the first time, ReMIX is coming to Portugal . The event will have a keynote and 3 tracks

  • .NET读取config配置文件方法的总结——有疑求解?

    2011-12-29 18:30:00

    概述 1,在MSDN中对于配置文件的定义: 配置文件是可以按需要更改的 XML 文件。 开发人员可以使用配置文件来更改设置,而不必重编译应用程序。 管理员可以使用配置文件来设置策略,以

  • Asp.net安全架构之4:Brute force(爆破)

    2012-6-13 8:27:00

    原理 爆破是对系统的登录入口发起不间断的请求,达到暴力破解的目的。 实际案例 某系统存在爆破攻击点,只要模拟以下攻击,就能采用字典破解法,根据分析发现,只要返回状态为302的,为用户名密

  • Visual Studio 2010: Multiple web.config versions

    2009-6-3 13:41:00

    Visual Studio 2010 has support for multiple web.config files. It is one feature of new web applicat

  • 我心中的“云”计算

    2009-11-6 18:36:00

    阅读: 401 评论: 9 作者: BenBen789 发表于 2009-11-06 16:21 原文链接 “云”,是 2009 年 IT 技术