gpt4 book ai didi

c# - 将存储库模式、缓存和 Web 服务链接在一起

转载 作者:行者123 更新时间:2023-11-30 15:03:14 24 4
gpt4 key购买 nike

我试图理解 Repository 模式以在我的应用程序中实现它。我在某种程度上坚持使用它。

下面是应用如何访问数据的简化算法:

  1. 应用第一次没有数据。它需要连接到 Web 服务才能获取此数据。因此,与 Web 服务交互的所有低级逻辑都将隐藏在 WebServiceRepository 类之后。从网络服务传递到应用程序的所有数据都将被缓存。

  2. 下次当应用程序请求数据时,将在缓存中搜索这些数据,然后再从网络服务请求它们。缓存将自身表示为数据库和 XML 文件,将通过 CacheRepository 访问。

    缓存数据可以处于三种状态:有效(可以向用户显示)、无效(不能显示的旧数据)和部分有效(可以显示但必须尽快更新)。

    a) 如果缓存的数据是有效的,那么在我们得到它们之后我们可以停止。

    b) 如果缓存数据无效或部分有效,我们需要访问 WebServiceRepository。如果对 Web 服务的访问成功结束,则请求的数据将被缓存,然后显示给用户(我认为这必须作为对 CacheRepository 的第二次调用来实现)。

    c) 所以数据访问的入口点是CacheRepository。仅当没有完全有效的缓存时才会调用 Web 服务。

我不知道在哪里放置验证缓存的逻辑(有效/无效/部分有效)?在哪里调用 WebServiceRepository?我认为这个逻辑不能放在任何一个 Repositories 中,因为它违反了 SOLID 的单一责任原则 (SRP)。

我应该实现某种RepositoryService 并将所有逻辑放入其中吗?或者有没有办法链接 WebServiceRepositoryWebServiceRepository

实现它的模式和方法是什么?

另一个问题是如何从缓存中获取部分有效的数据,然后在一个方法的调用中请求网络服务?我想使用代表和事件。还有其他方法吗?

请给个建议。链接上面列出的所有功能的正确方法是什么?

附言也许我描述的有点困惑。如果需要,我可以提供一些额外的说明。

附言在 CacheRepository(和 WebServiceRepository)下,我指的是一组存储库 - CustomerCacheRepositoryProductCacheRepository 等等。感谢@hacktick 的评论。

最佳答案

如果您的网络服务为不同的实体提供了 crud 方法,请为每个实体根创建一个存储库。如果有客户创建 CustomerRepository。如果存在带有附件的文档,则创建一个 DocumentRepository,它返回带有附件的文档作为属性。

存储库仅负责特定类型的实体(即客户或文档)。存储库不用于缓存等“横切关注点”。 (即您的 CacheRepository 示例)

为每个存储库注入(inject)(即 StuctureMap)一个 IDataCache 实例。

对 Repository.GetAll() 的调用返回当前存储库的所有实体。每个实体都在缓存中注册。记下缓存中该对象的 ID。

调用 Repository.FindById() 首先检查缓存中的 id。如果对象有效则返回它。

有关对象失效的通知被路由到缓存。您可以实现客户端失效或将消息从服​​务器推送到客户端,例如通过消息队列。

有关对象当前是否有效的状态信息不应存储在实体对象本身中,而应仅存储在缓存中。

关于c# - 将存储库模式、缓存和 Web 服务链接在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11861978/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com