C# 使用回调处理 API 异常?

C# Using callback for handling API exception?

提问人:Vietvo 提问时间:2/15/2023 更新时间:2/15/2023 访问量:94

问:

假设我的服务正在使用 NSwag 生成的代码使用第三方 API。目的只是调用 API,获取结果并跟踪/处理异常(如果有)作为下面的伪代码:

// Nswag generated code
class ApiClient: IApiClient
{
   string GetData();
   bool UploadData(data);
}

class Service1 
{
   IApiClient client;
   ILogger logger;
   void DoSth1() 
   {
     try 
     {
       var result = client.GetData();
     } catch (Exception e)
     {
       HandleException(e); // additional logic
       logger.Track(e);
     }
   }
}

class Service2 
{
   IApiClient client;
   ILogger logger;

   void DoSth2() 
   {
     string result;
     try 
     {
       result = client.GetData();
     } catch (Exception e)
     {
       HandleException(e); // additional logic
       logger.Track(e);
     }

     HandleResult(result)

     try 
     {
       bool uploaded = client.UploadData(result);
     } catch (Exception e)
     {
       HandleException(e); // additional logic
       logger.Track(e);
     }
   }
}

这些代码实际上一遍又一遍地重复我的服务。我正在考虑将这些逻辑移动到新服务中的方法,然后使用回调处理错误,例如使用 GetData():

class ApiService: IApiService
{
  IApiClient apiClient;

  string GetData(Action onSuccess, Action<Exception> onFailure) 
  {
    return Handle(() => apiClient.GetData(), onSuccess, onFailure);
  }

  T Handle<T>(Action apiCall, Action onSuccess, Action<Exception> onFailure) 
  {
    T result;
    try
    {
      result = apiCall();
    }
    catch (Exception e)
    {
      onFailure.Invoke(e);
    }

    onSuccess.Invoke();
    return result;
  }

}

class Service1 
{
   IApiService service;
   ILogger logger;
   void DoSth1() 
   {
     var result = service.GetData(
       onFailure: (Exception e) => 
       {
         HandleException(e);
         logger.Track(e);
       }
    )
   }
}

这种实现在我的服务中效果很好。

此实现的优点是:

  • 减少尝试...在服务中捕获

  • 集中 API 调用

  • 对我来说,这似乎更干净。

缺点是关于引入新服务,我在 Service1、Service2 -IApiService 和 IApiService - IApiClient 之间获得了新的耦合。这就是我所能看到的。

我的问题:这是处理 API 结果/异常的好方法吗?我错过了哪些优点/缺点?

谢谢

C# .NET API 回调

评论

1赞 Kami 2/15/2023
你有没有研究过事件驱动设计 - learn.microsoft.com/en-us/dotnet/architecture/microservices/...这两种方法相似,第二种方法选择引发事件,而不是调用函数来处理错误。

答: 暂无答案