这里有一个很大的设计缺陷,但我在解决它时遇到了麻烦:
业务需求有点牵扯,所以我会尽量保持这一点。 我们有一张购物表和一张退货表。返回时,我们必须找到返回db中最早购买的匹配项,并将其记录在“已应用的返回”表中。
因此,当我在该交易中插入退货时,我需要将退货应用于购买记录。
现在,我们有一个服务调用插件的存储库。服务需要知道插入记录的密钥是什么,以便它可以通过使用该密钥插入“应用”记录来完成事务。
我们基本上被卡住了,因为我的理解是存储库不应该返回这种数据。难道这不会破坏存储库作为集合的想法吗?
有什么替代方案?
澄清:
我们有一个Purchase表,一个Return表和一个Applied表
应用的表格如下所示 purchaseId returnId qtyReturned
因此,当插入时,我需要购买的ID(由某些业务规则决定)和新插入的返回的id。
答案 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);
}
}