【问题标题】:Avoid using persitence layer on model for aggregate children避免在模型上为聚合子代使用持久层
【发布时间】:2020-02-09 10:23:49
【问题描述】:

问题

假设以下 DDD 模型。

class Building {
    Room[] rooms

    addRoom(String name)  {
        room = new Room(name) // Model
        db.create(room)       // Persistence!!!
        rooms.add(room)       // Model
    }
}

class Room {
    String name
}

我们可以看到BuildingAR,负责创建它的聚合Room。我的问题是当我尝试按照 CRUD 模型在数据库中 Create Room 时。在某个时刻,可以创建一个房间,所以我的模型会调用Building,它会创建Room。但是,我的模型不应该使用持久层。

注意你可以添加房间,也就是说你可以在数据库中有一个Building与实际模型不一致。所以我也必须更新我的Building

如果我将 CreationRoom 的数据库移到模型之外,那么,当我 更新 我在数据库中的 Building 时,Room必须已经存在于数据库中。但RoomBuilding 的聚合子级,不应由Building 以外的类访问。

问题

如何在模型外部的数据库中创建 Room,将Room 作为聚合子级?

【问题讨论】:

标签: java domain-driven-design persistence crud


【解决方案1】:

如果您使用 DDD,请查看存储库模式 - 持久性和数据库交互如何工作应该很明显。

简单地说,存储库负责检索和存储聚合作为一个整体。

在您的情况下,您将有一些 CrudRepository<Building> 与数据库交互并存储建筑物,级联所有房间。

这里有一点需要注意:仅两种对象类型之间的组合可能不足以要求将建模作为聚合。如果不存在不变量并且不需要事务一致性,它们也可能是两个不同的聚合(通过 ID)相互引用

【讨论】:

    【解决方案2】:

    在您的场景中,如果我没记错的话,Building聚合根,它包含 Room 实体 的集合(请记住聚合本身也是一个实体)。

    如下所示的存储库应该负责聚合根的持久性操作(例如,创建、查找、更新等),即Building

    public interface Repositoy<Building> {
    
        Building findById(String buildingId);
    
        void store(Building building);
    }
    

    您已正确指出域操作(例如,在您的情况下添加空间)必须通过聚合根进行。但是,聚合根(或任何其他实体)不得承担持久性责任(如您所说:db.create(room))。

    客户端通过域服务应用服务与域交互。反过来,它们通过其存储库检索聚合根,进行必要的修改,并将整个聚合存储在单个事务中。因此,在每笔成功的交易中,您始终拥有一个一致的聚合,其子项在数据库中,无需担心缺少父项、子项等。

    public class SomeDomainOrApplicationService {
    
        private Repositoy<Building> repository;
    
        public void createRoomServiceMethod(String buildingId) {
    
            // retrieve aggregate root
            Building building = repository.findById(buildingId);
    
            // modify aggregate
            String roomName; // assign room name
            building.addRoom(roomName);
    
            // store aggregate
            repository.store(building);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-08-06
      • 1970-01-01
      • 2013-01-27
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-26
      相关资源
      最近更新 更多