zoukankan      html  css  js  c++  java
  • ASP.NET Web API 中的返回数据格式以及依赖注入

    本篇涉及ASP.NET Web API中的返回数据合适和依赖注入。

    获取数据

    public IEnumerable<Food> Get()
    {
        var results = reop.GetAllFoods()
            .OrderBy(f => f.Description)
            .Take(25)
            .ToList();
        return results;
    }

    默认情况下,ASP.NET API控制器方法返回json数据格式。在请求的时候可以要求其它的格式,比如:

    User-Agent:Fiddler
    Host:localhost:8000
    Accept:text/xml

    请求数据也可以要求多个格式,比如:

    User-Agent:Fiddler
    Host:localhost:8000
    Accept:text/xml, applicaiton/json, text/html

    此时,服务端首先查看客户端所能接受的类型数组,然后与服务端能接受的类型数组匹配,而服务端优先默认返回json,所以,以上请求返回json数据。返回的json数据类似如下:

    Description:'dddd'

    也就是首字母大写。如何让首字母变成小写呢?

    当然可以通过让视图模型的属性名第一个字母小写而实现。不过,还可以自定义Formatter。

    自定义返回数据的格式

    在WebApiConfig.cs文件中。

    using Newtonsoft.Json.Serialization;
    
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new {id = RouteParameter.Optional}
            );
            
            var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().FirstOrDefault();
            jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
        }
    }

    此时, 返回的数据格式大致是:

    description:'dddd'

    依赖注入 Dependency Injection

    比如在controller中,我们希望通过构造函数注入repoitory接口。

    public class FoodsController : ApiController
    {
        IFoodRepository _reop;
        
        public FoodsController(IFoodRepository reop)
        {
            _repo = repo;
        }
    }

    此时运行会报错:System.InvalidOperaitonException

    如何让API支持这种通过构造函数的依赖注入呢?

    安装Ninject.MVC3

    安装后,会在App_Data文件中多了一个NinjectWebCommon类。在其RegisterServices中可以注册依赖。

    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<IFoodRepository>().To<FoodRepository>();
    }

    在这里,我们告诉IOC Container, 当有请求过来要求IReposiotory的时候,就返回Repository实例。

    最后,我们需要告诉API Ninject的存在。


    NinjectWebCommon类的CreateKernel方法中。

    安装WebApiContrib.IoC.Ninject

    using WebApiContrib.IoC.Ninject;
    ...
    
    private static IKernel Createkernel()
    {
        var kernel = new StandardKernel();
        
        //支持API
        GlobalConfiguraiton.Configuration.DependencyResolver = new NinjectResolver(kernel);
    }
  • 相关阅读:
    庆贺自己的软件入围中国软件创新大赛,可惜精英奖没有评上。一个笔记本飞了,哈哈,大奖500万呢!
    VMware vSphere开发(2)配置VMware vSphere Web Services SDK的开发环境
    IPhone 视图切换的的2种方法
    Windows系统加固方案
    我们公司原来C++招聘考试题,题目难度正常,没有稀奇古怪的题,如果答对60分以上,恭喜你基本算一个合格的网络开发工程师了。
    算法分析整数划分
    Java反射机制
    Java类集
    设计包含min函数的栈
    ASP.NET学习之Membership
  • 原文地址:https://www.cnblogs.com/darrenji/p/5132448.html
Copyright © 2011-2022 走看看