我有一个名为Person的聚合根。该人还有一个地址。这些类之间的关系是ManyToOne(许多人共享相同的地址)。
这意味着当我使用工厂创建具有特定地址的新Person时,我必须检查数据库中是否已存在相同的地址并为用户使用现有地址。
这要求我的工厂可以访问Address-Repository(或直接访问数据库)。这是允许的吗?如果没有,那么这样做会有什么更好的方法呢?
// EDIT 我现在的解决方案如下:
我有一个PersonService类,它拥有注册人的逻辑。方法register()
已经采用由AddressFactory创建的Address-Object。 Addressfactory可以访问AddressRepository来检查输入的地址是否已经存在。这是代码:
public class PersonService{
@Inject private PersonRepository pRepo;
public Person register(Name name,..., Address address){
//check if same person exists,
//create person, persist person
return person;
}
}
public class AddressFactory{
@Inject AddressRepository aRepo;
public Address create(String street, int number, ...){
//check if address with attribues exists in repo,
//if not create new address
return address;
}
}
在某些bean中,这个方法被调用如下:
personService.register(new Name("test"),..., addressFactory.create("Some street", 1,...))
您怎么看?
答案 0 :(得分:3)
这意味着当我创建一个具有特定地址的新Person时 使用工厂,我必须检查是否已存在相同的地址 数据库并为用户使用现有地址。
如果您遵循单一责任原则,那么您不应该这样做。 PersonFactory
不应该创建Addresses
,而是Persons
。
当Address
创建包含复杂的逻辑时更是如此,例如在数据库中检索类似于用户填写的地址的Address
(如果这真的是你想要的) 。您应该将其委托给另一个对象。
答案 1 :(得分:1)
是的,就个人的存储库(而不是人本身)使用工厂而言,这是一个有效的解决方案。
但是,您应该考虑在您的域模型中,Person是否确实需要其地址以确保业务不变量。如果没有,请从该人员中删除该地址,并使用专门为此类投射范围定义的PersonDTO。