Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中,如何将域视图与域模型本身分离?_Java_Domain Driven Design - Fatal编程技术网

在java中,如何将域视图与域模型本身分离?

在java中,如何将域视图与域模型本身分离?,java,domain-driven-design,Java,Domain Driven Design,我如何将如何(甚至是否)查看域模型与视图本身的实现解耦。作为例子,考虑下面的代码: public class Student { private Set<Course> enrollment; public void enroll(Course c){ // domain implementation } public void unenroll(Course c) { // domain implementation

我如何将如何(甚至是否)查看域模型与视图本身的实现解耦。作为例子,考虑下面的代码:

public class Student
{
    private Set<Course> enrollment;
    public void enroll(Course c){
        // domain implementation
    }
    public void unenroll(Course c) {
       // domain implementation
    }

}
公共班级学生
{
私人设置注册;
公开无效注册(课程c){
//域实现
}
公共图书馆登记册(课程c){
//域实现
}
}
这是一个非常简单的例子,但它符合我的要求。确保此对象的视图与实际域功能解耦的好方法是什么?例如,这个学生应该能够用XML、JSON甚至某种游戏来表示,或者没有任何类型的视图

我想到的一些方法可能是:

@XmlRootElement(name="student")
public class StudentXmlView implements XmlView<Student> {

    @XmlElement(name="enrollment")  
    private XmlVeiw<Set<Course>> enrollmentView;
}
@XmlRootElement(name=“student”)
公共类StudentXmlView实现了XmlView{
@xmlement(name=“注册”)
私有XmlVeiw注册视图;
}

这种方法是否合适,或者java中是否有一些通常用于将域与其视图分离的最佳实践?

CQRS体系结构非常适合这种分离:它将写模型(DDD中的聚合)与读模型分离

write模型是专门设计用来保护关于状态更改的业务不变量的。它执行命令。无法查询

读取模型被设计为快速且适合特定用例。每个用例都有其他的读取模型。在这里,您可以使用任何最适合的技术

写模型和读模型之间不相等。您可以有3个写模型和1个读模型,或者任意组合

在微服务体系结构中,每个模型(写或读)都可以是一个微服务


CQRS之后的下一件事是事件源。

CQRS体系结构非常适合这种分离:它将写模型(DDD中的聚合)与读模型分离

write模型是专门设计用来保护关于状态更改的业务不变量的。它执行命令。无法查询

读取模型被设计为快速且适合特定用例。每个用例都有其他的读取模型。在这里,您可以使用任何最适合的技术

写模型和读模型之间不相等。您可以有3个写模型和1个读模型,或者任意组合

在微服务体系结构中,每个模型(写或读)都可以是一个微服务


CQRS之后的下一件事是事件来源。

CQRS非常适合this@ConstantinGalbenu是的,谢谢你,我只是和我想的一模一样。是的,有了CQRS,你可以有多少个阅读模型,即使聚合更多的write modelscqr也非常适合this@ConstantinGalbenu是的,谢谢你,我只是和我想的一模一样。是的,有了CQRS,你可以有多少个阅读模型,甚至聚合更多的写模型有一个问题:如果可以有任意数量的独立模型进行读写,那么如何使用意图揭示接口维护模型的功能?DDD似乎建议域的核心功能应该在域模型上维护,但是如果一个模型有多个版本作为CQR,您如何维护功能完整性?@TaylorHandy您没有相同概念的多个写模型,但只有一个。读取模型经过调整/拆分/重组,以更好地实现更快、更清晰地向用户显示数据的目的。写模型的设计是由域不变量和一致性需求驱动的。关于意图揭示界面:有什么比具有命令方法的编写模型更能揭示意图呢,比如
registerUser
生成
UserRegistered
事件和
registeredusercounter
读取模型中的
registeredusers
方法?哦,好的,这更有意义,谢谢。因此,在您的示例中,它将类似于注册用户的
UserRepository
,将
UserRegistered
事件推送到某个事件发布者,该事件发布者将看到并更新其计数。类似的东西?@TaylorHandy yesOne问题:如果你可以有任意数量的独立模型进行读写,你如何通过意图揭示接口维护模型的功能?DDD似乎建议域的核心功能应该在域模型上维护,但是如果一个模型有多个版本作为CQR,您如何维护功能完整性?@TaylorHandy您没有相同概念的多个写模型,但只有一个。读取模型经过调整/拆分/重组,以更好地实现更快、更清晰地向用户显示数据的目的。写模型的设计是由域不变量和一致性需求驱动的。关于意图揭示界面:有什么比具有命令方法的编写模型更能揭示意图呢,比如
registerUser
生成
UserRegistered
事件和
registeredusercounter
读取模型中的
registeredusers
方法?哦,好的,这更有意义,谢谢。因此,在您的示例中,它将类似于注册用户的
UserRepository
,将
UserRegistered
事件推送到某个事件发布者,该事件发布者将看到并更新其计数。像那样吗?@TaylorHandy是的