我正在学习DDD和六角结构,我想我已经掌握了基本知识。然而,有一件事我不确定如何解决:我如何向用户显示数据?
例如,我得到了一个简单的域,其中包含一个带有某些功能的Worker实体(某些方法会导致实体更改)和一个WorkerRepository,这样我就可以持久化Worker了。我得到了一个应用程序层,其中包含一些命令和命令总线来操作域(比如创建员工和更新他们的工作时间,持久化更改),以及一个基础结构层,其中包含WorkerRepository的实现和一个GUI应用程序。
在这个应用程序中,我想用他们的一些数据显示所有工人,并修改他们。如何显示数据?
第三种方法是正确的方法吗?或者我强迫更改必须通过命令总线是不是错了?
我应该创建两种类型的存储库吗?一个将用于域和应用程序层,另一个将仅用于向外部世界提供数据。第二个不会返回完整的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的演示应用程序在我手机上的六边形数字信号处理器芯片
这对我来说是棘手的部分。我想实现的逻辑,但对我来说,在应用程序层实现这一点没有意义,因为持久性上下文在基础结构层(例如或)。但是,如果我正确理解六边形结构,我就不能直接在基础结构层实现接口,因为基础结构层不应该知道域层。 我错过了什么?