Oop 了解让存储库、DAO和其他层访问不同数据源的正确时间

Oop 了解让存储库、DAO和其他层访问不同数据源的正确时间,oop,design-patterns,architecture,repository-pattern,dao,Oop,Design Patterns,Architecture,Repository Pattern,Dao,我正在设计一个新的应用程序,我想用它作为未来项目的样板 在这个应用程序中,我需要访问来自不同来源的数据,比如MySQL数据库、Mongo以及远程服务器。例如,用户在两个数据库中都有信息。但其他一些实体只存在于一个源中 我的问题不是针对我的项目的。我感兴趣的是讨论在多层体系结构中应该在哪里实现与数据源的集成。我要求提供建议的方法,我理解没有“对或错” 所以从我的理解来看,DAO是非常特定于数据库的。它也是数据库的通用实现 存储库更具体于业务,还实现了一个用于持久化和检索数据的接口(针对用例)。它还

我正在设计一个新的应用程序,我想用它作为未来项目的样板

在这个应用程序中,我需要访问来自不同来源的数据,比如MySQL数据库、Mongo以及远程服务器。例如,用户在两个数据库中都有信息。但其他一些实体只存在于一个源中

我的问题不是针对我的项目的。我感兴趣的是讨论在多层体系结构中应该在哪里实现与数据源的集成。我要求提供建议的方法,我理解没有“对或错”

所以从我的理解来看,DAO是非常特定于数据库的。它也是数据库的通用实现

存储库更具体于业务,还实现了一个用于持久化和检索数据的接口(针对用例)。它还可以使用DAO对象和其他存储库对象

  • 例如,如果我需要访问Redis,它不是一个传统的数据库,我应该为此创建一个DAO吗

  • 如果我需要通过RESTAPI与外部服务通信,我应该在哪里实现它?将DAO用于RESTAPI有意义吗

  • 假设一些实体同时驻留在关系数据库和Web服务中,我必须访问这两个实体才能组装实体对象。我想我需要一些抽象的东西,对吗?建议采用什么方法?这是一种什么样的模式来包装这些集成?存储库就是为此而设计的


还有其他提示吗?

我假设您已经看到,为了增加价值,请将这些提示链接到Martin Fowler的EAA p,以便进一步阅读:

  • -充当数据库表网关的对象。一个实例处理表中的所有行
  • -使用类似集合的接口在域和数据映射层之间进行调解,以访问域对象
  • 考虑到这一点,您的问题:

    例如,如果我需要访问Redis,它不是一个传统的数据库,我应该为此创建一个DAO吗? 如果我需要通过RESTAPI与外部服务通信,我应该在哪里实现它

    尽管本书结合SQL专门描述了DAO模式,但我相信其目的是简化数据查询语言的复杂性,并将其限制为一个实体。因此,应用程序开发人员可以使用一个接口,DB开发人员将能够轻松找到所有代码

    我不是Redis pro,但我的理解是,您可以通过REST API与它进行通信,REST API可能已经为您打包到某种数据访问库中。无论哪种方式,普通HTTP请求似乎不被社区认为是复杂的数据查询(我有点认为oData可能是复杂性最高的地方),因此可能不符合自己的DAO

    然而,根据您在HTTP上使用的实际查询语言,这一点是有争议的。例如,弹性查询DSL可以变得相当复杂,然后我会考虑一个DAO。 假设一些实体同时驻留在关系数据库和Web服务中,我必须访问这两个实体才能组装实体对象。我想我需要一些抽象的东西,对吗?建议采用什么方法?这是一种什么样的模式来包装这些集成?存储库就是为此而设计的? 我不确定我是否完全理解这个场景,我将假设您在DB中有一堆记录,您可以获取这些记录,然后使用从web API接收的属性进行增强

    在这种情况下,我会质疑在存储库中这样做是否会导致后续问题。我相信repository的目的是将数据存储收集逻辑与应用程序的其余部分隔离开来,在这种情况下,web API访问似乎更适合专门设计用于使用web API结果增强域对象的服务


    我可能还应该在这上面打上一个大大的“这取决于”,因为您未来的一些项目将看到如此复杂的数据层带来的好处,而对于其他项目来说,这将是一个完全多余的工作。我只是希望我上面提到的进一步阅读能帮助你根据自己的具体情况打电话。

    Hey@dakis,我会更新我的问题。关于DataMapper,我错了。我会移除它。问题是如何使用DAO和存储库,以及我应该将与其他服务的集成放在哪里。我将在这个问题中添加Redis和其他数据源。我并不是说他们必须适应这两门课,也许他们属于别的什么地方。似乎有人结束了这个问题。因此,我的200名代表的奖金被从中删除。我真的很抱歉,帖木儿!祝你好运