2017-07-14 69 views
0

我目前正在努力为我们的API编写一个非常好的SDK。我现在正在寻找几种方法之一。什么是C#SDK CRUD操作的正确返回类型?

  • 我可以从我的API调用中返回HttpResponseMessage(如下所示)。
  • 我可以做一些数据处理,并只传回对象。
  • 我可以创建一个自定义对象来包装SDK返回,以便它可以包含它需要的东西。
  • 当遇到服务器错误时,我可以抛出异常,但是如果应用程序可以从异常中恢复,这可能会很昂贵。
  • 我也可以在getter中返回一个元组,这样我就可以同时获得一个对象和HttpResponseMessage。

我希望SDK能够对数据进行恰当的处理,我不确定是否有一个如何在.NET中编写好的SDK的例子。我实际上会自己使用这个SDK,所以我希望它很好。我写了一些代码,我会在这里包括这些代码,但是我认为目前的迭代是有缺陷的。

public interface IBaseApi<T> 
{ 
    Task<IEnumerable<T>> GetAllAsync(); 

    Task<T> GetByIdAsync(int id); 

    Task<HttpResponseMessage> InsertAsync(T obj); 

    Task<HttpResponseMessage> UpdateAsync(T obj); 

    Task<HttpResponseMessage> DeleteAsync(int id); 
} 

现在我们返回一个空对象来表示Get请求失败。但我认为这是一个有缺陷的概念。

我也看过Facebook,Square和其他一些Sdks。没有什么比我更重要的了。

那么我的API应该发送什么样的返回类型?只是一个指针,我不知道客户端将如何使用这个。它可能是更大的查询的一部分,或直接传递给它们的控制器。我的总体目标是消费者可以尽可能少地处理自己,但如果出现错误信息,这也是有意义的。

回答

1

我在过去所做的那样,并已真的很好是创建一个包含有关该响应的元数据以及来自呼叫产生的实际数据,东西线沿线的一个“API响应”对象:

public class ApiResponse<TData> 
{   
    /// <summary> 
    /// Constructor for success. 
    /// </summary> 
    /// <param name="data"></param> 
    public ApiResponse(TData data) 
    { 
     Data = data; 
     Success = true; 
     Errors = new List<string>(); 
    } 

    /// <summary> 
    /// Constructor for failure. 
    /// </summary> 
    /// <param name="ex"></param> 
    public ApiResponse(IEnumerable<string> errors) 
    { 
     Errors = errors; 
     Success = false; 
    } 

    /// <summary> 
    /// Gets whether the API call was successful. 
    /// </summary> 
    public bool Success { get; private set; } 

    /// <summary> 
    /// Gets any errors encountered if the call was not successful. 
    /// </summary> 
    public IEnumerable<string> Errors { get; private set; }   

    /// <summary> 
    /// Gets the data resulting from the API call. 
    /// </summary> 
    public TData Data { get; private set; } 
} 

你可以有一个基类,它不会返回任何数据,然后从中派生出这个数据。