gpt4 book ai didi

c# - 如何正确地后处理 Refit 返回值?

转载 作者:行者123 更新时间:2023-11-30 15:14:39 27 4
gpt4 key购买 nike

我正在使用 Refit 编写一些 API ,这创造了奇迹,我在想出一个好的(如“干净”、“适当”)方法来对返回的数据执行一些任意处理时遇到了一些麻烦。

例如,考虑以下代码:

public interface ISomeService
{
[Get("/someurl/{thing}.json")]
Task<Data> GetThingAsync([AliasAs("thing")] string thing);
}

现在,我见过的许多 REST API 都有将实际数据(如“有用”数据)深入 JSON 响应打包的不幸习惯。比方说,实际的 JSON 具有以下结构:

{
"a" = {
"b" = {
"data" = {
...
}

现在,通常我只映射所有必要的模型,这将允许 Refit 正确反序列化响应。这虽然使 API 使用起来有点笨拙,因为每次我使用它时我都必须执行以下操作:

var response = await SomeService.GetThingAsync("foo");
var data = response.A.B.Data;

我的意思是,这两个外部模型实际上只是容器,不需要向用户公开。或者,说 Data property 是一个模型,它有另一个属性是 IEnumerable ,我很可能只想直接将其返回给用户。

我不知道如何在不必为每个服务编写无用的包装器类的情况下执行此操作,其中每个服务还必须明显地重复接口(interface)中的所有 XML 注释等,从而导致更多无用的代码四处飘荡.

我只想有一些简单的、可选的 Func<T, TResult>在给定 Refit API 的结果上调用的等效项,并在将返回的数据呈现给用户之前对返回的数据进行一些修改。

最佳答案

我发现针对此问题的一个足够干净的解决方案是使用扩展方法来扩展 Refit 服务。例如,假设我有一个像这样的 JSON 映射:

public class Response
{
[JsonProperty("container")]
public DataContainer Container { get; set; }
}

public class DataContainer
{
[JsonProperty("data")]
public Data Data { get; set; }
}

public class Data
{
[JsonProperty("ids")]
public IList<string> Ids { get; set; }
}

然后我有一个像这样的 Refit API:

public interface ISomeService
{
[Get("/someurl/{thing}.json")]
[EditorBrowsable(EditorBrowsableState.Never)]
[Obsolete("use extension " + nameof(ISomeService) + "." + nameof(SomeServiceExtensions.GetThingAsync))]
Task<Response> _GetThingAsync(string thing);
}

我可以像这样定义一个扩展方法,并使用它来代替 Refit 服务公开的 API:

#pragma warning disable 612, 618

public static class SomeServiceExtensions
{
public static Task<Data> GetThingAsync(this ISomeService service, string thing)
{
var response = await service._GetThingAsync(thing);
return response.Container.Data.Ids;
}
}

这样,每当我调用 GetThingAsync API 时,我实际上是在使用可以为我处理所有额外反序列化的扩展方法。

关于c# - 如何正确地后处理 Refit 返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54183008/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com