Modelli di progettazione per limitare la logica del modulo trasversale

2

Ho un'applicazione web che ha un carrello con gli articoli del carrello. Gli articoli del carrello vengono aggiunti alla sessione utente, quindi devono essere serializzabili.

Ho una classe di checkout che prende gli articoli del carrello e li salva nel DB. Esistono tuttavia alcuni tipi speciali di articoli sul carrello che richiedono azioni di pre e post elaborazione, ad esempio uno dei miei articoli cart può essere un ticket evento, il che significa che dopo l'acquisto devo effettivamente generare e salvare il ticket.

La domanda è: come aggiungo la logica di un modulo (generazione di ticket) a un modulo completamente indipendente (carrello della spesa), garantendo al tempo stesso che il carrello acquisti non sia a conoscenza dell'esistenza della generazione di ticket, evitando così l'inquinamento del dominio.

Ad esempio:

interface ICartItem {
  int quantity;
  decimal amount;
  string name;

  // this interface has only checkout related
  // data, no ticket related data
}

class Checkout {

  void addCartItem(ICartItem cartItem) {
    session.cartItems.Add(cartItem);
  }

  void doCheckout() {
    foreach (var item in session.cartItems) {
      saveCartItem(item);

      // Now, somehow determine if the cart item is a 
      // ticket and if so save the ticket details
    }
  }
}

Nota:

Il mio piano di backup è questo:

interface ICartItem {
  int quantity;
  decimal amount;
  string name;

  // add ticket generation logic here and call it 
  // in the DoCheckout method
  void onCheckoutComplete();
}

Tuttavia, l'organizzazione per la quale sto facendo questo ha uno stack fatto di spaghetti e potrebbe essere difficile garantire che il metodo ICartItem onCheckoutComplete () venga chiamato in tutti gli scenari (presente e futuro).

    
posta Shane 24.02.2016 - 17:35
fonte

1 risposta

2

Cosa succede se invertite la logica? Invece di avere un metodo saveCartItem(item) , si chiama invece item.save() e si passa la connessione DB e qualsiasi altra risorsa di cui ha bisogno. Quindi l'oggetto può fare tutto ciò che è necessario e il tuo codice di pagamento non deve preoccuparsene.

    
risposta data 24.02.2016 - 19:26
fonte

Leggi altre domande sui tag