2009-10-27 49 views
0

即可使用的存储库,可以说,我有一个DataRepository类的方法,getNames()和的getStates()。可以说这些数据存储在一个昂贵的操作的web服务或数据库中。什么是最好的做法,当你需要做昂贵的检索

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

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

关于最佳实践的任何其他想法?

回答

1

为你想 行为第一次调用是异步避免这种昂贵的呼叫阻塞 。 什么是编码这个最好的方法?

这是一个来电者的关注。最好提供同步和异步接口,以便客户可以决定哪些适合他们的情况。

的是,这DataRepository 类是既做实际横 boundry检索和缓存 打破单一职责原则 的事实。

是的,如果存储库类本身涉及检索和缓存实现,它会打破SRP。而且,关于命中哪个源的决定通常需要重要的逻辑,这是将这些功能分为不同类的另一个很好的理由。 (有了标准警告:如果YAGNI,那么不要这样做!)

1

知道它是否被称为异步是否真的是知识库的责任?我认为它只会打电话并返回它的数据,它如何被调用并不是它的照顾。我也不认为这是它的责任来存储数据....如果你想存储数据,调用者(可能有一些中介)可以存储它。存储库应该非常简单....请求数据并返回数据。或者甚至返回IQueryable,让需要数据的块实际上获取数据...

0

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

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

相关问题