Domain driven design 域模型工厂可以调用存储库吗?

Domain driven design 域模型工厂可以调用存储库吗?,domain-driven-design,factory,Domain Driven Design,Factory,在我们的DDD项目中,我们使用工厂来创建初始聚合根模型“订单”。有一条业务规则规定,新订单有其供应商的订单。供应商默认为特定供应商。我们需要从数据库中获取默认供应商 在创建初始订单以获取默认值时,可以调用订单工厂中的供应商存储库吗?我知道工厂的目的是在有效状态下创建模型。有效的新状态需要设置默认值。在这种情况下,我是否可以调用存储库,还是应该将默认供应商传递给工厂构造函数?您的问题的简单答案是,简单地说,是。您的问题的简单答案是,简单地说,是。它可以,并且有一个非常具体的情况,工厂需要调用存储库

在我们的DDD项目中,我们使用工厂来创建初始聚合根模型“订单”。有一条业务规则规定,新订单有其供应商的订单。供应商默认为特定供应商。我们需要从数据库中获取默认供应商


在创建初始订单以获取默认值时,可以调用订单工厂中的供应商存储库吗?我知道工厂的目的是在有效状态下创建模型。有效的新状态需要设置默认值。在这种情况下,我是否可以调用存储库,还是应该将默认供应商传递给工厂构造函数?

您的问题的简单答案是,简单地说,是。

您的问题的简单答案是,简单地说,是。

它可以,并且有一个非常具体的情况,工厂需要调用存储库。例如,当ORM生成聚合标识时,存储库将公开如下方法

class SomeRepository {
    ...
    Identity Generate();
    ...
}

如果聚合构造足够复杂,需要一个专门的工厂,那么从工厂调用“Generate”是很自然的。

它可以,并且有一个非常特殊的情况,工厂需要调用存储库。例如,当ORM生成聚合标识时,存储库将公开如下方法

class SomeRepository {
    ...
    Identity Generate();
    ...
}

如果聚合构造足够复杂,需要一个专门的工厂,那么从工厂调用“Generate”是很自然的。

+1,因为工厂或域服务可以访问repositor

但是

-1关于:

我认为这与域名无关。我认为这是一条申请规则

和我一起思考:如果企业现在决定默认供应商将是另一个供应商,该怎么办。这是一个需要改变你所从事的业务的规则吗?这需要改变你们的工厂吗?可以吗

请记住:域指向“我们从事的业务”而不是“我们如何开展业务”

我宁愿把它放在应用程序服务上。域不需要知道是否存在默认供应商。无论发生什么,它都可能需要一个“供应商”

订单可能有一个构造器,比如订单(供应商)->将强制na订单有一个供应商

或者工厂可以通过其方法接收默认供应商ID

但域名永远不应该知道这件事。我认为这不适合那里


Bruno

+1,因为工厂或域服务可以访问repositor

但是

-1关于:

我认为这与域名无关。我认为这是一条申请规则

和我一起思考:如果企业现在决定默认供应商将是另一个供应商,该怎么办。这是一个需要改变你所从事的业务的规则吗?这需要改变你们的工厂吗?可以吗

请记住:域指向“我们从事的业务”而不是“我们如何开展业务”

我宁愿把它放在应用程序服务上。域不需要知道是否存在默认供应商。无论发生什么,它都可能需要一个“供应商”

订单可能有一个构造器,比如订单(供应商)->将强制na订单有一个供应商

或者工厂可以通过其方法接收默认供应商ID

但域名永远不应该知道这件事。我认为这不适合那里


布鲁诺

谢谢。从技术上讲,通过初始化供应商和不设置默认值,对象仍然有效。我不确定这是否是正确的位置。我倾向于让应用程序服务调用存储库并将所需数据传递给工厂。这可以减少耦合并增强SRP。不要吹毛求疵,但我不会将其放在应用程序服务中,而是放在体现用例的域服务中(如果不希望依赖工厂中的存储库)。但总而言之,我们现在谈论的是细节、个人体验和便利。谢谢。从技术上讲,通过初始化供应商和不设置默认值,对象仍然有效。我不确定这是否是正确的位置。我倾向于让应用程序服务调用存储库并将所需数据传递给工厂。这可以减少耦合并增强SRP。不要吹毛求疵,但我不会将其放在应用程序服务中,而是放在体现用例的域服务中(如果不希望依赖工厂中的存储库)。但总而言之,我们现在谈论的是细节、个人体验和便利。