4

这里有一个很大的设计缺陷,但我无法解决它:

业务需求有点涉及,所以我会尽量保持简单。我们有一张购买表和一张退货表。当进行退货时,我们必须在数据库中找到返回最旧购买的匹配项,并将其记录在“已应用退货”表中。

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

就目前而言,我们有一个服务调用存储库以进行插入。服务需要知道插入记录的键是什么,以便它可以通过使用该键插入“已应用”记录来完成事务。

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

什么是替代方案?

澄清:

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

申请的表看起来像这样 purchaseId returnId qtyReturned

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

4

1 回答 1

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);
   }

}
于 2009-07-10T05:14:28.247 回答