5

我目前有一个 Web API

  • FromSqlRaw(...).ToListAsync()在存储库中使用获取一行数据
  • Ok(data.ToArray())Task<ActionResult<IEnumerable<MyClass>>>通过控制器一样返回此数据。

现在我想知道是否应该或可以使用 IAsyncEnumerable 作为返回类型。这个想法是在存储库和控制器中使用它。但是,在这个(现在已经破旧的)线程中,它声明不应该使用它。这里建议的解决方案类似于:

FromSqlRaw(...).AsNoTracking().AsAsyncEnumerable()

至于控制器,我希望将响应包裹起来ActionResult以显式设置返回码。但是,目前这似乎不起作用。

我应该将解决方案应用于存储库并将结果作为控制器中的列表使用还是保持原样?

4

1 回答 1

8

IAsyncEnumerable为您提供了基于拉取的异步数据检索的接口。换句话说,这个 API 表示一个迭代器,其中下一项是异步获取的。

这意味着您将分几轮接收数据,并且每轮都以异步方式接收。

  • 之前IAsyncEnumerable你可以使用IEnumerable<Task<T>>,它代表一堆返回类型的异步操作T

  • Task<IEnumerable<T>>表示具有返回类型的单个异步操作IEnumerable<T>


让我们将这些知识应用到 WebAPI 中:

  • Task<ActionResult<T>>从 HTTP 消费者的角度来看,和 之间没有区别ActionResult<T>。从用户的角度来看,这是一个实现细节。
  • WebAPI 控制器的操作实现了请求-响应模型。这意味着发送单个请求并在消费者端收到单个响应。
  • 如果消费者再次调用相同的操作,则将实例化一个新的控制器并处理该请求。

IAsyncEnumerable这意味着如果您的 API被公开为操作结果类型,那么您的 API 的使用者将无法利用它。

于 2020-11-24T09:38:19.187 回答