2009-07-09 25 views
4

这里有一个很大的设计缺陷,但我在解决它时遇到了问题:DDD - Repository模式返回数据库密钥?

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

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

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

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

什么是替代方案?

澄清:

我们有一个购买表,返回表和应用表

施加的表看起来像这样 purchaseId returnId qtyReturned

所以,当了一回是插入我需要购买的ID(由一些商业规则决定)和新插入的回报的ID。

回答

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

} 
+0

嗨亚瑟,这个感谢。我想我知道你要去哪里,但是请看我上面的说明。我如何处理需要插入返回的ID以便插入到应用表中? – jlembke 2009-07-10 17:47:10