2017-09-25 10 views
-2

私のプロジェクトでは、WebApiRefitlink)と多く呼んでいます。基本的にはWebApiinterfaceと定義しています。例えば:各WebApiためC#とWebApi:共通ベースクライアントを作成する方法

public interface ICustomer 
{ 
    [Get("/v1/customer")] 
    Task<CustomerResponse> GetDetails([Header("ApiKey")] string apikey, 
             [Header("Authorization")] string token, 
             [Header("Referer")] string referer); 
} 

、私はそのようなclientを作成する:

public async Task<CustomerResponse> GetDetails(string apikey, string token) 
    { 
     CustomerResponse rsl = new CustomerResponse(); 
     rsl.Success = false; 

     var customer = RestService.For<ICustomer>(apiUrl); 
     try 
     { 
      rsl = await customer.GetDetails(apikey, token, apiUrl); 
      rsl.Success = true; 
     } 
     catch (ApiException ax) 
     { 
      rsl.ErrorMessage = ax.Message; 
     } 
     catch (Exception ex) 
     { 
      rsl.ErrorMessage = ex.Message; 
     } 

     return rsl; 
    } 

クライアントとの間の唯一の違いは、(上記の例のコードICustomerに)インタフェースであり、リターン構造(IN例CustomerResponseBaseResponseから派生しています)、関数は呼び出す必要があります(この例では、paramsを使用して)。

重複したコードを避けるため、基本クラスを用意する必要があります。 ありがとうございます。

答えて

-1

私は人々があなたに説明や解決策なしでネガティブなフィードバックを与えるのが好きです。誰かが私の同様の問題を抱えている場合、この問題を解決するためにジェネリッククラスを見つけることができます。

public class BaseClient<T> where T : IGeneric 
{ 
    public const string apiUrl = "<yoururl>"; 

    public T client; 

    public BaseClient() : base() { 
     client = RestService.For<T>(apiUrl); 
    } 

    public async Task<TResult> ExecFuncAsync<TResult>(Func<TResult> func) 
           where TResult : BaseResponse 
    { 
     TResult rsl = default(TResult); 

     T apikey = RestService.For<T>(apiUrl); 
     try 
     { 
      rsl = func.Invoke(); 
      rsl.Success = true; 
     } 
     catch (ApiException ax) 
     { 
      rsl.ErrorMessage = ax.Message; 
     } 
     catch (Exception ex) 
     { 
      rsl.ErrorMessage = ex.Message; 
     } 

     return rsl; 
    } 

    public async Task<List<TResult>> ExecFuncListAsync<TResult>(Func<List<TResult>> func) 
    { 
     List<TResult> rsl = default(List<TResult>); 

     T apikey = RestService.For<T>(apiUrl); 
     try 
     { 
      rsl = func.Invoke(); 
     } 
     catch (ApiException ax) 
     { 
     } 
     catch (Exception ex) 
     { 
     } 

     return rsl; 
    } 
} 
関連する問題