代码之家  ›  专栏  ›  技术社区  ›  user1727072

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

  •  4
  • user1727072  · 技术社区  · 13 年前

    我有一个聚合根,叫做Person。此人还有一个地址。这些类之间的关系是ManyToOne(许多人共享同一地址)。

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

    这要求我的工厂能够访问地址存储库(或直接访问数据库)。这是允许的吗?如果没有,还有什么更好的方法可以做到这一点?

    //编辑 我的解决方案如下:

    我有一个类PersonService,它包含注册一个人的逻辑。方法 register() 已经接受了一个由AddressFactory创建的地址对象。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 回复  |  直到 13 年前
        1
  •  4
  •   guillaume31    13 年前

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

    如果你严格遵守单一责任原则,你就不应该这样做。 PersonFactory 不应该创建 Addresses 但是 Persons .

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

        2
  •  1
  •   Community Mohan Dere    9 年前

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

    然而,您应该考虑,在您的域模型中,Person是否真的需要他们的地址来确保业务不变量。如果没有,请删除此人的地址并使用 PersonDTO 专门为这样的投影范围定义的。