DDD - 存储库模式返回数据库密钥?

时间:2009-07-09 21:59:55

标签: ddd-repositories

这里有一个很大的设计缺陷,但我在解决它时遇到了麻烦:

业务需求有点牵扯,所以我会尽量保持这一点。 我们有一张购物表和一张退货表。返回时,我们必须找到返回db中最早购买的匹配项,并将其记录在“已应用的返回”表中。

因此,当我在该交易中插入退货时,我需要将退货应用于购买记录。

现在,我们有一个服务调用插件的存储库。服务需要知道插入记录的密钥是什么,以便它可以通过使用该密钥插入“应用”记录来完成事务。

我们基本上被卡住了,因为我的理解是存储库不应该返回这种数据。难道这不会破坏存储库作为集合的想法吗?

有什么替代方案?

澄清:

我们有一个Purchase表,一个Return表和一个Applied表

应用的表格如下所示 purchaseId returnId qtyReturned

因此,当插入时,我需要购买的ID(由某些业务规则决定)和新插入的返回的id。

1 个答案:

答案 0 :(得分:1)

我想根据你的问题提出以下建议:

public class Purchase {

   // ReturnRepository plays the role of collaborator
   public Return returnMe(PurchaseRepository purchaseRepository, int quantity) {
       return purchaseRepository.returnPurchase(this, quantity);
   }

}


public class PurchaseRepositoryImpl implements PurchaseRepository {

    // returnd Purchase object has its id set up
    public Purchase getOldestPurchase() {
        // logic in order to get oldest purchase
    }

    public Return returnPurchase(Purchase purchase, quantity) {
        // logic in order to save a return record
        // Some ORM frameworks returns ids when a record is saved. In my case, Hibernate or NHibernate (.NET) fulfill ths requirement

        // Then purchaseId, returnId and quantity is saved in "returns applied" table
    }

}


public class PurchaseServiceImpl implements PurchaseService {

   // Injected through dependency injection
   private PurchaseRepository purchaseRepository;

   // Spring transaction boundary, for example
   // Notice returnPurchase method returns a Return object
   public Return returnPurchase(int quantity) {
       Purchase purchase = purchaseRepository.getOldestPurchase();

       return purchase.returnMe(purchaseRepository, quantity);
   }

}