public abstract class ODataClientBase
{
protected readonly ODataClient ODataClient;
protected ODataClientBase(HttpClient httpClient)
{
ODataClient = new ODataClient(httpClient);
}
/// <summary>単一リクエスト</summary>
public abstract ValueTask ExecuteAsync(Request request, CancellationToken cancellationToken = default);
/// <summary>レスポンスを伴う実装</summary>
public abstract ValueTask<TResponse> ExecuteAsync<TResponse>(Request request, CancellationToken cancellationToken = default);
/// <summary>バッチリクエスト</summary>
public abstract ValueTask ExecuteAsync(IBatchRequest requests, CancellationToken cancellationToken = default);
}
public class CmsClient : ODataClientBase
{
public CmsClient(IHttpClientFactory httpClientFactory)
: base(httpClientFactory.CreateClient("Cms"))
{ }
public override async ValueTask ExecuteAsync(Request request, CancellationToken cancellationToken = default)
{
var response = await this.ODataClient.SendAsync(request, cancellationToken).ConfigureAwait(false);
if(!response.Success)
{
throw new HttpRequestException();
}
}
public override async ValueTask<TResponse> ExecuteAsync<TResponse>(Request request, CancellationToken cancellationToken = default)
{
var response = await this.ODataClient.SendAsync(request, cancellationToken);
if(!response.Success || response.StatusCode != System.Net.HttpStatusCode.OK)
{
throw new HttpRequestException();
}
return response.ReadAs<TResponse>();
}
public override async ValueTask ExecuteAsync(IBatchRequest requests, CancellationToken cancellationToken = default)
{
var responses = await this.ODataClient.BatchAsync(requests, cancellationToken).ConfigureAwait(false);
if(responses.All(_ => !_.Success))
{
throw new HttpRequestException();
}
}
}
- 各エンドポイントのエンティティ
- データを取得するときに余計なオブジェクトが多すぎる
- SELECT した時に空でも、結局メモリを確保されるので無駄
- Patch する時に余計なプロパティがあると上書きされる
- POST する時は、必要最低限のプロパティのみで十分
- ドメインに応じた DTO 、POCO を作るべき