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


  • 快速构建大数据缓存

    2009-12-27 15:26:00

    阅读: 151 评论: 3 作者: 孤剑 发表于 2009-12-27 14:27 原文链接 场景: 系统运行于正式环境后,发现时常发生 OOM ( OutOfMem

  • 博客园电子期刊2009年12月刊发布啦

    2010-1-19 15:51:00

    阅读: 704 评论: 4 作者: 博客园团队 发表于 2010-01-19 11:59 原文链接 为了让大家更方便地订阅期刊,这次我们改进了期刊的订阅操作方式,所以现在才发布,请谅解!

  • asp.net mvc(五)

    2009-8-12 18:36:00

    我们在创建一个Controller时都会默认遵守这样的规定,名称+“Controller”,但我们在页面访问这个Controller时并不会写上后面的Controller字符

  • 使用TFS来自动部署站点和Window Service

    2009-9-26 18:18:00

    先问各位看官两个问题: 1. 你们用TFS么? 2. 你们做自动部署么?怎么做的? 这写博客不同讲课,没法及时互动,那我只好自问自答一把了: 1. 用,当然用,按我了解的情

  • 使用Silverlight4与Wcf4的Net.tcp实现的简单聊天室

    2009-12-19 9:58:00

    阅读: 79 评论: 4 作者: 小笨蛋:Lollipop 发表于 2009-12-19 09:08 原文链接 这两天一直在研究Sl4与Wcf通信的问题,总算还有点收获,早上做了一个小de

  • C# with keyword equivalent

    2010-3-22 15:58:00

    There’s no with keyword in C#, like Visual Basic. So you end up writing code like this: this

  • NDC Video – Michael Feathers – Working Effectively with Legacy Code

    2009-8-18 23:06:00

    another one by Michael Feathers

  • 【十五分钟Talkshow】在.NET应用程序中访问Excel的几种方式

    2012-2-28 19:18:00

    摘要提示: 通过三个视频,我介绍和比较了在.NET应用程序中访问Excel的常见几种方式 }通过Excel API访问 }通过OpenXML访问 }通过第三方组件访问

  • 如何开发绚丽、高效率的界面(Windows嵌入式系统)

    2009-10-11 17:29:00

    摘要: 上篇文章中提到用户体验(UE),并且说到国内有专门去做UE的团队也很少。据我了解Microsoft、Nokia、Google等,还有国内的Baidu是有比较专业的UE团队。对于我们这样的普通

  • 用 PIL 写了个简单的缩略图生成程序

    2007-3-31 20:35:00

    最近刚刚学了简单的 PIL (Python Image Library)的使用方法,感觉比较简单好用!结合最近我要在 web 中做缩略图的需求,写了个函数。这个程序的思路是截取源图中间一块正方形区域