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


  • Nifty .NET Part #2: Enumerable.Empty

    2011-5-11 6:22:00

    In part 2 the generic method Enumerable.Empty<T>, as the name would say it returns a empty IE

  • NET多线程探索-线程同步和通信

    2012-3-20 16:43:00

    NET中各种线程同步方法 在NET多线程开发中,有时候需要多个线程协调工作,完成这个步骤的过程称为“同步”。 使用同步的主要原因: 1.多个线程访问同一个共

  • Silverlight轻量级取数方案(带源码)

    2009-12-6 23:03:00

    阅读: 742 评论: 4 作者: Amar-Yao 发表于 2009-12-06 01:02 原文链接 最近一直在做Flash交互相关的东西。主要思想就是在Flash声明的<pa

  • 同一个项目的不同的项目工作经验总结--设计文档编写经验总结

    2009-6-13 2:57:00

    摘要: 深度设计文档编写工作经验总结l概述临安自来水公司项目需要,由公司派我过来编写设计文档,由于本人对设计文档没有编写的经验,当初还有些担心,能否完成公司交给我的任务,对自己一点信心都没有。查看过

  • Asp.net开发经验-利用Aspose.Words按模板导出Word

    2012-7-21 19:05:00

    估计很多开发人员都为导出Excel或者Word烦扰吧..网上有各种各样的导出方法...经常用到的方法就是画网页..例如下面的GridView导出excel的代码..这段代码虽然有效..但是其实非常不

  • MOSS 工作流开发入门学习!

    2007-6-28 19:05:00

    摘要: 找到好的资料,必须Share出来,这个是我做人的宗旨!希望大家能够受益。&n... 阅读全文 AA(Show) 2007-06-28 18:01 发表评论

  • 快速构建大数据缓存

    2009-12-27 15:26:00

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

  • Windows程序开发工具详解系列【2.sn.exe】

    2009-6-27 22:35:00

    前言 作为一线的开发人员,我的工作主要是从事windows平台相关的程序开发工作,工作中经常用到一些工具,虽然在工程技术领域创造性方面的不是很多,更多的是让已有的技术来更好的为生产服务,但是

  • 第一次当Interviewer

    2009-7-24 17:05:00

    第一次当Interviewer