天天看點

DDD中reconstitute的處理

在DDD中隻說了Domain由Repository來存儲,用的時候再reconstitute,但是這個方法寫在哪裡并沒有說清楚。考慮到有以下幾種情況:

  1. ParentRepository.retrieve(String id)能擷取ChildDomain
  2. Repository可能是一個遠端方法
  3. 在沒有Database的情況下使用DummyRepository

可以看到,2和3是沖突的。因為2希望Repository.save(ValueObject vo)而3傾向于Repository.save(Domain domain)。

另外對于1而言,要麼明确類型調用ChildRepository.retrieve,其中類型可以通過url來判斷。

總的來說希望一直系統Service通過調用ParentDomain.execute來處理,而不是明确的指向子類。

下面是幾種方案的處理

  • Repositoy

    想一直以父類角度操作需要完成以下兩個要求

    a. 使用繼承的一個前提是資料庫裡有一張表存有所有父類資料,進而不用再次路由到相應子類。這個可以通過Denormal時使用一張表存所有,或者postgresql的inherit來實作。

    b. 一次性擷取所有字段,包括子表專有字段。這種通過Denormal時使用一張表存所有或者postgresql的json來處理。

    c. 取出來後能明确的知道到底是哪個子類,這個要通過discriminator

    d. 一種最極端的做法就是直接将實作類放到資料庫的某個字段,然後直接用反射來生成相應對象。

  • Service

    如果由service來決定調用哪個實作類,那麼domain接口隻是起了作為規範的作用,不能起到屏蔽實作差異的效果。

  • Domain

    如果由domain interface來處理,好處是可以采用注冊的機制來擴充。缺點是入參與資料庫的存儲緊密聯系到了一起。domain按理說隻和vo關聯而不用和po聯系

  • Factory

    factory的處理有點歸一的味道,畢竟當初就是factory.create的,然後由factory處理reconstitute來處理。但是這樣factory又有點像為了彌補oo和db之間的鴻溝而采用的不優雅的方案。

結論

reconstitute應該由repository來處理:在repository得到po後交給factory的是po,factory通過discriminator來得到不同的domain

繼續閱讀