C#和WebApi:如何创建公共基本客户端

时间:2017-09-25 10:53:22

标签: c# asp.net-web-api base-class

在我的项目中,我使用WebApilink)调用了很多Refit。基本上,我将WebApi定义为interface。例如:

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

对于每个WebApi,我都会创建一个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中),返回结构(在示例CustomerResponse中派生自BaseResponse),以及我具有的功能调用(在示例GetDetails中使用params)。

我应该有一个基类来避免重复的代码。 提前谢谢。

1 个答案:

答案 0 :(得分:-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;
    }
}