2

我的域对象可以在需要时使用工厂方法或工厂层吗?

我一直在尝试让客户端代码在任何存在的地方创建和注入依赖项,但似乎这并不总是正确的做法。在这里的这个问题中,例如,在哪里检查域对象中的强制属性?,一个用户可以拥有多个宠物;没有用户,宠物就无法存在。

我一直在尝试创建一个宠物,然后将其添加到用户的集合中,但问题是为了创建宠物,我需要提供用户(这违背了拥有User::addPet(ConcretePet)方法的目的)。

我宁愿做的是有一个User::addPet()接受参数数组的方法,然后使用工厂或工厂方法创建 Pet。这合理吗?

编辑:另一个场景

这是另一种情况,我希望我的域模型访问工厂。如果我的用户需要他们拥有的每个 Pet 的 License 对象,那么在 User::addPet(ConcretePet) 方法中创建它是否有意义?当然我可以在服务层创建许可证,但这又意味着将业务逻辑从域中移除!

4

1 回答 1

0

如果一个宠物没有它的用​​户就不能存在,这并不意味着一个用户没有宠物就可以存在。

问题是宠物是否需要它的用户,反之亦然。我几乎可以考虑两者都单独存在,交叉引用它们可能是一个好主意,也可能不是一个好主意,具体取决于问题。一般来说,我会说它不太好,因为它意味着用户可以与宠物互动,而宠物可以与用户互动,并且两种互动都会触发反向互动,从而导致死循环。

一个更安全的解决方案是拥有一个包含用户和宠物并指导它们之间的所有交互的对象:用户-宠物-关系。

如果您声明不能注入对象依赖项,那么您做错了什么。如果你想注入一个工厂,你将使用服务定位器反模式,这是另一个应该避免的代码异味。

我宁愿做的是有一个接受参数数组的 User::addPet() 方法,然后使用工厂或工厂方法创建 Pet。这合理吗?

它不是。此函数内部没有比外部更多的信息。所有宠物参数确实存在,并且您拥有用户对象。您还需要什么来创建与用户有关系的宠物,然后将该宠物添加给用户?

于 2013-07-12T07:20:45.917 回答