当前位置: 首页 > 知识库问答 >
问题:

在六边形体系结构的UI上显示数据

陶乐生
2023-03-14

我正在学习DDD和六角结构,我想我已经掌握了基本知识。然而,有一件事我不确定如何解决:我如何向用户显示数据?

例如,我得到了一个简单的域,其中包含一个带有某些功能的Worker实体(某些方法会导致实体更改)和一个WorkerRepository,这样我就可以持久化Worker了。我得到了一个应用程序层,其中包含一些命令和命令总线来操作域(比如创建员工和更新他们的工作时间,持久化更改),以及一个基础结构层,其中包含WorkerRepository的实现和一个GUI应用程序。

在这个应用程序中,我想用他们的一些数据显示所有工人,并修改他们。如何显示数据?

  1. 我可以参考WorkerRepository的实现。我认为这不是一个好的解决方案,因为这样我可以跳过命令总线在存储库中插入新的worker。我希望所有更改都通过命令总线。
  2. 那么好吧,我将把WorkerRepository拆分为WorkerQueryRepository和WorkerCommandRepository(按照CQRS),并且只引用WorkerQueryRepository。这仍然不是一个好的解决方案,因为回购还给工人实体,他们有方法来改变他们,这些改变将如何保持?
  3. 我应该创建两种类型的存储库吗?一个将用于域和应用程序层,另一个将仅用于向外部世界提供数据。第二个不会返回完整的Worker实体,只返回只包含GUI所需数据的WorkerDTOs。这样,GUI就没有其他方法来更改worker,只能通过命令总线。

第三种方法是正确的方法吗?或者我强迫更改必须通过命令总线是不是错了?

共有1个答案

唐彦
2023-03-14

我应该创建两种类型的存储库吗?一个将用于域和应用程序层,另一个将仅用于向外部世界提供数据。第二个不会返回完整的Worker实体,只返回只包含GUI所需数据的WorkerDTOs。

这就是CQRS方法;很管用。

格雷格·杨(2010)

你提议的工作的当前术语是“投影”。你经常会有不止一个;也就是说,您可以为GUI中工作人员的每个视图有一个单独的投影。(这样做的好处是使视图更容易--它不需要考虑给出的数据,因为数据已经被有效地格式化了)。

对此的另一种思考方式是,您有一个“只写”表示(聚合)和“只读”表示(投影)。在这两种情况下,都是从记录簿(通过存储库)中读取当前状态,然后使用该状态构造所需的表示。

由于读模型不需要保存,所以在读端考虑工厂而不是存储库可能会更好。(2009年,Greg Young出于同样的原因使用了“provider”。)

一旦您完成了分离这两个对象的第一步,您就可以开始独立地处理它们不同的用例了。

例如,如果需要扩展读取性能,您可以选择将记录册复制到一堆从副本中,并从从副本中装载投影工厂,而不是从主副本中装载投影工厂。或者开始探索不同的持久性存储(键值存储、图数据库、全文索引器)是否更合适。Udi Dahan在CQRS中回顾了许多这些想法--但不同(2015)。

“读取模型不需要保存”是不正确的。

它是正确的;但它可能没有那么明确和具体。

我们不需要创建读模型的持久表示,因为描述读模型实例之间差异的所有信息都已经被写入捕获。

我们经常希望缓存读模型(或它的表示),这样我们就可以在许多查询中分摊创建读模型的工作。各种折衷可能表明缓存的表示应该持久地存储。

但是如果一颗流星出现并破坏了我们的读取模型缓存,我们损失了工作投资,但我们不会损失信息。

 类似资料:
  • 服务->逻辑所在的位置(接口及其实现)。 实体->它们将在整个应用程序中使用。 Repository->基础结构层必须实现的接口。 基础结构层实现了存储库接口、JPA实体、对数据库的调用(hibernate)以及一些将JPA实体转换为核心实体的函数(映射器?)。 Spring data有一种非常有用的实现CRUD操作的方法: 但是,我认为如果我使用spring数据,如果UserRepository

  • 我正在将nTier架构迁移到六边形架构中。我的域现在定义得很好,我有所有基础设施依赖项的接口。查看数据库存储库,我有几个数据库,在下面的一侧有一个类实现每个repo。我的问题是关于数据库依赖项的正确方法是什么: 1-在域端有一个接口来处理数据访问,然后依赖于基础设施实现,并有一个类作为所有数据库存储库的入口点,就像一个facade,从那里调用所有存储库实现。这种方法与我在nTier应用程序中已经使

  • 我可以轻松地做0度和180度的旋转。我可以从旋转60度几次得到60度的其他倍数。 但我想不出一个算法来做到这一点。

  • 我使用预先训练好的mobilenet模型构建了Tensorflow Lite演示摄像头应用程序,如所述https://www.tensorflow.org/lite/convert/cmdline_examples. 据我所知,AndroidNNAPI(神经网络api)支持高通六边形数字信号处理器。如果可能的话,我想让Tensorflow Lite的演示应用程序在我手机上的六边形数字信号处理器芯片

  • 这对我来说是棘手的部分。我想实现的逻辑,但对我来说,在应用程序层实现这一点没有意义,因为持久性上下文在基础结构层(例如或)。但是,如果我正确理解六边形结构,我就不能直接在基础结构层实现接口,因为基础结构层不应该知道域层。 我错过了什么?