2012-04-30 18 views
6

Attualmente sto lavorando su un sito di e-commerce e c'è una funzionalità che non sono molto sicuro di come implementare. La maggior parte delle volte basta aggiungere prodotti al carrello e comprarli, probabilmente è il flusso di lavoro più semplice. Quello che sto chiedendo è un po 'diverso, e se ci fosse un limite di tempo per un prodotto da acquistare? Voglio dire che alcuni siti ti danno un limite di tempo esatto per comprare un prodotto (come Soccer Manager), in quei siti non puoi tenere un prodotto per sempre, c'è un limite di 15 minuti per esso e se non lo compri in quel periodo, l'oggetto sarà essere rilasciato dal carrello. (e molto probabilmente qualcun altro ci salterà sopra)Come eseguire processi in background in un sito ASP.NET MVC 3?

Ora, come programmatore ASP.NET MVC mi piacerebbe implementare questa funzione, ma come ho detto, non sono sicuro di come farlo. Penso che quando aggiungo l'articolo al carrello ho bisogno di tenere il tempo (qualcosa come ItemAddedAt) e ho bisogno di rilasciare quell'elemento in x minuti, quindi qualcosa deve essere eseguito x minuti dopo per rilasciare quel prodotto. Pensando globalmente, penso di aver bisogno di un servizio, quando aggiungo un articolo, devo anche iscrivermi a questo servizio e il servizio esegue un timer/lavoro in background. Quello che non so/non ho esperienza è questa parte, come farlo in un progetto ASP.NET MVC, c'è un progetto, articolo, libreria o qualcosa del genere?

Naturalmente non so se la mia logica è giusta per questo problema, ho bisogno di una guida, se possibile, qualche codice sorgente su cui lavorare.

risposta

4

AFAIK non esiste un modo standard per dichiarare/programmare attività all'interno di un progetto MVC. Il modo consigliato per ottenere ciò che si desidera è creare un nuovo progetto Applicazione console all'interno della soluzione e utilizzare l'Utilità di pianificazione di Windows per eseguire ogni X minuti, rilasciando tutti i prodotti che sono stati più di X minuti in qualsiasi carrello.

Per far funzionare questo, è necessario fare riferimento al progetto MVC da quello nuovo (per accedere a tutti i modelli) o, ancora meglio, creare un progetto Libreria di classi, spostare le classi del modello/database lì e fare riferimento ai progetti MVC e Console.


Detto questo, non v'è in realtà un piccolo "hack" che può essere utilizzato per ottenere i compiti programmati in un progetto MVC. È possibile utilizzare il seguente codice:

HttpContext.Current.Cache.Add("Task", "1", null, 
      DateTime.MaxValue, TimeSpan.FromMinutes(5), 
      CacheItemPriority.Normal, new CacheItemRemovedCallback(CheckCarts)); 

Quella linea, che potremmo definire, ad esempio, dal Global.asax, sarebbe aggiungere una voce "Attività" per la cache. Il valore memorizzato ("1") non è importante, l'importante è che la voce della cache scada tra cinque minuti e, quando è scaduta, chiama il metodo "CheckCarts" (definito nel Global.asax o nella classe dove si esegue questo codice).

public void CheckCarts(string key, object value, CacheItemRemovedReason reason) { 
    // Insert your code here to check for expired carts 
    (...) 

    // We add the entry again to the cache, so that this method will be called again in 5 minutes. 
    HttpContext.Current.Cache.Add("Task", "1", null, 
      DateTime.MaxValue, TimeSpan.FromMinutes(5), 
      CacheItemPriority.Normal, new CacheItemRemovedCallback(CheckCarts)); 
} 

Quando la cache scade, il metodo CheckCarts si chiama, il codice fa tutto quello che ha a che fare, e alla fine si aggiunge alla cache di nuovo, di essere chiamato in altri 5 minuti.

+0

Prima di tutto, grazie per la spiegazione dettagliata ^^ Penso che non preferirò l'Utilità di pianificazione di Windows perché da quello che ho capito, se uso l'Utilità di pianificazione in quel modo, ho bisogno di eseguire quel servizio con periodi molto brevi o ci saranno grandi intervalli di tempo tra la data di scadenza e il successivo periodo di esecuzione pianificato. IMHO la tua seconda soluzione è più eccitante perché ti dà un trigger preciso e sembra possa essere facilmente implementata ma c'è una domanda nella mia mente, CacheItemRemovedCallback è abbastanza affidabile da poter essere utilizzato in questo tipo di soluzioni? –

+0

questo tipo di implementazione ricorsiva potrebbe anche funzionare, ma ho immediatamente iniziato a preoccuparmi della dimensione dello stack delle chiamate in questo caso –

+0

@ArtemNikolov Abbiamo effettivamente utilizzato quel codice per la stessa identica ragione (attualmente sta lavorando in un e-commerce, per liberando azioni), ed è in corso da circa 4 anni, quindi suppongo di sì :) – salgiza

3

Questo scenario emette solo il segnale R. Ti permetterebbe di fare ciò che stai chiedendo in un modo semplice.

Se gli articoli nel carrello hanno una data di scadenza, è possibile che il sondaggio di visualizzazione sia scaduto. Se lo fanno, puoi eseguire il codice di rimozione per quell'elemento e aggiornare il tuo ui.

+1

Sono d'accordo. La rimozione non ha importanza finché non provi a visualizzare il tuo carrello. Quindi perché eseguire questo processo in background? Basta controllare il carrello per la scadenza prima di visualizzarlo. Questo ti farà risparmiare anche il lavoro di scartare i carrelli abbandonati. E ti farà risparmiare il dover monitorare un insieme di lavori batch per assicurarti che siano in esecuzione. –

+0

@spaceman: Sarò sicuro di cercare su SignalR, una libreria in tempo reale come quella che potrebbe fare bene qui e si possono fare alcuni bei trucchi UX. –

+0

@Brian: Penso che ci sia un leggero fraintendimento in merito a questa rimozione, non si tratta del carrello dell'acquirente, si tratta della scorta di quel prodotto. Dopo la scadenza è necessario rilasciare quel prodotto in modo che altre persone possano acquistarlo, fino a quel momento è necessario mostrare loro un pulsante di acquisto disabilitato perché l'articolo è ancora prenotato. Ovviamente per ogni richiesta è necessario controllare lo stock, ma ora il servizio di gestione degli inventari dovrà controllare anche la scadenza dell'oggetto prenotato. Invece di quello voglio che il prodotto segnali questa scadenza in modo da poter ridurre la messaggistica interna tra i componenti. –

Problemi correlati