私たちの会社には、製品と対話するためのほぼ 160 の異なる REST API を提供する Web 製品があります。現在、API は内部クライアント製品でのみ使用されていますが、最終的に公開される予定です。RestSharp ライブラリを使用してこれらの REST API を呼び出す ac# ラッパーを作成していますが、これまでのところ問題なく動作しています。たとえば、アカウント情報を取得する GET API の 1 つは次のとおりです。
/api/account/{id}
次のような JSON データが返されます。
{ “Id” : “12345”, “Name” : “Test Account” }
データを受信したら、JSON 文字列を適切な DTO に逆シリアル化し、オブジェクトを返します。したがって、API ラッパーの私の関数は次のとおりです。
Public Account GetAccount ( int accountId )
{
//create restsharp client and request
return restClient.Execute<Account> ( restRequest )
}
しかし、現在の問題は、API が変化していることです。新しいバージョンの API を導入しています。新しいバージョンでは、エンドポイントは同じままです。唯一の違いは、異なるデータを返すことです。
たとえば、アカウントを取得するための V1 API は次のとおりです: (バージョンが設定されていない場合、デフォルトでサーバーは V1 を使用します)
GET - /api/V1/account/{id}
次のような JSON データが返されます。
{ “Id” : “12345”, “Name” : “Test Account” }
アカウントを取得するための V2 API は次のとおりです。
GET - /api/V2/account/{id}
次のような JSON データが返されます。
{ “Id” : “12345”, “Name” : “Test Account”, “Company” : “Some Company”, “Status” : “Some Status” }
将来、同じ API の新しいバージョンが別のデータを返す可能性があります。また、API のバージョンが変わっても、新しいバージョンのすべての API が変わるわけではありません。非常に多くの API が引き続き V1 オブジェクト データを送信します。V1 バージョンと比較して、特定の数の API のみが異なるデータを送信します。
私のジレンマは、既存の API ラッパーをリファクタリングする方法です。
- 最初のアプローチは、API の新しいバージョンごとに新しいメソッドを作成することです。例:
Public AccountV1 GetAccountV1 ( int accountId )
- V1 API を呼び出し、JSON を V1 オブジェクトに逆シリアル化して返します。- URL で V2 と同じ API を呼び出し、Public AccountV2 GetAccountV2 ( int accountId )
JSON を V2 オブジェクトに逆シリアル化して返します。
このアプローチの問題点は、160 API 用の V2 関数を作成するためにほぼ同じコードを書き直さなければならないことです。また、新しいバージョンの API が登場した場合、同じことをもう一度行う必要があります。V3 用に 160 個のメソッドを書き直します。
- 2 つ目は、Generics、Abstract Factory、動的プロキシ、またはその他の設計を使用することです。これにより、異なるバージョンの API に対してほぼ同じコードを書き直す必要がなくなります。
2番目のアプローチについては、実装方法がわかりません。私の目標は、最小限のコード変更で済むような方法でラッパー コードをリファクタリングすることです。拡張可能です。つまり、API バージョンを変更してデータを返した場合に、将来、大量のことを書き直す必要はありません。
私のコードをリファクタリングし、正しいデザインパターンを選択するのに役立つものは本当に役に立ちます. どんな例でも役に立ちます。