Gestione degli eventi in base alla loro proprietà

3

Sto lavorando con un sistema esterno che invia a noi dati simili all'evento. Un SDK esistente dei ragazzi di terze parti analizza il JSON, quindi alla fine otteniamo qualcosa come la seguente classe:

public class Event
{
    public string Type;
    public dynamic Data;
}

I requisiti sono i seguenti:

  1. Tutti gli eventi dovrebbero avere un gestore predefinito.

  2. I tipi di eventi specifici potrebbero avere un gestore che sovrascrive quello predefinito e fa qualcos'altro (il codice e la duplicazione logica nei gestori non sono un problema al momento).

  3. Il tipo di eventi può variare, quindi dovremmo essere in grado di spostare facilmente l'evento dal loro gestore specifico a uno predefinito o viceversa.

La soluzione che ho pensato è stata quella di fornire un dizionario con la mappatura di string a Type, dove Type sarebbe un tipo di gestore. Quindi, un gestore appropriato verrebbe creato tramite riflessione e gli verrà passato un evento da gestire. Se la chiave non è presente nel dizionario, verrà creato un gestore predefinito. Tuttavia, non sono sicuro che sia il modo migliore e non mi piace avere tre voci nel dizionario che puntano a un tipo, ad es.

'eventA' = > handlerA

'eventB' = > handlerA

'eventC' = > handlerA

Non ho una ragione specifica per non apprezzarla, mi sembra solo che ci possa essere un modo migliore.

Ho anche pensato di usare i generici per questo, ma è più di un'idea vaga e non un concetto concreto in questo momento.

Qualche suggerimento su questo? Sono abbastanza sicuro che il problema non sia unico ma, purtroppo, non sono riuscito a trovare una buona formulazione per cercare.

    
posta Vlad Stryapko 13.04.2017 - 12:39
fonte

2 risposte

3

Probabilmente ce ne sono altri, ma le tre soluzioni più ovvie a cui posso pensare sono:

  1. Utilizza una mappa Dictionary<string, HanderDelegate> ,
  2. Utilizza un'istruzione switch per mappare i nomi di "evento" ai loro gestori,
  3. Utilizza il polimorfismo OO (una classe per tipo di evento) e una sorta di factory.

Ognuno ha i suoi pro e contro. Io personalmente andrei con la soluzione del dizionario, come suggerisci tu. Non c'è una risposta "corretta" qui però.

    
risposta data 13.04.2017 - 13:19
fonte
2

Il tuo design proposto è buono. Non vedo alcun motivo per obiettare. Ci sono possibili progetti alternativi, ma non riesco a pensare a qualcosa di decisamente migliore.

Se hai tre tipi di eventi che sono tutti gestiti da un gestore, tali informazioni devono essere codificate da qualche parte in qualsiasi progetto. Potrebbe sembrare una "ripetizione", ma non lo è; sono tre distinte informazioni. Quindi, non ti preoccupare di questo.

    
risposta data 13.04.2017 - 13:19
fonte

Leggi altre domande sui tag