flutter 清洁架构和存储库

2hh7jdfx  于 2023-11-21  发布在  Flutter
关注(0)|答案(1)|浏览(136)

最近我在做的Flutter项目,我决定使用Clean Architecture来采用一个功能驱动的架构。经过详细的软件设计,它非常适合逻辑的划分。
然而,这些天来,我对仓库的使用产生了一个问题。在一个使用Firestore的应用程序中,仓库是我与这些数据交互的层,在不同的功能上划分它们,同时仍然使用相同的集合,这是正确的吗?(不同部分由不同特征组成,但涉及相同的数据集合)。在工作结束时,我可能会发现几个代码相同的仓库类,即使它们属于不同的特性**。
澄清将不胜感激!提前感谢

o75abkj4

o75abkj41#

存储库是从外部数据源检索/管理数据的一个很好的模型。
这个模型是面向实体的。也许这就是促使你问这个问题的原因。我认为功能驱动设计并不要求所有东西都面向功能。我的意思是这个设计决定了你的领域层分类,但不是所有的。仅仅因为每个特性有一个处理程序并不意味着你必须多次重新编码存储库。存储库是基础架构层的一部分。它的接口可以共享如果您的应用程序上有多个域,则可以使用多个项目/模块。
在域层的某个地方(在要素类管理器中),您将使用存储库加载一些数据。您需要确保的是,您使用的是接口,而不是依赖于存储库实现(也许这对您来说已经很清楚了,只是为其他读者提供的一点)。
例如,您可以使用OrderReservationRepository中的IClientRepository来加载客户数据。
无论你使用哪种设计,你都会面临的困难是:

  • 这个仓库将返回什么结果?
  • 我应该只加载实体本身还是它的关系?

关于第一点,有几种方法:

  • 第一个也是我最喜欢的方法是返回一个DTO对象(只包含属性,没有方法的类)。如果需要,将这些类转换为域模型(域层下的类)。
  • 第二:有些开发人员更喜欢直接返回域模型,以减少数据Map。

对于第二点,我认为无论使用什么设计,它总是相同的难度:

  • 我应该加载实体及其关联实体吗?
  • 我是否应该只加载关联实体的标识符并执行延迟加载?
  • 我可以加载实体的聚合(任意连接)来减少数据加载时间并使事情变得更简单吗?

我的观点是,这取决于上下文。设计是用来让事情变得简单,而不是复杂化的。如果我在系统中完全使用存储库模型,并面对使用许多过滤器进行数据搜索的屏幕实现,我将随时使用自定义查询或存储过程来加载聚合数据,我不会因为模型的原因而使实现复杂化或使加载非常慢。我认为这里非常重要的一点是知道何时打破规则。没有模型可以解决所有问题。另外,一个模型通常只能解决一个问题
结论,在软件项目中,我们总是需要:

  • 实体满载=>慢速模式
  • 加载没有关联数据的实体(只有关系标识符)=>快速模式
  • 自定义数据加载(任意连接)=>自定义模式

好的设计将帮助您轻松区分这三种用途。

相关问题