C#SDK CRUD操作的正确返回类型是什么?

时间:2017-07-14 17:06:55

标签: c# asp.net sdk

我目前正努力为我们的API编写一个非常好的SDK。我正在考虑现在就采取一些方法。

  • 我可以从我的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);
}

现在我们返回一个null对象来指示Get request失败。但我认为这是一个有缺陷的概念。

我还看过Facebook,Square和其他一些Sdks。对我来说没有什么比这更好的了。

那么我的API应该发送哪种返回类型?只是一个指针,我不知道客户端将如何使用它。它可能是更大查询的一部分或直接传递给他们的Controller。我的总体目标是,消费者只需要很少的处理就能完成自己的工作,但如果出现问题则消息也是有意义的。

1 个答案:

答案 0 :(得分:1)

我过去所做的并且效果很好的是创建一个&#34; Api响应&#34;包含有关响应的元数据以及调用产生的实际数据的对象,类似于:

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; }
}

您可以拥有一个不返回任何数据的基类,然后从中派生出来。