使用域驱动设计,实例化的简单值对象/实体在哪里?
例如,如果我需要在服务类中创建一个简单的值对象,我是否只需要在值对象的类上调用new运算符,将其与服务类耦合?
可以根据域驱动设计在服务类中调用new运算符吗?
这些价值物品不能通过DI容器注入,因为它们简单,所以不保证使用工厂。
答案 0 :(得分:3)
直接从构造函数中实例化它们有什么问题?
通常,当实例化过程很复杂或者想要减轻客户选择具体类时,您只需要工厂。
然而,由于无处不在的语言在DDD中至关重要,因此聚合将具有工厂方法来创建与其相关的其他聚合,这是非常普遍的。
例如,不要像下面那样凭空产生项目任务:
var task = new Task(projectId, ...);
你可以这样做:
var task = project.addTask(...);
这表示"任务可以添加到项目"更好地使用案例,代价是必须加载Project
聚合。