ASP.NET Web APIにおける戻りデータフォーマットおよび依存注入

3517 ワード


本編は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:FiddlerHost:localhost:8000 Accept:text/xmlリクエストデータは、User-Agent:FiddlerHost: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をインストールします.MVC 3がインストールされると、App_DataファイルにNinjectWebCommonクラスが1つ追加されました.RegisterServicesに依存を登録できます.
 
private static void RegisterServices(IKernel kernel)
{
    kernel.Bind<IFoodRepository>().To<FoodRepository>();
}

 
ここで、IOC Containerに、Irepositoryのリクエストがあった場合、Repossitoryインスタンスを返すように伝えます.最後に、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);
}