C# 将存储库模式、缓存和web服务链接在一起

C# 将存储库模式、缓存和web服务链接在一起,c#,web-services,design-patterns,caching,repository-pattern,C#,Web Services,Design Patterns,Caching,Repository Pattern,我试图理解存储库模式,以便在我的应用程序中实现它。在某种程度上,我被它困住了 以下是应用程序访问数据的简化算法: 第一次应用程序没有数据。它需要连接到web服务才能获取此数据。因此,所有与web服务交互的低级逻辑都将隐藏在WebServicePository类后面。从web服务传递到应用程序的所有数据都将被缓存 下次应用程序请求数据时,将在缓存中搜索此数据,然后再从web服务请求数据。缓存将自身表示为数据库和XML文件,并将通过CacheRepository进行访问 缓存的数据可以处于三种状态:

我试图理解
存储库
模式,以便在我的应用程序中实现它。在某种程度上,我被它困住了

以下是应用程序访问数据的简化算法:

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

  • 下次应用程序请求数据时,将在缓存中搜索此数据,然后再从web服务请求数据。缓存将自身表示为数据库和XML文件,并将通过
    CacheRepository
    进行访问

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

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

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

    c) 因此,数据访问的入口点是
    CacheRepository
    。只有在没有完全有效的缓存时,才会调用Web服务

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

    我是否应该实现某种类型的
    RepositoryService
    ,并将所有逻辑放在其中?或者有没有办法链接
    webservicepository
    webservicepository

    实现这一点的模式和方法是什么

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

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

    另外,也许我描述的有点混乱。如有需要,我可以再作澄清


    p.p.S.在
    CacheRepository
    下(在
    webservicepository
    下),我指的是一组存储库-
    CustomerCacheRepository
    ProductCacheRepository
    等等。感谢@hacktick的评论。

    如果您的Web服务为不同实体提供crud方法,请为每个EntityRot创建一个存储库。 如果有客户,请创建CustomerRepository。如果存在附件为子项的文档,请创建一个DocumentRepository,将附件作为属性返回文档

    存储库只负责特定类型的实体(即客户或文档)。存储库不用于“交叉关注点”,如缓存。(即,您的缓存存储库示例)

    为每个存储库注入一个IDataCache实例(即StucureMap)

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

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

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


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

    您是否控制web服务?缓存是客户端缓存还是服务器端缓存?@dtryon不,我不是。我只能通过XMLAPI从web服务获取数据。缓存是客户端的。为什么要有单独的存储库?只需在每个实体存储库中使用缓存依赖项。这样您就不需要动态解析依赖关系。@dtryon,因为从服务器请求的数据将存储在数据库和文件中。我需要隐藏所有低级数据访问详细信息。所以在我看来,存储库模式适合这种情况。在缓存依赖项下是什么意思?你能告诉我更多关于这一点吗?我想我和@hacktick谈论的是同一件事:
    IDataCache实例在
    CacheRepository
    下(以及
    webservicepository
    下)每个存储库的
    IDataCache实例,我指的是一组存储库-
    CustomerCacheRepository
    ProductCacheRepository
    等等。这是我的错误,我没有写在问题中。谢谢你的回答,所以所有的数据存储和验证逻辑都转移到了IDataCache的实现上。当存储库需要返回实体对象时,它必须引用IDataCache的注入实现,并确定是否存在任何有效数据。若并没有,那个么它会向web服务请求数据。我是否以正确的方式理解了你的答案?你能回答我之前的评论吗?请不要。IDataCache实例只负责缓存。因此,它持有每个实体和实体的对象以及“有效”状态。存储库负责根据数据缓存正确操作。例如,如果存储库注意到一个实体无效(根据缓存),它可以重新加载该实体,或者只是正确地标记该实体,以便向用户显示该实体已过时。我想我理解。非常感谢。