DDD - Шаблон репозитория, возвращающий ключи базы данных? - PullRequest
4 голосов
/ 10 июля 2009

Здесь есть большой недостаток дизайна, но у меня проблемы с его устранением:

Потребность бизнеса немного сложна, поэтому я постараюсь сделать это проще. У нас есть таблица с покупками и таблица для возвратов. Когда производится возврат, мы должны найти соответствие, возвращающее самую старую покупку в БД, и записать это в таблицу «возврат применен».

Итак, когда я вставляю Возврат, в рамках этой транзакции мне нужно применить возврат к записи о покупке.

В нынешнем виде у нас есть служба, которая вызывает хранилище для вставки. Служба должна знать, что является ключом этой вставленной записи, чтобы она могла завершить транзакцию, вставив «примененную» запись с использованием этого ключа.

Мы в основном застряли, потому что, насколько я понимаю, репозиторий не должен возвращать такого рода данные. Разве это не противоречит идее о том, что хранилище является коллекцией?

Какая альтернатива?

РАЗЪЯСНЕНИЯ:

У нас есть таблица покупок, таблица возврата и таблица Applied

Применяемая таблица выглядит следующим образом buyId returnId qtyReturned

Поэтому, когда возврат вставлен Мне нужен идентификатор покупки (определяется некоторыми бизнес-правилами) и идентификатор недавно вставленного возврата.

1 Ответ

1 голос
/ 10 июля 2009

Я полагаю следующее по вашему вопросу:

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

}
...