【发布时间】:2015-06-21 09:17:53
【问题描述】:
我有一个使用我的存储库的大型代码库,这些存储库都实现了 IRespository,并且我正在实现方法的异步版本:
T Find(id);
Task<T> FindAsync(id);
...etc...
有几种存储库。最简单的方法是基于一个不可变集合,其中实体的范围足够小,值得从数据库中一次性加载它们。这种负载发生在任何人第一次调用任何 IRepository 方法时。例如,Find(4) 将触发尚未发生的加载。
我已经用 Lazy 实现了这个。非常好用,已经工作多年了。
我不能在 Async 上冷火,所以我必须在同步版本旁边添加 Async。我的问题是,我不知道首先调用哪个 - 存储库上的同步或异步方法。
我不知道如何声明我的懒惰 - 如果我像往常一样这样做,
Lazy<MyCollection<T>>
然后在第一次调用 FindAsync() 时加载它不会是异步的。另一方面,如果我去
Lazy<Task<MyCollection<T>>>
这对于 FindAsync() 来说非常有用,但是同步方法将如何触发初始加载而不会与 Cleary 先生关于调用 Task.Result 导致死锁的警告相冲突?
感谢您的宝贵时间!
【问题讨论】:
标签: c# repository async-await .net-4.5