当前位置 > 首页 > 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


  • SESSION的持久处理,希望大家多指正

    2009-3-28 18:49:00

    摘要: 之前发了个帖子,抱怨在招聘过程中面试人员对SESSION处理的问题,引起园子里几位大佬的注意。网上关于SESSION持久处理讲的最多的是用SQLSERVER存在数据库里面,上午同园子里兄弟探

  • 在C#代码中执行BCS外部内容类型方法

    2010-7-6 11:19:00

    作者: Sunmoonfire 发表于 2010-07-06 07:31 原文链接 阅读: 428 评论: 0 在 前面的博文 中我们讨论了如何使用Business Connectivit

  • 虚拟主机伪静态配置(asp/php/Asp.Net)

    2012-10-17 9:07:00

    虚拟主机伪静态配置(asp/php/Asp.Net) 搞了好几天的虚拟主机伪静态,经测试虚拟主机伪静态配置不分语言(asp/php/.net),只分系统windows和apache 一、win

  • [Flex]Arthropod - Flex AIR Flash Debug Tools

    2009-5-27 22:05:00

    一直在找一种比较方便的调试Flex、AIR的工具,用过一些,但是感觉都是差那么一些,今天无意中发现了一款Kenshin比较中意的Debug工具:Arthropod。 具体让我们看一下,A

  • ext.net 开发学习之TabPanel (二)

    2011-9-27 14:37:00

    昨天捣鼓好了页面框架,得到了园友的帮忙,在这里 说声 “谢谢”…… :) 框架好了,当然要实现效果。cs的效果如下,当然我们这边开发bs

  • 你必须知道的ADO.NET(七) Wow!Command对象高级应用

    2012-3-11 17:10:00

    摘要 在上一篇文章 《你必须知道的ADO.NET(六) 谈谈Command对象与数据检索》 中,我详细讲解了Command对象的基础知识以及基本用法。作为ADO.NET中最具执行力的对象,C

  • Google chrome OS vmdk文件在WMware下运行的办法 (二)

    2009-11-25 1:08:00

    阅读: 157 评论: 3 作者: 一叶舟 发表于 2009-11-24 22:09 原文链接 博文发布后不少朋友拍了砖,给我提了很多建议 在这里我先谢谢大家 1、下载地址,如果不想

  • 快来加入微软技术社区精英计划,提升个人品牌

    2010-1-20 16:44:00

    阅读: 597 评论: 13 作者: Shiny Zhu 发表于 2010-01-20 13:52 原文链接 在12月初举办的 两岸三地MVP Open Day 上,作为MVP跟微软的近距

  • Asp.net 在三层架构中事务的使用

    2012-2-1 18:23:00

    再我知道的.net中,执行事务有两种方法,一种是自动事物,使用起来相当简单,但是需要配置服务器,如果你用的是web共享主机,即没有权限配置自己的服务器,那就没必要用这种了,接下了我讲下.net中最普

  • Syntactic Sugar

    2009-12-7 15:29:00

    Well, I wish there was a way of getting away from SyntaticSugar static class initial point, and b