DDD - 是否允许工厂访问存储库?

时间:2013-04-08 09:23:51

标签: domain-driven-design java-ee-6

我有一个名为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,...))

您怎么看?

2 个答案:

答案 0 :(得分:3)

  

这意味着当我创建一个具有特定地址的新Person时   使用工厂,我必须检查是否已存在相同的地址   数据库并为用户使用现有地址。

如果您遵循单一责任原则,那么您不应该这样做。 PersonFactory不应该创建Addresses,而是Persons

Address创建包含复杂的逻辑时更是如此,例如在数据库中检索类似于用户填写的地址的Address(如果这真的是你想要的) 。您应该将其委托给另一个对象。

答案 1 :(得分:1)

是的,就个人的存储库(而不是人本身)使用工厂而言,这是一个有效的解决方案。

但是,您应该考虑在您的域模型中,Person是否确实需要其地址以确保业务不变量。如果没有,请从该人员中删除该地址,并使用专门为此类投射范围定义的PersonDTO