当您需要进行昂贵的检索时,使用存储库的最佳做法是什么

时间:2009-10-27 14:00:54

标签: c# design-patterns repository-pattern

好吧,假设我有一个 DataRepository 类,方法是 getNames ()和 getStates ()。假设这些数据存储在一个昂贵的操作的Web服务或数据库中。

运行并返回第一个查询后,当消费者询问这些方法时,它会立即返回,因为结果会缓存在DataRepository类中。

问题是,对于第一次调用,您希望行为异步以避免阻止此昂贵的调用。编码的最佳方法是什么?事实上,这个DataRepository类正在进行实际的跨边界检索和缓存单一的Respnosibility原则。

这里有关于最佳做法的其他想法吗?

3 个答案:

答案 0 :(得分:1)

存储库是否真的有责任知道它是否被称为异步?我认为它只会调用它并返回它的数据,如何调用它并不关心它。我也不认为存储数据是它的责任....如果你想存储数据,调用者(可能是一些中间人)可以存储它。存储库应该非常简单....请求数据并返回数据。或者甚至返回IQueryable并让需要数据的部分实际获得数据......

答案 1 :(得分:1)

  

您想要的第一个电话   行为异步以避免阻塞   在这个昂贵的电话。是什么   编码的最好方法是什么?

这是来电者的担忧。最好同时提供同步和异步接口,以便客户可以决定哪个适合他们的位置。

  

是这个DataRepository的事实   上课正在做两个实际的交叉   边界检索和缓存   打破单一责任   原理

是的,如果存储库类本身涉及检索和缓存实现,它会中断SRP。更重要的是,关于击中哪个源的决定通常需要重要的逻辑,这是将这些函数分成不同类的另一个好理由。 (标准警告:如果YAGNI,则不要这样做!)

答案 2 :(得分:0)

如果你必须进行第一次异步调用,你也可以将所有调用设为异步。这将使您的代码更易于编写和理解。您将不必处理2个不同的呼叫模式。

数据存储库应该负责一件事:将数据提供给用户。它从数据存储中检索数据。该数据存储可能是对WS或DB的昂贵调用或来自缓存的廉价调用。数据存储库可以检查缓存中是否存在数据并返回该数据或从WS或DB获取数据,将其放入缓存中然后将其返回。