在分离问题时,我有一个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有关。
提前致谢。
答案 0 :(得分:1)
因此,在这两种情况下,Pencil
,PencilProperties
,Plant
和Tree
都是您的数据实体。您的存储库应负责获取数据。无论您的存储库是数据库,ORM还是字典都无关紧要。唯一重要的是你想要实现它的方式。
(原谅C#LINQ,但它与Java足够接近) 因此,对于实现,您可以将存储库提取为isShared,简单如下:
var pencilIsShared = _pencilRepository.First().IsShared;
至于你何时需要映射它,简单的答案是"在你的存储库"
由于您Pencil
的更改可能性不如PencilRepository
,因此您需要反转依赖关系,并确保您拥有PencilRepository
界面,并且{{1}无论是否共享PencilRepositoryImpl
,实现都将返回给您。
至于您对在数据映射器中访问数据库的担忧,您可以做的是将映射器逻辑包含在存储库中,然后抽象映射器,以便您不再违反SRP。请参阅以下链接。
存储库模式
这个很干净:https://medium.com/@krzychukosobudzki/repository-design-pattern-bc490b256006