C#でWeb API(Rest API)の作り方
はい、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; }
}
}
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テストの方法も記事にしたのでぜひ、参考にどうぞ!
最後までお読みいただきありがとうございました(^^♪