【发布时间】:2019-04-14 18:45:39
【问题描述】:
我正在尝试创建一个第三方库来使用 API。
我创建了一堆类来解析不同的 api 调用,例如:
public class AccountsEndpoint: IAccountsEndpoint
{
public async Task<Account> GetAsync(id)
{
return await this.BuildUrl(id).GetJsonAsync();
}
//etc...
}
public class NotificationsEndpoint: INotificationsEndpoint
{
public async Task<Notification> SetPrimary(id)
{
return await this.BuildUrl(id).AppendSegment("Primary")
.PostJsonAsync(null, cancellationToken)
.ReceiveJson<Notification>())();
}
}
我有大量这样的端点,我想在每次调用之前运行一些额外的代码,
例如,如果我的 oauth 令牌无效,我希望获得一个新的访问令牌并自动重试请求。
我希望 NOT 必须使用以下处理程序包装所有 api 调用:
public async Task<Notification> SetPrimary(id)
{
return await new CustomErrorHandler(() =>
this.BuildUrl(id).AppendSegment("Primary")
.PostJsonAsync(null, cancellationToken)
.ReceiveJson<Notification>())()).ExecuteAsync();
}
如果我要做类似的事情,我必须记住在所有端点上使用错误处理程序,当我觉得有更好的方法来反转控件时。 (或者,我可以生成虚拟接口并在那里有包装逻辑,但这会产生与手动添加调用相同的问题)。
如何使用错误处理程序逻辑包装所有调用?
【问题讨论】:
-
我对呈现的代码有点困惑,因为它没有提供足够的上下文让我清楚地了解它应该做什么。尽管如此,您提到了管道和中间件模式。如果您有一个管理请求的管道,那么您可以在管道的早期插入一个满足您寻求的行为的中间件
-
类似于 Web API 中消息处理程序的使用方式
-
@nkosi 感谢您的回复,我会检查一下
-
您似乎在使用 Flurl。您可能会对这些内容感兴趣。 flurl.io/docs/configuration 和 flurl.io/docs/extensibility
-
如果您在全球范围内应用它,则不会。
标签: c# .net rest architecture