清洁架构:内存实体的哪一层?

时间:2019-03-14 05:48:48

标签: clean-architecture

鲍勃叔叔考虑清洁架构的不同层时,我有一个问题:如果您将数据存储在数据库中,例如,这显然是一个细节,所以数据库将进入外部层(框架和驱动程序)。但是,描述该数据库中数据的实体是我应用程序的核心信息,因此它们位于最内层(实体)。

现在让我们说我必须在应用程序启动时获取所有数据。然后有一些计算在开始时只需要一次,但是这有点耗时。因此,不可能一直从数据库中获取数据。因此,该应用程序可以使用该数据的内存表示形式。

我的问题是,您将把这种内存表示形式放在哪里?一方面,它仅是数据库之类的细节,因此位于最外层。另一方面,它确切地表示了具有更多信息的实体-但最终,这只是简单的旧对象的列表。这会推荐核心层,不是吗?

我个人倾向于使用第一个选项,并像处理其他数据源一样详细地处理它。

亲切的问候, 蒂里

2 个答案:

答案 0 :(得分:1)

正确的答案是“取决于”。

“理论”与“实践”之间存在巨大差异。

别误会我:“理论”是好的。 “理论”代表“智慧”,而智慧总是“好”。

但是...

“体系结构”中的“层”必将由您选择实施项目的框架来决定。如果您使用MySql在PHP / Codeigniter中进行编码,则您的选择必然会与使用ASP.Net MVC 5和Entity Framework进行编码时的选择有所不同。如果您使用Hibernate在Java / Spring Boot中进行编码,则它们将有所不同。如果您选择使用Hibernate / JPA与Hibernate / HQL,它们甚至可能会有所不同。

最好的方法是阅读罗伯特·马丁(Robert Martin)和阿利斯泰尔·考克本(Alistair Cockburn)和斯科特·麦康奈尔(Scott McConnell)以及其他尽可能多的人,尝试吸收他们的“智慧”……然后在面对时“明智地选择”具有实际项目和现实世界的限制。

'希望有帮助...

PS,回答您的问题:

如果这是一个Java Spring Boot / Hibernate项目,并且我有完全的自由:

  1. 我将“实体”实现为POJO

  2. 我将使用Hibernate / JPA语法(例如,使用“ EntityManager”等)

  3. 我将确保仅通过更改application.properties“数据源”配置文件即可在内存数据库(如H2)和RDMS(如Oracle)之间进行切换。

换句话说,我会“像处理另一个数据源一样处理它-作为详细信息”;)

答案 1 :(得分:1)

这仍然是一个细节,应该保留在外面的圆圈中。如果您以存储库模式来考虑,则实现是在内存中还是访问SQL数据库都没有关系。它仍然是您要与业务逻辑分开的细节,以便您随时可以轻松地对其进行更改。