プログラミング

C#でWeb API(Rest API)の作り方

hebishima.shogo

はい、hebiです。

C#でWeb APIを作成する方法を説明します。

「Model」、「Controller」、「Businesslogic」、「DetaAccess」4つのコンポーネントで構成します。
上記構成は大手会社さんとお仕事をさせていただいた際の構成であり、設計および開発が行いやすかったです。ぜひ参考にしてみてください。

スポンサーリンク

コンポーネントの説明

4つのコンポーネントについて説明します。

  • Model
    データを定義するコンポーネントです。
  • Controller
    クライアントからリクエストを受け取り、レスポンスを返却するコンポーネントです。Controllerではデータの受け渡しのみで処理は書かない規約としてました。
    そのため、カバレッジは100%になるため、Unitテストは不要と考えます。
  • Businesslogic
    リクエストのデータをもとに処理を行うコンポーネントです。
    ここでロジックを書いて行きUnitテストを行います。
  • DetaAccess
    DBにアクセスするコンポーネントです。SQL文でCRUDを実行します。

WebAPIの作成手順

WebAPIを作成していきましょう!

プロジェクトの作成

Visual Studioを起動し、ASP.NET Core Web APIプロジェクトを作成します。
作成した初期状態は以下になります。

コンポーネント用のフォルダを作成します。

Modelの作成

リクエストとレスポンス用のModelを作成します。
HogeInputModel(リクエスト用)

using System;

namespace WebAPITest.Model
{
    public class HogeInputModel
    {
        public string Hoge { get; set; }
    }
}

HogeResultModel(レスポンス用)

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace WebAPITest.Model
{
    public class HogeResultModel
    {
        [Key]
        public string Text { get; set; }

        [NotMapped]
        public int Status { get; set; } 
    }
}

HogeResultModelのプロパティにはDBのカラム名と同じ名前にします。
※同じ名前にできない場合は、Column属性を利用します。
DBに含まれないプロパティについては[NotMapped]属性を付与して除外できます。

DataAccessの作成

HogeDataAccessを作成します。
ここでのDBへの処理は割愛します。

using WebAPITest.Model;

namespace WebAPITest.DataAccess
{
    public class HogeDataAccess
    {
        public HogeDataAccess()
        {
        }

        virtual public HogeResultModel GetHoge(HogeInputModel input)
        {
            HogeResultModel resultModel = new HogeResultModel();

            // DBからデータを取得
            // 今回は処理を割愛します。別途SQL、Postgresqlの説明を行います。

            resultModel.Text = "test";
            resultModel.Status = 0; // 成功

            return resultModel;
        }
    }
}

Businesslogicの作成

HogeBusinesslosicを作成します。
HogeDataAccessの依存を防ぐため、コンストラクタで受け取ります。
GetHoge関数で、HogeDataAccess.GetHoge関数実行します。

using WebAPITest.DataAccess;
using WebAPITest.Model;
using WebAPITest.Base;

namespace WebAPITest.Businesslogic
{
    public class HogeBusinesslogic<A,R> : IHogeBusinesslogic<HogeInputModel, HogeResultModel>
    {
        private HogeDataAccess hogeDataAccess;
        public HogeBusinesslogic(HogeDataAccess hogeDataAccess)
        {
            // DIとしてhogeDataAccessを受け取る
            this.hogeDataAccess = hogeDataAccess;
        }

        public HogeResultModel GetHoge(HogeInputModel input)
        {
            // hogeデータを取得
            HogeResultModel result = hogeDataAccess.GetHoge(input);

            return result;
        }
    }
}

namespace WebAPITest.Base
{
    public interface IHogeBusinesslogic<A,R>
    {
        R GetHoge(A input);
    }
}

Controllerの作成

HogeControllerを作成します。
クラスの上部にある[Route(“[controller]”)]を指定すると「http://hostname/Hoge」にアクセス可能となり、Get関数名の上部にある[Route(“Get”)]を指定することで、「http://hostname/Hoge/Get」へアクセスしてデータを取得します。[HttpGet]はGetリクエストを示し、用途に応じて[HttpPut]、[HttpPost]、[HttpDlete]を記述します。

using WebAPITest.Base;
using WebAPITest.Model;
using Microsoft.AspNetCore.Mvc;

namespace WebAPITest.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class HogeController : ControllerBase
    {
        private readonly ILogger<HogeController> _logger;
        private IHogeBusinesslogic<HogeInputModel, HogeResultModel> hogeBusinesslogic;

        public HogeController(ILogger<HogeController> logger, IHogeBusinesslogic<HogeInputModel, HogeResultModel> hogeBusinesslogic)
        {
            _logger = logger;
            this.hogeBusinesslogic = hogeBusinesslogic;
        }

        [HttpGet]
        [Route("Get")]
        public HogeResultModel Get([FromQuery]HogeInputModel input)
        {
            HogeResultModel result = hogeBusinesslogic.GetHoge(input);

            return result;
        }

        [HttpPost]
        [Route("Post")]
        public HogeResultModel Post(HogeInputModel input)
        {
            HogeResultModel result = new HogeResultModel();
            // 処理は割愛します。
            return result;
        }
    }
}

DIの設定

ControllerのコンストラクタにBusinesslogicをDIする設定と、BusinesslogicのコンストラクタにDataAccessをDIする設定を行います。16行目と17行目を追加します。
DIについては後日記述したいと思いますが、Unitテストがとても楽になりますので、便利な仕組みです。

using WebAPITest.Base;
using WebAPITest.Businesslogic;
using WebAPITest.DataAccess;
using WebAPITest.Model;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

// DIを設定
builder.Services.AddTransient<IHogeBusinesslogic<HogeInputModel, HogeResultModel>, HogeBusinesslogic<HogeInputModel, HogeResultModel>>();
builder.Services.AddTransient<HogeDataAccess, HogeDataAccess>();


var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseAuthorization();

app.MapControllers();

app.Run();

最後に

このようにコンポーネントを分けて役割を分担することで、設計およびコードを綺麗に作成できると考えております。

Unitテストの方法も記事にしたのでぜひ、参考にどうぞ!

あわせて読みたい
C#でUnitテスト方法
C#でUnitテスト方法

最後までお読みいただきありがとうございました(^^♪

スポンサーリンク
ABOUT ME
hebi
hebi
エンジニア
フルスタックエンジニアとして活躍中。
HTML5プロフェッショナル認定Level1、Level2所持者です。

未経験の方でも簡単にプログラミングを学べるようにと情報を発信しております。
記事URLをコピーしました