0

我的 DDD 读数一直困扰着我。从我所见,似乎我的系统中每个给定的聚合根类型都只有存储库实例。

例如,考虑以下想象的情况作为更深领域模型的抽象:

在此处输入图像描述

当以“标准风格”编码时,我认为Owner我的系统中的每个都有自己的汽车集合,所以会有相同数量的Car集合(我应该称之为存储库吗?),因为有Owners。但是,如前所述,似乎在 DDD 中我应该在整个系统中只有一个 CarRepository(我已经看到了将它们作为静态类访问的示例),并且要执行简单的操作,例如将汽车添加Owner到应该使用域服务,对于简单的情况,这似乎不是非常友好的 API。

我在我的系统中只CarRepository实例化一个(单例)是对的,还是我错过了什么?我想争取类似的东西

public void an_owner_has_cars() throws Exception {
    Owner owner = new Owner(new OwnerId(1));
    CarId carId = new CarId(1);
    Car car = new Car(carId);
    owner.addCar(car);
    Assert.assertEquals(car, owner.getCarOf(carId));
}

但是如果不将存储库注入到Owner中,这似乎是不可能的,这似乎是一种被禁止的事情。

4

2 回答 2

2

存储库不代表属于另一个实体的集合。这个想法是它代表整个实体集合。

所以在你的例子Car中是一个实体,可能是一个聚合。所以你的模型在概念上是可以的,但你需要拆分和之间的紧密耦合CarOwner因为Owner它绝对是一个 AR,在你当前的模型中,删除它意味着属于它的所有汽车也应该被删除。

你可能追求的是这样的:

public class Owner {
    private IEnumerable<OwnedCar> cars;
}

public class OwnedCar {
    public Guid CarId { get; set; }
}

或者,作为 VO 的替代方案:

public class Owner {
    private IEnumerable<Guid> carsOwned;
}

所以一个 AR 不应该引用另一个 AR 实例。

另一点是您可能不想将存储库注入实体,因为这可能表明存在一些设计缺陷(有点代码味道)。

将拥有的汽车纳入 Owner 将是 the 的工作,OwnerRepository因为它是同一聚合的一部分。不会有,OwnedCarRepository因为它是一个值对象。

于 2013-08-26T04:58:03.693 回答
1

100% 肯定,除非您在不使用任何依赖项注入机制的遗留系统中工作,否则您不必制作单例 CarRepository。

如果您发现需要将 CarRepository 注入 Owner 以检索属于特定所有者的汽车,这可能暗示您应该重新建模那里的关系,例如:

public class Owner {

}

public class Car {
    private Owner owner;
}

并使用 CareRepository 来实现您的目标:

public interface CarRepository {
    List<Car> findBy(String onwer);
}

只是一个猜测,静态部分可能指的是 DomainEvents,比如:

public class Owner {

    public long quantityOfCarsOwned() {
        return DomainEvents.raise(new SumCarsEvent(this));//static 
    }
}

public class SumCarsEventHandler {
     private CarRepository carRepository;//inject this, SumCarsEventHandler should be a statless bean managed by container like spring

     public long handle(SumCarsEvent event) {
         return carRepository.countBy(event.getOwner());
     }

}

在非常简单的情况下,我认为它太复杂了。

于 2013-08-26T01:01:06.013 回答