【问题标题】:Accessing and Using entities of other features in Clean Architecture访问和使用 Clean Architecture 中其他功能的实体
【发布时间】:2020-11-23 15:56:34
【问题描述】:

我已经为我的应用程序的每个部分创建了功能包,我的项目结构如下所示:

app
    core
    features
        main
            domain
            data
            ui
        feature1
            domain
                entities
                    entity1
                    entity2
                …
            data
            ui
        feature2
            domain
                entities
                    entity1
                    entity2
                …
            data
            ui

我的问题是,我可以在 ma​​in 功能中使用 feature1feature2entities 吗?如果方法不正确,有没有更好的解决方案? 谢谢大家。

【问题讨论】:

    标签: flutter architecture entity clean-architecture


    【解决方案1】:

    更好的问题是,为什么要将领域层分离到几个功能上? 在干净的架构中,建议域模型是一个独立的包,它不依赖于其他包。

    因此,我会将域模型放入自己的包中,并让不同的功能通过它们的用例访问它。

    Clean architecture by Uncle Bob

    【讨论】:

    • 我应该分离整个域层(包括存储库合同和用例)吗?还是只有实体?
    • 只有实体,UseCases 将是另一个自己的层,通常称为应用层:)
    【解决方案2】:

    MartinPeek 所说的相反,NOWHERE 在 Clean Architecture 书中写道“建议将域模型作为一个包”popular clean architecture diagram 绝不是关于如何实现应用程序目录结构的指南。事实上,鲍勃叔叔已经明确表示,“尖叫”架构将使其应用程序用例从顶部可见。在 Simon Brown 贡献的最后一章“缺失的章节”中,他评估了不同的打包方式,并从分层打包如何违反 Clean 架构规则开始。

    当您实现分层打包时,您的源目录将有不同的子目录,例如domain/entitiesuse-casesdata-access-gateway/repositoriesweb-apipresentersviews、等等,它尖叫 清洁架构,但不是您系统的意图,即 医疗保健管理应用程序,或 购物车服务。而且,当您尝试对单个功能进行单个更改时,您将不得不在 4 个不同的包中进行更改。

    如果你想真实地实现 Clean 架构,那么你应该垂直地跨层来划分你的包,而不是根据水平层来划分你的包。您应该在根目录本身中有应用层(域实体和用例)。每个包都应该映射到业务逻辑中的一个域,这样所有因相同原因而更改的用例和实体都被打包在一起,而所有因不同原因而更改的用例和实体都被隔离。这样,您最终会得到一个像这样的目录结构:databaseapiemployeewagestaxes。甚至无需给您任何提示,您就可以大致了解此应用程序的用途。

    您也可以将数据访问层、API 和 UI 相关模块放在根目录下各自单独的包中,并让用例访问它们,或者您甚至可以将它们封装在“垂直切片”本身中,正如鲍勃叔叔所说:

    如果你解耦系统中改变的元素 不同的原因,那么您可以继续添加新的用例而不干扰 旧的。如果您还对 UI 和数据库进行分组以支持这些用例,那么 每个用例使用 UI 和数据库的不同方面,然后添加新的用例 不太可能影响老年人。

    当然,这有其优点和缺点。

    为了进一步阅读,我发现这个博客在我刚开始时非常有帮助:Explaining Clean Architecture

    回答你的问题,

    我可以在我的主要功能中使用 feature1 和 feature2 的实体吗?

    实体可以相互交谈,实际上它是任何业务逻辑的一部分,但是随着我们从抽象层到具体化层的更高层,您应该使事物更加隔离。同样,当您进行更改时,您不需要更改与该更改无关的用例。因此,我建议您创建一个单独的用例来访问这两个实体,或者创建一个单独的实体,它是 feature1 和 feature2 实体的聚合,并实现一个新功能来访问它。然后你可以让你的主要功能使用这个新创建的用例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-08
      • 2021-06-08
      • 2018-01-03
      • 1970-01-01
      • 2021-06-08
      • 2016-10-02
      • 1970-01-01
      • 2020-09-10
      相关资源
      最近更新 更多