标签: hexagonal-architecture

端口和适配器架构中的域模型实际上是什么?

由于我最近阅读了大量有关端口和适配器架构的内容,我偶然发现这段代码是按照上述架构构建的应用程序的一部分:

package com.example.user.management;

import lombok.*;

import javax.persistence.*;
import java.io.Serializable;

@Table(name = "user")
@AllArgsConstructor
@Data
@NoArgsConstructor
@javax.persistence.Entity
@Setter
@Getter
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class User implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private Long id;

    @Column(name = "username")
    private String username;

    @Column(name = "password")
    private String password;

    @Column(name = "role")
    private String role;

    public User(String username, String password, String role) {
        this.username = username;
        this.password = password;
        this.role = role;
    }

}
Run Code Online (Sandbox Code Playgroud)

由于端口和适配器架构的主要目的是将域层与任何技术细节和实现分离和隔离,并记住这个用户实体实际上是域层,它不包含对 java 的依赖吗?持久化库?据我了解,领域层仅负责实现用例。我真的很困惑这种类型的架构中的域层实际上应该是什么。

architecture design-patterns hexagonal-architecture

5
推荐指数
1
解决办法
2119
查看次数

DDD 存储库可以是有状态的吗?

我\xe2\x80\x99m 设计一个运输应用程序并尝试使用清洁架构。我\xe2\x80\x99m 试图找出在哪里保存Shipment 对象的状态,以便每次用户单击UI 中的按钮时\xe2\x80\x99t 都必须重新实例化一个新对象。这是流程。

\n\n
    \n
  1. 用户在 UI 中输入送货号码
  2. \n
  3. UI 控制器处理 UI 事件并实例化用例交互器的实例\n a。存储库实例被传递到用例交互器的构造函数中
  4. \n
  5. 用例交互器通过调用工厂(例如CREATE_BY_DELIVERY)来实例化Shipment 的实例。工厂调用Repository从数据库收集数据。
  6. \n
  7. 交付数据填充在 UI 上
  8. \n
  9. 然后用户单击“报价”按钮
  10. \n
  11. UI 控制器处理按钮单击事件并调用用例交互器的 RATE_QUOTE 方法\na。用例交互器是否需要像步骤 #3 中那样再次调用 Shipment 工厂,或者用例交互器是否可以获得步骤 #3 中已创建的 Shipment 对象的实例?
  12. \n
  13. 费率显示在 UI 上
  14. \n
  15. 然后用户单击“处理发货”按钮
  16. \n
  17. UI 控制器处理按钮单击事件并调用用例交互器的 PROCESS_SHIPMENT 方法\na。用例交互器是否需要像步骤 #3 中那样再次调用 Shipment 工厂,或者用例交互器是否可以获得步骤 #3 中已创建的 Shipment 对象的实例?
  18. \n
\n\n

发货对象的状态应该是 UI 控制器、用例交互器还是存储库上的实例变量吗?理想情况下,我想将其保存在某个地方,这样我就不需要每次用户单击 UI 上的按钮时都创建一个新对象。

\n\n

先感谢您!

\n

domain-driven-design ddd-repositories hexagonal-architecture clean-architecture

4
推荐指数
1
解决办法
1771
查看次数

Jpa 实体作为域模型

根据 DDD 或六边形架构记录的推荐实践 - 域模型应该与与实际使用的技术(表/列名称、联接等、JPA 注释)更相关的数据模型表示分离。这里的一个实际问题是——如何在这个模型中进行诸如乐观版本控制之类的事情?假设您有一个域服务,可以在域模型上读取-->更新-->保存。现在,JPA 实体可能有一个无法向上传递的版本列。因此,当保存调用到达存储库并且存储库本质上再次进行(模型->实体)转换和读取+更新时,它将无法判断最初读取的是实体的哪个版本。
第二个问题是对此的性能考虑,涉及这里的一些额外阅读

dns domain-driven-design jpa hexagonal-architecture onion-architecture

4
推荐指数
1
解决办法
1067
查看次数

带存储库的六边形架构

我试图通过一个例子来理解六边形架构Repository。在此设置中,我有以下几层:框架(基础设施)-> 应用程序-> 域。

User在域部分,假设我想验证User是否通过DuplicateUsernameValidator. 为了获取此信息,我需要从某处获取此信息。我在领域层又添加了一个接口UserRepository,这样在上面的层就可以解决了。

这对我来说是棘手的部分。我想实现 的逻辑UserRepository,但对我来说在应用程序层实现这个没有意义,因为持久化上下文位于基础设施层(例如JdbcUserRepositoryJpaUserRepository)。但是,如果我正确理解六边形结构,我就无法UserRepository直接在基础设施层中实现接口,因为基础设施层不应该知道域层。

我缺少什么?

hexagonal-architecture

2
推荐指数
1
解决办法
6129
查看次数

六边形架构和 DDD

我有一个关于六边形架构和 DDD 的问题

是否允许从作为参数传递给适配器的持久适配器调用域逻辑?

例子:

class DomainService(private val repositoryPort: RepositoryPort,
                    private val domainService2: DomainService2) {
  fun doSomething(id: String?) {
    repositoryPort.doSomething(id) {
      id: String? ->
      domainService2.doSomething2(id)
    }
    println("Doing something")
  }
}

class DomainService2 {
  fun doSomething2(id: String?) {
    println("Doing something$id")
  }
}

interface RepositoryPort {
  fun doSomething(id: String?, consumer: (id: String?) -> Unit)
}

class RepositoryAdapter : RepositoryPort {
  override fun doSomething(id: String?, consumer: (id: String?) -> Unit) {
    println("checking something, searching in database")
    consumer.invoke(id) // Is it allow here to …
Run Code Online (Sandbox Code Playgroud)

domain-driven-design hexagonal-architecture kotlin

2
推荐指数
1
解决办法
4104
查看次数

我应该将课程结果放在 DDD 中的哪里?

给定一个ReceiptValidator接口和一个返回多个数据的GoogleReceiptValidator实现,我应该在哪里放置ReceiptValidatorResult

由于它与ReceiptValidator相关,因此可以将其放置在 Domain Layer 中。

但是,如果另一个AppleReceiptValidator有不同的数据怎么办?ReceiptValidatorResult也应该是一个接口吗?

domain-driven-design hexagonal-architecture

0
推荐指数
1
解决办法
590
查看次数