1

Je travaille sur le domaine du système de gros. Lorsque certains produits sont livrés, le domaine NewProductsDeliveredEvent est déclenché. L'événement contient un ensemble d'objets de valeur ProductDelivery contenant le code et la quantité du produit. Quelque chose comme ci-dessous:Référentiel et mise à jour en vrac - éviter les allers-retours de base de données

class NewProductsDeliveredEvent { 
    Set<ProductDelivery> productDeliveries; 
} 

class ProductDelivery { 
    ProductCode productCode; 
    Quantity quantity 
} 

Jusqu'ici tout va bien. Maintenant, lorsque le composant responsable des mises à jour d'inventaire reçoit ce type d'événement. Il doit mettre à jour la table des produits avec la quantité actuelle de produits disponibles. J'ai donc quelque chose comme ça:

class NewProudctsDeliveredHandler { 
    ProductRepository productRepo; 

    handle(NewProductDeliveryEvent event) { 
    for (ProductDelivery delivery : event.getProductDeliveries()) { 
     Product product = productRepo.getByCode(delivery.getProductCode()) 
     product.updateQuantity(delivery.getQuantity()); 
    } 
    } 
} 

Il est facile de repérer que cette logique génère beaucoup de DB et je roundtrips penser à une solution pour soulager la douleur. Une idée pourrait être d'utiliser le modèle Specification et de construire une spécification OU pour les codes de produit. Cependant, dans mon application, le code produit est un identifiant d'entreprise, donc cette solution sent un peu (peut-être que j'exagère).

Y a-t-il une meilleure façon de le gérer? Toutes les idées grandement appréciées.

+1

Pourquoi ne pas simplement productRepo.getByCodes (...)? – gseric

+0

parce que je n'ai jamais vu un référentiel avec une telle méthode et pour moi il semble comme un défaut de conception (mais bien sûr, ce serait la solution la plus simple;)) –

+0

Que fait "product.updateQuantity (delivery.getQuantity());" faire? mettre à jour l'inventaire? – Hippoom

Répondre

3

Si vous autorisez une légère digression, mais êtes-vous sûr que la mise à jour groupée est une bonne idée dans votre cas?

Le produit est un agrégat de haute contaction s'il gère l'inventaire. Imaginez seulement que des centaines de personnes passent des commandes pour le même produit en même temps sur Amazon.com, alors que peu de gens modifieront votre commande en même temps.

Prenons un exemple:

 
    Event1: A-5, B-1 
    Event2: C-1, D-2 
    Event3: A-2, D-3 

Event1 conflits avec event3, conflits event2 avec event3

Le plus produit que vous mettez à jour dans une transaction, la plus grande chance d'une défaillance de la concurrence si vos produits se vendent bien . L'itération d'un produit par transaction est encore pire, rendant l'événement plus difficile à réessayer. Peut-être que diviser l'événement en plusieurs sous-événements qui déclenchent une seule mise à jour du produit est plus approprié.

+0

Très bon point! Un grand merci, j'ai juste oublié cet aspect. Je savais qu'il y avait quelque chose de mal avec repo.getById (IDs ...) :) –

+1

@ woof-woof Je crois que la mise à jour en vrac est encore userful dans certaines situations, cela dépend de votre domaine. J'ai travaillé sur un projet de réservation pour plusieurs années, et nous mettons à jour la commande et le produit en une seule transaction. Cela fonctionne bien parce que la plupart des commandes proviennent des canaux de marketing de b2b (bureau de vente, agents) et le rendement n'est pas très élevé. – Hippoom

Questions connexes