好吧,假设我有一个 DataRepository 类,方法是 getNames ()和 getStates ()。假设这些数据存储在一个昂贵的操作的Web服务或数据库中。
运行并返回第一个查询后,当消费者询问这些方法时,它会立即返回,因为结果会缓存在DataRepository类中。
问题是,对于第一次调用,您希望行为异步以避免阻止此昂贵的调用。编码的最佳方法是什么?事实上,这个DataRepository类正在进行实际的跨边界检索和缓存单一的Respnosibility原则。
这里有关于最佳做法的其他想法吗?
答案 0 :(得分:1)
存储库是否真的有责任知道它是否被称为异步?我认为它只会调用它并返回它的数据,如何调用它并不关心它。我也不认为存储数据是它的责任....如果你想存储数据,调用者(可能是一些中间人)可以存储它。存储库应该非常简单....请求数据并返回数据。或者甚至返回IQueryable并让需要数据的部分实际获得数据......
答案 1 :(得分:1)
您想要的第一个电话 行为异步以避免阻塞 在这个昂贵的电话。是什么 编码的最好方法是什么?
这是来电者的担忧。最好同时提供同步和异步接口,以便客户可以决定哪个适合他们的位置。
是这个DataRepository的事实 上课正在做两个实际的交叉 边界检索和缓存 打破单一责任 原理
是的,如果存储库类本身涉及检索和缓存实现,它会中断SRP。更重要的是,关于击中哪个源的决定通常需要重要的逻辑,这是将这些函数分成不同类的另一个好理由。 (标准警告:如果YAGNI,则不要这样做!)
答案 2 :(得分:0)
如果你必须进行第一次异步调用,你也可以将所有调用设为异步。这将使您的代码更易于编写和理解。您将不必处理2个不同的呼叫模式。
数据存储库应该负责一件事:将数据提供给用户。它从数据存储中检索数据。该数据存储可能是对WS或DB的昂贵调用或来自缓存的廉价调用。数据存储库可以检查缓存中是否存在数据并返回该数据或从WS或DB获取数据,将其放入缓存中然后将其返回。