本篇涉及ASP.NET Web API中的返回数据合适和依赖注入。
获取数据
public IEnumerableGet(){ var results = reop.GetAllFoods() .OrderBy(f => f.Description) .Take(25) .ToList(); return results;}
默认情况下,ASP.NET API控制器方法返回json数据格式。在请求的时候可以要求其它的格式,比如:
User-Agent:FiddlerHost:localhost:8000Accept:text/xml请求数据也可以要求多个格式,比如:User-Agent:FiddlerHost:localhost:8000Accept: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().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().To ();}
在这里,我们告诉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);}