0

我们正在迁移到 .NET 4.5,我正在考虑将异步添加到我的存储库中:

interface IRepository<T>
{
    T Find(int id);
    Task<T> FindAsync(int id);
    IEnumerable<T> FindAll();
    Task<IEnumerable<T>> FindAllAsync();
    ...
}

实现可能会调用 DB、WebServices 等。

我的问题是,我应该支持 CancellationToken 吗?

(别担心 - FindAllAsync() 可能是基于 Rx 的:))

4

2 回答 2

1

好吧,绝对添加async到您的存储库中。我完全async赞成接管世界。:)

CancellationToken支持是另一个问题。如果可能需要它或者底层实现(DB/Web 服务)支持它,我通常会提供它(在这种情况下,实现是如此简单,我宁愿只提供它)。

请注意,您可以提供重载,而无需CancellationToken调用主要实现传递CancellationToken.None。或者,您可以在其接口上给出一个默认值,该值new CancellationToken()相当于CancellationToken.None. 我过去一直使用默认值方法,但在某些情况下(例如将Action变量分配给myRepository.FindAllAsync),重载允许方法解析但默认值不允许。

于 2013-01-17T17:50:15.477 回答
0

我正要问同样的问题。我开始认为答案是“只有当你认为取消是一个重要的场景时”。如果您认为某些存储库需要很长时间以致用户或基础设施服务想要取消正在进行的查询,那么您应该这样做。我可以想象对于查询,尽管人们会认为大多数更新和插入会很快发生。如果他们不这样做,很可能是由于异常情况导致任务失败(超时?)。

添加对 CancellationToken 的支持将要求所有调用者提供一个,这会产生有害的链接效应。

于 2013-01-17T13:34:22.593 回答