Skip to content

Instantly share code, notes, and snippets.

@papeMK2
Created October 9, 2021 03:49
Show Gist options
  • Save papeMK2/22ea22d98a284b7ba6184ee67d0995a9 to your computer and use it in GitHub Desktop.
Save papeMK2/22ea22d98a284b7ba6184ee67d0995a9 to your computer and use it in GitHub Desktop.
OData の Wrapper を作る時の覚書

OData Wrapper に必要なものの覚書

  • エンドポイントにリクエストを投げる処理
    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();
            }
        }
    }

Wrapper に必要ないもの

  • 各エンドポイントのエンティティ
    • データを取得するときに余計なオブジェクトが多すぎる
      • SELECT した時に空でも、結局メモリを確保されるので無駄
    • Patch する時に余計なプロパティがあると上書きされる
    • POST する時は、必要最低限のプロパティのみで十分
    • ドメインに応じた DTO 、POCO を作るべき
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment