结合模型或实体?

时间:2017-09-25 13:34:08

标签: java architecture mvp n-tier-architecture clean-architecture

在分离问题时,我有一个SOLID问题。 在典型的三层架构(模型,视图,演示者)中,我们正在按照Clean Architecture方法(Uncle Bob)解决问题,模型/数据的组合方式是什么?这是一个典型的例子。铅表不保存信息是否已被共享,该信息存储在另一个表中 - 例如,PencilProperties。然后,当我创建域模型 - PencilModel时 - 设置其" isShared"的正确方法是什么?依赖于此PencilProperties表的字段?

我正在使用Repository,它只是通过数据映射器类在PencilDatabaseObject和PencilModel之间映射数据。

另一个例子是,我们有两个对象:

Plant
 -> id
 -> name

Tree
 -> id
 -> plant_id
 -> plant_name

此时我需要在Plant和Tree之间进行映射,以便Tree从Plant实体获取属性? 此时访问数据映射器中的数据库似乎与SOLID有关。

提前致谢。

1 个答案:

答案 0 :(得分:1)

因此,在这两种情况下,PencilPencilPropertiesPlantTree都是您的数据实体。您的存储库应负责获取数据。无论您的存储库是数据库,ORM还是字典都无关紧要。唯一重要的是你想要实现它的方式。

(原谅C#LINQ,但它与Java足够接近) 因此,对于实现,您可以将存储库提取为isShared,简单如下:

var pencilIsShared = _pencilRepository.First().IsShared;

至于你何时需要映射它,简单的答案是"在你的存储库"

由于您Pencil的更改可能性不如PencilRepository,因此您需要反转依赖关系,并确保您拥有PencilRepository界面,并且{{1}无论是否共享PencilRepositoryImpl,实现都将返回给您。

至于您对在数据映射器中访问数据库的担忧,您可以做的是将映射器逻辑包含在存储库中,然后抽象映射器,以便您不再违反SRP。请参阅以下链接。

存储库模式

这个很干净:https://medium.com/@krzychukosobudzki/repository-design-pattern-bc490b256006