由于我最近阅读了大量有关端口和适配器架构的内容,我偶然发现这段代码是按照上述架构构建的应用程序的一部分:
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 的依赖吗?持久化库?据我了解,领域层仅负责实现用例。我真的很困惑这种类型的架构中的域层实际上应该是什么。
我\xe2\x80\x99m 设计一个运输应用程序并尝试使用清洁架构。我\xe2\x80\x99m 试图找出在哪里保存Shipment 对象的状态,以便每次用户单击UI 中的按钮时\xe2\x80\x99t 都必须重新实例化一个新对象。这是流程。
\n\n发货对象的状态应该是 UI 控制器、用例交互器还是存储库上的实例变量吗?理想情况下,我想将其保存在某个地方,这样我就不需要每次用户单击 UI 上的按钮时都创建一个新对象。
\n\n先感谢您!
\ndomain-driven-design ddd-repositories hexagonal-architecture clean-architecture
根据 DDD 或六边形架构记录的推荐实践 - 域模型应该与与实际使用的技术(表/列名称、联接等、JPA 注释)更相关的数据模型表示分离。这里的一个实际问题是——如何在这个模型中进行诸如乐观版本控制之类的事情?假设您有一个域服务,可以在域模型上读取-->更新-->保存。现在,JPA 实体可能有一个无法向上传递的版本列。因此,当保存调用到达存储库并且存储库本质上再次进行(模型->实体)转换和读取+更新时,它将无法判断最初读取的是实体的哪个版本。
第二个问题是对此的性能考虑,涉及这里的一些额外阅读
dns domain-driven-design jpa hexagonal-architecture onion-architecture
我试图通过一个例子来理解六边形架构Repository。在此设置中,我有以下几层:框架(基础设施)-> 应用程序-> 域。
我User在域部分,假设我想验证User是否通过DuplicateUsernameValidator. 为了获取此信息,我需要从某处获取此信息。我在领域层又添加了一个接口UserRepository,这样在上面的层就可以解决了。
这对我来说是棘手的部分。我想实现 的逻辑UserRepository,但对我来说在应用程序层实现这个没有意义,因为持久化上下文位于基础设施层(例如JdbcUserRepository或JpaUserRepository)。但是,如果我正确理解六边形结构,我就无法UserRepository直接在基础设施层中实现接口,因为基础设施层不应该知道域层。
我缺少什么?
我有一个关于六边形架构和 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) 给定一个ReceiptValidator接口和一个返回多个数据的GoogleReceiptValidator实现,我应该在哪里放置ReceiptValidatorResult?
由于它与ReceiptValidator相关,因此可以将其放置在 Domain Layer 中。
但是,如果另一个AppleReceiptValidator有不同的数据怎么办?ReceiptValidatorResult也应该是一个接口吗?